|
@@ -353,11 +353,18 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Header().Set("Content-Type", "application/json")
|
|
var params = mux.Vars(r)
|
|
var params = mux.Vars(r)
|
|
// start here
|
|
// start here
|
|
-
|
|
|
|
- caller, err := logic.GetUser(r.Header.Get("user"))
|
|
|
|
- if err != nil {
|
|
|
|
- logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
|
|
|
|
|
|
+ var caller *models.User
|
|
|
|
+ var err error
|
|
|
|
+ var ismaster bool
|
|
|
|
+ if r.Header.Get("user") == logic.MasterUser {
|
|
|
|
+ ismaster = true
|
|
|
|
+ } else {
|
|
|
|
+ caller, err = logic.GetUser(r.Header.Get("user"))
|
|
|
|
+ if err != nil {
|
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
username := params["username"]
|
|
username := params["username"]
|
|
user, err := logic.GetUser(username)
|
|
user, err := logic.GetUser(username)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -379,11 +386,11 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
selfUpdate := false
|
|
selfUpdate := false
|
|
- if caller.UserName == user.UserName {
|
|
|
|
|
|
+ if !ismaster && caller.UserName == user.UserName {
|
|
selfUpdate = true
|
|
selfUpdate = true
|
|
}
|
|
}
|
|
|
|
|
|
- if !selfUpdate {
|
|
|
|
|
|
+ if !ismaster && !selfUpdate {
|
|
if caller.IsAdmin && user.IsSuperAdmin {
|
|
if caller.IsAdmin && user.IsSuperAdmin {
|
|
slog.Error("non-superadmin user", "caller", caller.UserName, "attempted to update superadmin user", username)
|
|
slog.Error("non-superadmin user", "caller", caller.UserName, "attempted to update superadmin user", username)
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
|
|
@@ -407,7 +414,7 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
- if selfUpdate {
|
|
|
|
|
|
+ if !ismaster && selfUpdate {
|
|
if user.IsAdmin != userchange.IsAdmin || user.IsSuperAdmin != userchange.IsSuperAdmin {
|
|
if user.IsAdmin != userchange.IsAdmin || user.IsSuperAdmin != userchange.IsSuperAdmin {
|
|
slog.Error("user cannot change his own role", "caller", caller.UserName, "attempted to update user role", username)
|
|
slog.Error("user cannot change his own role", "caller", caller.UserName, "attempted to update user role", username)
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user not allowed to self assign role"), "forbidden"))
|
|
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user not allowed to self assign role"), "forbidden"))
|
|
@@ -415,6 +422,13 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ if ismaster {
|
|
|
|
+ if !user.IsSuperAdmin && userchange.IsSuperAdmin {
|
|
|
|
+ slog.Error("operation not allowed", "caller", logic.MasterUser, "attempted to update user role to superadmin", username)
|
|
|
|
+ logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("attempted to update user role to superadmin"), "forbidden"))
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if auth.IsOauthUser(user) == nil {
|
|
if auth.IsOauthUser(user) == nil {
|
|
err := fmt.Errorf("cannot update user info for oauth user %s", username)
|
|
err := fmt.Errorf("cannot update user info for oauth user %s", username)
|