fix(idaa): require JWT for all Novi users, remove embed meeting button

- Issue JWT to all verified Novi users, not just moderators; unauthenticated
  URL access no longer sufficient to join an IDAA video conference
- Remove 'embedmeeting' from Jitsi toolbar via explicit toolbarButtons whitelist;
  the embed dialog exposed the Jitsi host/room URL violating IDAA privacy rules

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-03-31 17:53:09 -04:00
parent ae4b94f1b2
commit 9b0c05b80c

View File

@@ -836,28 +836,26 @@ async function init_jitsi() {
const url_params = data.params; const url_params = data.params;
// --- Initialize Jitsi --- // --- Initialize Jitsi ---
let jwt_token = null; // All verified Novi users get a JWT — not just moderators.
if (is_moderator) { // Without JWT enforcement, the room URL alone is enough to join, which violates IDAA privacy.
console.log('Jitsi: Attempting to get JWT for moderator...'); // is_moderator is encoded in the token payload by get_jitsi_jwt().
jwt_token = await get_jitsi_jwt( console.log('Jitsi: Attempting to get JWT...');
display_name, const jwt_token = await get_jitsi_jwt(
email, display_name,
is_moderator, email,
room_name, is_moderator,
user_id room_name,
); user_id
if (!jwt_token) { );
const container = document.getElementById(jitsi_container_id); if (!jwt_token) {
if (container) const container = document.getElementById(jitsi_container_id);
container.innerHTML = if (container)
'<h1>Authentication Failed. Please try again.</h1>'; container.innerHTML =
console.error('Jitsi: Authentication failed. JWT not received.'); '<h1>Authentication Failed. Please try again.</h1>';
return; console.error('Jitsi: Authentication failed. JWT not received.');
} return;
console.log('Jitsi: Successfully received JWT.');
} else {
console.log('Jitsi: Not a moderator, proceeding without JWT.');
} }
console.log('Jitsi: Successfully received JWT.');
const disabled_sounds = [ const disabled_sounds = [
disable_incoming_msg_sound ? 'INCOMING_MSG_SOUND' : null, disable_incoming_msg_sound ? 'INCOMING_MSG_SOUND' : null,
@@ -879,7 +877,19 @@ async function init_jitsi() {
startWithVideoMuted: true, startWithVideoMuted: true,
enableLobby: is_moderator, enableLobby: is_moderator,
disableReactionsModeration: false, disableReactionsModeration: false,
disabledSounds: disabled_sounds disabledSounds: disabled_sounds,
// Explicit toolbar whitelist — omitting 'embedmeeting' entirely.
// "Embed Meeting" exposes the Jitsi host/room URL and must never appear
// for IDAA users (authenticated or not) — privacy requirement.
toolbarButtons: [
'camera', 'chat', 'closedcaptions', 'desktop', 'download',
'etherpad', 'feedback', 'filmstrip', 'fullscreen', 'hangup',
'help', 'invite', 'livestreaming', 'microphone',
'mute-everyone', 'mute-video-everyone', 'participants-pane',
'profile', 'raisehand', 'recording', 'security',
'select-background', 'settings', 'shareaudio', 'sharedvideo',
'shortcuts', 'stats', 'tileview', 'toggle-camera', 'videoquality'
]
}, },
interfaceConfigOverwrite: { interfaceConfigOverwrite: {
DISABLE_JOIN_LEAVE_NOTIFICATIONS: true, DISABLE_JOIN_LEAVE_NOTIFICATIONS: true,