feat(realtime): remote-control consent signaling + verified-email gate (LC-183 server) #227
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/lc-183-remote-control-handshake"
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?
Server half of the LC-181 remote-control handshake (subtask LC-183). Adds the consent signaling + the security gate; a forged client frame cannot bypass it because the gate runs on the relay.
Changes
RemoteControlSignalChatEvent(kind = request/grant/deny/revoke, no input payload - the input stream is a separate WebRTC data channel, LC-184) + theremote_control_signalClientFrame. Dedicated variant rather than overloadingCallSignal(per LC-182: CallSignal's relay special-cases glare/voice).relay_control_signalmirrorsrelay_call_signal's DM-room + membership + peer resolution, then enforces the gate before forwarding to the peer only.remote_control_allowed, fail-closed): both peers email-verified AND neither blocked. Verification is build-defined per the LC-182 decision:users.email_verified_at IS NOT NULL(the#[cfg(standalone)]verification flow sets it).remote_control_email_verified) to flip if saas later grows its own check.#lc-control-busOOB fragment (mirrors#lc-call-bus);render_eventNone-arm updated for exhaustiveness.Tests
Gate unit tests (
routes::ws::tests): two verified+unblocked allowed; blocked denied either direction (both builds); unverified denied either direction (standalone-only, since saas verification is implicit).just test+just test-saasboth green (106 each); clippy/fmt clean both modes.Out of scope (next slice)
The client consent UI - the "Request control" affordance, the grant/deny prompt, and the
#lc-control-busconsumer - is browser-iterated and pairs with the LC-184 data channel. This PR is the security-critical, fully-tested server foundation.