diff --git a/features/INDEX.md b/features/INDEX.md index 0e5f5a7..90326f5 100644 --- a/features/INDEX.md +++ b/features/INDEX.md @@ -24,7 +24,9 @@ | PROJ-10 | Deployment (Docker Compose + Synapse Installer) | Deployed | [PROJ-10-deployment.md](PROJ-10-deployment.md) | 2026-09-11 | | PROJ-11 | Chat (Matrix Client-Server API) | Planned | [PROJ-11-chat.md](PROJ-11-chat.md) | 2026-09-11 | -Noch nicht gestartet (siehe [docs/PRD.md](../docs/PRD.md) Core Features): Passwort-Reset, dedizierte Tenant-Isolation-Tests. P2 (Medien-Anhänge, Push) bewusst aus PROJ-11 ausgeklammert, siehe dessen Non-Goals. +Noch nicht gestartet (siehe [docs/PRD.md](../docs/PRD.md) Core Features): dedizierte Tenant-Isolation-Tests. P2 (Medien-Anhänge, Push) bewusst aus PROJ-11 ausgeklammert, siehe dessen Non-Goals. + +Nachträge 2026-09-11 (commit bc4d749): Passwort-Reset → [[PROJ-1]], Mitglied hart löschen → [[PROJ-3]]. diff --git a/features/PROJ-1-auth.md b/features/PROJ-1-auth.md index 39e47bf..f0cd0e6 100644 --- a/features/PROJ-1-auth.md +++ b/features/PROJ-1-auth.md @@ -13,16 +13,18 @@ E-Mail/Passwort-Auth mit JWT-Session für TalkTime. Grundlage für alle geschüt - `frontend/src/pages/LoginPage.tsx`, `RegisterPage.tsx` - `frontend/src/lib/auth-context.tsx` — Session-State im Frontend - `frontend/src/routes/ProtectedRoute.tsx` — Redirect bei fehlender Session +- **Nachtrag 2026-09-11 (commit bc4d749):** Passwort-Reset — `backend/src/db/schema.ts` (`password_reset_tokens`-Tabelle, 60min TTL, single-use), `POST /api/auth/forgot-password` + `POST /api/auth/reset-password/:token` in `backend/src/routes/auth.ts`, Mail-Versand über bestehenden `services/mail.ts`; Frontend: `ForgotPasswordForm.tsx`/`ResetPasswordForm.tsx`, `ForgotPasswordPage.tsx`/`ResetPasswordPage.tsx`, Link im `LoginForm.tsx` ## Acceptance Criteria - [x] Registrierung mit E-Mail + Passwort, Passwort gehasht (bcrypt, Cost 12) - [x] Login liefert JWT, generische Fehlermeldung bei falschen Zugangsdaten (kein User-Enumeration-Leak) - [x] Geschützte Frontend-Routen leiten unauthentifizierte Nutzer zum Login um - [x] Geschützte Backend-Routen verifizieren JWT via `request.jwtVerify()` +- [x] Passwort-Reset per E-Mail-Link, Token läuft nach 60min ab, einmalig verwendbar +- [x] `forgot-password` antwortet immer generisch, unabhängig davon ob die E-Mail registriert ist (kein Enumeration-Leak) ## Open Items -- Passwort-Reset (siehe PRD P0) noch nicht gebaut - E-Mail-Verification laut PRD P1 noch offen ## Notes -Retro-Spec: Feature war bereits produktiv im Code, INDEX.md/Spec wurden nachträglich nachgezogen. +Retro-Spec: Feature war bereits produktiv im Code, INDEX.md/Spec wurden nachträglich nachgezogen. Passwort-Reset am 2026-09-11 nachgebaut und getestet auf talkhub-LXC (192.168.66.8). diff --git a/features/PROJ-3-mitgliederverwaltung.md b/features/PROJ-3-mitgliederverwaltung.md index 66fa71a..8f20b57 100644 --- a/features/PROJ-3-mitgliederverwaltung.md +++ b/features/PROJ-3-mitgliederverwaltung.md @@ -10,14 +10,18 @@ Mitglieder eines Vereins verwalten: Liste, Status-Aktionen (aktivieren/deaktivie - `backend/src/routes/members.ts` - `frontend/src/pages/MembersPage.tsx` - Mitglied-Status-Aktionen + Deaktivierungs-Sync (commit b38a5a4) +- **Nachtrag 2026-09-11 (commit bc4d749):** `DELETE /api/members/:memberId` — Admin-only, hartes Löschen. Audit-Log-Eintrag wird vor dem Delete geschrieben (`audit_logs.targetId` ist unconstrained text, überlebt das Löschen). Matrix-Account wird per `deactivateUser(matrixUserId, erase=true)` gelöscht. Abhängige Daten (`parent_links`, `team_members`, `org_roles`) laufen über bestehende `onDelete: cascade`-FKs mit. Frontend: Bestätigungsdialog (`AlertDialog`) im Dropdown-Menü der Mitgliederliste. ## Acceptance Criteria - [x] Mitgliederliste pro Verein abrufbar (paginiert) - [x] Status ändern (aktiv/inaktiv) durch berechtigte Rollen - [x] Deaktivierung löst Sync-Schritt Richtung Matrix aus +- [x] Mitglied kann durch Org-Admin endgültig gelöscht werden (mit Bestätigungsdialog im Frontend) +- [x] Löschen entfernt/erased den zugehörigen Matrix-Account und alle abhängigen Datensätze (Team-Zuordnungen, Rollen, Eltern-Verknüpfungen) +- [x] Audit-Log-Eintrag bleibt nach dem Löschen erhalten ## Open Items - Vollständige Membership-Sync mit Outbox/Retry/Reconciliation laut PRD noch nicht fertig — aktuell nur direkter Sync-Aufruf, kein Retry-Mechanismus geprüft ## Notes -Retro-Spec. +Retro-Spec. Löschen-Feature am 2026-09-11 nachgebaut und getestet auf talkhub-LXC (192.168.66.8).