Markdown-export kan ongemerkt het geopende brondocument overschrijven #1671
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1671
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Probleem
Bij export naar .md mag de gebruiker als uitvoerpad exact het momenteel geopende bronbestand kiezen. writeDocumentExport schrijft daar vervolgens de geprojecteerde/geredigeerde export atomisch overheen, terwijl de exportdialoog een kopie belooft en de in-memory editor niet als extern gewijzigd wordt bijgewerkt. Dit kan originele inhoud en metadata verliezen.
Reproductie
Verwacht
Export naar het bronpad wordt geblokkeerd of vraagt expliciet om een afzonderlijke, destructieve handeling; een gewone export verandert de bron niet.
Technische aanwijzing
_documentExport kent filePath/projectPath, maar _pickDocumentExportPath en writeDocumentExport vergelijken outputPath nergens met de bronlocatie.
Gevonden bij audit van commit
d439638c6b.Triage: accepted
Bevestigd tegen
main(e93ef205c).writeDocumentExport(lib/services/document_export_service.dart) kent alleenoutputPathen schrijft daar viawriteStringAtomicnaartoe; voormdis dat_projectedMarkdown(bundle, …)._pickDocumentExportPath(lib/widgets/document_editor_screen.dart) vergelijkt het gekozen pad nergens metstate.filePath, terwijl de aanroeper dat pad wél in handen heeft (_writeDocumentExportin hetzelfde bestand).Wat er dan gebeurt is erger dan "een bestand overschrijven": de export is de geprojecteerde body. In het geredigeerde profiel schrijft de gebruiker dus een geredigeerde versie over zijn eigen bron heen, terwijl de editor de oude tekst blijft vasthouden alsof er niets is — de volgende opslag maakt het definitief of draait het terug, maar hoe dan ook zonder dat iemand het zag.
Oplossingsrichting
Het brondocumentpad meegeven aan
_pickDocumentExportPathen aanwriteDocumentExport, en een uitvoerpad dat daarnaar wijst weigeren met een melding die zegt waarom ("een export is een kopie; kies een andere naam"). Vergelijken op het gecanoniseerde pad — symlinks opgelost, hoofdletterongevoelig waar het bestandssysteem dat is — en niet op stringgelijkheid.Weigeren, niet waarschuwen-en-doorgaan: er is geen geval waarin "exporteer over mijn eigen document heen" is wat iemand bedoelde. Wie zijn document wil normaliseren doet dat met Opslaan, en dat is een andere handeling.
Neem in dezelfde pas mee of de deck-export dit gat ook heeft; zo ja, apart issue, niet hier verbreden.
Regressietest (verplicht)
test/document_export_write_test.dart: export metoutputPathgelijk aan het bronpad → geweigerd (null), bronbestand byte-identiek. Plus een variant via een symlink of een andere schrijfwijze van hetzelfde pad, want dáár faalt een naïeve stringvergelijking.Kosten
Service + scherm + één nieuwe
l10n.d('…')⇒ 31 vertalingen (make add-l10n, zietaalbouwer). Halve dag.Prioriteit
Hoog binnen deze reeks: stil, onomkeerbaar verlies van het eigen document van de gebruiker.