Document opslaan/exporteren verdubbelt extensies met hoofdletters #1659

Closed
opened 2026-08-21 12:00:46 +00:00 by brenno · 2 comments
Owner

Probleem

De extensiecontrole is hoofdlettergevoelig. Een gebruiker die NAME.MD kiest bij Opslaan als krijgt NAME.MD.md; Report.PDF bij export wordt Report.PDF.pdf. Dit is zichtbaar op case-preserving platformen en kan verwarring of verkeerde bestandsassociaties geven.

Reproductie

  1. Kies Opslaan als en voer Document.MD in.
  2. Exporteer daarnaast naar Rapport.PDF.
  3. Controleer de uiteindelijke namen.

Verwacht

Bekende extensies worden hoofdletterongevoelig herkend en niet dubbel toegevoegd.

Technische aanwijzing

lib/services/file/file_service_open.dart:_writeDocumentToPicked en lib/widgets/document_editor_screen.dart:_pickDocumentExportPath gebruiken case-sensitive endsWith.

Gevonden bij audit van commit d439638c6b.

## Probleem De extensiecontrole is hoofdlettergevoelig. Een gebruiker die NAME.MD kiest bij Opslaan als krijgt NAME.MD.md; Report.PDF bij export wordt Report.PDF.pdf. Dit is zichtbaar op case-preserving platformen en kan verwarring of verkeerde bestandsassociaties geven. ## Reproductie 1. Kies Opslaan als en voer Document.MD in. 2. Exporteer daarnaast naar Rapport.PDF. 3. Controleer de uiteindelijke namen. ## Verwacht Bekende extensies worden hoofdletterongevoelig herkend en niet dubbel toegevoegd. ## Technische aanwijzing lib/services/file/file_service_open.dart:_writeDocumentToPicked en lib/widgets/document_editor_screen.dart:_pickDocumentExportPath gebruiken case-sensitive endsWith. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted

Bevestigd tegen main (e93ef205c).

  • lib/services/file/file_service_open.dartdest.endsWith('.md') ? dest : '$dest.md'.
  • lib/widgets/document_editor_screen.dartdest.endsWith('.$ext') ? dest : '$dest.$ext'.

Beide hoofdlettergevoelig, dus Document.MD wordt Document.MD.md en Rapport.PDF wordt Rapport.PDF.pdf.

Oplossingsrichting

Op beide plekken vergelijken via p.extension(dest).toLowerCase() in plaats van endsWith. Dat vangt en passant een tweede rafel in dezelfde regel: een gekozen pad zónder extensie maar mét een punt in een mapnaam wordt nu ook verkeerd gelezen.

Doe in dezelfde pas de deck-kant mee — saveDeckAs/pakketexport gebruiken hetzelfde patroon; als daar hetzelfde staat, hoort het in één wijziging, niet in een tweede issue dat over een half jaar nog open staat.

Regressietest (verplicht)

test/document_new_and_save_as_test.dart (of de dichtstbijzijnde file-service-test) met een kiezer die Document.MD teruggeeft → pad ongewijzigd; idem Rapport.PDF langs _pickDocumentExportPath.

Kosten

Klein: twee regels plus tests. Geen l10n.

Prioriteit

Laag-middel. Geen dataverlies, wel verwarring en verkeerde bestandskoppelingen op case-preserving systemen.

## Triage: accepted **Bevestigd tegen `main` (e93ef205c).** - `lib/services/file/file_service_open.dart` — `dest.endsWith('.md') ? dest : '$dest.md'`. - `lib/widgets/document_editor_screen.dart` — `dest.endsWith('.$ext') ? dest : '$dest.$ext'`. Beide hoofdlettergevoelig, dus `Document.MD` wordt `Document.MD.md` en `Rapport.PDF` wordt `Rapport.PDF.pdf`. ## Oplossingsrichting Op beide plekken vergelijken via `p.extension(dest).toLowerCase()` in plaats van `endsWith`. Dat vangt en passant een tweede rafel in dezelfde regel: een gekozen pad zónder extensie maar mét een punt in een mapnaam wordt nu ook verkeerd gelezen. Doe in dezelfde pas de deck-kant mee — `saveDeckAs`/pakketexport gebruiken hetzelfde patroon; als daar hetzelfde staat, hoort het in één wijziging, niet in een tweede issue dat over een half jaar nog open staat. ## Regressietest (verplicht) `test/document_new_and_save_as_test.dart` (of de dichtstbijzijnde file-service-test) met een kiezer die `Document.MD` teruggeeft → pad ongewijzigd; idem `Rapport.PDF` langs `_pickDocumentExportPath`. ## Kosten Klein: twee regels plus tests. Geen l10n. ## Prioriteit Laag-middel. Geen dataverlies, wel verwarring en verkeerde bestandskoppelingen op case-preserving systemen.
Author
Owner

De drie plekken buiten de documentmodus staan nu apart: #1700 (deck Opslaan als, stijlprofielexport, zegel-tijdstempelverzoek). Voorstel daar is één gedeelde withExtension-helper voor alle vijf de plekken; doe dit issue en #1700 in één pas.

De drie plekken buiten de documentmodus staan nu apart: #1700 (deck Opslaan als, stijlprofielexport, zegel-tijdstempelverzoek). Voorstel daar is één gedeelde `withExtension`-helper voor alle vijf de plekken; doe dit issue en #1700 in één pas.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1659
No description provided.