|
|
|
@ -226,13 +226,8 @@ func (hs *HTTPServer) UpdateUserActiveOrg(c *contextmodel.ReqContext) response.R |
|
|
|
|
|
|
|
|
|
func (hs *HTTPServer) handleUpdateUser(ctx context.Context, cmd user.UpdateUserCommand) response.Response { |
|
|
|
|
// external user -> user data cannot be updated
|
|
|
|
|
isExternal, err := hs.isExternalUser(ctx, cmd.UserID) |
|
|
|
|
if err != nil { |
|
|
|
|
return response.Error(http.StatusInternalServerError, "Failed to validate User", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if isExternal { |
|
|
|
|
return response.Error(http.StatusForbidden, "User info cannot be updated for external Users", nil) |
|
|
|
|
if response := hs.errOnExternalUser(ctx, cmd.UserID); response != nil { |
|
|
|
|
return response |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if len(cmd.Login) == 0 { |
|
|
|
@ -344,20 +339,6 @@ func (hs *HTTPServer) UpdateUserEmail(c *contextmodel.ReqContext) response.Respo |
|
|
|
|
return response.Redirect(hs.Cfg.AppSubURL + "/profile") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (hs *HTTPServer) isExternalUser(ctx context.Context, userID int64) (bool, error) { |
|
|
|
|
getAuthQuery := login.GetAuthInfoQuery{UserId: userID} |
|
|
|
|
var err error |
|
|
|
|
if _, err = hs.authInfoService.GetAuthInfo(ctx, &getAuthQuery); err == nil { |
|
|
|
|
return true, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if errors.Is(err, user.ErrUserNotFound) { |
|
|
|
|
return false, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// swagger:route GET /user/orgs signed_in_user getSignedInUserOrgList
|
|
|
|
|
//
|
|
|
|
|
// Organizations of the actual User.
|
|
|
|
@ -571,8 +552,8 @@ func (hs *HTTPServer) ChangeActiveOrgAndRedirectToHome(c *contextmodel.ReqContex |
|
|
|
|
// 403: forbiddenError
|
|
|
|
|
// 500: internalServerError
|
|
|
|
|
func (hs *HTTPServer) ChangeUserPassword(c *contextmodel.ReqContext) response.Response { |
|
|
|
|
cmd := user.ChangeUserPasswordCommand{} |
|
|
|
|
if err := web.Bind(c.Req, &cmd); err != nil { |
|
|
|
|
form := user.ChangeUserPasswordCommand{} |
|
|
|
|
if err := web.Bind(c.Req, &form); err != nil { |
|
|
|
|
return response.Error(http.StatusBadRequest, "bad request data", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -581,43 +562,12 @@ func (hs *HTTPServer) ChangeUserPassword(c *contextmodel.ReqContext) response.Re |
|
|
|
|
return errResponse |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
userQuery := user.GetUserByIDQuery{ID: userID} |
|
|
|
|
|
|
|
|
|
usr, err := hs.userService.GetByID(c.Req.Context(), &userQuery) |
|
|
|
|
if err != nil { |
|
|
|
|
return response.Error(http.StatusInternalServerError, "Could not read user from database", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
getAuthQuery := login.GetAuthInfoQuery{UserId: usr.ID} |
|
|
|
|
if authInfo, err := hs.authInfoService.GetAuthInfo(c.Req.Context(), &getAuthQuery); err == nil { |
|
|
|
|
oauthInfo := hs.SocialService.GetOAuthInfoProvider(authInfo.AuthModule) |
|
|
|
|
if login.IsProviderEnabled(hs.Cfg, authInfo.AuthModule, oauthInfo) { |
|
|
|
|
return response.Error(http.StatusBadRequest, "Cannot update external user password", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
passwordHashed, err := util.EncodePassword(string(cmd.OldPassword), usr.Salt) |
|
|
|
|
if err != nil { |
|
|
|
|
return response.Error(http.StatusInternalServerError, "Failed to encode password", err) |
|
|
|
|
} |
|
|
|
|
if user.Password(passwordHashed) != usr.Password { |
|
|
|
|
return response.Error(http.StatusUnauthorized, "Invalid old password", nil) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err := cmd.NewPassword.Validate(hs.Cfg); err != nil { |
|
|
|
|
c.Logger.Warn("the new password doesn't meet the password policy criteria", "err", err) |
|
|
|
|
return response.Err(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cmd.UserID = userID |
|
|
|
|
encodedPassword, err := util.EncodePassword(string(cmd.NewPassword), usr.Salt) |
|
|
|
|
if err != nil { |
|
|
|
|
return response.Error(http.StatusInternalServerError, "Failed to encode password", err) |
|
|
|
|
if response := hs.errOnExternalUser(c.Req.Context(), userID); response != nil { |
|
|
|
|
return response |
|
|
|
|
} |
|
|
|
|
cmd.NewPassword = user.Password(encodedPassword) |
|
|
|
|
|
|
|
|
|
if err := hs.userService.ChangePassword(c.Req.Context(), &cmd); err != nil { |
|
|
|
|
return response.Error(http.StatusInternalServerError, "Failed to change user password", err) |
|
|
|
|
if err := hs.userService.Update(c.Req.Context(), &user.UpdateUserCommand{UserID: userID, Password: &form.NewPassword, OldPassword: &form.OldPassword}); err != nil { |
|
|
|
|
return response.ErrOrFallback(http.StatusInternalServerError, "Failed to change user password", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return response.Success("User password changed") |
|
|
|
|