PdfDragButton: echten Datei-Inhalt (Blob) ziehen statt Link

Thunderbird & Co. hatten beim URL-basierten Drag nur einen LINK als
Anhang gespeichert (0 Bytes) und die Datei erst beim Senden nachgeladen
-> Fehler, weil kurzlebiger Token abgelaufen. Der User erwartet, dass
die Datei direkt angehaengt wird, nicht der Link.

Loesung: Datei wird vorab per Bearer-Auth (Axios-Instanz) als Blob
geladen und beim dragstart als echter Datei-Inhalt uebergeben:
dataTransfer.items.add(File) + DownloadURL mit lokaler blob:-URL.
-> Datei-INHALT wird uebertragen, kein Link.

Blob wird beim Mount vorgeladen (Ladezustand 'laedt ...'); der
Endpoint /files/download schreibt kein Audit-Log, daher kein Spam.

Security R131 damit vollstaendig erledigt: im Drag steckt weder eine
Server-URL noch ein Token -> ein Fehl-Drop kann gar nichts mehr leaken
(kein Access-, kein Download-Token). Token-Cache/getDownloadToken im
Drag-Pfad entfernt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 14:11:17 +02:00
co-authored by Claude Opus 4.8
parent 645d9a2624
commit 3073acb4b0
2 changed files with 105 additions and 122 deletions
+13 -9
View File
@@ -114,15 +114,19 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
unverändert) kein neuer Endpoint, keine neue Angriffsfläche. Ausweitung
auf weitere PDF-Stellen (Rechnungen, Vertragsdoks, Datenschutz) folgt bei
Bedarf über dieselbe Komponente.
- **Nachtrag Pentest R131 (LOW-MEDIUM, gefixt):** Erste Version hängte den
15-Min-Access-Token an und schrieb ihn per `text/plain`/`text/uri-list`
beim Drag mit → Fehl-Drop in ein Textfeld hätte den Voll-Token als
lesbaren Text geleakt. Fix: (a) kurzlebiger 60s-Download-Token
(`authApi.getDownloadToken()`, `type:"download"`, nur `?token=`) statt
Access-Token modul-weiter Cache, auf mount+hover vorgewärmt; (b) NUR
noch `DownloadURL` im DataTransfer, keine text/plain-Repräsentation →
Fehl-Drop in Text-/Chat-Feld erzeugt gar nichts. Klick-Vorschau nutzt
ebenfalls bevorzugt den Download-Token.
- **Nachtrag Pentest R131 + Funktions-Iteration → Blob-Ansatz (final):**
Zwischenstände (Access-Token → 60s-Download-Token, Text-Formate raus/rein)
hatten entweder ein Token-Leak-Risiko ODER hängten nur einen LINK an
(Thunderbird lud die URL erst beim Senden → 0 Bytes / Fehler, Token
abgelaufen). Endstand: Datei wird VORAB per Bearer-Auth als **Blob**
geladen und beim Drag als echter Datei-Inhalt übergeben
(`dataTransfer.items.add(File)` + `DownloadURL` mit lokaler `blob:`-URL).
→ Es wird der DATEI-INHALT übertragen, kein Link. Sicherheit R131 damit
vollständig erledigt: im Drag steckt WEDER Server-URL NOCH Token, ein
Fehl-Drop kann nichts mehr leaken. Blob wird beim Mount vorgeladen
(Ladezustand „lädt …", `/files/download` schreibt kein Audit-Log, daher
kein Audit-Spam). Zuverlässiges Datei-Drop v.a. in Chromium; Ziele ohne
File-Annahme → Klick-Fallback (Tab öffnen, manuell anhängen).
- [x] **📋 Vertragsformular: Copy-Buttons für Bankkarte (IBAN) + Ausweis** (2026-07-30)
- In „Kundendaten verknüpfen" je ein Kopieren-Button neben dem Label,