feat(realtime,desktop): remote-control safety envelope (LC-186) #230
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/lc-186-remote-control-safety"
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?
Final subtask of the TeamViewer-style remote-control story (LC-181): the safety envelope around a live control session. Builds on LC-183 (consent gate, #227), LC-184 (controller capture, #228), LC-185 (OS injection, #229).
Kill-switch (sharer side)
data-lc-control-banner) shows the whole time a peer holds control, with a "Stop control" button.CommandOrControl+Alt+F9registered natively viatauri-plugin-global-shortcut- the reliable sever when the controller holds the input focus (clicking the button is hard while a remote cursor moves). The handler flips the injector off + releases held input directly (ControlState::kill, independent of the webview), thenwindow.evals alc:control-killevent so the page signalsrevokeand drops the banner.Auto-revoke (
call.jsrevokeAsSharer)On call end (teardown), screen-share stop (
endScreenShare), and data-channel drop (controlChannel.onclose/onerror): signalrevoke(controller stops capturing + audit closes) and disarm locally. The design's "focus loss to a higher-integrity window" auto-revoke is intentionally not implemented - UIPI already blocks injection into elevated windows, so the exposure does not exist; instead the controller sees a standing UIPI hint (data-lc-control-uipi) so it is never silently no-op'd.Audit
chat.dbremote_control_sessions(migration 0052) viadb::remote_control_audit.relay_control_signalopens a row ongrant(controller = recipient, sharer = granter) and closes it onrevoke; a WS-disconnect backstop (end_sessions_for_user) closes any session a hard drop left open. Only participant ids + timestamps are stored - never content.Limits
RateLimitKind::RemoteControlRequestcapsrequestsignals at 10/min per requester (over-limit drops silently, same posture as the verified/block gate). The LC-183 verified-email + block-list gate still applies.Decision (recorded in the design doc): no max-session-duration / periodic re-consent in v1. The instant kill-switch + auto-revoke + disconnect-close already bound exposure; periodic re-consent adds friction without a matching threat once an instant sever exists. Revisit if a concrete need appears.
Verification
just test+just test-saasgreen, including a newdb_remote_control_auditintegration test (start/end-by-room, idempotent re-grant, end-for-user closes both roles).cargo check+clippy+fmtclean.cargo check --target x86_64-pc-windows-gnuclean (global-shortcut + injector path).Story status
LC-182 design, LC-183 gate, LC-184 controller, LC-185 injection, LC-186 safety - all landed. Remaining future work (separate, not blocking): Linux/macOS injection backends; manual end-to-end verification on a real Windows box (LC-180).