fix(import): Keynote-importfout zichtbaar, diagnostisch en sluitbaar #1459

Merged
brenno merged 3 commits from fix/keynote-import-melding into main 2026-08-12 07:13:49 +00:00
Owner

Samenvatting

De import van een .key-bestand faalde met "Kon Why security fails.key niet lezen als key-presentatie" — een foutmelding die (1) pas na 8s auto-dismissed, (2) geen diagnostische info gaf, en (3) geen duidelijke voortgang toonde. Deze PR lost alle drie:

  1. Fout zichtbaar en sluitbaar in het voortgangsvenster — de fout landt niet meer in een SnackBar die pas na 8s verdwijnt, maar in het bestaande PresentationImportProgressDialog zelf, met een "Sluiten"-knop als uitweg en een "Kopiëren"-knop voor de technische detail.
  2. Diagnostische info — de KeyImporter houdt bij welke stap loopt (uitpakken, preview, IWA, salvage) en noemt die in de foutmelding; bij "geen preview en geen IWA" somt hij op wat er wél in het archief zat (aantal bestanden, IWA-bestanden, preview/metadata aanwezig).
  3. Voortgang — het voortgangsvenster was al aanwezig (#875); deze PR hergebruikt het nu ook voor de foutweergave in plaats van een aparte snackbar.

Daarnaast een security-fix: _transportSafe riep cause.toString() om de exception verzendbaar te maken, maar FormatException.toString() plakt de ontlede bron in de melding — die bron kan persoonsgegevens bevatten. sanitizeError (al in gebruik door logError) stript die bron; nu ook toegepast voordat de cause de UI bereikt.

Testplan

  • make check groen (9289 tests, 86.9% dekking)
  • Nieuwe test: de cause wordt gesaneerd (geen brontekst in de foutmelding)
  • Nieuwe test: de KeyImporter-foutmelding bevat diagnostische archief-info
  • Nieuwe test: importFailureDetail bevat de message en de cause
  • Bijgewerkte test: het voortgangsvenster toont de fout en sluit pas na "Sluiten"
  • Bijgewerkte test: een onleesbaar bestand meldt de fout in het venster (niet in een snackbar)

Generated with Devin

## Samenvatting De import van een `.key`-bestand faalde met "Kon *Why security fails.key* niet lezen als key-presentatie" — een foutmelding die (1) pas na 8s auto-dismissed, (2) geen diagnostische info gaf, en (3) geen duidelijke voortgang toonde. Deze PR lost alle drie: 1. **Fout zichtbaar en sluitbaar in het voortgangsvenster** — de fout landt niet meer in een SnackBar die pas na 8s verdwijnt, maar in het bestaande `PresentationImportProgressDialog` zelf, met een "Sluiten"-knop als uitweg en een "Kopiëren"-knop voor de technische detail. 2. **Diagnostische info** — de `KeyImporter` houdt bij welke stap loopt (uitpakken, preview, IWA, salvage) en noemt die in de foutmelding; bij "geen preview en geen IWA" somt hij op wat er wél in het archief zat (aantal bestanden, IWA-bestanden, preview/metadata aanwezig). 3. **Voortgang** — het voortgangsvenster was al aanwezig (#875); deze PR hergebruikt het nu ook voor de foutweergave in plaats van een aparte snackbar. Daarnaast een security-fix: `_transportSafe` riep `cause.toString()` om de exception verzendbaar te maken, maar `FormatException.toString()` plakt de ontlede bron in de melding — die bron kan persoonsgegevens bevatten. `sanitizeError` (al in gebruik door `logError`) stript die bron; nu ook toegepast voordat de cause de UI bereikt. ## Testplan - [x] `make check` groen (9289 tests, 86.9% dekking) - [x] Nieuwe test: de cause wordt gesaneerd (geen brontekst in de foutmelding) - [x] Nieuwe test: de KeyImporter-foutmelding bevat diagnostische archief-info - [x] Nieuwe test: `importFailureDetail` bevat de message en de cause - [x] Bijgewerkte test: het voortgangsvenster toont de fout en sluit pas na "Sluiten" - [x] Bijgewerkte test: een onleesbaar bestand meldt de fout in het venster (niet in een snackbar) Generated with [Devin](https://devin.ai)
_transportSafe riep f.cause.toString() om de exception verzendbaar te maken
over de isolategrens, maar toString() plakt bij een FormatException de
ontlede bron in de melding — en die bron kan persoonsgegevens bevatten.
sanitizeError (al in gebruik door logError) stript die bron; pas hem hier
ook toe, zodat de cause die in de UI landt geen brontekst meer meedraagt.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
"Kon het .key niet lezen" was een raadsel: de fout zei niet wélke stap
struikelde, noch wat er wel in het archief zat. Nu:

- houdt de importer bij welke stap loopt (uitpakken, preview, IWA, salvage)
  en noemt die stap in de foutmelding bij een onverwachte uitzondering;
- somt bij "geen preview en geen IWA" op wat er wél in het archief zat
  (aantal bestanden, IWA-bestanden, preview/metadata aanwezig), zodat de
  gebruiker (en wij) kunnen zien of het een nieuw formaat is of iets anders.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
fix(import): toon de fout in het voortgangsvenster, niet in een snackbar
All checks were successful
scans / scans (pull_request) Successful in 6m6s
static-gate / static-gate (pull_request) Successful in 13m36s
f607f48669
De importfout landde in een SnackBar die na 8s auto-dismissed — te lang
voor een fout die de gebruiker wil lezen, en de enige uitweg was "Kopiëren"
drukken. Nu toont het voortgangsvenster zelf de fout, met:

- de vertaalde samenvatting (importFailureText);
- technische detail in een SelectableText (importFailureDetail: de ruime
  message + de gesaneerde cause), kopieerbaar voor een bugmelding;
- een "Sluiten"-knop als uitweg, naast "Kopiëren".

De snackbar in presentation_import_action.dart voor import-failures is
verwijderd; het venster toont de fout nu zelf.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit 89e304f833 into main 2026-08-12 07:13:49 +00:00
Sign in to join this conversation.
No description provided.