github.com/unclejack/drone@v0.2.1-0.20140918182345-831b034aa33b/pkg/model/user.go (about) 1 package model 2 3 import ( 4 "errors" 5 "fmt" 6 "regexp" 7 "time" 8 9 "code.google.com/p/go.crypto/bcrypt" 10 ) 11 12 var ( 13 ErrInvalidUserName = errors.New("Invalid User Name") 14 ErrInvalidPassword = errors.New("Invalid Password") 15 ErrInvalidEmail = errors.New("Invalid Email Address") 16 ) 17 18 // Gravatar URL pattern 19 var GravatarPattern = "https://gravatar.com/avatar/%s?s=%v&d=identicon" 20 21 // Simple regular expression used to verify that an email 22 // address matches the expected standard format. 23 var RegexpEmail = regexp.MustCompile(`^[^@]+@[^@.]+\.[^@.]+`) 24 25 type User struct { 26 ID int64 `meddler:"id,pk" json:"id"` 27 Email string `meddler:"email" json:"email"` 28 Password string `meddler:"password" json:"-"` 29 Token string `meddler:"token" json:"-"` 30 Name string `meddler:"name" json:"name"` 31 Gravatar string `meddler:"gravatar" json:"gravatar"` 32 Created time.Time `meddler:"created,utctime" json:"created"` 33 Updated time.Time `meddler:"updated,utctime" json:"updated"` 34 Admin bool `meddler:"admin" json:"-"` 35 36 // GitHub OAuth2 token for accessing public repositories. 37 GithubLogin string `meddler:"github_login" json:"-"` 38 GithubToken string `meddler:"github_token" json:"-"` 39 40 // Bitbucket OAuth1.0a token and token secret. 41 BitbucketLogin string `meddler:"bitbucket_login" json:"-"` 42 BitbucketToken string `meddler:"bitbucket_token" json:"-"` 43 BitbucketSecret string `meddler:"bitbucket_secret" json:"-"` 44 45 GitlabToken string `meddler:"gitlab_token" json:"-"` 46 } 47 48 // Creates a new User from the given Name and Email. 49 func NewUser(name, email string) *User { 50 user := User{} 51 user.Name = name 52 user.Token = createToken() 53 user.SetEmail(email) 54 return &user 55 } 56 57 // Returns the Gravatar Image URL. 58 func (u *User) Image() string { return fmt.Sprintf(GravatarPattern, u.Gravatar, 42) } 59 func (u *User) ImageSmall() string { return fmt.Sprintf(GravatarPattern, u.Gravatar, 32) } 60 func (u *User) ImageLarge() string { return fmt.Sprintf(GravatarPattern, u.Gravatar, 160) } 61 62 // Set the email address and calculate the 63 // Gravatar hash. 64 func (u *User) SetEmail(email string) { 65 u.Email = email 66 u.Gravatar = createGravatar(email) 67 } 68 69 // Set the password and hash with bcrypt 70 func (u *User) SetPassword(password string) error { 71 // validate the password is an appropriate size 72 switch { 73 case len(password) < 6: 74 return ErrInvalidPassword 75 case len(password) > 256: 76 return ErrInvalidPassword 77 } 78 79 // convert the password to a hash 80 b, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) 81 if err != nil { 82 return err 83 } 84 // update the user 85 u.Password = string(b) 86 return nil 87 } 88 89 // Validate verifies all required fields are correctly populated. 90 func (u *User) Validate() error { 91 switch { 92 case len(u.Name) == 0: 93 return ErrInvalidUserName 94 case len(u.Name) >= 255: 95 return ErrInvalidUserName 96 case len(u.Email) == 0: 97 return ErrInvalidEmail 98 case len(u.Email) >= 255: 99 return ErrInvalidEmail 100 case RegexpEmail.MatchString(u.Email) == false: 101 return ErrInvalidEmail 102 default: 103 return nil 104 } 105 } 106 107 // ComparePassword compares the supplied password to 108 // the user password stored in the database. 109 func (u *User) ComparePassword(password string) error { 110 return bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password)) 111 }