// Package retentionapi implementiert RET-06-API: die Backend-Seite der // Aufbewahrungsfristen-Konfigurationsoberfläche (CRUD auf // Aufbewahrungsklassen + Vorschauliste ablaufender Objekte). Das // Next.js-Frontend selbst ist NICHT Teil dieses Tickets (Board- // Entscheidung: Backend-API zuerst, Frontend als eigenes Folgeticket). package retentionapi import ( "net/http" "strings" ) // requiredRoleHeader ist der Header-Name des PROVISORISCHEN Rollen- // Checks (siehe RequireRole-Dokumentation). const requiredRoleHeader = "X-Admin-Roles" // RequireRole ist ein PROVISORISCHER Rollen-Check, KEIN RBAC-02-Aufruf. // // Core RBAC-02 (internal/policy, Enforcer.Authorize) ist reiner // Go-Code innerhalb des Core-Moduls, hat keine HTTP-Schnittstelle, über // die Archive (physisch getrenntes Go-Modul) es aufrufen könnte — // derselbe "gefunden, aber nicht modulübergreifend verdrahtet"-Befund // wie bei Core FDN-03/FDN-09. Bis ein Core-seitiger HTTP-Wrapper um // RBAC-02 existiert (eigenes, künftiges Core-Ticket, z. B. RBAC-06), // prüft dieser Middleware NUR einen einfachen, selbst gesetzten Header // (`X-Admin-Roles`, kommagetrennt) auf das Vorhandensein der // geforderten Rolle — KEINE echte Autorisierung gegen Core, leicht zu // fälschen von jedem, der den Header selbst setzen kann. Muss ersetzt // werden, sobald der Core-HTTP-Wrapper existiert. func RequireRole(requiredRole string, next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { roles := r.Header.Get(requiredRoleHeader) if !containsRole(roles, requiredRole) { http.Error(w, "zugriff verweigert: rolle "+requiredRole+" erforderlich (provisorischer check, siehe RequireRole)", http.StatusForbidden) return } next(w, r) } } func containsRole(commaSeparated, role string) bool { for _, r := range strings.Split(commaSeparated, ",") { if strings.TrimSpace(r) == role { return true } } return false }