Pentest R104.1: Salutation-Endpunkte 404 statt 500

INFO-Finding: GET/PUT /api/customers/:id/salutation-preference
warfen bei nicht-existierendem Customer 500 statt 404.

canAccessCustomer prüft für Staff-User nur den Portal-Flag, kein
Existenz-Check. Der Service warf `new Error('Kunde nicht
gefunden')`, was der Controller-Catch generisch auf 500 mappte.
set/clear kamen als Prisma-P2003 (FK-Constraint) durch.

Fix:
- Neuer Helper assertCustomerExists() im customer.service, wirft
  ApiError(404, ...). Wird von get/set/clearSalutationPreference
  aufgerufen.
- Die drei Controller-Catches respektieren jetzt
  ApiError.statusCode → 404 kommt sauber durch, alle anderen
  Fehler bleiben bei 500.

Doku: docs/todo.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 09:19:42 +02:00
parent 3c190e43fb
commit e49133fd64
3 changed files with 43 additions and 4 deletions
+11
View File
@@ -97,6 +97,17 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🔒 Pentest R104.1 Salutation-Endpunkte: 404 statt 500**
- INFO-Finding: `GET/PUT /api/customers/:id/salutation-preference`
warfen bei nicht-existierendem Customer 500 statt 404.
- Ursache: `canAccessCustomer` prüft für Staff-User nur Portal-Flag,
kein Existenz-Check. Service warf `new Error(...)`, Controller-
Catch mappte generisch auf 500.
- Fix: neuer Helper `assertCustomerExists()` im Service wirft
`ApiError(404, ...)`. Die drei Controller-Catches respektieren
jetzt `ApiError.statusCode`. Auch `set`/`clear` prüfen Existenz
(sonst käme ein Prisma-P2003 als 500 durch).
- [x] **🔒 Pentest R102 Interne Vertragsnummer nachziehen**
- INFO-Finding: `contractNumber` (interne CRM-Nummer) hatte im
Update-Path keine Whitelist. `<script>alert(1)</script>`