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  }