Pentest R111: contract-categories – Permission-String angeglichen

Pentester meldete 403 auf POST/PUT/DELETE /api/contract-categories/*
für Admin trotz vorhandener contract-categories:*-Perms. Vermutete
Regression aus R110, war aber schon seit dem allerersten Commit
so: Route verlangte developer:access, während der Permission-Seed
den Admins contract-categories:* gibt.

Fix: Route auf contract-categories:create/update/delete umgestellt,
konsistent mit den sechs Peer-Katalog-Endpunkten (platforms/
tariffs/cancellation-periods/… nutzen alle ressourcen-spezifische
Perms). Kommentar aktualisiert.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 16:35:47 +02:00
co-authored by Claude Opus 4.7
parent da3ae282fc
commit 217aa82b2a
2 changed files with 22 additions and 4 deletions
+11 -4
View File
@@ -8,9 +8,16 @@ const router = Router();
router.get('/', authenticate, contractCategoryController.getContractCategories);
router.get('/:id', authenticate, contractCategoryController.getContractCategory);
// Ändern/Löschen nur mit Entwickler-Berechtigung (Vertragstypen erfordern Formular-Anpassungen)
router.post('/', authenticate, requirePermission('developer:access'), contractCategoryController.createContractCategory);
router.put('/:id', authenticate, requirePermission('developer:access'), contractCategoryController.updateContractCategory);
router.delete('/:id', authenticate, requirePermission('developer:access'), contractCategoryController.deleteContractCategory);
// Ändern/Löschen: `contract-categories:*` wird per seed.ts an Admin-
// Rollen vergeben. Vorher stand hier `developer:access` mit dem
// Kommentar „Vertragstypen erfordern Formular-Anpassungen". Historische
// Design-Restriktion, die aber im Widerspruch zum Permission-Seed stand
// (Admin hatte `contract-categories:*` ohne Nutzen). Pentester R111 hat
// die Diskrepanz aufgedeckt; angeglichen an die sechs Peer-Endpunkte
// (platforms/tariffs/cancellation-periods/… nutzen alle ressourcen-
// spezifische Perms statt developer:access).
router.post('/', authenticate, requirePermission('contract-categories:create'), contractCategoryController.createContractCategory);
router.put('/:id', authenticate, requirePermission('contract-categories:update'), contractCategoryController.updateContractCategory);
router.delete('/:id', authenticate, requirePermission('contract-categories:delete'), contractCategoryController.deleteContractCategory);
export default router;
+11
View File
@@ -97,6 +97,17 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🔧 Pentest R111 contract-categories: falscher Permission-String**
- Der Pentester meldete 403 auf `POST/PUT/DELETE /api/contract-categories/*`
für Admin trotz vorhandener `contract-categories:*`-Permissions.
Vermutete Regression aus R110, war aber schon seit dem ersten
Commit so die Route verlangte `developer:access`, während der
Permission-Seed den Admins `contract-categories:*` gibt.
- Fix: Route auf `contract-categories:create/update/delete`
umgestellt, konsistent mit den sechs Peer-Katalog-Endpunkten
(platforms/tariffs/cancellation-periods/…). Kommentar aktualisiert,
damit die historische Design-Restriktion nicht wieder eingebaut wird.
- [x] **🔒 Pentest R110 Mass-Assignment-Whitelist auf 7 Update-Endpunkten**
- MEDIUM-Finding: `PUT /api/stressfrei-emails/:id` und 6 weitere Update-
Endpunkte (`platform`, `tariff`, `contractCategory`,