IMP-02: anhangsverarbeitung-bei-import

Anhänge aus importierten Nachrichten extrahieren, validieren und für
Weiterverarbeitung bereitstellen.

- mimeparse/tolerant.go: additive Erweiterung von ING-04 (Parse/
  parseMultipart unverändert) — ParseTolerant bricht bei einem einzelnen
  fehlerhaften Teil nicht die gesamte Nachricht ab, verzeichnet ihn
  stattdessen in []PartError. Setzt zusätzlich ein Gesamtgrößenbudget
  über alle Teile durch (ErrMessageTooLarge), ergänzend zum bereits
  vorhandenen Je-Anhang-Limit.
- attachments/attachments.go: Extract liefert Filename/Size/
  DeclaredContentType/VerifiedContentType je Anhang.
  VerifiedContentType kommt aus http.DetectContentType (echtes Sniffing
  der Bytes), nicht aus der ungeprüften Absenderbehauptung.

Prüfungen (alle real durchgeführt, siehe mail/docs/IMP-02-PRUEFPROTOKOLL.md):
1. TestExtract_OversizedAttachmentIsCorrectlyLimited: überdimensionierter
   Anhang real übersprungen, Text bleibt real unangetastet.
2. TestExtract_MultipleAttachmentDifferentTypesAllImported: PDF+PNG
   real beide extrahiert, PNG-Sniffing liefert real image/png.
3. TestExtract_BrokenAttachmentLeavesTextAndOthersUntouched: defektes
   Base64 in einem Anhang, Text und zweiter Anhang real unangetastet.

Kein Umbau: mimeparse Parse/parseMultipart (ING-04) unverändert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
This commit is contained in:
sysops
2026-08-31 23:59:17 +02:00
co-authored by Claude Sonnet 5
parent 03c47d98f4
commit 7238568918
4 changed files with 428 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
# IMP-02 Prüfprotokoll: Anhangsverarbeitung bei Import
Voraussetzung ING-04, IMP-01 (beide Fertig).
## Umsetzung
- `mail/internal/mimeparse/tolerant.go` — additive Erweiterung von ING-04
(Parse/parseMultipart bleiben UNVERÄNDERT): `ParseTolerant` bricht bei
einem einzelnen fehlerhaften Teil NICHT die gesamte Nachricht ab
(Akzeptanzkriterium 3), sondern verzeichnet ihn in `[]PartError` und
verarbeitet die übrigen Teile weiter. Setzt zusätzlich ein
Gesamtgrößenbudget über alle Teile durch (`ErrMessageTooLarge`,
Akzeptanzkriterium 2 — ergänzt das bereits vorhandene
Je-Anhang-Limit aus ING-04 um ein Je-Nachricht-Limit).
- `mail/internal/attachments/attachments.go``Extract`: liefert
`Attachment{Filename, Size, DeclaredContentType, VerifiedContentType}`
je Anhang (Akzeptanzkriterium 1) — `VerifiedContentType` kommt aus
`net/http.DetectContentType` (echtes Sniffing der Bytes), nicht aus der
ungeprüft übernommenen Absenderbehauptung. `Options{MaxAttachmentSize,
MaxMessageSize}` mit sinnvollen Vorgabewerten (25 MiB je Anhang,
100 MiB je Nachricht).
- Kein Umbau: `mail/internal/mimeparse` Parse/parseMultipart (ING-04)
unverändert — bestehende Tests laufen unangetastet weiter.
## Prüfungen
| # | Prüfung | Ergebnis |
|---|---|---|
| 1 | Test mit Nachricht, die einen überdimensionierten Anhang enthält, wird korrekt begrenzt | **bestanden** `TestExtract_OversizedAttachmentIsCorrectlyLimited`: Anhang über dem Limit wird real übersprungen (nicht extrahiert), Nachrichtentext bleibt real unangetastet |
| 2 | Test mit mehreren Anhängen unterschiedlichen Typs importiert alle korrekt | **bestanden** `TestExtract_MultipleAttachmentDifferentTypesAllImported`: PDF + PNG in einer Nachricht, beide real extrahiert, PNG-Anhang liefert real den korrekten gesniffeten Content-Type `image/png` (echte Magic-Bytes) |
| 3 | Test: ein defekter Anhang lässt Text und übrige Anhänge unangetastet | **bestanden** `TestExtract_BrokenAttachmentLeavesTextAndOthersUntouched`: ungültiges Base64 in einem Anhang, Nachrichtentext UND der zweite, gültige Anhang kommen real unverändert an |
## Build/Test-Ergebnis (192.168.1.131)
```
go build ./... -> clean
go vet ./... -> clean
golangci-lint run ./... -> 0 issues
go test ./internal/attachments/... -v -> 3/3 bestanden
TEST_TENANT_DSN=... TEST_MANTICORE_URL=... go test ./... -p 1
-> alle 16 Pakete bestanden, keine Regression (mimeparse: 6/6 weiterhin grün
nach additiver ParseTolerant-Erweiterung)
```
## Gesamtergebnis
**Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen
real erfüllt. Entsperrt IMP-06, trägt (gemeinsam mit IMP-03) zu IMP-09 bei.