func LoginPost(c *middleware.Context, cmd dtos.LoginCommand) Response { authQuery := login.LoginUserQuery{ Username: cmd.User, Password: cmd.Password, } if err := bus.Dispatch(&authQuery); err != nil { if err == login.ErrInvalidCredentials { return ApiError(401, "Invalid username or password", err) } return ApiError(500, "Error while trying to authenticate user", err) } user := authQuery.User loginUserWithUser(user, c) result := map[string]interface{}{ "message": "Logged in", } if redirectTo, _ := url.QueryUnescape(c.GetCookie("redirect_to")); len(redirectTo) > 0 { result["redirectUrl"] = redirectTo c.SetCookie("redirect_to", "", -1, setting.AppSubUrl+"/") } metrics.M_Api_Login_Post.Inc(1) return Json(200, result) }
func LoginView(c *middleware.Context) { viewData, err := setIndexViewData(c) if err != nil { c.Handle(500, "Failed to get settings", err) return } viewData.Settings["googleAuthEnabled"] = setting.OAuthService.Google viewData.Settings["githubAuthEnabled"] = setting.OAuthService.GitHub viewData.Settings["genericOAuthEnabled"] = setting.OAuthService.Generic viewData.Settings["oauthProviderName"] = setting.OAuthService.OAuthProviderName viewData.Settings["disableUserSignUp"] = !setting.AllowUserSignUp viewData.Settings["loginHint"] = setting.LoginHint viewData.Settings["allowUserPassLogin"] = setting.AllowUserPassLogin if !tryLoginUsingRememberCookie(c) { c.HTML(200, VIEW_INDEX, viewData) return } if redirectTo, _ := url.QueryUnescape(c.GetCookie("redirect_to")); len(redirectTo) > 0 { c.SetCookie("redirect_to", "", -1, setting.AppSubUrl+"/") c.Redirect(redirectTo) return } c.Redirect(setting.AppSubUrl + "/") }
func tryLoginUsingRememberCookie(c *middleware.Context) bool { // Check auto-login. uname := c.GetCookie(setting.CookieUserName) if len(uname) == 0 { return false } isSucceed := false defer func() { if !isSucceed { log.Trace("auto-login cookie cleared: %s", uname) c.SetCookie(setting.CookieUserName, "", -1, setting.AppSubUrl+"/") c.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubUrl+"/") return } }() userQuery := m.GetUserByLoginQuery{LoginOrEmail: uname} if err := bus.Dispatch(&userQuery); err != nil { return false } user := userQuery.Result // validate remember me cookie if val, _ := c.GetSuperSecureCookie( util.EncodeMd5(user.Rands+user.Password), setting.CookieRememberName); val != user.Login { return false } isSucceed = true loginUserWithUser(user, c) return true }
func LoginView(c *middleware.Context) { viewData, err := setIndexViewData(c) if err != nil { c.Handle(500, "Failed to get settings", err) return } enabledOAuths := make(map[string]interface{}) for key, oauth := range setting.OAuthService.OAuthInfos { enabledOAuths[key] = map[string]string{"name": oauth.Name} } viewData.Settings["oauth"] = enabledOAuths viewData.Settings["disableUserSignUp"] = !setting.AllowUserSignUp viewData.Settings["loginHint"] = setting.LoginHint viewData.Settings["disableLoginForm"] = setting.DisableLoginForm if !tryLoginUsingRememberCookie(c) { c.HTML(200, VIEW_INDEX, viewData) return } if redirectTo, _ := url.QueryUnescape(c.GetCookie("redirect_to")); len(redirectTo) > 0 { c.SetCookie("redirect_to", "", -1, setting.AppSubUrl+"/") c.Redirect(redirectTo) return } c.Redirect(setting.AppSubUrl + "/") }
func LoginView(c *middleware.Context) { if err := setIndexViewData(c); err != nil { c.Handle(500, "Failed to get settings", err) return } settings := c.Data["Settings"].(map[string]interface{}) settings["googleAuthEnabled"] = setting.OAuthService.Google settings["githubAuthEnabled"] = setting.OAuthService.GitHub settings["disableUserSignUp"] = !setting.AllowUserSignUp settings["loginHint"] = setting.LoginHint if !tryLoginUsingRememberCookie(c) { c.HTML(200, VIEW_INDEX) return } if redirectTo, _ := url.QueryUnescape(c.GetCookie("redirect_to")); len(redirectTo) > 0 { c.SetCookie("redirect_to", "", -1, setting.AppSubUrl+"/") c.Redirect(redirectTo) return } c.Redirect(setting.AppSubUrl + "/") }
func LoginPost(c *middleware.Context, cmd dtos.LoginCommand) { userQuery := m.GetUserByLoginQuery{LoginOrEmail: cmd.User} err := bus.Dispatch(&userQuery) if err != nil { c.JsonApiErr(401, "Invalid username or password", err) return } user := userQuery.Result passwordHashed := util.EncodePassword(cmd.Password, user.Salt) if passwordHashed != user.Password { c.JsonApiErr(401, "Invalid username or password", err) return } loginUserWithUser(user, c) result := map[string]interface{}{ "message": "Logged in", } if redirectTo, _ := url.QueryUnescape(c.GetCookie("redirect_to")); len(redirectTo) > 0 { result["redirectUrl"] = redirectTo c.SetCookie("redirect_to", "", -1, setting.AppSubUrl+"/") } metrics.M_Api_Login_Post.Inc(1) c.JSON(200, result) }
func getUserName(c *middleware.Context) (string, error) { var keystoneUserIdObj interface{} if setting.KeystoneCookieCredentials { if keystoneUserIdObj = c.GetCookie(setting.CookieUserName); keystoneUserIdObj == nil { return "", errors.New("Couldn't find cookie containing keystone userId") } else { return keystoneUserIdObj.(string), nil } } else if keystoneUserIdObj = c.Session.Get(middleware.SESS_KEY_USERID); keystoneUserIdObj == nil { return "", errors.New("Session timed out trying to get keystone userId") } userQuery := m.GetUserByIdQuery{Id: keystoneUserIdObj.(int64)} if err := bus.Dispatch(&userQuery); err != nil { if err == m.ErrUserNotFound { return "", err } } return userQuery.Result.Login, nil }
func getNewToken(c *middleware.Context) (string, error) { var username, project string var err error if username, err = getUserName(c); err != nil { return "", err } if project, err = getOrgName(c); err != nil { return "", err } var keystonePasswordObj interface{} if setting.KeystoneCookieCredentials { if keystonePasswordObj = c.GetCookie(middleware.SESS_KEY_PASSWORD); keystonePasswordObj == nil { return "", errors.New("Couldn't find cookie containing keystone password") } } else if keystonePasswordObj = c.Session.Get(middleware.SESS_KEY_PASSWORD); keystonePasswordObj == nil { return "", errors.New("Session timed out trying to get keystone password") } if setting.KeystoneCredentialAesKey != "" { keystonePasswordObj = decryptPassword(keystonePasswordObj.(string)) } auth := Auth_data{ Username: username, Project: project, Password: keystonePasswordObj.(string), Domain: setting.KeystoneDefaultDomain, Server: setting.KeystoneURL, } if err := AuthenticateScoped(&auth); err != nil { return "", err } c.Session.Set(SESS_TOKEN, auth.Token) c.Session.Set(SESS_TOKEN_EXPIRATION, auth.Expiration) c.Session.Set(SESS_TOKEN_PROJECT, project) // in keystone v3 the token is in the response header return auth.Token, nil }