diff --git a/models/login_source.go b/models/login_source.go index b8c1ae224..7153606a9 100755 --- a/models/login_source.go +++ b/models/login_source.go @@ -40,7 +40,7 @@ const ( LoginDLDAP // 5 LoginOAuth2 // 6 LoginSSPI // 7 - LoginCloubBrain // 8 + LoginCloudBrain // 8 ) // LoginNames contains the name of LoginType values. @@ -51,7 +51,7 @@ var LoginNames = map[LoginType]string{ LoginPAM: "PAM", LoginOAuth2: "OAuth2", LoginSSPI: "SPNEGO with SSPI", - LoginCloubBrain: "Cloud Brain", + LoginCloudBrain: "Cloud Brain", } // SecurityProtocolNames contains the name of SecurityProtocol values. @@ -202,6 +202,8 @@ func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) { source.Cfg = new(OAuth2Config) case LoginSSPI: source.Cfg = new(SSPIConfig) + case LoginCloudBrain: + source.Cfg = new(CloudBrainConfig) default: panic("unrecognized login source type: " + com.ToStr(*val)) } @@ -717,7 +719,7 @@ 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: + case LoginCloudBrain: user, err = LoginViaCloudBrain(user, login, password, source) default: return nil, ErrUnsupportedLoginType @@ -831,12 +833,16 @@ func LoginViaCloudBrain(user *User, login, password string, source *LoginSource) } if user != nil { - //todo: update token user.Token = token return user, UpdateUserCols(user, "token") } - cloudBrainUser, err := cloudbrain.GetUserInfo(token, login) + cloudBrainUser, err := cloudbrain.GetUserInfo(login, token) + + if err != nil { + log.Error("GetUserInfo(%s) failed: %v", login, err) + return nil, err + } if len(cloudBrainUser.Email) == 0 { cloudBrainUser.Email = fmt.Sprintf("%s@cloudbrain", login) diff --git a/modules/auth/cloudbrain/cloudbrain.go b/modules/auth/cloudbrain/cloudbrain.go index 30ca8946d..4020faa5f 100755 --- a/modules/auth/cloudbrain/cloudbrain.go +++ b/modules/auth/cloudbrain/cloudbrain.go @@ -31,7 +31,7 @@ type RespAuth struct { type RespToken struct { Code string `json:"code"` - Message string `json:"message"` + Message string `json:"msg"` Payload PayloadToken `json:"payload"` } @@ -43,7 +43,7 @@ type PayloadToken struct { type RespUserInfo struct { Code string `json:"code"` - Message string `json:"message"` + Message string `json:"msg"` Payload PayloadUserInfo `json:"payload"` } @@ -71,6 +71,8 @@ func UserValidate(username string, password string) (string, error) { return "", err } + defer resp.Body.Close() + body,err := ioutil.ReadAll(resp.Body) if err != nil { log.Error("read resp body failed:" + err.Error()) @@ -109,6 +111,8 @@ func GetUserInfo(username string, token string) (*CloudBrainUser, error) { return nil, err } + defer resp.Body.Close() + body,err := ioutil.ReadAll(resp.Body) if err != nil { log.Error("read resp body failed:", err.Error()) diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 3e32702aa..f2d3b2ea0 100755 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -192,6 +192,7 @@ no_reply_address_helper=具有隐藏电子邮件地址的用户的域名。例 [home] uname_holder=登录名或电子邮箱地址 +uname_holder_cloud_brain=云脑登录名 password_holder=密码 switch_dashboard_context=切换控制面板用户 my_repos=项目列表 @@ -267,6 +268,7 @@ twofa_passcode_incorrect=你的验证码不正确。如果你丢失了你的设 twofa_scratch_token_incorrect=你的验证口令不正确。 login_userpass=登录 login_openid=OpenID +login_cloudbrain=云脑用户登录 oauth_signup_tab=注册帐号 oauth_signup_title=添加电子邮件和密码 (用于帐号恢复) oauth_signup_submit=完成账号 diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 5d6e015f1..3181aaed5 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -305,6 +305,7 @@ func RegisterRoutes(m *macaron.Macaron) { // ***** START: User ***** m.Group("/user", func() { m.Get("/login", user.SignIn) + m.Get("/login/cloud_brain", user.SignInCloudBrain) m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost) m.Group("", func() { m.Combo("/login/openid"). diff --git a/routers/user/auth.go b/routers/user/auth.go old mode 100644 new mode 100755 index e1a885480..421598347 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -36,6 +36,8 @@ const ( tplMustChangePassword = "user/auth/change_passwd" // tplSignIn template for sign in page tplSignIn base.TplName = "user/auth/signin" + // tplSignIn template for sign in page + tplSignInCloudBrain base.TplName = "user/auth/signin_cloud_brain" // tplSignUp template path for sign up page tplSignUp base.TplName = "user/auth/signup" // TplActivate template path for activate user @@ -143,10 +145,28 @@ func SignIn(ctx *context.Context) { ctx.Data["PageIsSignIn"] = true ctx.Data["PageIsLogin"] = true ctx.Data["EnableSSPI"] = models.IsSSPIEnabled() + ctx.Data["EnableCloudBrain"] = true ctx.HTML(200, tplSignIn) } +// SignInCloudBrain render sign in page +func SignInCloudBrain(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("sign_in") + + // Check auto-login. + if checkAutoLogin(ctx) { + return + } + + ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login" + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsCloudBrainLogin"] = true + ctx.Data["EnableCloudBrain"] = true + + ctx.HTML(200, tplSignInCloudBrain) +} + // SignInPost response for sign in request func SignInPost(ctx *context.Context, form auth.SignInForm) { ctx.Data["Title"] = ctx.Tr("sign_in") diff --git a/templates/user/auth/signin_cloud_brain.tmpl b/templates/user/auth/signin_cloud_brain.tmpl new file mode 100755 index 000000000..6b0b9c38f --- /dev/null +++ b/templates/user/auth/signin_cloud_brain.tmpl @@ -0,0 +1,10 @@ +{{template "base/head" .}} +