Windows: geen installer, installeren is nu omslachtig voor gebruikers #1208
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#1208
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?
Platform: Windows
Probleem
Er is geen installer voor Windows. Daardoor is het installeren omslachtig voor gebruikers.
Verwacht gedrag
Een Windows-installer (bijvoorbeeld MSI of een setup-executable) zodat gebruikers OciDeck op de gebruikelijke manier kunnen installeren, met snelkoppelingen en een nette de-installatie.
Uitgewerkt plan: Windows-installer (#1208)
Terecht punt: bouwen vanaf bron met Visual Studio en de vastgezette
Flutter-toolchain is zwaar voor wie de app alleen wil gebruiken. Een installer
kan — binnen strakke grenzen. Dit is het plan; er wordt nog niets gebouwd.
Uitgangspunt: een domme, offline installer
De installer verpakt uitsluitend wat
make build-windowsal oplevert(
build/windows/x64/runner/Release/). Hij mag:windows/file-associations.regregistreren;Wat er niet in komt, en de harde grens is: geen auto-update, geen
versiecheck, geen phone-home, geen release-feed, geen "meld nieuwe versie". Op
het moment dat de installer zichzelf wil bijwerken, botst hij met de belofte in
SECURITY.mddat OciDeck niet naar huis belt en dat een fix je bereikt door dedefault branch te halen en opnieuw te bouwen. Die belofte blijft staan; de
installer is enkel gemak, geen update-kanaal.
De kernwaarden blijven overeind: decks blijven Markdown, geen lock-in, geen
account, geen server, geen telemetrie.
Techniekkeuze: Inno Setup
Voorkeur boven MSIX en WiX:
af en zit het "gewoon een map met een exe"-model in de weg.
Programs and Features-de-installatie +het importeren van de bestaande
.reg-sleutels met een klein, leesbaarscript. Het
.iss-script hoort inwindows/, naastfile-associations.reg.Code-signing (Authenticode) — meegenomen in het ontwerp
Ondertekenen van zowel
ocideck.exeals de installer, zodat SmartScreen nietop "onbekende uitgever" slaat — voor een securitytool een slecht signaal.
flutter build windowsen vóór het bundelen,plus de installer zelf ná het bouwen (
signtoolof Inno'sSignTool-hook).besluit — zie onder). Het certificaat en zijn sleutel worden niet in de
repo bewaard; de signing-stap leest ze uit een aparte, buiten de repo
bewaarde bron.
bouwt hij een ongetekende installer met een duidelijke waarschuwing in de
build-uitvoer, zodat een ontwikkelaar zonder cert niet vastloopt maar wél weet
dat het resultaat ongetekend is.
Borging zonder CI: een poort in
tool/Een installer valt structureel buiten
flutter test(geen Dart-gedrag; desktop-packaging draait niet onder de testrunner). De eerlijke borging is een poort in
tool/(in de trant vancheck_bundled_docs_fresh.dart) die vasthoudt dat:.iss-script enwindows/file-associations.regniet uit elkaar lopen —dezelfde ProgIDs, hetzelfde
ocideck.exe-pad;make build-windowsverpakt en niets anders.Zonder deze poort verrot het script stil bij de volgende hernoeming (zoals de
icon-set eerder). De feitelijke "werkt de installer" blijft een handmatige
Windows-build, want een CI-runner ontbreekt.
Documentatie en belofte
SECURITY.mddie de zin over "no signed installer" verzoent methet bestaan van deze installer: er is een offline installer voor gemak, hij
update zichzelf niet, een fix komt nog steeds via rebuild.
docs/BUILD.md(die de installer op regel 428-429 al noemt):hoe je hem bouwt en ondertekent.
Distributie
Geen CI-runner betekent dat elke installer-build een handmatige stap op
Windows is:
make build-windows→ ondertekenen → Inno Setup draaien →installer ondertekenen → als artefact bij de release-tag hangen. Dit is de echte
terugkerende kost van "er is een installer".
Rollen die meewegen
sluipt, wint de belofte en is het antwoord nee.
zichtbaarheid als "fabrikant" onder de CRA/productaansprakelijkheid t.o.v.
build-from-source. Geen blokkade, wel bewust te nemen vóór publicatie.
vertrouwen; daarom is signing in dit ontwerp meegenomen, niet uitgesteld.
Openstaande besluiten (voor jou)
en beheerd worden? Zonder is het een aankoop-/sleutelbeheerbeslissing.
elders? Er is bewust geen release-feed.
Vervolg wanneer je "bouwen" zegt
windows/ocideck.iss(Inno),tool/check_installer_sync.dart(poort),docs/BUILD.md-sectie,SECURITY.md-alinea, en eenmake build-windows-installer-doel. Bouwen en verifiëren gebeurt op een Windows-machine.
Besluiten (aanvulling op het plan)
1. Artefact → Forgejo. De installer hangt straks als bestand bij de
release-tag op deze tracker. Past bij "geen aparte release-feed".
2. Signing → eerst een gratis OSS-certificaat, dán bouwen. LibreKAT heeft nu
geen Authenticode-certificaat. Een ongetekende installer is afgewezen: Windows
SmartScreen toont dan "onbekende uitgever", en dat ondermijnt het vertrouwen in
uitgerekend een securitytool. In plaats daarvan eerst een gratis/goedkoop
code-signing certificaat regelen:
projecten (aanvraag met projectverificatie).
Gevolg voor de planning: de installer-build is geparkeerd tot het certificaat
binnen is. De aanvraag zelf (identiteits-/projectverificatie voor de stichting)
ligt bij LibreKAT, niet in deze repo. Zodra het cert er is, volgt het bouwwerk
uit het plan hierboven:
windows/ocideck.iss,tool/check_installer_sync.dart,de
docs/BUILD.md-sectie, deSECURITY.md-alinea en eenmake build-windows-installer-doel, met de signing-stap erin. Bouwen enverifiëren op een Windows-machine.
Er is een certificaat aangevraagd bij de SignPath Foundation, die dat voor open-sourceprojecten gratis doet. Op dit moment hebben we nog geen reactie op dat verzoek.
Gebouwd — PR #1582 (tak
feat/windows-installer)Het uitgewerkte plan hierboven is uitgevoerd, met drie afwijkingen die het waard zijn om te noemen.
1. Plaatsing:
packaging/windows/in plaats vanwindows/. Het plan noemdewindows/, naastfile-associations.reg. Sindsdien ispackaging/linux/ontstaan (#1227) als de plek voor verpakkingsmetadata.packaging/windows/ocideck.issspiegelt dat precedent en houdt Flutters eigen platformmap schoon.2. Borging: een test, geen
tool/-poort. Het plan vroeg omtool/check_installer_sync.dart, met als argument dat een installer buitenflutter testvalt. Dat argument klopt, maar #1227 had hetzelfde probleem al opgelost mettest/linux_packaging_test.dart— een offline bedradingstest.test/windows_packaging_test.dartvolgt die vorm. Voordeel boven eentool/-poort: hij draait automatisch mee in de suite én staat inREGISTRATION_TESTS, dus hij bijt vóór de merge in plaats van erna. Een tweede mechanisme naast een werkend precedent leek geen winst.3. De aanname "geen CI-runner" is onjuist. Het plan (en mijn eigen eerste versie van de documentatie) ging ervan uit dat een installer per definitie handwerk is. De forge heeft inderdaad geen Windows-machine, maar
.github/workflows/release.ymlop de spiegel bouwt bij elkev*-tag de Windows-zip die de forge metcurlterughaalt. De installer in díe lijn hangen is dus een open besluit en geen onmogelijkheid. Dat is rechtgezet in de documentatie en krijgt een eigen issue.Openstaande besluiten uit het plan
1. Authenticode-certificaat — uitgesteld. De ondertekening zit als schakelaar in
scripts/build_windows_installer.sh: uit is de standaard en het script waarschuwt luid, aan is alles-of-niets. Het accepteert uitsluitend een vingerafdruk uit de certificaatopslag, geen sleutelbestand en geen wachtwoord, zodat ondertekenmateriaal nooit een omgevingsvariabele of runner-geheim kan worden. #1013 blijft daarmee gewoon staan.2. Waar het artefact landt — nog open, met één voorwaarde erbij. De bewakerstoets leverde hier een botsing op die niet stilzwijgend gemaakt mag worden: een installer vraagt om verhoging, en een óngetekende installer die om verhoging vraagt leert een slechtere gewoonte aan dan een ongetekende app die je zelf uitpakt — mensen klikken installatievensters weg, en juist daar komt "Onbekende uitgever" te staan. Publiceren is dus een andere beslissing dan bouwen. De voorwaarde staat vastgelegd in
docs/BUILD.md: wordt de installer gepubliceerd, dan moet hij inSHA256SUMSstaan en dus onder de minisign-handtekening over dat manifest vallen. Die handtekening komt in de plaats van het afgewezen certificaat.Wat er niet in zit
Geen bijwerken, geen versiecontrole, geen release-feed, geen netwerk — de grens die de bewaker stelde. Dat staat niet op goede bedoelingen: de poort laat de bouw vallen zodra er een downloader óf een
[Code]-sectie in het script verschijnt, dat laatste omdat dáár een versiecontrole zich zou verstoppen. De alinea inSECURITY.mdverzoent de belofte "geen installer die zichzelf bijwerkt" met het bestaan van deze installer.Tot het besluit over publicatie valt, levert een release nog steeds alleen de zip. Dat staat ook zo in de changelog, zodat niemand naar een download zoekt die er niet is.