From e1f799513eb244bba30646a9f072015da6508cb0 Mon Sep 17 00:00:00 2001 From: Schalli Date: Tue, 11 Aug 2026 14:11:11 +0200 Subject: [PATCH] docs: close the LDAP bind password backlog item Notes what was deliberately left out: extracting and renaming the crypto service out of calendar/ touches five modules and belongs in its own change, so the existing provider is reused as-is and the naming smell is recorded in LdapModule instead. Co-Authored-By: Claude Opus 5 (1M context) --- .planning/STATE.md | 3 ++- .../2026-08-11-ldap-bindpasswort-unverschluesselt.md | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) rename .planning/todos/{pending => completed}/2026-08-11-ldap-bindpasswort-unverschluesselt.md (85%) diff --git a/.planning/STATE.md b/.planning/STATE.md index 70d7c5b..0896c0b 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -8,7 +8,7 @@ status: complete stopped_at: Phase 16 abgeschlossen — UAT durchgefuehrt, kritischer Sweep-Fehler gefunden und behoben (260811-f9i), Rest-Annahme A1 bewusst als offen akzeptiert last_updated: "2026-08-11T09:25:00.000Z" last_activity: 2026-08-11 -last_activity_desc: Phase 15 geschlossen (Bericht 15-04 nachgezogen) +last_activity_desc: LDAP-Bind-Passwort verschluesselt (4f687ea) progress: total_phases: 16 completed_phases: 15 @@ -309,6 +309,7 @@ None yet. | 260728-lih | LDAP: Sync strikt selektiv (leere Auswahl = No-Op statt Voll-Import) + Auto-Sync-Default aus (syncIntervalMin 60→0) | 2026-07-28 | c54e424,57bc7f9,63a07ab | [260728-lih-ldap-sync-selektiv-und-auto-sync-default](.planning/quick/260728-lih-ldap-sync-selektiv-und-auto-sync-default/) | | 260729-d3k | LDAP: Multi-Base-DN und Base-DN als Sync-Scope (statt leerer Gruppenfilter = No-Op) | 2026-07-29 | 5cbd530,96be7e1 | [260729-d3k-ldap-multi-base-dn-und-base-dn-als-scope](.planning/quick/260729-d3k-ldap-multi-base-dn-und-base-dn-als-scope/) | | 260805-d0r | Benutzer-Detail zeigte Gruppenmitgliedschaften aus Freigaben statt aus Mitgliedschaften — GET /module-grants/users/:userId liefert jetzt { groups, modules }, Chips mit Herkunfts-Badge; im Browser gegengeprüft: Mitgliedschaft bleibt sichtbar, auch wenn die Gruppe kein Modul freigibt | 2026-08-05 | ecadf69,f8ff74b,8ce3748 | [260805-d0r-benutzer-detail-zeigt-gruppenmitgliedsch](.planning/quick/260805-d0r-benutzer-detail-zeigt-gruppenmitgliedsch/) | +| 260811-enc | LDAP-Bind-Passwort war das einzige Zugangsdatum im Klartext in der DB. Jetzt AES-256-GCM ueber den bestehenden CalendarCryptoService, Spalte umbenannt zu encryptedBindPassword, Entschluesselung zentral in getConfig()/getAllActiveConfigs(), idempotenter Bootstrap-Backfill fuer Altbestand. Falscher Schluessel wirft, statt still "kein Passwort" zu liefern (sonst wuerde aus einem authentifizierten Bind unbemerkt ein anonymer) | 2026-08-11 | 4f687ea | (direct) | | 260811-j04 | DOE-Ausschreibungen verlinkten auf die API (rohes JSON) statt auf die Bekanntmachung — betraf Trefferliste, Detailansicht und Alarm-Mails. Adapter baut die URL jetzt aus der Bekanntmachungsnummer, Migration schreibt 2846 bestehende Zeilen in Tender und TenderSource um. Zielseite im Browser fuer beide Kennungsformen verifiziert (numerisch und UUID) — ein HTTP-Statuscheck taugt dort nicht, die Seite antwortet auf jede Kennung mit 200 | 2026-08-11 | ecf7872 | [260811-j04-doe-tender-links-point-to-the-api-instea](.planning/quick/260811-j04-doe-tender-links-point-to-the-api-instea/) | | 260811-f9i | KRITISCH: objectGUID-Existenzpruefung fand nie etwas — der Filter wurde als `\xx`-escapter String gebaut, ldapts wandelt das nicht in Rohbytes; beide Suchen (Base-DNs und WR-03-Fallback) teilten ihn, also haette der erste echte Sync JEDE AD-gebundene Gruppe samt Mitgliedschaften und Modulfreigaben geloescht. Jetzt EqualityFilter ueber den rohen Buffer, `escapeLdapFilterBuffer()` entfernt. Read-only am echten AD gemessen (escapter String 0 Treffer, EqualityFilter 1 korrekter Treffer); Regressionstests gegengeprueft (alter Code = 8 rote Tests) | 2026-08-11 | d2019dc | [260811-f9i-fix-objectguid-existence-sweep-to-use-eq](.planning/quick/260811-f9i-fix-objectguid-existence-sweep-to-use-eq/) | | 260805-fok | Standardgruppe bei Mandanten-Anlage + Startup-Reparatur — GroupsService.ensureDefaultGroup(tenantId) mit D-13-Waechter (null Gruppen, nicht fehlende Markierung), verdrahtet in TenantService.create und AdminSeedService.ensureDefaultGroupsForAllTenants; schliesst die Migrations-Backfill-Luecke auf frischen Installationen (Testserver: tenants=1 users=4 groups=0) | 2026-08-05 | 9d1254c,0d7d8a5 | [260805-fok-standardgruppe-bei-mandanten-anlage-und-](.planning/quick/260805-fok-standardgruppe-bei-mandanten-anlage-und-/) | diff --git a/.planning/todos/pending/2026-08-11-ldap-bindpasswort-unverschluesselt.md b/.planning/todos/completed/2026-08-11-ldap-bindpasswort-unverschluesselt.md similarity index 85% rename from .planning/todos/pending/2026-08-11-ldap-bindpasswort-unverschluesselt.md rename to .planning/todos/completed/2026-08-11-ldap-bindpasswort-unverschluesselt.md index ea45569..5b3f7e0 100644 --- a/.planning/todos/pending/2026-08-11-ldap-bindpasswort-unverschluesselt.md +++ b/.planning/todos/completed/2026-08-11-ldap-bindpasswort-unverschluesselt.md @@ -1,5 +1,13 @@ --- created: 2026-08-11 +resolved: 2026-08-11 +resolution: | + Behoben in Commit 4f687ea. Spalte heisst jetzt encryptedBindPassword, + Verschluesselung ueber den bestehenden CalendarCryptoService, Entschluesselung + zentral in getConfig()/getAllActiveConfigs(), Bootstrap-Backfill fuer + Altbestand, 9 neue Tests. Punkt 1 der Loesung (Dienst aus calendar/ + herausheben und umbenennen) bewusst NICHT mitgemacht — beruehrt fuenf Module + und gehoert in eine eigene Aenderung; im LdapModule als Notiz vermerkt. title: LDAP-Bind-Passwort liegt im Klartext in der DB, obwohl der Verschluesselungsdienst schon existiert area: ldap severity: major