|
|
@@ -6,6 +6,7 @@ |
|
|
|
package models |
|
|
|
|
|
|
|
import ( |
|
|
|
"code.gitea.io/gitea/modules/auth/cloudbrain" |
|
|
|
"crypto/tls" |
|
|
|
"encoding/json" |
|
|
|
"errors" |
|
|
@@ -14,7 +15,6 @@ import ( |
|
|
|
"net/textproto" |
|
|
|
"strings" |
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/auth/cloudbrain" |
|
|
|
"code.gitea.io/gitea/modules/auth/ldap" |
|
|
|
"code.gitea.io/gitea/modules/auth/oauth2" |
|
|
|
"code.gitea.io/gitea/modules/auth/pam" |
|
|
@@ -22,7 +22,6 @@ import ( |
|
|
|
"code.gitea.io/gitea/modules/setting" |
|
|
|
"code.gitea.io/gitea/modules/timeutil" |
|
|
|
|
|
|
|
gouuid "github.com/satori/go.uuid" |
|
|
|
"github.com/unknwon/com" |
|
|
|
"xorm.io/xorm" |
|
|
|
"xorm.io/xorm/convert" |
|
|
@@ -41,6 +40,7 @@ const ( |
|
|
|
LoginDLDAP // 5 |
|
|
|
LoginOAuth2 // 6 |
|
|
|
LoginSSPI // 7 |
|
|
|
LoginCloubBrain // 8 |
|
|
|
) |
|
|
|
|
|
|
|
// LoginNames contains the name of LoginType values. |
|
|
@@ -51,6 +51,7 @@ var LoginNames = map[LoginType]string{ |
|
|
|
LoginPAM: "PAM", |
|
|
|
LoginOAuth2: "OAuth2", |
|
|
|
LoginSSPI: "SPNEGO with SSPI", |
|
|
|
LoginCloubBrain: "Cloud Brain", |
|
|
|
} |
|
|
|
|
|
|
|
// SecurityProtocolNames contains the name of SecurityProtocol values. |
|
|
@@ -716,6 +717,8 @@ func ExternalUserLogin(user *User, login, password string, source *LoginSource) |
|
|
|
user, err = LoginViaSMTP(user, login, password, source.ID, source.Cfg.(*SMTPConfig)) |
|
|
|
case LoginPAM: |
|
|
|
user, err = LoginViaPAM(user, login, password, source.ID, source.Cfg.(*PAMConfig)) |
|
|
|
case LoginCloubBrain: |
|
|
|
user, err = LoginViaCloudBrain(user, login, password, source) |
|
|
|
default: |
|
|
|
return nil, ErrUnsupportedLoginType |
|
|
|
} |
|
|
@@ -763,16 +766,6 @@ func UserSignIn(username, password string) (*User, error) { |
|
|
|
} |
|
|
|
|
|
|
|
if hasUser { |
|
|
|
if user.CloudBrainValidated { |
|
|
|
_, _, err := cloudbrain.UserValidate(username, password) |
|
|
|
if err != nil { |
|
|
|
log.Error("cloudbrain.UserValidate(%s) failed: %v", username, err) |
|
|
|
return nil, err |
|
|
|
} else { |
|
|
|
return user, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
switch user.LoginType { |
|
|
|
case LoginNoType, LoginPlain, LoginOAuth2: |
|
|
|
if user.IsPasswordSet() && user.ValidatePassword(password) { |
|
|
@@ -807,32 +800,6 @@ func UserSignIn(username, password string) (*User, error) { |
|
|
|
|
|
|
|
return ExternalUserLogin(user, user.LoginName, password, &source) |
|
|
|
} |
|
|
|
} else { |
|
|
|
email, token, err := cloudbrain.UserValidate(username, password) |
|
|
|
if err == nil { |
|
|
|
if email == "" { |
|
|
|
email = genRandEmail() |
|
|
|
} |
|
|
|
|
|
|
|
log.Info(email) |
|
|
|
u := &User{ |
|
|
|
Name: username, |
|
|
|
Email: email, |
|
|
|
Passwd: password, |
|
|
|
IsActive: true, |
|
|
|
CloudBrainValidated: true, |
|
|
|
Token: token, |
|
|
|
} |
|
|
|
if err := CreateUser(u); err != nil { |
|
|
|
log.Error("CreateUser(%s) failed: %v", username, err) |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
log.Info("Account created: %s", u.Name) |
|
|
|
|
|
|
|
return u, nil |
|
|
|
} |
|
|
|
|
|
|
|
log.Info("cloudbrain.UserValidate(%s) failed: %v", username, err) |
|
|
|
} |
|
|
|
|
|
|
|
sources := make([]*LoginSource, 0, 5) |
|
|
@@ -856,6 +823,34 @@ func UserSignIn(username, password string) (*User, error) { |
|
|
|
return nil, ErrUserNotExist{user.ID, user.Name, 0} |
|
|
|
} |
|
|
|
|
|
|
|
func genRandEmail() string{ |
|
|
|
return gouuid.NewV4().String() + "@cloudbrain.com" |
|
|
|
func LoginViaCloudBrain(user *User, login, password string, source *LoginSource) (*User, error) { |
|
|
|
token, err := cloudbrain.UserValidate(login, password) |
|
|
|
if err != nil { |
|
|
|
log.Error("UserValidate(%s) failed: %v", login, err) |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
cloudBrainUser, err := cloudbrain.GetUserInfo(token, login) |
|
|
|
|
|
|
|
if len(cloudBrainUser.Email) == 0 { |
|
|
|
cloudBrainUser.Email = fmt.Sprintf("%s@cloudbrain", login) |
|
|
|
} |
|
|
|
|
|
|
|
user = &User{ |
|
|
|
LowerName: strings.ToLower(login), |
|
|
|
Name: login, |
|
|
|
Email: cloudBrainUser.Email, |
|
|
|
LoginType: source.Type, |
|
|
|
LoginSource: source.ID, |
|
|
|
LoginName: login, |
|
|
|
IsActive: true, |
|
|
|
} |
|
|
|
|
|
|
|
err = CreateUser(user) |
|
|
|
if err != nil { |
|
|
|
log.Error("CreateUser(%s) failed: %v", login, err) |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return user, err |
|
|
|
} |