diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2014-05-11 14:12:45 +0800 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2014-05-11 14:12:45 +0800 |
commit | 55019bfbc5c2b7db7a1f861a90d97e6760433e4d (patch) | |
tree | 07a3ecf9e82b942b3428f0eaa7cce947dce743e8 /models | |
parent | 4d6de6c7b9715a6ccce3f09249b47b984b9a1295 (diff) | |
parent | 7d84cc96e8da9f7389f855be4f86864039843e6c (diff) |
merge all login methods
Diffstat (limited to 'models')
-rw-r--r-- | models/login.go | 128 | ||||
-rw-r--r-- | models/release.go | 4 | ||||
-rw-r--r-- | models/user.go | 37 |
3 files changed, 130 insertions, 39 deletions
diff --git a/models/login.go b/models/login.go index 21e1ce68..05ffac2c 100644 --- a/models/login.go +++ b/models/login.go @@ -7,6 +7,7 @@ package models import ( "encoding/json" "errors" + "strings" "time" "github.com/go-xorm/core" @@ -17,7 +18,8 @@ import ( // Login types. const ( - LT_PLAIN = iota + 1 + LT_NOTYPE = iota + LT_PLAIN LT_LDAP LT_SMTP ) @@ -49,13 +51,14 @@ func (cfg *LDAPConfig) ToDB() ([]byte, error) { } type LoginSource struct { - Id int64 - Type int - Name string `xorm:"unique"` - IsActived bool `xorm:"not null default false"` - Cfg core.Conversion `xorm:"TEXT"` - Created time.Time `xorm:"created"` - Updated time.Time `xorm:"updated"` + Id int64 + Type int + Name string `xorm:"unique"` + IsActived bool `xorm:"not null default false"` + Cfg core.Conversion `xorm:"TEXT"` + Created time.Time `xorm:"created"` + Updated time.Time `xorm:"updated"` + AllowAutoRegisted bool `xorm:"not null default false"` } func (source *LoginSource) TypeString() string { @@ -120,3 +123,112 @@ func DelLoginSource(source *LoginSource) error { _, err = orm.Id(source.Id).Delete(&LoginSource{}) return err } + +// login a user +func LoginUser(uname, passwd string) (*User, error) { + var u *User + var emailLogin bool + if strings.Contains(uname, "@") { + u = &User{Email: uname} + emailLogin = true + } else { + u = &User{LowerName: strings.ToLower(uname)} + } + + has, err := orm.Get(u) + if err != nil { + return nil, err + } + + // if email login, then we cannot auto register + if emailLogin { + if !has { + return nil, ErrUserNotExist + } + } + if u.LoginType == LT_NOTYPE { + u.LoginType = LT_PLAIN + } + + // for plain login, user must have existed. + if u.LoginType == LT_PLAIN { + if !has { + return nil, ErrUserNotExist + } + + newUser := &User{Passwd: passwd, Salt: u.Salt} + newUser.EncodePasswd() + if u.Passwd != newUser.Passwd { + return nil, ErrUserNotExist + } + return u, nil + } else { + if !has { + var sources []LoginSource + cond := &LoginSource{IsActived: true, AllowAutoRegisted: true} + err = orm.UseBool().Find(&sources, cond) + if err != nil { + return nil, err + } + + for _, source := range sources { + u, err := LoginUserLdapSource(nil, u.LoginName, passwd, + source.Id, source.Cfg.(*LDAPConfig), true) + if err == nil { + return u, err + } + } + + return nil, ErrUserNotExist + } + + var source LoginSource + hasSource, err := orm.Id(u.LoginSource).Get(&source) + if err != nil { + return nil, err + } + if !hasSource { + return nil, ErrLoginSourceNotExist + } + + if !source.IsActived { + return nil, ErrLoginSourceNotActived + } + + switch u.LoginType { + case LT_LDAP: + return LoginUserLdapSource(u, u.LoginName, passwd, + source.Id, source.Cfg.(*LDAPConfig), false) + case LT_SMTP: + } + return nil, ErrUnsupportedLoginType + } +} + +// Query if name/passwd can login against the LDAP direcotry pool +// Create a local user if success +// Return the same LoginUserPlain semantic +func LoginUserLdapSource(user *User, name, passwd string, sourceId int64, cfg *LDAPConfig, autoRegister bool) (*User, error) { + mail, logged := cfg.Ldapsource.SearchEntry(name, passwd) + if !logged { + // user not in LDAP, do nothing + return nil, ErrUserNotExist + } + if !autoRegister { + return user, nil + } + + // fake a local user creation + user = &User{ + LowerName: strings.ToLower(name), + Name: strings.ToLower(name), + LoginType: LT_LDAP, + LoginSource: sourceId, + LoginName: name, + IsActive: true, + Passwd: passwd, + Email: mail, + } + + return RegisterUser(user) +} diff --git a/models/release.go b/models/release.go index 1fee5610..e6c3d561 100644 --- a/models/release.go +++ b/models/release.go @@ -50,7 +50,7 @@ func IsReleaseExist(repoId int64, tagName string) (bool, error) { } // CreateRelease creates a new release of repository. -func CreateRelease(repoPath string, rel *Release, gitRepo *git.Repository) error { +func CreateRelease(gitRepo *git.Repository, rel *Release) error { isExist, err := IsReleaseExist(rel.RepoId, rel.TagName) if err != nil { return err @@ -59,7 +59,7 @@ func CreateRelease(repoPath string, rel *Release, gitRepo *git.Repository) error } if !gitRepo.IsTagExist(rel.TagName) { - _, stderr, err := com.ExecCmdDir(repoPath, "git", "tag", rel.TagName, "-m", rel.Title) + _, stderr, err := com.ExecCmdDir(gitRepo.Path, "git", "tag", rel.TagName, "-m", rel.Title) if err != nil { return err } else if strings.Contains(stderr, "fatal:") { diff --git a/models/user.go b/models/user.go index 39709492..c5c474ee 100644 --- a/models/user.go +++ b/models/user.go @@ -27,11 +27,14 @@ const ( ) var ( - ErrUserOwnRepos = errors.New("User still have ownership of repositories") - ErrUserAlreadyExist = errors.New("User already exist") - ErrUserNotExist = errors.New("User does not exist") - ErrEmailAlreadyUsed = errors.New("E-mail already used") - ErrUserNameIllegal = errors.New("User name contains illegal characters") + ErrUserOwnRepos = errors.New("User still have ownership of repositories") + ErrUserAlreadyExist = errors.New("User already exist") + ErrUserNotExist = errors.New("User does not exist") + ErrEmailAlreadyUsed = errors.New("E-mail already used") + ErrUserNameIllegal = errors.New("User name contains illegal characters") + ErrLoginSourceNotExist = errors.New("Login source does not exist") + ErrLoginSourceNotActived = errors.New("Login source is not actived") + ErrUnsupportedLoginType = errors.New("Login source is unknow") ) // User represents the object of individual and member of organization. @@ -440,30 +443,6 @@ func SearchUserByName(key string, limit int) (us []*User, err error) { return us, err } -// LoginUserPlain validates user by raw user name and password. -func LoginUserPlain(uname, passwd string) (*User, error) { - var u *User - if strings.Contains(uname, "@") { - u = &User{Email: uname} - } else { - u = &User{LowerName: strings.ToLower(uname)} - } - - has, err := orm.Get(u) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUserNotExist - } - - newUser := &User{Passwd: passwd, Salt: u.Salt} - newUser.EncodePasswd() - if u.Passwd != newUser.Passwd { - return nil, ErrUserNotExist - } - return u, nil -} - // Follow is connection request for receiving user notifycation. type Follow struct { Id int64 |