Extensiecontrole is hoofdlettergevoelig op de deck-, stijlprofiel- en zegelroute #1700

Closed
opened 2026-08-21 22:56:34 +00:00 by brenno · 0 comments
Owner

Probleem

De controle "heeft dit pad de juiste extensie al?" is op elke opslaan- en exportroute hoofdlettergevoelig. Wie Deck.MD kiest, krijgt Deck.MD.md. Zichtbaar op case-preserving bestandssystemen, en het levert dubbele extensies en verkeerde bestandskoppelingen op.

#1659 dekt de twee documentroutes. Dit issue dekt de drie andere plekken waar hetzelfde patroon staat, zodat de klasse in één keer weg is in plaats van half.

Reproductie

  1. Presentatie → Opslaan als → voer Presentatie.MD in. Uitkomst: Presentatie.MD.md.
  2. Stijlprofiel exporteren → voer een naam in met .OCIDECKSTYLE. Uitkomst: extensie er nog eens achter.
  3. Zegel → tijdstempelverzoek opslaan → voer verzoek.TSQ in. Uitkomst: verzoek.TSQ.tsq.

Verwacht

Bekende extensies worden hoofdletterongevoelig herkend en niet dubbel toegevoegd — op élke route, niet alleen bij het document.

Technische aanwijzing

Drie plekken met hetzelfde patroon, geen van drieën gedekt door #1659:

  • lib/services/file_service.dartsaveDeckAsDetailed: result.endsWith('.md') ? result : '$result.md'
  • lib/services/file/file_service_style_profile.dartdest.endsWith('.$ext') ? dest : '$dest.$ext'
  • lib/widgets/dialogs/seal_timestamp_dialog.dartpath!.endsWith('.tsq') ? path : '$path.tsq'

De twee uit #1659, ter volledigheid: lib/services/file/file_service_open.dart (document Opslaan als) en lib/widgets/document_editor_screen.dart (documentexport).

WebDAV en S3 doen het al goed: die vergelijken op lowerName.

Oplossingsrichting

Eén gedeelde helper — String withExtension(String path, String ext) in lib/utils/ — die vergelijkt via p.extension(path).toLowerCase() en de extensie alleen toevoegt als hij er niet al staat. Alle vijf de plekken (de drie hier plus de twee uit #1659) gaan erlangs; dan kan er geen zesde ontstaan die het weer zelf doet.

p.extension in plaats van endsWith vangt bovendien een tweede rafel in dezelfde regels: een gekozen pad zónder extensie maar mét een punt in een mapnaam wordt nu verkeerd gelezen.

Doe #1659 en dit in één pas. Vijf plekken die één helper krijgen is één wijziging; twee losse rondes langs dezelfde regels is werk voor niets.

Aangrenzende regel, niet dit issue

saveDeckAsDetailed bouwt zijn voorgestelde naam met RegExp(r'[^\w\s-]'). Dat is dezelfde ASCII-only-\w die in #1675 aan de documentkant staat: een deck met de titel Résumé heet Rsum.md, en een Chinese titel wordt leeg. Het is een andere fout in dezelfde functie — hoort bij #1675 (die vraagt al om te kijken of de deck-kant een tweede kopie heeft; die is dit), niet hier. Wie hier komt, doet ze allebei in één aanraking.

Regressietest

Servicetests met een kiezer die Presentatie.MD, profiel.OCIDECKSTYLE en verzoek.TSQ teruggeeft ⇒ pad ongewijzigd. Plus een unittest op de helper zelf: extensie ontbreekt, extensie in kleine letters, extensie in hoofdletters, punt in de mapnaam maar niet in de bestandsnaam.

Kosten

Klein: één helper (let op de registratieketen bij een nieuw bestand in lib/utils/SOURCE_MAP plus dekking), vijf aanroepplekken, een handvol tests. Geen l10n.

Gevonden bij de triage van #1659 (22-08-2026), geverifieerd tegen main (e93ef205c).

## Probleem De controle "heeft dit pad de juiste extensie al?" is op elke opslaan- en exportroute hoofdlettergevoelig. Wie `Deck.MD` kiest, krijgt `Deck.MD.md`. Zichtbaar op case-preserving bestandssystemen, en het levert dubbele extensies en verkeerde bestandskoppelingen op. #1659 dekt de twee documentroutes. Dit issue dekt de drie andere plekken waar hetzelfde patroon staat, zodat de klasse in één keer weg is in plaats van half. ## Reproductie 1. Presentatie → Opslaan als → voer `Presentatie.MD` in. Uitkomst: `Presentatie.MD.md`. 2. Stijlprofiel exporteren → voer een naam in met `.OCIDECKSTYLE`. Uitkomst: extensie er nog eens achter. 3. Zegel → tijdstempelverzoek opslaan → voer `verzoek.TSQ` in. Uitkomst: `verzoek.TSQ.tsq`. ## Verwacht Bekende extensies worden hoofdletterongevoelig herkend en niet dubbel toegevoegd — op élke route, niet alleen bij het document. ## Technische aanwijzing Drie plekken met hetzelfde patroon, geen van drieën gedekt door #1659: - `lib/services/file_service.dart` — `saveDeckAsDetailed`: `result.endsWith('.md') ? result : '$result.md'` - `lib/services/file/file_service_style_profile.dart` — `dest.endsWith('.$ext') ? dest : '$dest.$ext'` - `lib/widgets/dialogs/seal_timestamp_dialog.dart` — `path!.endsWith('.tsq') ? path : '$path.tsq'` De twee uit #1659, ter volledigheid: `lib/services/file/file_service_open.dart` (document Opslaan als) en `lib/widgets/document_editor_screen.dart` (documentexport). WebDAV en S3 doen het al goed: die vergelijken op `lowerName`. ## Oplossingsrichting Eén gedeelde helper — `String withExtension(String path, String ext)` in `lib/utils/` — die vergelijkt via `p.extension(path).toLowerCase()` en de extensie alleen toevoegt als hij er niet al staat. Alle vijf de plekken (de drie hier plus de twee uit #1659) gaan erlangs; dan kan er geen zesde ontstaan die het weer zelf doet. `p.extension` in plaats van `endsWith` vangt bovendien een tweede rafel in dezelfde regels: een gekozen pad zónder extensie maar mét een punt in een mapnaam wordt nu verkeerd gelezen. **Doe #1659 en dit in één pas.** Vijf plekken die één helper krijgen is één wijziging; twee losse rondes langs dezelfde regels is werk voor niets. ### Aangrenzende regel, niet dit issue `saveDeckAsDetailed` bouwt zijn voorgestelde naam met `RegExp(r'[^\w\s-]')`. Dat is dezelfde ASCII-only-`\w` die in #1675 aan de documentkant staat: een deck met de titel `Résumé` heet `Rsum.md`, en een Chinese titel wordt leeg. Het is een andere fout in dezelfde functie — hoort bij #1675 (die vraagt al om te kijken of de deck-kant een tweede kopie heeft; die is dit), niet hier. Wie hier komt, doet ze allebei in één aanraking. ## Regressietest Servicetests met een kiezer die `Presentatie.MD`, `profiel.OCIDECKSTYLE` en `verzoek.TSQ` teruggeeft ⇒ pad ongewijzigd. Plus een unittest op de helper zelf: extensie ontbreekt, extensie in kleine letters, extensie in hoofdletters, punt in de mapnaam maar niet in de bestandsnaam. ## Kosten Klein: één helper (let op de registratieketen bij een nieuw bestand in `lib/utils/` — `SOURCE_MAP` plus dekking), vijf aanroepplekken, een handvol tests. Geen l10n. Gevonden bij de triage van #1659 (22-08-2026), geverifieerd tegen `main` (e93ef205c).
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#1700
No description provided.