fix(PROJ-72): Superadmin kann Passwort/Rolle von Superadmin-Peers nicht ändern
SEC-01 Privilegien-Check (roleLevel(target) >= roleLevel(sess)) blockte Superadmin (höchstes Level) bei jedem Ziel-User mit gleichem Level - inklusive anderer Superadmins. Passwort-Reset durch Superadmin schlug dadurch fehl. Superadmin ist jetzt vom Peer-Level-Check ausgenommen, da kein höheres Level existiert.
This commit is contained in:
@@ -155,14 +155,17 @@ func (s *Server) handleUpdateUser(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
// SEC-01: Privilege escalation check — caller must not assign a role
|
// SEC-01: Privilege escalation check — caller must not assign a role
|
||||||
// at or above their own level, and must not modify users at or above
|
// at or above their own level, and must not modify users at or above
|
||||||
// their own level.
|
// their own level. Superadmin is the top level, so peer (same-level)
|
||||||
if roleLevel(target.Role) >= roleLevel(sess.Role) {
|
// checks would otherwise block superadmin-vs-superadmin management.
|
||||||
writeError(w, http.StatusForbidden, "insufficient privileges to modify this user")
|
if sess.Role != userstore.RoleSuperAdmin {
|
||||||
return
|
if roleLevel(target.Role) >= roleLevel(sess.Role) {
|
||||||
}
|
writeError(w, http.StatusForbidden, "insufficient privileges to modify this user")
|
||||||
if req.Role != nil && roleLevel(*req.Role) >= roleLevel(sess.Role) {
|
return
|
||||||
writeError(w, http.StatusForbidden, "insufficient privileges to assign this role")
|
}
|
||||||
return
|
if req.Role != nil && roleLevel(*req.Role) >= roleLevel(sess.Role) {
|
||||||
|
writeError(w, http.StatusForbidden, "insufficient privileges to assign this role")
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updated, err := s.users.Update(id, userstore.UpdateUserRequest{
|
updated, err := s.users.Update(id, userstore.UpdateUserRequest{
|
||||||
|
|||||||
Reference in New Issue
Block a user