From f2b9afbfea84bbeaf00b1a1c33310ad886eae091 Mon Sep 17 00:00:00 2001 From: Bernd Steckmeister Date: Mon, 6 Jul 2026 18:28:25 +0200 Subject: [PATCH] test: SQLCipher auf Android-Emulator verifiziert (Neuanlage verschluesselt, Klartext-Migration, Neustart ohne Re-Migration) Co-Authored-By: Claude Fable 5 --- PROGRESS.md | 53 +++++++++++++++++++++++++++++++++++++ ROADMAP.md | 10 ++++--- android/gradle.properties | 4 +++ docs/SQLCIPHER_MIGRATION.md | 19 ++++++++++--- 4 files changed, 80 insertions(+), 6 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index a839d5e..137c423 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -13,6 +13,59 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format: --- +## 2026-07-06 – SQLCipher auf ANDROID getestet (Emulator API 36): Neuanlage, Migration und Neustart grün + +**Erledigt:** Der größte offene Teil von Testplan Punkt 4 +(`docs/SQLCIPHER_MIGRATION.md`) ist jetzt real auf Android belegt – kein +Gerät angeschlossen, aber der vorhandene Emulator (Medium Phone API 36.1, +x86_64, MIT Play Services) reicht für die DB-Schicht: + +- **Szenario A – frische Installation:** Debug-APK installiert, App + gestartet → `pyramid.sqlite` wird von Anfang an VERSCHLÜSSELT angelegt + (Header = Zufallsbytes statt „SQLite format 3", per `run-as`/`od` + verifiziert); auth_log ohne Cipher-Fallback oder Fehler. +- **Szenario B – Update-Szenario (Utas Fall):** `pm clear` (auch der + Keystore-Eintrag weg) + synthetische Klartext-DB (2 Tabellen, 550 + Zeilen) VOR dem ersten Start in `files/` gelegt → beim Start lief die + echte Migration: auth_log „Klartext-DB erfolgreich nach SQLCipher + migriert (2 Tabellen verifiziert)", `.premigration`-Backup liegt da, + DB danach verschlüsselt, App lief normal weiter (Login-Screen, + Screenshot geprüft). **Bewusst NICHT mit Bernds echter DB getestet** – + die enthält seine Session/Olm-Account, ein Duplikat auf einem zweiten + „Gerät" würde den E2EE-State korrumpieren. +- **Szenario C – Neustart:** force-stop + Relaunch → verschlüsselte DB + öffnet mit dem Schlüssel aus dem Android-Keystore, KEINE zweite + Migration, kein Fehler. Damit sind `openCipherOnAndroid`, + `sqlcipher_export` und flutter_secure_storage auf Android + (Haupt-Isolate) praktisch belegt. +- Doku nachgezogen: Status-Kopf `docs/SQLCIPHER_MIGRATION.md`, + ROADMAP-M1-Vermerk. Emulator danach heruntergefahren. Nebenbei: + `android/gradle.properties` bekam beim APK-Build automatisch zwei + Flutter-Migrator-Flags (`builtInKotlin=false`, `newDsl=false` – pinnt + bestehendes Verhalten), mit committet. + +**UNGETESTET bleibt (ROADMAP-Punkt weiter NICHT abgehakt):** echtes +ARM-Gerät, Migration einer ECHTEN eingeloggten Session auf Android und +der Push-Test (FCM-Background-Isolate liest verschlüsselte DB, +secure_storage im Background-Isolate) – braucht ein Testgerät mit +eingeloggtem Account (Login-Daten hat nur Bernd). Erst danach Release +und Utas Gerät. + +**Offen/Nächster Schritt:** auth_log-Check des weiterlaufenden +Windows-Beobachtungslaufs (Einträge seit 2026-07-06 18:19). Für Bernd +unverändert: PC_TESTPLAN 1 (Rest) + 2–8 durchklicken; fürs +SQLCipher-Finale ein echtes Android-Gerät anstecken (Debug-Build reicht, +Ablauf wie hier im Emulator). + +**Stolperfallen:** (1) Ein Dart-Skript außerhalb des Repos kann +`package:`-Imports nicht auflösen – Hilfsskripte kurz ins Repo legen +(`tool/`, untracked) und nach dem Lauf löschen. (2) Für Datei-Zugriff im +App-Sandbox-Verzeichnis braucht es eine DEBUG-APK (`run-as` geht nur bei +debuggable); das Emulator-Image hat kein `sqlite3`-Binary – Test-DBs +also am PC bauen und pushen. + +--- + ## 2026-07-06 – auth_log-Check 17:43-Fenster: echter ~7-min-Netzausfall OHNE Logout überstanden (stärkster Positiv-Befund bisher) **Erledigt:** Vierte PC-Session, zuerst der Pflicht-Check der Vorsession diff --git a/ROADMAP.md b/ROADMAP.md index 5b54e21..b0dc431 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -48,9 +48,13 @@ Punkte abhaken (`[x]`), wenn erledigt UND in `PROGRESS.md` protokolliert. Backup/Verifikation/atomarem Tausch, Push-Isolate-Marker). Bernds echte Windows-DB wurde erfolgreich migriert (PROGRESS.md 2026-07-06), Tests in `test/app_database_test.dart` fahren die Migration mit echtem SQLCipher. - **Bleibt offen, weil Android UNGETESTET ist** (Migration auf Gerät, - Push-Isolate liest verschlüsselte DB, secure_storage im - Background-Isolate) – Testplan Punkt 4 in `docs/SQLCIPHER_MIGRATION.md`; + **Nachtrag 2026-07-06 (vierte PC-Session): Android-EMULATOR-Test grün** + (API 36: Neuanlage verschlüsselt, Klartext-Migration beim ersten Start, + Neustart mit Keystore-Schlüssel ohne Re-Migration – Details im + Status-Kopf von `docs/SQLCIPHER_MIGRATION.md`). **Bleibt offen:** + echtes ARM-Gerät mit eingeloggter Session + Push-Isolate-Test + (FCM liest verschlüsselte DB, secure_storage im Background-Isolate) – + Testplan Punkt 4 in `docs/SQLCIPHER_MIGRATION.md`; erst nach grünem Gerätetest Release + Utas Gerät (vorher ihr Key-Backup prüfen!), dann abhaken. `sqlcipher_flutter_libs` steht zwar in `pubspec.yaml`, wird aber nirgends diff --git a/android/gradle.properties b/android/gradle.properties index fbee1d8..d5da727 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,2 +1,6 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/docs/SQLCIPHER_MIGRATION.md b/docs/SQLCIPHER_MIGRATION.md index 5549c7e..a8dd1fa 100644 --- a/docs/SQLCIPHER_MIGRATION.md +++ b/docs/SQLCIPHER_MIGRATION.md @@ -4,9 +4,22 @@ > Windows mit Bernds echter 14-MB-DB praxisgetestet** (Migration gelaufen, > 23 Tabellen verifiziert, Login/E2EE danach intakt, Neustart öffnet die > verschlüsselte DB, `flutter test` deckt Migration/Fehlpfade mit echtem -> SQLCipher ab). **Android bleibt UNGETESTET** (Punkt 4 des Testplans unten: -> Migration auf Gerät, Push-Isolate + secure_storage) – erst danach Release -> und Uta. **Abweichung vom Plan unten:** Die Annahme „keine Desktop-Binaries" +> SQLCipher ab). +> **Android-Emulator-Test 2026-07-06 (API 36, x86_64, Debug-APK) GRÜN:** +> (a) frische Installation legt die DB direkt verschlüsselt an +> (Header = Zufallsbytes, per run-as verifiziert), kein Cipher-Fallback im +> auth_log; (b) Update-Szenario nach `pm clear` + untergeschobener +> Klartext-DB (synthetisch, 2 Tabellen/550 Zeilen): Migration lief beim +> ersten Start („2 Tabellen verifiziert" im auth_log), `.premigration` +> liegt da, DB danach verschlüsselt; (c) Neustart öffnet mit dem +> Keystore-Schlüssel OHNE Re-Migration, App rendert normal den +> Login-Screen. Damit sind openCipherOnAndroid, sqlcipher_export und +> flutter_secure_storage auf Android (Haupt-Isolate) real belegt. +> **Offen bleibt (deshalb Punkt 4 NICHT voll abgehakt):** echtes +> ARM-Gerät, Migration einer ECHTEN eingeloggten Session auf Android und +> der Push-Test (FCM-Isolate liest verschlüsselte DB, secure_storage im +> Background-Isolate) – braucht ein Testgerät mit eingeloggtem Account. +> Erst danach Release und Uta. **Abweichung vom Plan unten:** Die Annahme „keine Desktop-Binaries" > ist seit sqlcipher_flutter_libs 0.6.x überholt – das Plugin baut SQLCipher > auf Windows/Linux als `sqlite3.dll`/`libsqlite3.so` mit (im Build-Output > verifiziert). Deshalb ist Phase 1 NICHT Android-only: Windows/Linux