feat: Geräte-Pairing-UI + Einstellungen-Neustrukturierung
- Sync-Settings-Tab: neuer Bereich "Gerät koppeln" (10.3.1), nutzt den bereits vorhandenen, bisher nirgends verdrahteten SnapshotService. Ein Gerät erzeugt per CreatePairingCode einen verschlüsselten DB-Snapshot + Einmal-Code, das zweite Gerät übernimmt per RedeemPairingCode Datenbank und Sync-Schlüssel. Bestätigungsdialog vor dem Einlösen, da die lokale Datenbank dabei vollständig ersetzt wird (alter Stand wird automatisch als Backup gesichert). - Einstellungen: TabPlacement von Top auf Left umgestellt (vertikale Liste statt langem horizontalem Balken) und die 13 Tabs in drei logische Gruppen sortiert (Fachliches / Zeitplanung / System). - Neuer SettingsTab-Enum ersetzt rohe int-Tab-Indizes bei MainWindowViewModel.NavigateToSettings/ TimetableViewModel.OnNavigateToSettings. Dabei einen bestehenden Bug gefunden und mitbehoben: das Zahnrad im Stundenplan öffnete über den hartcodierten Index 7 tatsächlich "Datenschutz" statt des laut Kommentar/Tooltip beabsichtigten "Ferien & Feiertage". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1317,6 +1317,17 @@ die Docker-Verifikation unter 10.2.4 (kein Docker im Entwicklungsstand verfügba
|
||||
RestartApplication`, gleiches Muster wie bei DB-Passwort/AppLock-Änderungen) — `SyncEngine`/
|
||||
`SnapshotService` werden nur einmalig beim Start registriert, es gibt keinen
|
||||
Live-Re-Registrierungspfad.
|
||||
|
||||
**Nachtrag (Einstellungen-Reorg):** Der Tab-Balken war mit 13 Tabs oben (`TabPlacement="Top"`)
|
||||
unübersichtlich lang geworden und wird mit weiteren Sync-Features noch länger. Umgestellt auf
|
||||
`TabPlacement="Left"` (vertikale Liste, skaliert besser) und die Tabs in drei logische Gruppen
|
||||
sortiert (Fachliches / Zeitplanung / System). Neuer Enum `SettingsTab` in
|
||||
`SettingsViewModel.cs` ersetzt die bisherigen rohen `int`-Tab-Indizes bei
|
||||
`MainWindowViewModel.NavigateToSettings`/`TimetableViewModel.OnNavigateToSettings` — beim
|
||||
Umsortieren dabei ein bereits vorhandener Bug aufgefallen und mitbehoben: das Zahnrad-Symbol
|
||||
im Stundenplan öffnete über den hartcodierten Index `7` tatsächlich den Tab "Datenschutz"
|
||||
statt des in Kommentar/Tooltip beabsichtigten "Ferien & Feiertage" — mit benanntem Enum kann
|
||||
diese Klasse von Fehler nicht mehr auftreten.
|
||||
- [x] **10.1.2** Verbindungstest mit klarer Fehlermeldung (nicht erreichbar / Token ungültig).
|
||||
|
||||
**Umsetzung:** `SyncAuthService.TestConnectionAsync` unterscheidet drei Zustände (erreichbar
|
||||
@@ -1431,7 +1442,16 @@ die Docker-Verifikation unter 10.2.4 (kein Docker im Entwicklungsstand verfügba
|
||||
Pfad explizit außerhalb des von der Plattform verwalteten Checkouts sind sicher.
|
||||
|
||||
### 10.3 Verschlüsselung
|
||||
- [ ] **10.3.1** Schlüsselübertragung auf ein zweites Gerät (QR-Code oder Passphrase).
|
||||
- [x] **10.3.1** Schlüsselübertragung auf ein zweites Gerät (QR-Code oder Passphrase).
|
||||
|
||||
**Umsetzung:** Der Backend-Mechanismus (`SnapshotService`/`SyncCrypto`, Einmal-Code-Pairing)
|
||||
existierte bereits, war aber an keiner Stelle im Client verdrahtet. Neuer Bereich "Gerät
|
||||
koppeln" im Sync-Settings-Tab: ein Gerät erzeugt per `CreatePairingCode` einen verschlüsselten
|
||||
DB-Snapshot + Code (Format `WORT-ZZ-WORT`, 24h gültig), das zweite Gerät gibt den Code über
|
||||
`RedeemPairingCode` ein und übernimmt Datenbank + Sync-Schlüssel. Bestätigungsdialog vor dem
|
||||
Einlösen (überschreibt die lokale Datenbank vollständig, alter Stand wird automatisch als
|
||||
Backup gesichert). Kein QR-Code (nur Passphrase-Code) — für zwei eigene Geräte per Hand
|
||||
abtippen ausreichend, QR-Code wäre erst für eine Companion-App relevant.
|
||||
- [ ] **10.3.2** Warnung und Wiederherstellungspfad bei verlorenem Schlüssel.
|
||||
- [x] **10.3.3** Prüfen, welche Daten unverschlüsselt über `PlainEventStore` laufen —
|
||||
personenbezogene Daten dürfen das nicht. `Grade`/`ExamResult` (beide mit `StudentId` plus
|
||||
|
||||
Reference in New Issue
Block a user