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:
sysops
2026-07-26 21:50:19 +02:00
parent 9db5eaa1e8
commit c580a7c05d
+11 -8
View File
@@ -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{