docs: README aktualisieren, Dev-Log/Dateiindex/GoBD-Checklist/Screenshots ins Repo

README: Feature-Tabelle und Inhaltsverzeichnis auf aktuellen Stand gebracht
(POP3, OCR, eDiscovery, DSGVO, Retention, LDAP, TOTP, IMAP-Server,
Prometheus, Tenant-Export etc. ergänzt).

Zusätzlich aufgenommen: CODEBASE.md (Dateiindex, Stand 2026-03-31 — vor
PROJ-44 eingefroren, sollte bei Gelegenheit aktualisiert werden), DEVLOG.md
(Session-Log), docs/GOBD_DSGVO_CHECKLIST.md (Compliance-Checkliste),
resume (Session-Notiz), screenshots/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-07-03 23:45:59 +02:00
co-authored by Claude Sonnet 5
parent 767373b206
commit af16138687
9 changed files with 8555 additions and 382 deletions
+262
View File
@@ -0,0 +1,262 @@
# archivmail — Dateiindex
> Vollständiger Überblick aller Dateien und ihrer Funktion. Stand: 2026-03-31.
---
## Konfigurationsdateien (Root)
- `go.mod` — Go-Moduldefinition (pgx, imap, smtp, jwt, ldap, crypto, yaml)
- `go.sum` — Go-Dependency-Lockfile
- `package.json` — Next.js/Node.js Projektdefinition (React, Tailwind, shadcn/ui)
- `package-lock.json` — npm-Lockfile
- `tsconfig.json` — TypeScript-Konfiguration
- `components.json` — shadcn/ui Konfiguration (Alias-Pfade, Style)
- `docker-compose.yml` — Docker-Komposedatei für lokale Entwicklung
- `config.test.yml` — Test-Konfiguration
- `CLAUDE.md` — Projektdokumentation für Claude (Architektur, Konventionen)
- `CODEBASE.md` — Dieser Dateiindex
- `DEVLOG.md` — Entwicklungslog
- `.eslintrc.json` — ESLint-Konfiguration
---
## cmd/ — Go-Einstiegspunkte
### cmd/archivmail/
- `main.go` — HTTP-API-Server: initialisiert Storage, Index, Auth, SMTP-Daemon, IMAP-Server, Audit, Mailer, Tenants, Labels, TokenStore
- `cmd_import.go``archivmail import`: EML/MBOX-Import mit --file/--dir/--recursive/--dry-run
- `cmd_export.go``archivmail export`: Export als EML/MBOX mit Filtern
- `cmd_import_piler.go``archivmail import-piler`: Import aus piler-Archiven
- `cmd_migrate_tenants.go``archivmail migrate-tenants`: E-Mails zu Mandanten-Index migrieren
- `version.go` — AppVersion + Modul-Versionen
### cmd/archivmail-export/
- `main.go` — Standalone-Export-Tool (alle Mails → EML-Verzeichnis)
### cmd/archivmail-import/
- `main.go` — Standalone-Import-Tool (EML-Batch mit Indexierung)
---
## internal/ — Interne Go-Pakete
### internal/api/
- `server.go` — Server-Struct, alle Routen, Middleware (auth, tenant, requireRole)
- `auth_handlers.go` — Login, Logout, Passwort-Änderung, TOTP-Init/Verify
- `onboarding_handlers.go` — Signup, Email-Verifikation, Forgot-Password, Reset-Password (PROJ-28)
- `invite_handlers.go` — Einladungslinks erstellen + prüfen (PROJ-28)
- `totp_handlers.go` — TOTP-Enrollment und Verification
- `search_handlers.go` — GET /api/search: Fulltext-Suche mit Paginierung
- `mail_handlers.go` — GET /api/mails/{id}: Mail-Abruf, Attachments, Raw
- `admin_handlers.go` — User-CRUD, Audit-Log, Health, Version
- `quota_handlers.go` — Tenant-Quota GET/SET, Usage-Abfrage (PROJ-29)
- `retention_handlers.go` — Retention-Policy, Purge (PROJ-34)
- `import_handlers.go` — Batch-Mail-Upload mit Progress-Tracking (Job-ID)
- `export.go` — Export-Endpoint (EML/ZIP)
- `dashboard_handlers.go` — System-Statistiken: Storage, Mails, Uptime, Aktivität
- `cert_handlers.go` — TLS-Zertifikat-Verwaltung
- `imap_settings_handlers.go` — IMAP-Modus-Konfiguration pro Tenant
- `label_handlers.go` — Label-CRUD + Auto-Rules
- `ldap_sync.go` — LDAP-Benutzer-Synchronisation
- `ldap_tenants.go` — Per-Tenant-LDAP-Endpoints (PROJ-23)
- `profile_handlers.go` — GET/PATCH /api/profile
- `version_handlers.go` — GET /api/version
- `upload.go` — Upload-Job-Management
### internal/auth/
- `auth.go` — JWT-Issuing, bcrypt-Passwort-Hashing, LDAP-Fallback, Tenant-Kontext
- `totp.go` — TOTP (RFC 6238), QR-Code-Generierung
### internal/audit/
- `audit.go` — Audit-Logger: DB + Flat-File, alle sicherheitsrelevanten Ereignisse
### internal/storage/
- `storage.go` — AES-256-GCM-Dateispeicher + PostgreSQL-Metadaten, SHA-256-Dedup
- `quota.go` — CheckQuota() mit 60s-Cache, ErrQuotaExceeded (PROJ-29)
- `storage_stats.go` — MailActivityStats(), StorageEstimateStats()
### internal/index/
- `index.go` — Indexer-Interface + Factory (Xapian, Stub)
- `xapian.go` — Xapian-CGO-Wrapper (Volltext-Index)
- `xapian_stub.go` — Stub für Builds ohne Xapian
- `worker.go` — Async Index-Worker (Queue)
- `tenant_manager.go` — TenantIndexManager (Pro-Tenant-Indizes)
- `tenant_worker.go` — Tenant-aware Index-Worker
### internal/imap/
- `store.go` — IMAP-Account-Store (verschlüsselte Credentials)
- `client.go` — IMAP-Client (Verbindung, Fetch)
- `importer.go` — IMAP-Importer (Sync → Storage)
- `scheduler.go` — Periodischer IMAP-Sync
### internal/imapserver/
- `server.go` — IMAP4-Archive-Server (Read-Only, PROJ-26)
### internal/pop3/
- `store.go` — POP3-Account-Store
- `client.go` — POP3-Client
- `importer.go` — POP3-Importer
### internal/smtpd/
- `smtpd.go` — SMTP-Daemon: eingehende Mails → Storage + Index, Tenant-Routing
### internal/ldapauth/
- `client.go` — LDAP-Authentifizierung gegen AD/OpenLDAP
### internal/ldapconfig/
- `store.go` — Globale LDAP-Konfiguration (verschlüsselt)
- `tenant_store.go` — Per-Tenant-LDAP-Konfiguration (PROJ-23)
### internal/mailer/
- `mailer.go` — SMTP-Out-Client via net/smtp (TLS + STARTTLS), kein externer Dependency
- `templates.go` — HTML+Text-Templates: Verify, Reset, Invite, AlreadyRegistered
### internal/userstore/
- `userstore.go` — User-CRUD: Create, CreateInactive, Activate, GetByEmail, SetPassword, VerifyPassword, Update, Delete, List
### internal/tenantstore/
- `store.go` — Tenant-CRUD + Domains, IMAP-Modus, Retention-Days, Logo
- `quota.go` — SetQuota(), GetQuota(), GetUsage() (PROJ-29)
### internal/labelstore/
- `store.go` — Label-CRUD + Auto-Rules (From/To/Subject-basiert)
### internal/tokenstore/
- `store.go` — auth_tokens: Create (32-Byte random, SHA-256), Use (einmalig), Peek, Cleanup (PROJ-28)
---
## pkg/ — Öffentliche Pakete
### pkg/mailparser/
- `parser.go` — RFC 5822 Parser: From, To, CC, Subject, Body (Text+HTML), Attachments
- `mbox.go` — MBOX-Splitter
---
## config/
- `config.go` — YAML-Konfiguration: ServerConfig (fqdn), APIConfig, StorageConfig, DatabaseConfig, SMTPConfig, SMTPOutConfig, IndexConfig, AuditConfig, IMAPServerConfig
---
## src/app/ — Next.js Seiten (App Router)
- `layout.tsx` — Root-Layout: Navbar, Theme-Provider, Toaster
- `page.tsx` — Login: Username/Passwort, Links zu Signup + Forgot-Password
- `signup/page.tsx` — Self-Service Registrierung (+ Invite-Token-Support)
- `verify/page.tsx` — Email-Verifikation via Token
- `forgot-password/page.tsx` — Passwort-Reset-Anfrage
- `reset-password/page.tsx` — Neues Passwort setzen via Token
- `search/page.tsx` — Fulltext-Suche mit Filtern, Pagination, Labels
- `mail/[id]/page.tsx` — Mail-Detail: Headers, Body, Attachments
- `settings/page.tsx` — Profil, Passwort, TOTP, Labels, IMAP/POP3
- `imap/page.tsx` — IMAP-Account-Konfiguration
- `pop3/page.tsx` — POP3-Account-Konfiguration
- `admin/page.tsx` — Admin-Dashboard (Multi-Tab)
- `admin/upload/page.tsx` — Batch-Mail-Import mit Progress
---
## src/components/
### src/components/ui/ (shadcn/ui Primitive)
`button`, `input`, `card`, `dialog`, `alert`, `alert-dialog`, `toast`, `toaster`, `sonner`, `select`, `checkbox`, `radio-group`, `switch`, `tabs`, `accordion`, `table`, `form`, `label`, `textarea`, `dropdown-menu`, `popover`, `tooltip`, `breadcrumb`, `pagination`, `badge`, `separator`, `scroll-area`, `skeleton`, `command`, `sheet`, `sidebar`, `navigation-menu`, `avatar`, `progress`, `collapsible`
### src/components/ (Business-Komponenten)
- `navbar.tsx` — Top-Navigation mit Logo, User-Menu, Theme-Toggle
- `UserNav.tsx` — User-Dropdown (Profil, Settings, Logout)
- `theme-toggle.tsx` — Light/Dark-Mode Toggle
- `theme-provider.tsx` — next-themes Provider
- `LabelList.tsx` — Label-Navigation
- `LabelPicker.tsx` — Label-Picker Dropdown
- `page-skeleton.tsx` — Loading-Skeleton
### src/components/admin/
- `ModulesTab.tsx` — Feature-Module-Übersicht
- `UserDialogs.tsx` — Create/Edit/Delete User Dialogs
- `TenantLDAPDialog.tsx` — LDAP-Konfiguration für Mandant
### src/components/admin/tabs/
- `DashboardTab.tsx` — System-Stats, Uptime, Mail-Aktivität, Storage-Prognose
- `UsersTab.tsx` — User-CRUD mit Rollen
- `TenantsTab.tsx` — Mandanten-CRUD + Domains
- `LDAPTab.tsx` — Globale LDAP-Konfiguration
- `TenantLDAPTab.tsx` — Per-Tenant-LDAP
- `LabelsTab.tsx` — Label + Auto-Rules Verwaltung
- `AuditTab.tsx` — Audit-Log Viewer
- `RetentionTab.tsx` — GoBD-Retention pro Tenant (PROJ-34)
- `QuotaTab.tsx` — Storage-Quota pro Tenant mit Usage-Balken (PROJ-29)
- `SecurityTab.tsx` — Security-Audit + Fixes
- `CertTab.tsx` — TLS-Zertifikat-Verwaltung
- `IMAPSettingsTab.tsx` — IMAP-Modus-Einstellung
- `ImportTab.tsx` — Batch-Import-Tool
- `ServicesTab.tsx` — Service-Status (SMTP, IMAP, POP3)
---
## src/lib/
### src/lib/api/
- `index.ts` — Re-Export aller API-Funktionen (Kompatibilität)
- `core.ts` — HTTP-Client mit Credentials, Error-Handling
- `users.ts` — User-API: getUsers, createUser, updateUser, deleteUser, TOTP
- `mail.ts` — Mail-API: searchEmails, getMail, downloadAttachment, IMAP/POP3
- `system.ts` — System-API: getHealth, getStats, getServices, getAuditLog, Labels, Certs
- `tenants.ts` — Tenant-API: CRUD, Domains, Logo, LDAP, Quota (PROJ-29)
- `ldap.ts` — LDAP-API: getLDAPConfig, saveLDAPConfig, testLDAP, syncLDAP
### src/lib/
- `auth-cache.ts` — Client-side Auth-Cache (localStorage, TTL)
- `utils.ts` — classname merging, Datums-Formatierung
---
## src/hooks/
- `useAuth.ts` — Aktueller User + login/logout
- `useLDAPConfig.ts` — Globale LDAP-Konfiguration
- `useTenantLDAPConfig.ts` — Per-Tenant-LDAP
- `useTenantUsers.ts` — Benutzer eines Mandanten
- `use-toast.ts` — Toast-Benachrichtigungen
- `use-mobile.tsx` — Responsive-Breakpoint (768px)
---
## features/ — Feature-Spezifikationen
| ID | Datei | Thema |
|----|-------|-------|
| PROJ-1 | `PROJ-1-authentifizierung-und-rollen.md` | JWT-Auth, RBAC |
| PROJ-2 | `PROJ-2-import-eml-mbox.md` | EML/MBOX-Import |
| PROJ-3 | `PROJ-3-import-imap.md` | IMAP-Sync |
| PROJ-4 | `PROJ-4-import-smtp.md` | SMTP-Daemon |
| PROJ-5 | `PROJ-5-speicherung-und-indexierung.md` | AES-256-GCM Storage, Xapian |
| PROJ-6 | `PROJ-6-volltext-suche.md` | Volltext-Suche |
| PROJ-7 | `PROJ-7-email-ansicht.md` | Mail-Viewer |
| PROJ-8 | `PROJ-8-imap-auto-sync.md` | IMAP-Scheduler |
| PROJ-9 | `PROJ-9-ordner-und-labels.md` | Labels + Auto-Rules |
| PROJ-10 | `PROJ-10-admin-bereich.md` | Admin-Panel |
| PROJ-11 | `PROJ-11-audit-log.md` | Audit-Logging |
| PROJ-12 | `PROJ-12-export.md` | EML/MBOX-Export |
| PROJ-13 | `PROJ-13-rest-api-crm.md` | REST-API für CRM |
| PROJ-14 | `PROJ-14-import-pop3.md` | POP3-Import |
| PROJ-15 | `PROJ-15-cli-import-export.md` | CLI-Tools |
| PROJ-16 | `PROJ-16-ldap-active-directory.md` | LDAP/AD-Integration |
| PROJ-17 | `PROJ-17-system-dashboard.md` | System-Dashboard |
| PROJ-18 | `PROJ-18-integritaetspruefung.md` | SHA-256-Integrity-Check |
| PROJ-19 | `PROJ-19-import-piler.md` | piler-Migration |
| PROJ-20 | `PROJ-20-nutzer-loeschung.md` | GoBD-konforme Löschung |
| PROJ-21 | `PROJ-21-multi-tenancy.md` | Multi-Tenancy |
| PROJ-22 | `PROJ-22-ldap-webgui.md` | LDAP-Web-GUI |
| PROJ-23 | `PROJ-23-tenant-ldap-pro-mandant.md` | Per-Tenant-LDAP |
| PROJ-24 | `PROJ-24-totp-zwei-faktor.md` | TOTP-2FA |
| PROJ-25 | `PROJ-25-user-profil-einstellungen.md` | User-Profil |
| PROJ-26 | `PROJ-26-imap-server-schnittstelle.md` | IMAP-Archive-Server |
| PROJ-27 | `PROJ-27-container-ready.md` | Docker-Support |
| PROJ-28 | `PROJ-28-self-service-onboarding.md` | Signup, Verify, Password-Reset |
| PROJ-29 | `PROJ-29-tenant-quotas.md` | Tenant-Quotas |
| PROJ-30 | `PROJ-30-bleve-migration.md` | Xapian → Manticore |
| PROJ-31 | `PROJ-31-billing-subscriptions.md` | Billing (geplant) |
| PROJ-32 | `PROJ-32-message-id-dedup.md` | Message-ID-Dedup |
| PROJ-33 | `PROJ-33-imap-modus-shared-personal.md` | IMAP Shared/Personal |
| PROJ-34 | `PROJ-34-retention-policy.md` | GoBD-Retention |
+7808
View File
File diff suppressed because it is too large Load Diff
+420 -382
View File
File diff suppressed because it is too large Load Diff
+64
View File
@@ -0,0 +1,64 @@
# GoBD/DSGVO-Compliance-Checkliste archivmail
Bewertung gegen den "Leitfaden zur E-Mail-Archivierung in Deutschland" (VOI-Grundsätze, GoBD, DSGVO).
Stand: 2026-06-13, basierend auf Code-Review (nicht nur Spec-Review).
## Zusammenfassung
**Gut abgedeckt:** Verschlüsselung at-rest (AES-256-GCM), Volltextsuche (Manticore), Audit-Log
in PostgreSQL mit Filterung/Export, Retention/Löschsperre (PROJ-34), Multi-Tenant-Rollenmodell,
Integritätsprüfung per SHA-256 (PROJ-18), Export in EML/MBOX/ZIP/CSV (PROJ-12, PROJ-15, PROJ-39, PROJ-47).
**Top-Lücken (priorisiert):**
1. **Audit-Log ist NICHT unveränderbar** kein DB-Trigger/Constraint gegen UPDATE/DELETE auf
`audit_log`, und die in PROJ-11 spezifizierte append-only Flat-File (`/var/log/archivmail/audit.log`,
JSON Lines) existiert im Code nicht. Das ist ein Kernpunkt von VOI-Grundsatz 8 (Protokollierung)
und wird bei einer Prüfung als erstes angeschaut.
2. **Verschlüsselung ist optional/deaktivierbar** `Keyfile` kann leer bleiben → kein "at rest"-Schutz
garantiert, kein erzwungenes Minimum.
3. **Keine Kennzeichnung/Klassifikation personenbezogener Daten** kein `contains_personal_data`
o.ä. Flag im Mail-Datenmodell; DSGVO-Löschkonflikt (Art. 17 vs. GoBD-Aufbewahrung) ist nirgends
im Code dokumentiert oder technisch abgebildet.
4. **Mindestaufbewahrung nicht erzwungen** `retention_days` ist frei konfigurierbar inkl. `0`
(kein Lock); es gibt keine Differenzierung nach Dokumentenart (6 vs. 10 Jahre vs. dauerhaft) und
kein erzwungenes Minimum von 10 Jahren für Buchungsbelege.
5. **Zeitstempel/Signaturerhalt (BSI TR 03125)** nicht implementiert (Nice-to-have, niedrige Priorität).
---
## Checkliste
| # | Anforderung | Status | Begründung / Codeverweis | Empfehlung |
|---|---|---|---|---|
| 1 | **Vollständigkeit** 100% Ein-/Ausgang archiviert | ⚠️ Teilweise | SMTP-BCC-Journal (PROJ-4), IMAP/POP3-Import (PROJ-3/14), EML/MBOX-Import (PROJ-2). SMTP-Daemon (`internal/smtpd/smtpd.go`) gibt bei Storage-Fehler `452` zurück → MTA-Retry, kein Verlust beim Empfang. Kein zentraler "Vollständigkeits-Reconciliation"-Mechanismus zwischen Mailserver-Log und Archiv. | Prüfung/Abgleich-Report (z.B. erwartete vs. archivierte Anzahl pro Tag) als neues Feature vorschlagen. |
| 2 | **Frühzeitigkeit** Archivierung bei Eingang/Ausgang | ✅ Erfüllt | SMTP-BCC-Journaling (PROJ-4) archiviert synchron beim Empfang/Versand; IMAP-Cron-Sync (PROJ-8) ergänzt. `internal/storage/storage.go:343 Save()` läuft direkt im Empfangspfad. | |
| 3 | **Unveränderbarkeit / Formaterhalt** | ✅ Erfüllt | `Save()` speichert Original-RFC2822-Bytes (ggf. gzip-komprimiert, PROJ-36) ohne inhaltliche Konvertierung; `Load()`/`maybeDecompress()` liefert Original zurück. Export liefert EML 1:1 (PROJ-12, `internal/api/export.go`). Kein Schreibzugriff/UPDATE auf gespeicherte Mail-Dateien im Code gefunden. | |
| 4 | **Zugriffsschutz** | ✅ Erfüllt | JWT-Auth (httpOnly Cookie), bcrypt Cost 12 (PROJ-1). Rollenmodell `user`/`auditor`/`admin` strikt getrennt; `admin` hat explizit KEINEN Mail-Zugriff. Tenant-Isolation via `tenantAccessAllowed()` (`internal/api/import_handlers.go:22`). | |
| 5 | **Wiederauffindbarkeit / Volltextsuche** | ✅ Erfüllt | Manticore-RT-Index (PROJ-30), Volltextsuche inkl. Anhänge via OCR (PROJ-35/44), Filter nach Datum/Absender/etc. (PROJ-6). | |
| 6 | **Aufbewahrungsfristen (konfigurierbar je Dokumentenart, i.d.R. 610 Jahre)** | ⚠️ Teilweise | `RetentionDays` global (`config/config.go:74`) und pro Tenant (`config/config.go:122`, Spalte `tenants.retention_days`) konfigurierbar — aber als EINZELNER Wert für alle Mails, keine Differenzierung nach Dokumentenart (Geschäftsbrief 6J / Rechnung 10J / Vertrag dauerhaft). `0` = kein Lock ist als Default zulässig (kein erzwungenes Minimum). | Spec-Erweiterung: Mindestwert (z.B. Warnung/Block unter 2190 Tagen) und/oder Kategorisierung nach Mail-Typ (PROJ-43 Archivierungsregeln könnte hierfür genutzt werden). |
| 7 | **Löschsperre** | ✅ Erfüllt | PROJ-34 implementiert: `emails.retain_until`, `ErrRetentionLock` (`internal/storage/storage.go:27,659-667`), `Delete()` verweigert Löschung vor Fristablauf, `Purge()` löscht nur abgelaufene Mails (`storage.go:710-718`). | |
| 8 | **Protokollierung/Audit-Log unveränderlich** | ❌ Fehlt | `internal/audit/audit.go:64-75` erstellt `audit_log`-Tabelle OHNE Trigger/Rule gegen `UPDATE`/`DELETE` (PROJ-11 AC: "kein UPDATE/DELETE durch Admin oder Anwendung möglich" — NICHT umgesetzt). Die geforderte append-only JSON-Lines-Datei (`/var/log/archivmail/audit.log`) existiert nicht im Code — nur `New(dsn, logDir, logger)` mit Kommentar "logDir is reserved for future". Audit-Events (Login, Suche, Export, Import) werden korrekt geschrieben, aber Unveränderbarkeit ist nicht garantiert. | PROJ-11 nachbessern: (a) PostgreSQL-Trigger/REVOKE UPDATE/DELETE auf `audit_log`, (b) append-only Flat-File-Logger implementieren. Hohe Priorität für GoBD-Prüfungen. |
| 9 | **Nachprüfbarkeit durch Dritte / GDPdU-Export** | ✅ Erfüllt | Export-Funktionen: Einzel-EML/PDF, ZIP-Massenexport mit `manifest.csv` (PROJ-12, `internal/api/export.go`), eDiscovery-ZIP mit `metadata.csv` + README (PROJ-39, `internal/api/ediscovery.go`), CLI-Export inkl. Tenant-Voll-Export (PROJ-15, PROJ-47, `cmd/archivmail/cmd_export.go`), Audit-Log-CSV-Export für Auditoren. | Optional: PROJ-47 (In Review) fertigstellen/QA. |
| 10 | **Migrationssicherheit** | ⚠️ Teilweise | Migrationstools vorhanden (PROJ-19 Mailpiler-Import, PROJ-30 Xapian→Manticore), `initSchema`/idempotente `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` Pattern durchgängig genutzt (z.B. `storage.go:99-100`). Kein dokumentierter "Compliance-Erhalt-Check" nach Migration (z.B. automatischer Verify-Lauf nach Schema-Änderung). | Migrations-Runbook + Post-Migration-Integritätscheck (kann PROJ-18-Job nach Migration triggern) dokumentieren. |
| 11 | **Maschinelle Auswertbarkeit (Standardformate)** | ✅ Erfüllt | Export als EML (Original-MIME, PROJ-12/15), MBOX (`cmd_export.go`), CSV-Metadaten (PROJ-39). | |
| 12 | **Zeitstempel/Signaturerhalt (BSI TR 03125)** | ❌ Fehlt | Keine S/MIME- oder PGP-Signaturprüfung, kein qualifizierter Zeitstempel-Dienst im Code gefunden. Für die meisten KMU nicht zwingend erforderlich. | Als Backlog-Item vermerken, nur bei Bedarf (signierte Mails im Kundenkreis) als neue Spec aufnehmen. |
| 13 | **Informationspflicht der Mitarbeiter** | ❌ Fehlt (organisatorisch) | Nicht im Code prüfbar/lösbar. | Organisatorische Maßnahme: Betriebsvereinbarung / Datenschutzhinweis außerhalb des Systems. |
| 14 | **Trennung/Kennzeichnung personenbezogener Daten, Löschkonflikt Art. 5/17/32** | ❌ Fehlt | Kein Feld wie `contains_personal_data` o.ä. im Mail-Datenmodell (`internal/storage/storage.go` Tabelle `emails`); PROJ-20 (Nutzer-Löschung) behandelt nur Anonymisierung von Nutzerkonten/Audit-Einträgen, nicht von Mail-Inhalten. Konflikt GoBD-Aufbewahrung vs. DSGVO-Löschanspruch ist nirgends dokumentiert oder im Code abgebildet (z.B. `Purge()` prüft nur `retain_until`, keine "Lösch-trotz-Anfrage-abgelehnt"-Logik mit Begründung). | Neue Feature-Spec: DSGVO-Auskunfts-/Löschersuchen-Workflow, der bei aktivem `retain_until` automatisch auf "Aufbewahrungspflicht hat Vorrang" verweist und dies dokumentiert/protokolliert. |
| 15 | **Mandantentrennung/Zugriffskontrolle nach Rolle (Multi-Tenant)** | ✅ Erfüllt | PROJ-21 Multi-Tenancy, `tenantAccessAllowed()` als Standardmuster (`internal/api/import_handlers.go:22`), Tenant-Quotas (PROJ-29), Pro-Tenant-Retention (`tenants.retention_days`). Laut Memory: keine physische Storage-Trennung pro Tenant (logische Trennung über `email_refs`/DB). | Bekannte Lücke (siehe Memory `project_tenant_isolation_review.md`): physische Storage-Trennung als optionales Härtungsfeature evaluieren, falls von Kunden gefordert. |
| 16 | **Verschlüsselung at-rest** | ⚠️ Teilweise | AES-256-GCM implementiert (`internal/storage/storage.go:154-...`, `encrypt()`), inkl. gzip vor Verschlüsselung (PROJ-36). ABER: `Keyfile` ist optional — `loadKey()` gibt bei leerem Pfad `nil` zurück → "no encryption configured" (`storage.go:126`). Es gibt keine Pflicht/Warnung im Setup, dass ein Keyfile gesetzt sein MUSS. | Setup-/Healthcheck-Warnung (evtl. in `archivmail status`, siehe letzter Commit) ergänzen, falls `Keyfile` leer ist — und/oder Pflichtfeld in Produktions-Config-Validierung. |
---
## Nächste Schritte (Vorschlag, Priorität absteigend)
1. **PROJ-11 nachbessern** (Audit-Log-Unveränderbarkeit): DB-Trigger gegen UPDATE/DELETE +
append-only JSON-Lines-Datei wie ursprünglich spezifiziert.
2. **Encryption-Pflicht**: Healthcheck/Setup-Validierung, dass `storage.keyfile` konfiguriert ist.
3. **Neue Spec**: DSGVO-Löschersuchen-Workflow mit GoBD-Vorrang-Dokumentation (Punkt 14).
4. **PROJ-34 erweitern**: Mindestaufbewahrung (kein `retention_days=0` als stiller Default in
produktiven Setups) + Differenzierung nach Dokumentenart (ggf. via PROJ-43 Regeln).
5. **Vollständigkeits-Reconciliation** (Punkt 1) als neues Feature evaluieren.
6. Nice-to-have: BSI TR 03125 Zeitstempel/Signaturerhalt (Punkt 12), nur bei konkretem Bedarf.
PROJ-47 (Tenant-Voll-Export, Status "In Review") sollte für Punkt 9 final abgeschlossen werden.
+1
View File
@@ -0,0 +1 @@
claude --resume e3017ff3-1f64-4f4d-b446-b2e51bf227df
Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB