Geräteverwaltung im Einstellungen-Menü des Remote-Clients, für Mac- und Linux-Server #284
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/Iris#284
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Warum
Die Geräteverwaltung (Liste, Sperren, Entfernen, Terminal- und Bildschirm-Freigabe, Token neu erzeugen) gibt es nur im Companion Panel des Mac-Servers. Der Linux-Server hat sie gar nicht, obwohl er dasselbe Wire-Protokoll spricht und auch das Terminal (iris/Iris#274) dort gebraucht wird. Die Verwaltung soll im Einstellungen-Menü des Remote-Clients liegen und gegen beide Server gleich funktionieren.
Entscheidung (Alf, 2026-10-31)
Jedes gekoppelte Gerät darf alles verwalten, auch die Terminal-Freigabe. Begründung: Wer das Token hat, hat ohnehin Zugriff; sobald Alf den Verlust merkt, sperrt er das Gerät. Bewusst in Kauf genommen: Ein gestohlenes Gerät kann sich in der Zwischenzeit selbst das Terminal freigeben. Ergänzend wegen des gemeinsamen Tokens (Sperren per Geräte-ID hält nicht fest): „Token neu erzeugen“ gehört in dasselbe Menü.
Umfang
Entwicklerdokumentation/02-Wire-Protokoll.md):GET /devices,POST /devices/<id>/block|unblock|remove|rename, Freigaben (terminal,remote-desktop),POST /token/regenerate(Antwort mit neuem Token; der aufrufende Client übernimmt es).RegisteredDeviceStore; das Companion Panel bleibt.X-Device-ID, Name, zuletzt gesehen, gesperrt, Freigaben) und Durchsetzung der Sperre; danach Terminal dort (PTY im Container, Freigabe über dieselben Routen).Etappen
Verwandt: iris/Iris#274 (Terminal), iris/2ndbrain-ios#77.
PR #141 gemergt: docs(wire): Geräteverwaltung /devices (iris/Iris#284)
http://docker:3000/alf/2ndbrain/pulls/141
Commits:
Stand: Etappe 1 – Mac-Server-Routen und Geräte-Fenster im Mac-Client
Geändert
GET /devicesundPOST /devices/<id>/block|unblock|remove|rename|terminal|remote-desktopauf dem vorhandenenRegisteredDeviceStore(gleiche Wirkung wie im Companion Panel, Entzug des Terminals beendet die Sitzungen). Eigenes Gerät sperren/entfernen → 409.RemoteDevices.swift(Client + Sheet „Geräte“: Terminal-, Bildschirm-, Sperr-, Entfernen-Knopf), Eintrag „Geräte“ im Einstellungen-Menü.Entwicklerdokumentation/02-Wire-Protokoll.md).Geprüft: Xcode-Build des Schemas Iris (erfolgreich; ein erster Lauf direkt nach dem Anlegen der Datei meldete Fehler ohne Fehlerzeile, der zweite lief durch).
Nicht geprüft: Alles zur Laufzeit (Liste, Schalter, Sperren, Entfernen, Dialog); Build von IrisClient; die Routen gegen den laufenden Server.
Offen: „Token neu erzeugen“ (Rückgabe des neuen Tokens an den aufrufenden Client, Profil aktualisieren), Linux-Server (Etappe 2), iOS (Etappe 3), Terminal auf Linux (Etappe 4), Handbuch.
PR #285 gemergt: feat(devices): Geräteverwaltung im Mac-Server und im Einstellungen-Menü des Mac-Clients (iris/Iris#284)
http://docker:3000/iris/Iris/pulls/285
Commits:
Stand: Etappe 1 – Mac-Server-Routen und Geräte-Fenster im Mac-Client
Geändert
GET /devicesundPOST /devices/<id>/block|unblock|remove|rename|terminal|remote-desktopauf dem vorhandenenRegisteredDeviceStore(gleiche Wirkung wie im Companion Panel, Entzug des Terminals beendet die Sitzungen). Eigenes Gerät sperren/entfernen → 409.RemoteDevices.swift(Client + Sheet „Geräte“: Terminal-, Bildschirm-, Sperr-, Entfernen-Knopf), Eintrag „Geräte“ im Einstellungen-Menü.Entwicklerdokumentation/02-Wire-Protokoll.md).Geprüft: Xcode-Build des Schemas Iris (erfolgreich; ein erster Lauf direkt nach dem Anlegen der Datei meldete Fehler ohne Fehlerzeile, der zweite lief durch).
Nicht geprüft: Alles zur Laufzeit (Liste, Schalter, Sperren, Entfernen, Dialog); Build von IrisClient; die Routen gegen den laufenden Server.
Offen: „Token neu erzeugen“ (Rückgabe des neuen Tokens an den aufrufenden Client, Profil aktualisieren), Linux-Server (Etappe 2), iOS (Etappe 3), Terminal auf Linux (Etappe 4), Handbuch.
PR #132 gemergt: feat(devices): Geräteregister und /devices-Routen im Linux-Server (iris/Iris#284)
http://docker:3000/iris/iris-linux-server/pulls/132
Commits:
Stand: Etappe 2 – Linux-Server: Geräteregister und Routen
Geändert
device_store.py: Register unter/data/devices.json(Name, zuletzt gesehen, gesperrt, Terminal-Freigabe),last_seenhöchstens alle 30 s geschrieben.track_devices(main.py): Anfragen mit gültigem Token undX-Device-IDtragen das Gerät ein; gesperrte Geräte bekommen 403{"error": "Device blocked"}auch mit gültigem Token (wie auf dem Mac)./healthbleibt frei.device_routes.py:GET /devices,POST /devices/<id>/block|unblock|remove|rename|terminal, Antworten und Fehlerform wie der Mac-Server ({"error": …}); eigenes Gerät sperren/entfernen → 409;remote-desktop→ 400 (gibt es auf Linux nicht). Sperren entzieht auch die Terminal-Freigabe.Geprüft
tests/test_devices.py(7 Tests) undtest_health_and_auth.pygegen den Dev-Hostalf@iris-servernach rsync-Deploy: 12 passed. Nur Wegwerf-Geräte (pytest-device-…) angelegt und wieder entfernt.Nicht geprüft
/data, nur gelesen).Offen: iOS-UI (Etappe 3), Terminal auf dem Linux-Server (Etappe 4, nutzt
terminal_allowed), „Token neu erzeugen“, Handbuch.PR #81 gemergt: feat(devices): Geräteverwaltung in den Einstellungen (iris/Iris#284)
http://docker:3000/iris/2ndbrain-ios/pulls/81
Commits:
Stand: Etappe 3 – iOS: Geräte in den Einstellungen
Geändert:
DevicesSupport.swift(Client fürGET /devices,POST /devices/<id>/<aktion>und die AnsichtDevicesView): Liste mit Name, zuletzt gesehen, Hinweisen „dieses Gerät“/„gesperrt“, Schalter „Terminal erlauben“, Wischen für Sperren/Entsperren/Entfernen (Bestätigung beim Entfernen; das eigene Gerät lässt sich nicht sperren oder entfernen). Einstieg: Einstellungen → „Geräte verwalten“. Gilt für Mac- und Linux-Server.Geprüft: Build für den iOS-Simulator.
Nicht geprüft: Alles auf dem Gerät; die Ansicht gegen den Linux-Server und gegen den Mac-Server.
PR #133 gemergt: feat(terminal): Terminal auf dem Linux-Server mit Freigabe je Gerät (iris/Iris#284)
http://docker:3000/iris/iris-linux-server/pulls/133
Commits:
Stand: Etappe 4 – Terminal auf dem Linux-Server
Geändert
terminal_host.py: Sitzungen an einer Pseudo-Konsole (openpty+setsid -c), 1-MiB-Ringpuffer, Long-Poll-Lesen mit Offset undreset, Besitzer = Geräte-ID, max. 8 Sitzungen, Ende nach 30 min Leerlauf, beendete Sitzungen bleiben 5 min.terminal_routes.py:/terminal/access|open|list|<id>/read|write|resize|closeund die öffentliche Seite/terminal/ui/…mit denselben Antwortformen wie der Mac-Server; Zugang nur mit Token und Freigabe des Geräts (403 sonst), Loopback ausgenommen.POST /devices/<id>/terminal); Entziehen, Sperren und Entfernen beenden die Sitzungen des Geräts.app/terminal_web/: Kopie der Terminal-Seite (HTML/JS/CSS, xterm.js) ausfrontend/macos-iris/Iris/Resources/— bei Änderungen dort muss die Kopie nachgezogen werden./bin/bash -ilals Container-Useriris. Claude Code nur, wennclaudeim Image liegt (derzeit nicht): sonst 400 „nicht installiert“.Geprüft:
tests/test_terminal.py(5) undtests/test_devices.py(7) gegen den Dev-Hostalf@iris-servernach rsync-Deploy: 12 passed — u. a. Shell-Rundlauf mit Rechenergebnis, Größe 30×100, Wieder-Anhängen mit Verlauf, fremde Sitzung → 404, Entzug beendet die Sitzung, Seite öffentlich mit CSP.Nicht geprüft
Hinweis zur Sicherheit: Der Container-User hat über die Compose-Gruppe Zugriff auf
/var/run/docker.sock. Wer eine Shell im Container hat, kann damit Docker auf dem Host steuern, das ist faktisch Root auf dem Host. Die Freigabe je Gerät ist deshalb die einzige Schranke.PR #142 gemergt: docs(wire): Terminal auf dem Linux-Server (iris/Iris#284)
http://docker:3000/alf/2ndbrain/pulls/142
Commits:
Stand: Dokumentation zur Geräteverwaltung und zum Linux-Terminal
app/terminal_web/).BENUTZERHANDBUCH.mdund HTML-Site neu gebaut.Nicht geprüft: Darstellung in der App.
Offen in iris/Iris#284: „Token neu erzeugen“ aus dem Client; Prüfung aller Teile von Hand.
PR #286 gemergt: docs(handbuch): Terminal auf beiden Servern, Geräte im Client verwalten (iris/Iris#284)
http://docker:3000/iris/Iris/pulls/286
Commits:
Stand: Dokumentation zur Geräteverwaltung und zum Linux-Terminal
app/terminal_web/).BENUTZERHANDBUCH.mdund HTML-Site neu gebaut.Nicht geprüft: Darstellung in der App.
Offen in iris/Iris#284: „Token neu erzeugen“ aus dem Client; Prüfung aller Teile von Hand.
PR #82 gemergt: feat(devices): alle Aktionen sichtbar, Bildschirmfreigabe und Umbenennen (iris/Iris#284)
http://docker:3000/iris/2ndbrain-ios/pulls/82
Commits:
Stand: Geräteverwaltung mit vollem Umfang (Rückmeldung nach dem Test)
Befund (Alf): Auf dem iPhone ließ sich nur das Terminal ein- und ausschalten; Sperren und Entfernen steckten als Wischgesten, die Bildschirmfreigabe fehlte.
Geändert
Geprüft: iOS-Simulator-Build, Xcode-Build des Schemas Iris.
Nicht geprüft: Gerät; Bildschirmfreigabe-Schalter gegen den Mac-Server.
PR #287 gemergt: feat(devices): Umbenennen im Geräte-Sheet (iris/Iris#284)
http://docker:3000/iris/Iris/pulls/287
Commits:
Stand: Geräteverwaltung mit vollem Umfang (Rückmeldung nach dem Test)
Befund (Alf): Auf dem iPhone ließ sich nur das Terminal ein- und ausschalten; Sperren und Entfernen steckten als Wischgesten, die Bildschirmfreigabe fehlte.
Geändert
Geprüft: iOS-Simulator-Build, Xcode-Build des Schemas Iris.
Nicht geprüft: Gerät; Bildschirmfreigabe-Schalter gegen den Mac-Server.
PR #134 gemergt: feat(devices): Token-Rotation bei Sperren und Entfernen (iris/Iris#284)
http://docker:3000/iris/iris-linux-server/pulls/134
Commits:
Stand: Token-Rotation bei Sperren/Entfernen (Entscheidung Alf: Übergangszeit 14 Tage, Knopf „Token neu erzeugen“ ja)
Ablauf: Sperren oder Entfernen eines Geräts erzeugt ein neues Bearer-Token. Das alte gilt 14 Tage weiter, aber nur für die Geräte, die bleiben dürfen (
pending, nachX-Device-ID), und für Prozesse auf dem Server selbst (Mac: Loopback; Linux: Loopback und Docker-Netz 172.16/12).GET /healthmeldettoken_epoch; ein Client mit abweichender Epoche holt mit dem alten Token das neue überGET /auth/token(nur fürpending-Geräte, sonstnull). Mit der ersten Anfrage mit dem neuen Token gilt das Gerät als umgestellt, sind alle umgestellt, wird das alte vergessen. Das gesperrte Gerät steht nicht auf der Liste und bleibt draußen.POST /auth/rotatewechselt ohne Sperre (Knopf „Token neu erzeugen“ im Geräte-Sheet des Mac-Clients, in der iOS-Geräteliste und im Companion Panel).{"rotate": false}beiblock/removelässt die Rotation aus.Geändert
TokenRotation.swift,isAuthorizedmit Übergangsregel,/auth/token,/auth/rotate,token_epochin/health; Companion „Regenerate token“ nutzt die Rotation.token_rotation.py,device_middleware.py(tauscht ein akzeptiertes altes Token gegen das aktuelle, damit die vielen Routen mit eigenem Vergleich nichts wissen müssen),/auth/token,/auth/rotate,token_epoch.followTokenRotation, Profil wird aktualisiert) und iOS (TokenRotationSupport.swift, Profil über Benachrichtigung aktualisiert).Geprüft
tests/test_token_rotation_local.py(4 Tests in einer Wegwerf-App: Sperren rotiert, der gesperrte und ein erfundener Gerät-ID bleiben draußen, Telefon und Mac stellen um, das alte Token wird danach abgewiesen, interne Prozesse laufen weiter, Ablauf nach 14 Tagen, eigenes Gerät nicht sperrbar).Nicht geprüft
Vorfall: Meine Live-Tests (Sperren/Entfernen eines Wegwerf-Geräts) haben das Token des Dev-Hosts
alf@iris-serverzweimal gewechselt, bevor esrotate: falsegab; Mac-Client und iPhone mussten neu gekoppelt werden. Behoben: Live-Tests nutzenrotate: false, der Rotationstest läuft nur lokal.PR #83 gemergt: feat(devices): Token-Rotation folgen und Token neu erzeugen (iris/Iris#284)
http://docker:3000/iris/2ndbrain-ios/pulls/83
Commits:
Stand: Token-Rotation bei Sperren/Entfernen (Entscheidung Alf: Übergangszeit 14 Tage, Knopf „Token neu erzeugen“ ja)
Ablauf: Sperren oder Entfernen eines Geräts erzeugt ein neues Bearer-Token. Das alte gilt 14 Tage weiter, aber nur für die Geräte, die bleiben dürfen (
pending, nachX-Device-ID), und für Prozesse auf dem Server selbst (Mac: Loopback; Linux: Loopback und Docker-Netz 172.16/12).GET /healthmeldettoken_epoch; ein Client mit abweichender Epoche holt mit dem alten Token das neue überGET /auth/token(nur fürpending-Geräte, sonstnull). Mit der ersten Anfrage mit dem neuen Token gilt das Gerät als umgestellt, sind alle umgestellt, wird das alte vergessen. Das gesperrte Gerät steht nicht auf der Liste und bleibt draußen.POST /auth/rotatewechselt ohne Sperre (Knopf „Token neu erzeugen“ im Geräte-Sheet des Mac-Clients, in der iOS-Geräteliste und im Companion Panel).{"rotate": false}beiblock/removelässt die Rotation aus.Geändert
TokenRotation.swift,isAuthorizedmit Übergangsregel,/auth/token,/auth/rotate,token_epochin/health; Companion „Regenerate token“ nutzt die Rotation.token_rotation.py,device_middleware.py(tauscht ein akzeptiertes altes Token gegen das aktuelle, damit die vielen Routen mit eigenem Vergleich nichts wissen müssen),/auth/token,/auth/rotate,token_epoch.followTokenRotation, Profil wird aktualisiert) und iOS (TokenRotationSupport.swift, Profil über Benachrichtigung aktualisiert).Geprüft
tests/test_token_rotation_local.py(4 Tests in einer Wegwerf-App: Sperren rotiert, der gesperrte und ein erfundener Gerät-ID bleiben draußen, Telefon und Mac stellen um, das alte Token wird danach abgewiesen, interne Prozesse laufen weiter, Ablauf nach 14 Tagen, eigenes Gerät nicht sperrbar).Nicht geprüft
Vorfall: Meine Live-Tests (Sperren/Entfernen eines Wegwerf-Geräts) haben das Token des Dev-Hosts
alf@iris-serverzweimal gewechselt, bevor esrotate: falsegab; Mac-Client und iPhone mussten neu gekoppelt werden. Behoben: Live-Tests nutzenrotate: false, der Rotationstest läuft nur lokal.PR #288 gemergt: feat(devices): Token-Rotation im Mac-Server und -Client (iris/Iris#284)
http://docker:3000/iris/Iris/pulls/288
Commits:
Stand: Token-Rotation bei Sperren/Entfernen (Entscheidung Alf: Übergangszeit 14 Tage, Knopf „Token neu erzeugen“ ja)
Ablauf: Sperren oder Entfernen eines Geräts erzeugt ein neues Bearer-Token. Das alte gilt 14 Tage weiter, aber nur für die Geräte, die bleiben dürfen (
pending, nachX-Device-ID), und für Prozesse auf dem Server selbst (Mac: Loopback; Linux: Loopback und Docker-Netz 172.16/12).GET /healthmeldettoken_epoch; ein Client mit abweichender Epoche holt mit dem alten Token das neue überGET /auth/token(nur fürpending-Geräte, sonstnull). Mit der ersten Anfrage mit dem neuen Token gilt das Gerät als umgestellt, sind alle umgestellt, wird das alte vergessen. Das gesperrte Gerät steht nicht auf der Liste und bleibt draußen.POST /auth/rotatewechselt ohne Sperre (Knopf „Token neu erzeugen“ im Geräte-Sheet des Mac-Clients, in der iOS-Geräteliste und im Companion Panel).{"rotate": false}beiblock/removelässt die Rotation aus.Geändert
TokenRotation.swift,isAuthorizedmit Übergangsregel,/auth/token,/auth/rotate,token_epochin/health; Companion „Regenerate token“ nutzt die Rotation.token_rotation.py,device_middleware.py(tauscht ein akzeptiertes altes Token gegen das aktuelle, damit die vielen Routen mit eigenem Vergleich nichts wissen müssen),/auth/token,/auth/rotate,token_epoch.followTokenRotation, Profil wird aktualisiert) und iOS (TokenRotationSupport.swift, Profil über Benachrichtigung aktualisiert).Geprüft
tests/test_token_rotation_local.py(4 Tests in einer Wegwerf-App: Sperren rotiert, der gesperrte und ein erfundener Gerät-ID bleiben draußen, Telefon und Mac stellen um, das alte Token wird danach abgewiesen, interne Prozesse laufen weiter, Ablauf nach 14 Tagen, eigenes Gerät nicht sperrbar).Nicht geprüft
Vorfall: Meine Live-Tests (Sperren/Entfernen eines Wegwerf-Geräts) haben das Token des Dev-Hosts
alf@iris-serverzweimal gewechselt, bevor esrotate: falsegab; Mac-Client und iPhone mussten neu gekoppelt werden. Behoben: Live-Tests nutzenrotate: false, der Rotationstest läuft nur lokal.PR #143 gemergt: docs(wire): Token-Rotation (iris/Iris#284)
http://docker:3000/alf/2ndbrain/pulls/143
Commits:
Stand: Token-Rotation bei Sperren/Entfernen (Entscheidung Alf: Übergangszeit 14 Tage, Knopf „Token neu erzeugen“ ja)
Ablauf: Sperren oder Entfernen eines Geräts erzeugt ein neues Bearer-Token. Das alte gilt 14 Tage weiter, aber nur für die Geräte, die bleiben dürfen (
pending, nachX-Device-ID), und für Prozesse auf dem Server selbst (Mac: Loopback; Linux: Loopback und Docker-Netz 172.16/12).GET /healthmeldettoken_epoch; ein Client mit abweichender Epoche holt mit dem alten Token das neue überGET /auth/token(nur fürpending-Geräte, sonstnull). Mit der ersten Anfrage mit dem neuen Token gilt das Gerät als umgestellt, sind alle umgestellt, wird das alte vergessen. Das gesperrte Gerät steht nicht auf der Liste und bleibt draußen.POST /auth/rotatewechselt ohne Sperre (Knopf „Token neu erzeugen“ im Geräte-Sheet des Mac-Clients, in der iOS-Geräteliste und im Companion Panel).{"rotate": false}beiblock/removelässt die Rotation aus.Geändert
TokenRotation.swift,isAuthorizedmit Übergangsregel,/auth/token,/auth/rotate,token_epochin/health; Companion „Regenerate token“ nutzt die Rotation.token_rotation.py,device_middleware.py(tauscht ein akzeptiertes altes Token gegen das aktuelle, damit die vielen Routen mit eigenem Vergleich nichts wissen müssen),/auth/token,/auth/rotate,token_epoch.followTokenRotation, Profil wird aktualisiert) und iOS (TokenRotationSupport.swift, Profil über Benachrichtigung aktualisiert).Geprüft
tests/test_token_rotation_local.py(4 Tests in einer Wegwerf-App: Sperren rotiert, der gesperrte und ein erfundener Gerät-ID bleiben draußen, Telefon und Mac stellen um, das alte Token wird danach abgewiesen, interne Prozesse laufen weiter, Ablauf nach 14 Tagen, eigenes Gerät nicht sperrbar).Nicht geprüft
Vorfall: Meine Live-Tests (Sperren/Entfernen eines Wegwerf-Geräts) haben das Token des Dev-Hosts
alf@iris-serverzweimal gewechselt, bevor esrotate: falsegab; Mac-Client und iPhone mussten neu gekoppelt werden. Behoben: Live-Tests nutzenrotate: false, der Rotationstest läuft nur lokal.