]> source.dussan.org Git - gitea.git/commitdiff
Add function to the model for email address management (add/delete/activate)
authorPeter <peter@smitmail.eu>
Wed, 17 Dec 2014 15:40:10 +0000 (17:40 +0200)
committerPeter <peter@smitmail.eu>
Wed, 17 Dec 2014 15:40:10 +0000 (17:40 +0200)
models/user.go

index 08710763da9f95ff15a7622abc54972af52e13c5..fd2d8dc708e877cba683f63ce81d385a09b53be4 100644 (file)
@@ -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