Zeer lange documenttitel kan een ongeldige exportbestandsnaam opleveren #1677

Closed
opened 2026-08-21 12:02:11 +00:00 by brenno · 1 comment
Owner

Probleem

De voorgestelde exportnaam heeft geen maximale lengte. Een lange H1 of title in frontmatter kan een naam boven de gebruikelijke bestandssysteemlimiet opleveren, waarna de bestandskiezer of atomische write faalt. De fout verschijnt pas aan het eind van de exportflow.

Reproductie

  1. Maak een documenttitel van meer dan 255 veilige ASCII-tekens.
  2. Start een documentexport en accepteer de voorgestelde naam.
  3. Observeer de fout bij kiezen of schrijven.

Verwacht

De basisnaam wordt deterministisch begrensd met behoud van extensie en profieltag.

Technische aanwijzing

suggestedDocumentExportFileName normaliseert tekens maar kapt source/cleaned/base nergens af.

Gevonden bij audit van commit d439638c6b.

## Probleem De voorgestelde exportnaam heeft geen maximale lengte. Een lange H1 of title in frontmatter kan een naam boven de gebruikelijke bestandssysteemlimiet opleveren, waarna de bestandskiezer of atomische write faalt. De fout verschijnt pas aan het eind van de exportflow. ## Reproductie 1. Maak een documenttitel van meer dan 255 veilige ASCII-tekens. 2. Start een documentexport en accepteer de voorgestelde naam. 3. Observeer de fout bij kiezen of schrijven. ## Verwacht De basisnaam wordt deterministisch begrensd met behoud van extensie en profieltag. ## Technische aanwijzing suggestedDocumentExportFileName normaliseert tekens maar kapt source/cleaned/base nergens af. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted

Bevestigd tegen main (e93ef205c). suggestedDocumentExportFileName (lib/services/document_export_service.dart) normaliseert wel tekens maar kapt source, cleaned noch base af. Een lange # kop of title: levert dus een naam boven de gebruikelijke limiet, en de fout valt pas bij de bestandskiezer of bij de atomische schrijfactie — aan het eind van de exportflow, nadat de gebruiker alles al heeft ingevuld.

Oplossingsrichting

Begrens de basisnaam, niet de hele naam: reserveer eerst de ruimte voor -<tag>.<ext> en kap wat overblijft af op wat er binnen een budget van 255 past.

Twee dingen die je hier fout kunt doen:

  • Tel bytes, geen code-units. 255 is een byte-grens (ext4, APFS, NTFS). Een afgekapte naam van 255 tekens in het Grieks of Japans zit daar ruim overheen. Meet in UTF-8.
  • Kap op een rune-grens, anders blijft er een half teken staan.

Het totale pad is een aparte grens en niet van deze functie; die hoort de kiezer of de schrijfactie te melden.

Neem dit mee met #1675: dezelfde functie.

Regressietest (verplicht)

Unittest: titel van 1000 tekens → utf8.encode(naam).length <= 255, de naam eindigt nog op -volledig.md, en twee verschillende lange titels leveren verschillende namen op (deterministisch afkappen, geen botsing bij de eerste 200 tekens gelijk — als dat laatste te ver gaat, zeg het dan expliciet in de test in plaats van het stil te laten).

Kosten

Klein.

Prioriteit

Laag-middel: hinderlijk en laat zichtbaar, geen dataverlies.

## Triage: accepted **Bevestigd tegen `main` (e93ef205c).** `suggestedDocumentExportFileName` (`lib/services/document_export_service.dart`) normaliseert wel tekens maar kapt `source`, `cleaned` noch `base` af. Een lange `# kop` of `title:` levert dus een naam boven de gebruikelijke limiet, en de fout valt pas bij de bestandskiezer of bij de atomische schrijfactie — aan het eind van de exportflow, nadat de gebruiker alles al heeft ingevuld. ## Oplossingsrichting Begrens de **basisnaam**, niet de hele naam: reserveer eerst de ruimte voor `-<tag>.<ext>` en kap wat overblijft af op wat er binnen een budget van 255 past. Twee dingen die je hier fout kunt doen: - **Tel bytes, geen code-units.** 255 is een byte-grens (ext4, APFS, NTFS). Een afgekapte naam van 255 tekens in het Grieks of Japans zit daar ruim overheen. Meet in UTF-8. - **Kap op een rune-grens**, anders blijft er een half teken staan. Het totale *pad* is een aparte grens en niet van deze functie; die hoort de kiezer of de schrijfactie te melden. Neem dit mee met #1675: dezelfde functie. ## Regressietest (verplicht) Unittest: titel van 1000 tekens → `utf8.encode(naam).length <= 255`, de naam eindigt nog op `-volledig.md`, en twee verschillende lange titels leveren verschillende namen op (deterministisch afkappen, geen botsing bij de eerste 200 tekens gelijk — als dat laatste te ver gaat, zeg het dan expliciet in de test in plaats van het stil te laten). ## Kosten Klein. ## Prioriteit Laag-middel: hinderlijk en laat zichtbaar, geen dataverlies.
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#1677
No description provided.