Add function to the model for email address management (add/delete/activate)
This commit is contained in:
		
							parent
							
								
									99599c099f
								
							
						
					
					
						commit
						6919c80f0b
					
				
							
								
								
									
										133
									
								
								models/user.go
								
								
								
								
							
							
						
						
									
										133
									
								
								models/user.go
								
								
								
								
							|  | @ -42,6 +42,8 @@ var ( | |||
| 	ErrUserNotExist          = errors.New("User does not exist") | ||||
| 	ErrUserNotKeyOwner       = errors.New("User does not the owner of public key") | ||||
| 	ErrEmailAlreadyUsed      = errors.New("E-mail already used") | ||||
| 	ErrEmailNotExist         = errors.New("E-mail does not exist") | ||||
| 	ErrEmailNotActivated     = errors.New("E-mail address has not been activated") | ||||
| 	ErrUserNameIllegal       = errors.New("User name contains illegal characters") | ||||
| 	ErrLoginSourceNotExist   = errors.New("Login source does not exist") | ||||
| 	ErrLoginSourceNotActived = errors.New("Login source is not actived") | ||||
|  | @ -101,6 +103,7 @@ type EmailAddress struct { | |||
| 	OwnerId     int64  `xorm:"INDEX NOT NULL"` | ||||
| 	Email       string `xorm:"UNIQUE NOT NULL"` | ||||
| 	IsActivated bool | ||||
| 	IsPrimary   bool `xorm:"-"` | ||||
| } | ||||
| 
 | ||||
| // DashboardLink returns the user dashboard page link.
 | ||||
|  | @ -368,6 +371,25 @@ func VerifyUserActiveCode(code string) (user *User) { | |||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // verify active code when active account
 | ||||
| func VerifyActiveEmailCode(code, email string) *EmailAddress { | ||||
| 	minutes := setting.Service.ActiveCodeLives | ||||
| 
 | ||||
| 	if user := getVerifyUser(code); user != nil { | ||||
| 		// time limit code
 | ||||
| 		prefix := code[:base.TimeLimitCodeLength] | ||||
| 		data := com.ToStr(user.Id) + email + user.LowerName + user.Passwd + user.Rands | ||||
| 
 | ||||
| 		if base.VerifyTimeLimitCode(data, minutes, prefix) { | ||||
| 			emailAddress := &EmailAddress{Email: email} | ||||
| 			if has, _ := x.Get(emailAddress); has { | ||||
| 				return emailAddress | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ChangeUserName changes all corresponding setting from old user name to new one.
 | ||||
| func ChangeUserName(u *User, newUserName string) (err error) { | ||||
| 	if !IsLegalName(newUserName) { | ||||
|  | @ -604,6 +626,117 @@ func GetUserIdsByNames(names []string) []int64 { | |||
| 	return ids | ||||
| } | ||||
| 
 | ||||
| // Get all email addresses
 | ||||
| func GetEmailAddresses(uid int64) ([]*EmailAddress, error) { | ||||
| 	emails := make([]*EmailAddress, 0, 5) | ||||
| 	err := x.Where("owner_id=?", uid).Find(&emails) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	u, err := GetUserById(uid) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	primary_email_found := false | ||||
| 
 | ||||
| 	for _, email := range emails { | ||||
| 		if email.Email == u.Email { | ||||
| 			primary_email_found = true | ||||
| 			email.IsPrimary = true | ||||
| 		} else { | ||||
| 			email.IsPrimary = false | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// We alway want the primary email address displayed, even if it's not in
 | ||||
| 	// the emailaddress table (yet)
 | ||||
| 	if !primary_email_found { | ||||
| 		emails = append(emails, &EmailAddress{Email: u.Email, IsActivated: true, IsPrimary: true}) | ||||
| 	} | ||||
| 	return emails, nil | ||||
| } | ||||
| 
 | ||||
| func AddEmailAddress(email *EmailAddress) error { | ||||
| 	used, err := IsEmailUsed(email.Email) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} else if used { | ||||
| 		return ErrEmailAlreadyUsed | ||||
| 	} | ||||
| 
 | ||||
| 	_, err = x.Insert(email) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func (email *EmailAddress) Activate() error { | ||||
| 	email.IsActivated = true | ||||
| 	if _, err := x.Id(email.Id).AllCols().Update(email); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if user, err := GetUserById(email.OwnerId); err != nil { | ||||
| 		return err | ||||
| 	} else { | ||||
| 		user.Rands = GetUserSalt() | ||||
| 		return UpdateUser(user) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func DeleteEmailAddress(email *EmailAddress) error { | ||||
| 	has, err := x.Get(email) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} else if !has { | ||||
| 		return ErrEmailNotExist | ||||
| 	} | ||||
| 
 | ||||
| 	if _, err = x.Delete(email); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func MakeEmailPrimary(email *EmailAddress) error { | ||||
| 	has, err := x.Get(email) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} else if !has { | ||||
| 		return ErrEmailNotExist | ||||
| 	} | ||||
| 
 | ||||
| 	if !email.IsActivated { | ||||
| 		return ErrEmailNotActivated | ||||
| 	} | ||||
| 
 | ||||
| 	user := &User{Id: email.OwnerId} | ||||
| 	has, err = x.Get(user) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} else if !has { | ||||
| 		return ErrUserNotExist | ||||
| 	} | ||||
| 
 | ||||
| 	// Make sure the former primary email doesn't disappear
 | ||||
| 	former_primary_email := &EmailAddress{Email: user.Email} | ||||
| 	has, err = x.Get(former_primary_email) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} else if !has { | ||||
| 		former_primary_email.OwnerId = user.Id | ||||
| 		former_primary_email.IsActivated = user.IsActive | ||||
| 		x.Insert(former_primary_email) | ||||
| 	} | ||||
| 
 | ||||
| 	user.Email = email.Email | ||||
| 	_, err = x.Id(user.Id).AllCols().Update(user) | ||||
| 
 | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // UserCommit represents a commit with validation of user.
 | ||||
| type UserCommit struct { | ||||
| 	User *User | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue