Document opslaan overschrijft externe wijzigingen zonder conflictcontrole #1683
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#1683
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
Na het openen bewaart de documentstate geen bestandshash, mtime of andere versie-identiteit. Opslaan schrijft de in-memory bron daarom onvoorwaardelijk atomisch over het pad heen, ook als een andere editor, synchronisatietool of git-operatie het bestand sinds openen heeft gewijzigd.
Reproductie
Verwacht
Voor overschrijven wordt gecontroleerd of het bestand nog overeenkomt met de ingelezen/savepointversie; bij conflict krijgt de gebruiker vergelijken, herladen of bewust overschrijven.
Technische aanwijzing
DocumentState bewaart savedSource maar geen schijfversie. saveDocument schrijft direct via writeStringAtomic en saveDocumentWithDestination doet geen preflight-read/hashvergelijking.
Gevonden bij audit van commit
d439638c6b.Triage: accepted
Bevestigd tegen
main(e93ef205c).DocumentState(lib/state/document_provider.dart) bewaartsavedSourcemaar geen enkele identiteit van wat er op schijf staat.saveDocument(lib/services/file/file_service_open.dart) schrijft rechtstreeks viawriteStringAtomic, ensaveDocumentWithDestination(lib/widgets/shell/document_save_actions.dart) doet geen voorafgaande lezing.Het patroon staat al in de repo. Grafiekdata doet precies deze controle:
file_service_open.dartleest wat er op schijf staat, vergelijkt met de basislijn van bij het openen, en weigert mét waarschuwing bij een verschil. Wat daar geldt voor eendata/*.jsongeldt zeker voor het document zelf.Oplossingsrichting
_writeProjectdoet evenmin een controle) en hoort straks dezelfde poort te gebruiken. Maak daarvoor een eigen issue; dit issue blijft over het document.Regressietest (verplicht)
falsedie als schrijffout leest).Kosten
Grootste van deze reeks. Opslaglaag + state + dialoog, en de dialoog kost ongeveer vijf nieuwe
l10n.d('…')⇒ 31 vertalingen elk (make add-l10n). Reken op een dag.Prioriteit
Hoog: het werk van een ánder verdwijnt, en per definitie ziet niemand het gebeuren.
De presentatiekant staat nu apart: #1699. Die is scherper dan hier geschetst —
Deck.fileHashbestaat al (gezet bij openen én na elke schrijfactie), dus daar ontbreekt alleen de vergelijking vóór het schrijven. De dialoog en de poort horen gedeeld te worden met dit issue.