diff --git a/zebra-report/zebra-audio.html b/zebra-report/zebra-audio.html index 7d9518a..a1ea82b 100644 --- a/zebra-report/zebra-audio.html +++ b/zebra-report/zebra-audio.html @@ -317,13 +317,16 @@ async function reportPath(){ if (!sel) stats.forEach(r=>{ if(r.type==='candidate-pair'&&r.state==='succeeded'&&(r.nominated||r.selected)) sel=r; }); if (!sel){ setPath('path: connecting…', null); return; } const loc=stats.get(sel.localCandidateId)||{}, rem=stats.get(sel.remoteCandidateId)||{}; - const la=(loc.address||loc.ip||'?')+':'+(loc.port||'?'), ra=(rem.address||rem.ip||'?')+':'+(rem.port||'?'); const relayed = loc.candidateType==='relay'||rem.candidateType==='relay'; - /* show the real endpoints so it's verifiable: host = the two devices' IPs; - * relay = the TURN server's IP (142.93.73.64) appears on at least one side. */ - setPath('path: '+(relayed?'RELAYED via TURN':'DIRECT P2P')+' — you '+la - +' ↔ peer '+ra+' ('+(loc.candidateType||'?')+'/'+(rem.candidateType||'?')+')', relayed?'err':'ok'); - logLine('', 'active pair: '+la+' ['+(loc.candidateType||'?')+'] ↔ '+ra+' ['+(rem.candidateType||'?')+']'); + /* deliberately do NOT surface loc.address/loc.port/rem.address/rem.port — + * printing them would dox the peer to anyone who glances at the screen. + * candidate types (host/srflx/relay) are abstract enough to show: they + * tell you whether you're direct or relayed without leaking an address. */ + setPath('path: '+(relayed + ? 'RELAYED via TURN — a server forwards your (encrypted) audio' + : 'DIRECT peer-to-peer — nobody between you') + +' ('+(loc.candidateType||'?')+'/'+(rem.candidateType||'?')+')', relayed?'err':'ok'); + logLine('', 'transport: '+(relayed?'relayed via TURN':'direct peer-to-peer')+' ('+(loc.candidateType||'?')+'/'+(rem.candidateType||'?')+')'); } catch(_){} } @@ -641,8 +644,8 @@ else wirePuppet();