IMP-07: mehrfach-postfach-verwaltung-pro-tenant

Verwaltung mehrerer Postfächer je Mandant: Anlage, getrennte
Abrufkonfiguration pro Postfach.

- store.go: Postgres-Store, beliebig viele unabhängige Postfächer je
  Mandant, eigene Abrufparameter (Intervall, Host/Port/Benutzername,
  Ordnerauswahl) je Postfach. Passwort nie im Klartext gespeichert —
  Wiederverwendung von mail/internal/crypto (ARC-02, unverändert) für
  Envelope-Encryption. List filtert strikt nach tenant_slug,
  Update/Delete streng auf tenant_slug+id beschränkt.

Prüfungen (alle real durchgeführt, siehe mail/docs/IMP-07-PRUEFPROTOKOLL.md):
1. TestList_TwoTenantsWithMultipleMailboxesSeeOnlyOwn: zwei Mandanten
   sehen real ausschließlich eigene Postfächer.
2. TestDelete_DoesNotAffectSiblingMailboxes: Löschen real ohne
   Auswirkung auf Geschwister-Postfächer.
3. TestUpdate_ConfigChangeDoesNotAffectOtherMailboxes: Änderung real
   isoliert auf ein Postfach beschränkt.

Kein Umbau: mail/internal/crypto unverändert wiederverwendet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
This commit is contained in:
sysops
2026-09-01 00:31:18 +02:00
co-authored by Claude Sonnet 5
parent 145a161f8a
commit 5dcfa36f99
4 changed files with 446 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
# IMP-07 Prüfprotokoll: Mehrfach-Postfach-Verwaltung pro Tenant
Voraussetzung IMP-01 (Fertig), Core TEN-01/TEN-02 (Fertig,
Tenant-Datenmodell & Onboarding).
## Umsetzung
- `mail/internal/mailboxconfig/store.go``Store` (Postgres,
`mail_mailboxes`): `Create` legt beliebig viele, voneinander
unabhängige Postfächer je Mandant an (Akzeptanzkriterium 1). Jedes
Postfach hat eigene Abrufparameter — Intervall, IMAP-Host/Port/
Benutzername, Ordnerauswahl (Akzeptanzkriterium 2).
- Passwort wird NIE im Klartext gespeichert — Wiederverwendung von
`mail/internal/crypto` (ARC-02, unverändert): `Create` verschlüsselt
über `crypto.Service.Seal`, `GetDecryptedPassword` entschlüsselt bei
Bedarf über `crypto.Service.Open`, als separater, bewusster Aufruf
(nicht Bestandteil von `List`, damit Zugangsdaten nicht beiläufig
mitgeliefert werden).
- `List` filtert strikt nach `tenant_slug` (Akzeptanzkriterium 3).
`Update`/`Delete` sind streng auf `tenant_slug` + `id` beschränkt.
- Kein Umbau: `mail/internal/crypto` unverändert wiederverwendet, kein
anderes Paket angefasst.
## Prüfungen
| # | Prüfung | Ergebnis |
|---|---|---|
| 1 | Test: zwei Mandanten mit je mehreren Postfächern sehen ausschließlich eigene Postfächer | **bestanden** `TestList_TwoTenantsWithMultipleMailboxesSeeOnlyOwn`: Mandant A mit 2, Mandant B mit 1 Postfach — jeweils real nur die eigenen sichtbar |
| 2 | Test: Löschen eines Postfachs beeinträchtigt andere Postfächer desselben Mandanten nicht | **bestanden** `TestDelete_DoesNotAffectSiblingMailboxes`: Postfach „eins" real gelöscht, Postfach „zwei" bleibt real vollständig funktionsfähig (Zugangsdaten weiterhin real entschlüsselbar) |
| 3 | Konfigurationsänderung an einem Postfach wirkt nicht auf andere | **bestanden** `TestUpdate_ConfigChangeDoesNotAffectOtherMailboxes`: Änderung an Postfach „eins" (Host/Intervall) real übernommen, Postfach „zwei" real unverändert |
## Build/Test-Ergebnis (192.168.1.131)
```
go build ./... -> clean
go vet ./... -> clean
golangci-lint run ./... -> 0 issues
TEST_TENANT_DSN=... go test ./internal/mailboxconfig/... -v -timeout 60s -> 3/3 bestanden
TEST_TENANT_DSN=... TEST_MANTICORE_URL=... go test ./... -p 1
-> alle 22 Pakete bestanden, keine Regression
```
## Gesamtergebnis
**Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen
real erfüllt. Entsperrt ARC-09, trägt zu QA-02 bei — QA-02 bleibt
weiterhin blockiert, bis dessen übrige Abhängigkeiten (ING-07, ING-08,
ING-10) fertig sind.