bc6afefeae
Admin Set Password: - New setPassword adminProcedure in user router (Argon2 hashing) - Audit log: "Password reset by admin" (no password value logged) - UI: per-user "Password" button with key icon in User Management - Modal: new password + confirm, min 8 chars, mismatch validation - Success toast + auto-close on completion Dashboard fix: - Corrupted .next cache causing "Cannot find module worker.js" - Fixed by clearing .next cache and restarting dev server Co-Authored-By: claude-flow <ruv@ruv.net>
75 lines
2.7 KiB
Markdown
75 lines
2.7 KiB
Markdown
# Admin Set Password — Plan
|
|
|
|
## Anforderungsanalyse
|
|
|
|
**Was:** Admins sollen im User-Management das Passwort fuer beliebige User setzen/zuruecksetzen koennen.
|
|
|
|
**Ist-Zustand:**
|
|
- `user.create` Mutation hat Passwort-Support (Argon2 Hashing via `@node-rs/argon2`)
|
|
- Kein `setPassword` oder `resetPassword` Mutation fuer bestehende User
|
|
- UsersClient hat Passwort nur im Create-Formular, nicht im Edit-Bereich
|
|
|
|
**Soll-Zustand:**
|
|
- Neuer `setPassword` adminProcedure im user Router
|
|
- "Set Password" Button pro User im Admin-UI
|
|
- Passwort-Modal mit Eingabe + Bestaetigung
|
|
- Audit-Log Eintrag bei Passwort-Aenderung (ohne Passwort-Wert!)
|
|
|
|
---
|
|
|
|
## Betroffene Pakete & Dateien
|
|
|
|
| Paket | Dateien | Art der Aenderung |
|
|
|-------|---------|------------------|
|
|
| `packages/api` | `src/router/user.ts` | **edit** — `setPassword` Mutation hinzufuegen |
|
|
| `apps/web` | `src/components/admin/UsersClient.tsx` | **edit** — "Set Password" Button + Modal |
|
|
|
|
---
|
|
|
|
## Task-Liste
|
|
|
|
- [ ] **Task 1:** `setPassword` Mutation → `packages/api/src/router/user.ts`
|
|
- Input: `{ userId: string, password: string }` (min 8 Zeichen)
|
|
- adminProcedure (nur Admins duerfen Passwoerter setzen)
|
|
- Hash mit `@node-rs/argon2` (gleiches Pattern wie `create`)
|
|
- `db.user.update({ where: { id }, data: { passwordHash } })`
|
|
- Audit-Log: `createAuditEntry({ entityType: "User", action: "UPDATE", summary: "Password reset by admin" })`
|
|
- KEIN Passwort-Wert im Audit-Log (Sicherheit!)
|
|
|
|
- [ ] **Task 2:** UI — "Set Password" Button + Modal → `UsersClient.tsx`
|
|
- Pro User-Zeile: "Set Password" Button (Schloss-Icon)
|
|
- Klick oeffnet AnimatedModal mit:
|
|
- User-Name als Titel
|
|
- Neues Passwort Input (min 8 Zeichen)
|
|
- Passwort bestaetigen Input
|
|
- Validierung: Passwoerter muessen uebereinstimmen
|
|
- Submit-Button (disabled wenn <8 Zeichen oder nicht matching)
|
|
- Success: Toast "Password updated", Modal schliessen
|
|
- Error: Fehlermeldung anzeigen
|
|
|
|
---
|
|
|
|
## Abhaengigkeiten
|
|
|
|
- Task 1 muss vor Task 2 (API benoetigt fuer UI)
|
|
- Beide Tasks koennen in einer Sequenz implementiert werden (gleicher Agent)
|
|
|
|
---
|
|
|
|
## Akzeptanzkriterien
|
|
|
|
- [ ] `pnpm --filter @planarchy/web exec tsc --noEmit` — keine neuen Errors
|
|
- [ ] Admin kann Passwort fuer beliebigen User setzen
|
|
- [ ] Passwort wird mit Argon2 gehasht (nicht plaintext gespeichert)
|
|
- [ ] Audit-Log Eintrag wird erstellt (ohne Passwort-Wert)
|
|
- [ ] Min 8 Zeichen Validierung im UI und API
|
|
- [ ] Passwort-Bestaetigung muss uebereinstimmen
|
|
|
|
---
|
|
|
|
## Risiken & offene Fragen
|
|
|
|
- **Sicherheit:** Nur ADMIN-Rolle darf Passwoerter setzen (adminProcedure)
|
|
- **Audit:** Passwort-Wert DARF NICHT im Audit-Log erscheinen
|
|
- **UX:** Soll der User benachrichtigt werden? → Vorschlag: Nein, Admin setzt manuell und teilt dem User das Passwort separat mit
|