From 1449f409549e444eebc5e80e3d7a524b205abf57 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Thu, 4 Jun 2026 13:12:08 -0400 Subject: [PATCH] zebra-spaces: hide rendezvous-code + enter button while joined (over-the-shoulder privacy) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fox 2026-06-04: 'on join the space name and enter button should be hidden it should only show when disconnected. this prevents people without the password or link to be able to see it on the screen.' The rendezvous code is the join secret — anyone reading it off the host's screen can join the space (or rejoin under a fresh identity to bypass moderation). Added id="row-entry" to the existing entry row, then hide it in the 'welcome' case (alongside the existing reveal of sec-room), and restore it on: - leave (btn-leave click → cleanup block) - handleBlocked (banned / signal block) - peer-booted (self) — so a kicked listener can read the code to manually re-enter Same hidden-utility pattern as the mute/leave buttons. No FSM yet for the entry-row visibility — its only state is "joined? yes/no", which is already captured by the call FSM. Future cleanup could hang the toggle off a callState observer rather than scattered classList writes. --- web/zebra-spaces.html | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/web/zebra-spaces.html b/web/zebra-spaces.html index ae7faaf..26324df 100644 --- a/web/zebra-spaces.html +++ b/web/zebra-spaces.html @@ -707,7 +707,7 @@ try {

space

-
+
@@ -3766,6 +3766,11 @@ async function handleSignal(raw){ $('btn-leave').classList.remove('hidden'); $('btn-mute').classList.remove('hidden'); $('sec-room').classList.remove('hidden'); + /* Hide the rendezvous code + enter button once joined — fox + * 2026-06-04: "prevents people without the password or link + * from being able to see it on the screen" (over-the-shoulder + * privacy). The row reappears on leave / kick / WS-tear. */ + $('row-entry').classList.add('hidden'); /* remember which space this tab is in so a hard refresh auto-rejoins. * sessionStorage is per-tab so tab A in space X + tab B in space Y * stay independent and clear cleanly on tab close. */ @@ -4087,6 +4092,9 @@ async function handleSignal(raw){ $('btn-mute').classList.add('hidden'); $('btn-mute').disabled = true; $('btn-enter').disabled = false; + /* Bring the entry row back so the kicked user can re-enter + * a different (or same) rendezvous code manually. */ + $('row-entry').classList.remove('hidden'); } /* Authoritative tile teardown by pubkey — booted users can't be * publishing anything anymore by definition. The SFU side eviction @@ -5168,6 +5176,8 @@ function handleBlocked(source){ $('btn-leave').classList.add('hidden'); $('btn-mute').classList.add('hidden'); $('btn-enter').disabled = false; + /* re-expose the entry row so the user can read it / type a new code */ + $('row-entry').classList.remove('hidden'); } $('btn-accept-mic').addEventListener('click', () => { @@ -5526,6 +5536,8 @@ $('btn-leave').addEventListener('click', async () => { $('sec-share').classList.add('hidden'); $('sec-screen-share').classList.add('hidden'); $('sec-spotlight').classList.add('hidden'); + /* bring the rendezvous-code + enter row back when leaving */ + $('row-entry').classList.remove('hidden'); spotlight = null; roomMachines.call.send('DONE'); hideNotice(); @@ -5552,8 +5564,8 @@ logLine('', 'ready — pick a handle, type a rendezvous code, enter the space');