Tauri 2 DoH-Schutz für Windows: PowerShell-DoH-Takeover, Tamper-Service (SYSTEM, windows-service), Browser-Policies (Chromium built-in-DNS + eigenes DoH aus → OS-Resolver), 24h-Cooldown via bestehende magic/*-Endpoints. GitHub-Actions baut den x64-NSIS-Installer auf windows-latest. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
112 lines
5.7 KiB
Markdown
112 lines
5.7 KiB
Markdown
# ReBreak Magic für Windows
|
|
|
|
Windows-Companion-App für ReBreak — DNS-basierter Glücksspiel-Schutz mit
|
|
24h-Cooldown und Tamper-Protection. Das Windows-Pendant zu
|
|
`apps/rebreak-magic-mac` (gleiches Backend, gleiche `/api/magic/*`-Endpoints,
|
|
gleicher Look: Ketten-Icon, Nunito, Accent `#2E7FD4`).
|
|
|
|
## Architektur
|
|
|
|
```
|
|
ReBreak Magic (Tauri 2)
|
|
├── src/ React-Frontend (Nunito, ReBreak-Look)
|
|
│ ├── views/LoginView 6-stelliger Pairing-Code (wie Mac-App)
|
|
│ └── views/HubView Schutzstatus, Aktivierung, 24h-Countdown
|
|
├── src-tauri/src/ Rust-Core — Tokens erreichen die WebView NIE
|
|
│ ├── api.rs Backend-Client (/api/magic/*)
|
|
│ ├── auth.rs Windows Credential Manager (keyring)
|
|
│ ├── device.rs Device-ID via MachineGuid
|
|
│ ├── setup.rs Elevated One-Shot (EIN UAC-Prompt)
|
|
│ └── lib.rs Tauri-Commands + UI-State
|
|
├── src-tauri/protection-core/ Geteilte DoH-Logik (App + Service)
|
|
└── src-tauri/service/ Tamper-Service (Windows-Service, SYSTEM)
|
|
```
|
|
|
|
### Flow
|
|
|
|
1. **Koppeln** — User erstellt in der ReBreak-App einen 6-stelligen Code
|
|
(`POST /api/magic/pair/redeem` → `mgc_`-Session-Token → Credential Manager).
|
|
Direkt danach `POST /api/magic/register` (`platform: "windows"`) →
|
|
per-Device-DNS-Token, AdGuard-Client wird serverseitig provisioniert.
|
|
2. **Schutz aktivieren** — EIN UAC-Prompt führt ein One-Shot-PowerShell aus:
|
|
- Windows-DoH auf `https://dns.rebreak.org/dns-query/<token>` konfigurieren
|
|
(`Add-DnsClientDohServerAddress`, Interface-DNS, `EnableAutoDoh=2`,
|
|
per-Interface `DohFlags=1`, flushdns)
|
|
- State nach `%ProgramData%\ReBreak\protection.json`
|
|
- Tamper-Service installieren + starten (`sc.exe`, `obj= LocalSystem`,
|
|
Auto-Start, Auto-Restart bei Crash)
|
|
3. **Tamper-Protection** — Service prüft alle 5 Minuten:
|
|
- DoH manipuliert → sofort wiederherstellen
|
|
- Backend offline → **fail-closed**, Schutz bleibt
|
|
4. **Deaktivierung (24h-Cooldown)** — `request-release` startet den Cooldown,
|
|
die App zeigt den Countdown. Nach 24h revoked der Backend-Cron den Token;
|
|
der Service sieht `active=false` via `GET /api/magic/status?token=` und
|
|
baut den DoH-Schutz **selbst** ab (SYSTEM, kein zweiter UAC-Prompt).
|
|
Die unelevated App kann den Schutz nicht abbauen — Deaktivierung ist
|
|
ausschließlich server-zeitgesteuert, es gibt keinen Code, den der User
|
|
sehen oder eingeben könnte.
|
|
|
|
### Bewusste Abweichungen vom ursprünglichen Prompt-Dokument
|
|
|
|
| Prompt | Umgesetzt | Warum |
|
|
|---|---|---|
|
|
| Electron + node-windows | **Tauri 2 + Rust-Service** | ~5 MB statt ~150 MB, sauberer SYSTEM-Service, kein Node auf dem Zielsystem |
|
|
| NextDNS pro User | **Eigene DoH-Infra** (`dns.rebreak.org`, AdGuard) | Existiert bereits inkl. Provisioning in `magic/register`; kein neuer DSGVO-Sub-Auftragsverarbeiter, keine Kosten pro User, kuratierte Liste statt generischer Gambling-Kategorie |
|
|
| Supabase Edge Functions + eigene Tabelle | **Bestehendes Nitro-Backend** | `request-release`/`cancel-release` + Cron-Invalidierung existieren bereits (Mac-App nutzt denselben Flow) |
|
|
| Code verschlüsselt in DB, App empfängt Code | **Kein Code nötig** | Deaktivierung ist server-zeitgesteuert: Token-Revoke nach 24h, Service pollt Status |
|
|
|
|
### Backend-Änderungen (in diesem Repo, additiv)
|
|
|
|
- `backend/server/api/magic/register.post.ts` — optionales `platform`-Feld
|
|
(`"windows"`, Default bleibt `"macos"` für die Mac-App)
|
|
- `backend/server/api/magic/status.get.ts` — **neu**: Token-Status-Polling
|
|
für den Tamper-Service (`{ active: boolean }`, Token ist das Secret)
|
|
|
|
## Entwicklung (macOS)
|
|
|
|
```sh
|
|
pnpm install # Repo-Root
|
|
cd apps/rebreak-magic-win
|
|
pnpm build # tsc + vite
|
|
cd src-tauri
|
|
cargo build -p rebreak-protection-service
|
|
cp target/debug/rebreak-protection-service "binaries/rebreak-protection-service-$(rustc -vV | sed -n 's/host: //p')"
|
|
cargo check --workspace && cargo test --workspace
|
|
```
|
|
|
|
PowerShell-Ausführung ist `#[cfg(windows)]`-frei gehalten (Commands sind
|
|
Strings) — auf macOS schlagen die `powershell.exe`-Aufrufe einfach fehl und
|
|
der Status ist `MISSING`. UI-Entwicklung geht mit `pnpm tauri dev` auch am Mac.
|
|
|
|
## Build (Windows-Maschine)
|
|
|
|
```powershell
|
|
pnpm install # Repo-Root
|
|
cd apps\rebreak-magic-win
|
|
.\build-windows.ps1 # Service + App + NSIS-Installer (perMachine)
|
|
```
|
|
|
|
Service-Debug ohne SCM: `rebreak-protection-service.exe --console`
|
|
(Log: `%ProgramData%\ReBreak\service.log`).
|
|
|
|
Backend-Override (analog `config.example.json` der Mac-App):
|
|
`%APPDATA%\org.rebreak.magic\config.json` → `{ "backendBaseUrl": "https://staging.rebreak.org" }`.
|
|
Default ist Staging.
|
|
|
|
## Bekannte Limitationen (v1)
|
|
|
|
- **Browser-eigenes DoH** (Chrome/Firefox „Secure DNS") kann Windows-DoH
|
|
umgehen → Phase 2 (Browser-Policies via Registry: `DnsOverHttpsMode=off`
|
|
ist als HKLM-Policy für Chrome/Edge/Firefox setzbar — im selben elevated
|
|
One-Shot nachrüstbar).
|
|
- **IPv6-DNS** wird nicht angefasst (IPv4-DoH only, wie im Prompt).
|
|
Router-advertised IPv6-Resolver sind ein möglicher Bypass → Phase 2.
|
|
- **Lokale Windows-Admins** können den Service stoppen (`sc delete` etc.).
|
|
Wie überall bei ReBreak gilt: Friction statt absoluter Unumgehbarkeit —
|
|
die Hürde ist bewusst hoch (SYSTEM-Service, Auto-Restart, Re-Apply), aber
|
|
ein entschlossener Admin ist nicht aufhaltbar (gleiche Asymmetrie wie
|
|
Profil-Entfernung auf unsupervised iOS).
|
|
- `sc.exe stop/delete` bei der NSIS-Deinstallation ist noch nicht verdrahtet
|
|
(NSIS-Hook) — der Service deaktiviert sich aber selbst, sobald das Backend
|
|
den Token revoked.
|