@@ -1018,6 +1018,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) {
1018
1018
ctx = r .Context ()
1019
1019
user = httpmw .UserParam (r )
1020
1020
params codersdk.UpdateUserPasswordRequest
1021
+ apiKey = httpmw .APIKey (r )
1021
1022
auditor = * api .Auditor .Load ()
1022
1023
aReq , commitAudit = audit .InitRequest [database.User ](rw , & audit.RequestParams {
1023
1024
Audit : auditor ,
@@ -1045,7 +1046,25 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) {
1045
1046
return
1046
1047
}
1047
1048
1048
- err := userpassword .Validate (params .Password )
1049
+ admin , err := api .Database .GetUserByID (ctx , apiKey .UserID )
1050
+ if err != nil {
1051
+ httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
1052
+ Message : "Internal error fetching user." ,
1053
+ Detail : err .Error (),
1054
+ })
1055
+ return
1056
+ }
1057
+
1058
+ // only admins or owners can change passwords without sending old_password
1059
+ if params .OldPassword == "" && (! slice .Contains (admin .RBACRoles , codersdk .RoleUserAdmin ) &&
1060
+ ! slice .Contains (admin .RBACRoles , codersdk .RoleOwner )) {
1061
+ httpapi .Write (ctx , rw , http .StatusBadRequest , codersdk.Response {
1062
+ Message : "Old password is required for non-admin users." ,
1063
+ })
1064
+ return
1065
+ }
1066
+
1067
+ err = userpassword .Validate (params .Password )
1049
1068
if err != nil {
1050
1069
httpapi .Write (ctx , rw , http .StatusBadRequest , codersdk.Response {
1051
1070
Message : "Invalid password." ,
@@ -1059,7 +1078,6 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) {
1059
1078
return
1060
1079
}
1061
1080
1062
- // admins can change passwords without sending old_password
1063
1081
if params .OldPassword != "" {
1064
1082
// if they send something let's validate it
1065
1083
ok , err := userpassword .Compare (string (user .HashedPassword ), params .OldPassword )
0 commit comments