[Stabiliteit][P1] Instellingenbestand op Windows/Linux niet atomair; één afgebroken schrijfbeurt breekt elke volgende start #2628
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#2628
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?
Symptoom
Na een crash, een stroomstoring of het afsluiten van een vastgelopen OciDeck via Taakbeheer kan het gebeuren dat OciDeck bij elke volgende start opnieuw om toestemming vraagt, alle instellingen kwijt is, en bij elke wijziging "Instelling opslaan is mislukt" meldt — zonder uitleg of herstelroute.
Oorzaak
Op Windows en Linux slaat
shared_preferencesalles op in één JSON-bestand. Inshared_preferences_windows2.4.1 (lib/shared_preferences_windows.dart):localDataFile.writeAsStringSync(stringMap)(regel 394): niet atomair (het bestand wordt in-place afgekapt en herschreven), synchroon op de UI-isolate, en bij elkeset…het hele bestand;json.decode(readAsStringSync())(regel 361-363) zonder foutafhandeling.Een schrijfbeurt die halverwege wordt afgebroken laat een leeg of half bestand achter. Daarna gooit elke
SharedPreferences.getInstance()eenFormatException:SettingsNotifier._load()wordt zonderawaitofcatchaangeroepen (lib/state/settings_provider.dart:141): de fout gaat naar de zone-handler (in release onzichtbaar), de app draait op standaardwaarden;lib/state/consent_provider.dart:68-76) en vraagt dus elke start opnieuw; het wegschrijven van de toestemming faalt ook, dus dat blijft zo;_persist(settings_provider.dart:366) faalt en toont de snackbar.Twee gelijktijdige OciDeck-processen (#2627) vergroten de kans, omdat ze door elkaar heen hetzelfde bestand herschrijven.
Voorgestelde oplossing
SharedPreferences.getInstance(); bij eenFormatExceptionhet bestand hernoemen naarshared_preferences.json.corrupt-<tijd>, leeg verder gaan, en de gebruiker één keer melden: "Je instellingen waren beschadigd en zijn teruggezet; een kopie staat in …". Hetzelfde patroon alsRecoveryService.loadAllal gebruikt (quarantaine in plaats van verwijderen).writeStringAtomic(tijdelijk bestand + rename, met de Windows-terugval), achter dezelfde interfaces (ConsentStorebestaat al). Dat haalt ook de synchrone schrijfbeurten van de UI-isolate._load()-fouten inSettingsNotifiervangen en zichtbaar maken.Wat overeind moet blijven
Geheimen blijven in de sleutelhanger (niet in dit bestand); de toestemmingspoort blijft fail-closed voor het geval dat het bestand er gewoon nog niet is.
Toets
Test met een afgekapt
shared_preferences.json: de app start, vraagt één keer toestemming, kan daarna instellingen opslaan, en de beschadigde kopie staat ernaast.Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).