From c9f4fcf8de86703a7c89d6ee83ed76e8c1986e45 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Wed, 27 May 2026 02:30:54 +0200 Subject: [PATCH] fix: Portal-Passwort-Card im Vertragsdetail wieder sichtbar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Folge-Symptom zum PW-Save-Fix: das Speichern hat funktioniert, aber die "Zugangsdaten"-Card im Read-Only-View hat das Passwort- Feld nicht angezeigt. Ursache: das Frontend nutzte `c.portalPasswordEncrypted` als Truthy-Check, aber sanitizeContract strippt das Feld bewusst aus jeder Response (Pentest Runde 15 - kein verschlüsselter Blob in /contracts/:id). Fix: getContractById hängt jetzt ein virtuelles `hasPortalPassword`- Bool-Flag an die Response. Frontend nutzt das statt portalPasswordEncrypted. Der verschlüsselte Wert bleibt server-seitig; der Klartext kommt weiterhin über GET /contracts/:id/password mit Audit-Log. Live-verifiziert: PUT setzt PW, GET liefert hasPortalPassword:true + portalPasswordEncrypted ist NICHT in der Response. Co-Authored-By: Claude Opus 4.7 (1M context) --- backend/src/services/contract.service.ts | 7 +++++++ frontend/src/pages/contracts/ContractDetail.tsx | 6 +++--- frontend/src/types/index.ts | 5 ++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/backend/src/services/contract.service.ts b/backend/src/services/contract.service.ts index 7391b956..f25dcbf0 100644 --- a/backend/src/services/contract.service.ts +++ b/backend/src/services/contract.service.ts @@ -177,6 +177,13 @@ export async function getContractById(id: number, decryptPassword = false) { } } + // Virtuelles Bool-Flag, damit das Frontend "PW gesetzt?" weiß, ohne dass + // der verschlüsselte Blob in die Response leakt (sanitizeContract strippt + // portalPasswordEncrypted bewusst). Pentest Runde 15 – sensitive Feld + // raus aus /contracts/:id; UI nutzt jetzt `hasPortalPassword`. + (contract as Record).hasPortalPassword = + !!contract.portalPasswordEncrypted; + return contract; } diff --git a/frontend/src/pages/contracts/ContractDetail.tsx b/frontend/src/pages/contracts/ContractDetail.tsx index 16f42128..35d48630 100644 --- a/frontend/src/pages/contracts/ContractDetail.tsx +++ b/frontend/src/pages/contracts/ContractDetail.tsx @@ -2399,7 +2399,7 @@ export default function ContractDetail() { {/* Portal Credentials */} - {(c.portalUsername || c.stressfreiEmail || c.portalPasswordEncrypted) && ( + {(c.portalUsername || c.stressfreiEmail || c.hasPortalPassword) && (
{(c.portalUsername || c.stressfreiEmail) && ( @@ -2416,7 +2416,7 @@ export default function ContractDetail() { )} - {c.portalPasswordEncrypted && ( + {c.hasPortalPassword && (
Passwort
@@ -2435,7 +2435,7 @@ export default function ContractDetail() {
{/* Auto-Login Button */} - {c.provider?.portalUrl && (c.portalUsername || c.stressfreiEmail) && c.portalPasswordEncrypted && ( + {c.provider?.portalUrl && (c.portalUsername || c.stressfreiEmail) && c.hasPortalPassword && (