diff --git a/backend/src/routes/contractCategory.routes.ts b/backend/src/routes/contractCategory.routes.ts index e56d8dbd..4240561a 100644 --- a/backend/src/routes/contractCategory.routes.ts +++ b/backend/src/routes/contractCategory.routes.ts @@ -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; diff --git a/docs/todo.md b/docs/todo.md index 3bcc22b1..207eb816 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -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`,