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
- Koppeln — User erstellt in der ReBreak-App einen 6-stelligen Code
(
POST /api/magic/pair/redeem→mgc_-Session-Token → Credential Manager). Direkt danachPOST /api/magic/register(platform: "windows") → per-Device-DNS-Token, AdGuard-Client wird serverseitig provisioniert. - 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-InterfaceDohFlags=1, flushdns) - State nach
%ProgramData%\ReBreak\protection.json - Tamper-Service installieren + starten (
sc.exe,obj= LocalSystem, Auto-Start, Auto-Restart bei Crash)
- Windows-DoH auf
- Tamper-Protection — Service prüft alle 5 Minuten:
- DoH manipuliert → sofort wiederherstellen
- Backend offline → fail-closed, Schutz bleibt
- Deaktivierung (24h-Cooldown) —
request-releasestartet den Cooldown, die App zeigt den Countdown. Nach 24h revoked der Backend-Cron den Token; der Service siehtactive=falseviaGET /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— optionalesplatform-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)
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)
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=offist 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 deleteetc.). 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/deletebei der NSIS-Deinstallation ist noch nicht verdrahtet (NSIS-Hook) — der Service deaktiviert sich aber selbst, sobald das Backend den Token revoked.