From 08f486a28c9deb29c6657c30f568c72decc084b7 Mon Sep 17 00:00:00 2001 From: sysops Date: Sat, 4 Jul 2026 12:38:55 +0200 Subject: [PATCH] docs(PROJ-46): QA-Testergebnisse (9/9 PASS auf 192.168.1.132) dokumentieren Co-Authored-By: Claude Sonnet 5 --- DEVLOG.md | 337 ++++++++++++++++++++ features/PROJ-46-email-login-tenant-user.md | 37 +++ 2 files changed, 374 insertions(+) diff --git a/DEVLOG.md b/DEVLOG.md index 36b813e..b9f8403 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -7806,3 +7806,340 @@ Keine Commits in dieser Session. - src/lib/api/routing_rules.ts | 94 ++++++++++++++++++++++++++++ --- +## 2026-07-03 23:45 – 23:46 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- af16138 docs: README aktualisieren, Dev-Log/Dateiindex/GoBD-Checklist/Screenshots ins Repo + +### Geänderte Dateien +- CODEBASE.md | 262 ++++++ +- DEVLOG.md | 7808 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- README.md | 782 +++++++++--------- +- docs/GOBD_DSGVO_CHECKLIST.md | 64 ++ +- resume | 1 + +- screenshots/2026-06-12_22-27.png | Bin 0 -> 59929 bytes +- screenshots/2026-06-13_00-14.png | Bin 0 -> 125637 bytes +- screenshots/2026-06-14_21-59.png | Bin 0 -> 81727 bytes +- screenshots/2026-06-14_22-00.png | Bin 0 -> 195105 bytes + +--- +## 2026-07-03 23:46 – 23:48 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- CODEBASE.md | 262 ++++++ +- DEVLOG.md | 7808 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- README.md | 782 +++++++++--------- +- docs/GOBD_DSGVO_CHECKLIST.md | 64 ++ +- resume | 1 + +- screenshots/2026-06-12_22-27.png | Bin 0 -> 59929 bytes +- screenshots/2026-06-13_00-14.png | Bin 0 -> 125637 bytes +- screenshots/2026-06-14_21-59.png | Bin 0 -> 81727 bytes +- screenshots/2026-06-14_22-00.png | Bin 0 -> 195105 bytes + +--- +## 2026-07-03 23:49 – 23:49 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- CODEBASE.md | 262 ++++++ +- DEVLOG.md | 7808 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- README.md | 782 +++++++++--------- +- docs/GOBD_DSGVO_CHECKLIST.md | 64 ++ +- resume | 1 + +- screenshots/2026-06-12_22-27.png | Bin 0 -> 59929 bytes +- screenshots/2026-06-13_00-14.png | Bin 0 -> 125637 bytes +- screenshots/2026-06-14_21-59.png | Bin 0 -> 81727 bytes +- screenshots/2026-06-14_22-00.png | Bin 0 -> 195105 bytes + +--- +## 2026-07-03 23:50 – 23:53 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- CODEBASE.md | 262 ++++++ +- DEVLOG.md | 7808 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- README.md | 782 +++++++++--------- +- docs/GOBD_DSGVO_CHECKLIST.md | 64 ++ +- resume | 1 + +- screenshots/2026-06-12_22-27.png | Bin 0 -> 59929 bytes +- screenshots/2026-06-13_00-14.png | Bin 0 -> 125637 bytes +- screenshots/2026-06-14_21-59.png | Bin 0 -> 81727 bytes +- screenshots/2026-06-14_22-00.png | Bin 0 -> 195105 bytes + +--- +## 2026-07-03 23:53 – 23:54 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- CODEBASE.md | 262 ++++++ +- DEVLOG.md | 7808 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- README.md | 782 +++++++++--------- +- docs/GOBD_DSGVO_CHECKLIST.md | 64 ++ +- resume | 1 + +- screenshots/2026-06-12_22-27.png | Bin 0 -> 59929 bytes +- screenshots/2026-06-13_00-14.png | Bin 0 -> 125637 bytes +- screenshots/2026-06-14_21-59.png | Bin 0 -> 81727 bytes +- screenshots/2026-06-14_22-00.png | Bin 0 -> 195105 bytes + +--- +## 2026-07-03 23:54 – 23:56 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- c274df5 fix(deploy): update.sh synchronisiert systemd-Units bei jedem Deploy + +### Geänderte Dateien +- update.sh | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-07-03 23:58 – 23:58 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- update.sh | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-07-03 23:59 – 00:01 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- update.sh | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-07-04 00:02 – 00:02 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- 04e5b0f fix(security-audit): HTTPS/Port-Checks erkennen nftables Set-Syntax nicht + +### Geänderte Dateien +- internal/api/admin_security_handlers.go | 33 ++++++++++++++++++++++++++++++--- + +--- +## 2026-07-04 00:08 – 09:43 (9h 34m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- internal/api/admin_security_handlers.go | 33 ++++++++++++++++++++++++++++++--- + +--- +## 2026-07-04 09:44 – 09:44 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- internal/api/admin_security_handlers.go | 33 ++++++++++++++++++++++++++++++--- + +--- +## 2026-07-04 09:44 – 10:49 (1h 04m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- internal/api/admin_security_handlers.go | 33 ++++++++++++++++++++++++++++++--- + +--- +## 2026-07-04 11:55 – 11:56 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- internal/api/admin_security_handlers.go | 33 ++++++++++++++++++++++++++++++--- + +--- +## 2026-07-04 12:00 – 12:00 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- features/INDEX.md | 4 ++-- +- features/PROJ-43-archivierungsregeln.md | 15 ++++++++++++++- +- features/PROJ-52-vollstaendigkeits-reconciliation.md | 21 ++++++++++++++++++--- + +--- +## 2026-07-04 12:01 – 12:05 (4m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- features/INDEX.md | 4 ++-- +- features/PROJ-43-archivierungsregeln.md | 15 ++++++++++++++- +- features/PROJ-52-vollstaendigkeits-reconciliation.md | 21 ++++++++++++++++++--- + +--- +## 2026-07-04 12:06 – 12:07 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- a739015 docs: GoBD-Checklist auf aktuellen Stand bringen (PROJ-52, PROJ-56c) + +### Geänderte Dateien +- docs/GOBD_DSGVO_CHECKLIST.md | 4 ++-- + +--- +## 2026-07-04 12:08 – 12:12 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- 6d67a6b docs: GoBD-Checklist auf aktuellen Stand bringen, Spec für PROJ-56c nachtragen + +### Geänderte Dateien +- docs/GOBD_DSGVO_CHECKLIST.md | 56 ++++++++++++++++++++++++++------------------------------ +- features/INDEX.md | 1 + +- features/PROJ-56c-cron-purge-markierte-mails.md | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-07-04 12:13 – 12:14 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- 17633cb docs: Migrations-Runbook für Compliance-Erhalt-Check ergänzen (GoBD Punkt 10) + +### Geänderte Dateien +- docs/GOBD_DSGVO_CHECKLIST.md | 18 +++++++----------- +- docs/MIGRATION_RUNBOOK.md | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-07-04 12:15 – 12:17 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- 45ac685 docs(PROJ-65): Spec für physische Tenant-Trennung im Storage-Layer + +### Geänderte Dateien +- features/INDEX.md | 3 ++- + +--- +## 2026-07-04 12:17 – 12:17 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- features/INDEX.md | 3 ++- + +--- +## 2026-07-04 12:20 – 12:21 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- bd72761 chore: Screenshots aus dem Repo entfernen + +### Geänderte Dateien +- .gitignore | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- screenshots/2026-06-12_22-27.png | Bin 59929 -> 0 bytes +- screenshots/2026-06-13_00-14.png | Bin 125637 -> 0 bytes +- screenshots/2026-06-14_21-59.png | Bin 81727 -> 0 bytes +- screenshots/2026-06-14_22-00.png | Bin 195105 -> 0 bytes + +--- +## 2026-07-04 12:23 – 12:25 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +- 8174456 docs: README auf aktuellen Stand bringen (PROJ-43/52 Deployed, Config-Referenz vervollständigt) + +### Geänderte Dateien +- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- + +--- +## 2026-07-04 12:26 – 12:27 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- + +--- +## 2026-07-04 12:27 – 12:27 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- + +--- +## 2026-07-04 12:28 – 12:28 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- + +--- +## 2026-07-04 12:38 – 12:38 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** archivmail + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- + +--- diff --git a/features/PROJ-46-email-login-tenant-user.md b/features/PROJ-46-email-login-tenant-user.md index f58d0e8..61ec749 100644 --- a/features/PROJ-46-email-login-tenant-user.md +++ b/features/PROJ-46-email-login-tenant-user.md @@ -76,6 +76,43 @@ Konkreter Support-Fall (2026-06-13): patrick@perlbach24.de konnte sich trotz Pas - Nicht-Tenant-User per E-Mail → Erfolg - Unbekannter Identifier → `invalid_credentials` +## QA Test Results (2026-07-04, QA Engineer) + +**Testumgebung:** Testserver 192.168.1.132 (nicht Produktiv 131). Dedizierte Test-User +angelegt und nach Test wieder entfernt: +- `qa46-tenant` / `qa46-tenant@perlbach24.de` (tenant_id=1, role user) — username ≠ email +- `qa46-super` / `qa46-super@example.com` (tenant_id NULL, role superadmin) +Passwort `TestPw123!` (bcrypt cost 12). Beide User + zugehörige `login_attempts` nach Testende +gelöscht (verifiziert: 0 verbleibende `qa46%`-User). Audit-Log-Einträge bleiben append-only +erhalten (GoBD). Keine bestehenden Accounts verändert. + +**Gesamtergebnis: BESTANDEN (9/9 Punkte pass, 0 Bugs).** + +| # | Testpunkt | Erwartung | Ergebnis | Status | +|---|-----------|-----------|----------|--------| +| 1 | Tenant-User Login per E-Mail | 200 | 200, `user.username=qa46-tenant` korrekt aufgelöst | PASS | +| 2 | Tenant-User Login per Username | 401 | 401 invalid_credentials | PASS | +| 3 | Non-Tenant (superadmin, tenant_id NULL) per Username | 200 | 200 | PASS | +| 4 | Non-Tenant per E-Mail | 200 | 200 | PASS | +| 5 | Unbekannter Identifier | 401 | 401 (`{"error":"invalid credentials"}`) | PASS | +| 5b | Tenant-E-Mail + falsches Passwort | 401 | 401 | PASS | +| 6 | Rate-Limiting mit E-Mail-String als Schlüssel | 429 nach Fehlversuchen | 429 ausgelöst; `login_attempts.username` speichert vollständige E-Mail (VARCHAR(255)) ungekürzt | PASS | +| 7 | Audit-Log protokolliert Fehlversuche mit eingegebenem Identifier | Identifier im Log | Fehlversuche geloggt mit exaktem Identifier (`qa46-tenant@perlbach24.de`, `qa46-tenant`), Detail `invalid_password`/`rate limited`; Erfolg loggt kanonischen `user.Username` | PASS | +| 8 | IMAP-Login (PROJ-26, VerifyPassword-Pfad) per Username unverändert | LOGIN completed | `a OK LOGIN completed` per Username auf Port 993; VerifyPassword unangetastet, genutzt in `internal/imapserver/server.go:380` | PASS | +| 9 | Frontend: `/` E-Mail-Label+type=email, `/admin/login` "Benutzername oder E-Mail-Adresse" | korrekt | Deployte Seiten: `/` rendert `E-Mail-Adresse` + `type="email"`; `/admin/login` rendert `Benutzername oder E-Mail-Adresse` (type=text) | PASS | + +**Code-Review-Notizen:** +- `VerifyLogin` (userstore.go): Email-Lookup → Fallback `username = $1 AND tenant_id IS NULL`. + Timing-Side-Channel geschlossen (Dummy-bcrypt bei No-Match). `VerifyPassword` unverändert. +- `Manager.Login` (auth.go:79) ruft `VerifyLogin`. LDAP-`extractDomain` bleibt kompatibel (E-Mail-Format). +- Kein Regressions-Fund gegen bestehende Auth-/IMAP-Features. + +**Hinweis (kein Bug, informativ):** Alle produktiven Tenant-User auf 132 haben aktuell +`username == email` (z.B. `patrick@perlbach24.de`), sodass ihr Username-Login weiterhin über +den Email-Match greift. Der Reject-Pfad (Punkt 2) wurde deshalb bewusst mit einem Test-User +`username != email` verifiziert. `homelocal-admin` (id 120) wäre ein produktiver Fall mit +abweichendem Username — Passwort unbekannt, daher nicht live geprüft. + ## Migration (bereits durchgeführt am 2026-06-13) - Datenqualitäts-Check auf 192.168.1.131: 0 Tenant-User mit fehlender/ungültiger E-Mail, 0 Username↔E-Mail-Kollisionen - `login_attempts.username` von VARCHAR(100) → VARCHAR(255) erweitert (idempotenter `initSchema`-Eintrag in `internal/userstore/userstore.go` ergänzt)