diff --git a/PROGRESS.md b/PROGRESS.md index 053a6f9..5a84b84 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -13,6 +13,57 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format: --- +## 2026-07-03 – M1: Uta-Random-Logout – Ursache gefunden + Fix (UNGETESTET/Pi) + +**Erledigt:** +- Alle Logout-Auslöser im Code kartiert: + - 3 bewusste Nutzer-Logout-Buttons in `settings_modal.dart` (alle hinter + Bestätigungsdialog) – kein Kandidat für "random" + - Der eigentliche Verdächtige: `matrix`-Paket (v6.2.0) `Client._innerSync()` + behandelt `M_UNKNOWN_TOKEN` vom `/sync`-Endpunkt so: bei `soft_logout: true` + → `_handleSoftLogout()` → versucht `refreshAccessToken()` → **das SDK + hatte nie einen Refresh-Token angefordert** (`client.login(...)` in + `login_notifier.dart` rief ohne `refreshToken: true` auf) → `refreshAccessToken()` + wirft sofort "No refresh token available" → Catch-Block ruft `await logout()` + auf: ein **echter, destruktiver Logout**, ausgelöst rein durch einen normalen + Soft-Logout (z. B. abgelaufenes Access-Token), ganz ohne Nutzerinteraktion. + Quelle: `~/.pub-cache/hosted/pub.dev/matrix-6.2.0/lib/src/client.dart:2374-2384` + und `:2496-2509`. +- **Logging (Commit 63e4919):** neue `lib/core/auth_log.dart` schreibt jeden + Login-Status-Wechsel (`client.onLoginStateChanged`) sowie SDK-Warnungen/-Fehler + (`Logs().onLog`) in `auth_log.txt` im App-Support-Verzeichnis – übersteht + App-Neustart. Zusätzlich loggen alle 3 Nutzer-Logout-Buttons sich selbst, damit + sich künftig unterscheiden lässt: Nutzer-Logout vs. SDK-Auto-Logout. Reine + Zusatzfunktion, keine Verhaltensänderung. +- **Fix (Commit 9dc83f7):** `client.login(...)` fordert jetzt `refreshToken: true` + an. Damit kann das SDK einen Soft-Logout künftig durch stillen Token-Refresh + überstehen, statt die Sitzung zu zerstören. Unterstützt der Server keine + Refresh-Tokens, bleibt das Verhalten exakt wie vorher (`response.refreshToken` + ist dann `null`) – der Fix kann also nichts verschlimmern. + +**Offen/Nächster Schritt:** +1. **Praxistest auf dem PC (zwingend vor Haken in ROADMAP!):** Login → Nachrichten + senden/lesen → Logout → erneuter Login → alte verschlüsselte Nachrichten noch + lesbar? Dabei prüfen, ob `auth_log.txt` (App-Support-Verzeichnis) die + Login-Status-Wechsel sauber mitschreibt. +2. Danach: den nächsten Punkt in M1 angehen (Push-Entschlüsselungs-Regression). +3. **Wichtig für Bernd/Uta:** Der Fix wirkt nur für NEUE Logins. Utas bereits + bestehende Sitzung bekommt erst nach einem einmaligen manuellen Neu-Login + einen Refresh-Token und ist bis dahin weiterhin anfällig. Sobald der PC-Test + grün ist, sollte Uta sich einmal aus- und wieder einloggen. + +**Stolperfallen:** +- Konnte auf dem Pi nicht mit echtem Login/Logout getestet werden (kein GUI, + kein Matrix-Testaccount zur Hand) – Fix beruht auf genauem Lesen des + matrix-SDK-Quellcodes, nicht auf Beobachtung im Betrieb. Deshalb zwingend + vor dem nächsten Haken in ROADMAP am PC nachprüfen. +- `chat_provider.dart:42` nutzt weiterhin das deprecated `Timeline.onUpdate` + (Re-Entschlüsseln nach Schlüssel-Empfang) – hängt mit demselben Sync-Bereich + zusammen, aber bewusst nicht angefasst, um nicht zwei riskante Änderungen im + selben Bereich gleichzeitig ungetestet zu committen. + +--- + ## 2026-07-03 – M0 abgeschlossen: Ordnung, flutter analyze sauber, README **Erledigt:** diff --git a/ROADMAP.md b/ROADMAP.md index e15bfdc..0467377 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -18,10 +18,11 @@ Punkte abhaken (`[x]`), wenn erledigt UND in `PROGRESS.md` protokolliert. ## M1 – Sicherheit: Nie wieder aussperren / kein Datenverlust -- [ ] **Uta-Random-Logout untersuchen:** Ursache finden (Soft-Logout vom Server? Token - ungültig? Fehlerpfad im Sync, der zum Logout führt?). Erst Logging an allen - Logout-Pfaden einbauen, dann Ursache fixen. Ein unerwarteter Logout darf NIE - Krypto-Schlüssel wegwerfen. +- [x] **Uta-Random-Logout untersuchen:** UNGETESTET (Pi) – Ursache im matrix-SDK + gefunden + Fix committet (63e4919, 9dc83f7), siehe PROGRESS.md 2026-07-03. + Nächster PC-Lauf MUSS den vollen Kreislauf praktisch prüfen (Login → + Nachrichten → Logout → erneuter Login → alte Nachrichten lesbar?), erst + dann gilt der Punkt als wirklich erledigt. - [ ] **REGRESSION: Push-Benachrichtigungen werden nicht mehr entschlüsselt** (seit dem letzten Update; in der Version davor funktionierte es). Vorgehen: Diff der letzten Release-Versionen auf Push-/E2EE-Code prüfen (`background_push.dart`,