fix(opslaan): front matter zonder body is een lege presentatie, geen kapotte (#1909) #1910
No reviewers
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!1910
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/1909-save-reread"
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?
Sluit #1909 — gemeld door
kwootmet een schermafdruk die precies de goede kant op wees.Wat er misging
Na het opslaan leest OciDeck het zojuist geschreven bestand terug: om de genormaliseerde vorm op te pakken en de bytes nog eens langs de veiligheidsscan te halen. Die teruglezing weigerde front matter zonder diablok als afgekapt bestand (#1350).
De aanname eronder stond letterlijk in het commentaar — "a valid save always emits at least one slide block after the frontmatter" — en klopt niet. Een dia die nog leeg is serialiseert naar niets. Front matter zonder body is dus precies de vorm die OciDeck zelf wegschrijft voor een presentatie waarvan de enige dia nog leeg is. Gevolg: het opslaan las zijn eigen bestand niet meer terug en meldde dat als fout, en — het ergere deel, dat niet in de melding stond — hetzelfde bestand opnieuw openen lukte daarna ook niet.
Gereproduceerd:
bullets,image,twoImagesenfreeMarkdownals enige, lege dia lopen erin, net als een deck zonder dia's.De afweging, hardop
Afgekapt en leeg zijn in de bytes identiek. Er viel dus niets te verfijnen, alleen te kiezen. De heuristiek is weg; front matter zonder body opent nu als lege presentatie.
De botsing: fail-closed (waarde 1) tegen uitwisselbaarheid en betrouwbaarheid. Uitwisselbaarheid wint hier, om drie redenen:
.mdmet alleen front matter is geldige Marp die een andere editor ons mag aanreiken. Die weigeren botst met de kernbelofte.Waarde 1 staat hier bovendien niet echt aan de andere kant: de gate die er toe doet —
MarkdownSafetyScanner, fail-closed op uitvoerbare inhoud — is onaangeroerd. De truncatie-check beschermde geen gegevens maar een diagnose: bij een echt afgekapt bestand was de body al weg vóór wij hem lazen. Dat is wat we opgeven, en dat staat zo in de code, de CHANGELOG enDOCUMENT_MODE.md.Waaronder ik van gedachten verander: zodra er een signaal bestaat dat afgekapt van leeg onderscheidt — een
Content-Length-mismatch in de transportlaag, bijvoorbeeld — mag de weigering terugkomen op de route die dat signaal heeft, zonder het schijf-pad te raken.Wat er verandert
openDeckDetailed(schijf) enopenDeckFromContent(download, import, git en WebDAV) weigeren niet langer op een lege body. Die tweede route trof de gebruiker in zijn eigen, keurig opgeslagen werk._looksTruncatedis verwijderd;DOCUMENT_MODE.mdnoemde hem bij naam als open vraag en is bijgewerkt.save_hardening,file_service, de corrupt-file-corpus) zijn omgezet naar de nieuwe, mét de reden erbij — de corpus bewaakt hier nu de andere helft van zijn belofte: opent zonder te crashen.Toetsen
test/bug_1909_empty_deck_roundtrip_test.dart, eerst rood tegen de onherstelde code. De derde toets reproduceert de melding uit de schermafdruk letterlijk.Poorten
make checkgroen (volledige suite, dekkingsvloer, goldens).make check-secretsenmake sastgroen. Niet gedraaid: DAST/ZAP — dit raakt het geserveerde oppervlak niet (geen headers, geen CSP, geen uitgaand verkeer); het is de acceptatiegrens van het lezen van een.md.Wat hier bewust niet in zit
De melding zelf noemt nog steeds geen reden. Ná deze fix vuurt hij vrijwel alleen nog bij
unsafe— een gebruiker die zelf<iframe>of<script>in een vrije-Markdown-dia typt, slaat op, krijgt dezelfde schrikmelding en kan het bestand daarna nooit meer openen. Dat is een echte tweede bevinding (gereproduceerd), maar een andere: hij vraagt een productbesluit over eigen invoer versus de veiligheidspoort, en een melding die zegt wat er aan de hand is en wat je nu kunt doen. Aparte issue waard, niet deze PR.De storingsstap uit de melding — een tweede opslaglocatie met dezelfde mapnaam — is nagelopen en is geen oorzaak: verbindingen zijn gesleuteld op uuid,
librariesmapt één-op-één en de bestemmingsdialoog selecteert op pad. Het open-pad raadpleegt de verbindingenlijst niet.