feat: replace QR remote pairing with encrypted LAN discovery

Replace session ID + PIN auth with HKDF-derived home secret and
per-session AES-256-GCM encrypted channel. Auto-start remote server
on host devices, auto-discover hosts via authenticated UDP broadcast.
This commit is contained in:
edde746
2026-04-14 12:33:40 +02:00
parent a55650bc40
commit d093023ce7
44 changed files with 2799 additions and 2390 deletions
+23 -33
View File
@@ -238,7 +238,9 @@
"player": "Player",
"subtitlesAndConfig": "Subtitles & Configuration",
"seekAndTiming": "Seek & Timing",
"behavior": "Behavior"
"behavior": "Behavior",
"companionRemoteServer": "Companion Remote Server",
"companionRemoteServerDescription": "Mobilgeräten in deinem Netzwerk erlauben, diese App zu steuern"
},
"search": {
"hint": "Filme, Serien, Musik suchen...",
@@ -778,47 +780,35 @@
"controlDesktop": "Ein Desktop-Gerät steuern",
"connectedTo": "Verbunden mit ${name}",
"session": {
"creatingSession": "Fernsteuerungssitzung wird erstellt...",
"failedToCreate": "Fernsteuerungssitzung konnte nicht erstellt werden:",
"noSession": "Keine Sitzung verfügbar",
"scanQrCode": "QR-Code scannen",
"orEnterManually": "Oder manuell eingeben",
"startingServer": "Remote-Server wird gestartet...",
"failedToCreate": "Remote-Server konnte nicht gestartet werden:",
"hostAddress": "Host-Adresse",
"sessionId": "Sitzungs-ID",
"pin": "PIN",
"connected": "Verbunden",
"waitingForConnection": "Warte auf Verbindung...",
"serverRunning": "Remote-Server aktiv",
"serverStopped": "Remote-Server gestoppt",
"serverRunningDescription": "Mobilgeräte in deinem Netzwerk können diese App finden und sich verbinden",
"serverStoppedDescription": "Starte den Server, um Mobilgeräten die Verbindung zu ermöglichen",
"usePhoneToControl": "Verwende dein Mobilgerät, um diese App zu steuern",
"copiedToClipboard": "${label} in Zwischenablage kopiert",
"copyToClipboard": "In Zwischenablage kopieren",
"newSession": "Neue Sitzung",
"startServer": "Server starten",
"stopServer": "Server stoppen",
"minimize": "Minimieren"
},
"pairing": {
"scan": "Scannen",
"manual": "Manuell",
"pairWithDesktop": "Mit Desktop koppeln",
"enterSessionDetails": "Gib die Sitzungsdetails ein, die auf deinem Desktop-Gerät angezeigt werden",
"pairWithDesktop": "Mit Desktop verbinden",
"discoveryDescription": "Geräte in deinem Netzwerk, die Plezy mit demselben Plex-Konto nutzen, erscheinen automatisch",
"hostAddressHint": "192.168.1.100:48632",
"sessionIdHint": "8-stellige Sitzungs-ID eingeben",
"pinHint": "6-stellige PIN eingeben",
"connecting": "Verbinde...",
"tips": "Tipps",
"tipDesktop": "Öffne Plezy auf deinem Desktop und aktiviere Companion Remote in den Einstellungen oder im Menü",
"tipScan": "Verwende den Scannen-Tab, um dich schnell per QR-Code auf deinem Desktop zu koppeln",
"tipWifi": "Stelle sicher, dass beide Geräte im selben WiFi-Netzwerk sind",
"cameraPermissionRequired": "Kameraberechtigung wird zum Scannen von QR-Codes benötigt.\nBitte erteile den Kamerazugriff in den Geräteeinstellungen.",
"cameraError": "Kamera konnte nicht gestartet werden: ${error}",
"scanInstruction": "Richte deine Kamera auf den QR-Code auf deinem Desktop",
"invalidQrCode": "Ungültiges QR-Code-Format",
"connecting": "Verbinden...",
"searchingForDevices": "Suche nach Geräten...",
"noDevicesFound": "Keine Geräte in deinem Netzwerk gefunden",
"noDevicesHint": "Stelle sicher, dass Plezy auf deinem Desktop geöffnet ist und beide Geräte im selben WLAN sind",
"availableDevices": "Verfügbare Geräte",
"manualConnection": "Manuelle Verbindung",
"cryptoInitFailed": "Sichere Verbindung konnte nicht initialisiert werden. Stelle sicher, dass du bei einem Plex-Konto angemeldet bist.",
"validationHostRequired": "Bitte Host-Adresse eingeben",
"validationHostFormat": "Format muss IP:Port sein (z.B. 192.168.1.100:48632)",
"validationSessionIdRequired": "Bitte Sitzungs-ID eingeben",
"validationSessionIdLength": "Sitzungs-ID muss 8 Zeichen lang sein",
"validationPinRequired": "Bitte PIN eingeben",
"validationPinLength": "PIN muss 6 Ziffern haben",
"connectionTimedOut": "Zeitüberschreitung. Bitte Sitzungs-ID und PIN überprüfen.",
"sessionNotFound": "Sitzung nicht gefunden. Bitte Zugangsdaten überprüfen.",
"connectionTimedOut": "Verbindung abgelaufen. Stelle sicher, dass beide Geräte im selben Netzwerk sind.",
"sessionNotFound": "Gerät nicht gefunden. Stelle sicher, dass Plezy auf dem Host läuft.",
"authFailed": "Authentifizierung fehlgeschlagen. Stelle sicher, dass beide Geräte dasselbe Plex-Konto verwenden.",
"failedToConnect": "Verbindung fehlgeschlagen: ${error}"
},
"remote": {