mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-30 11:22:31 +00:00
feat(visitors): Handles locked rooms for visitors. (#13296)
* feat(visitors): Handles locked rooms for visitors. * squash: Handle locked room password on promotion. * squash: quotes. * squash: Renames main_domain to local_domain. * squash: Renames fmuc_main_domain to main_domain. Adds required config to point to the main virtual host of the main prosody. There are cases when the first visitor tries to join and there are not main participants as they are in the queue waiting for the vnode connect message and we cannot get dynamically the main domain. * squash: Fix check for main_domain config.
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
--- NOTE: Make sure all communication between prosodies is using the real jids ([foo]room1@muc.example.com)
|
||||
local st = require 'util.stanza';
|
||||
local jid = require 'util.jid';
|
||||
local new_id = require 'util.id'.medium;
|
||||
local util = module:require 'util';
|
||||
local presence_check_status = util.presence_check_status;
|
||||
|
||||
@@ -36,6 +37,8 @@ local ignore_list = module:get_option_set('visitors_ignore_list', {});
|
||||
-- Advertise the component for discovery via disco#items
|
||||
module:add_identity('component', 'visitors', 'visitors.'..module.host);
|
||||
|
||||
local sent_iq_cache = require 'util.cache'.new(200);
|
||||
|
||||
-- visitors_nodes = {
|
||||
-- roomjid1 = {
|
||||
-- nodes = {
|
||||
@@ -47,6 +50,24 @@ module:add_identity('component', 'visitors', 'visitors.'..module.host);
|
||||
--}
|
||||
local visitors_nodes = {};
|
||||
|
||||
-- sends connect or update iq
|
||||
-- @parameter type - Type of iq to send 'connect' or 'update'
|
||||
local function send_visitors_iq(conference_service, room, type)
|
||||
-- send iq informing the vnode that the connect is done and it will allow visitors to join
|
||||
local iq_id = new_id();
|
||||
sent_iq_cache:set(iq_id, socket.gettime());
|
||||
local connect_done = st.iq({
|
||||
type = 'set',
|
||||
to = conference_service,
|
||||
from = module.host,
|
||||
id = iq_id })
|
||||
:tag('visitors', { xmlns = 'jitsi:visitors',
|
||||
room = jid.join(jid.node(room.jid), conference_service) })
|
||||
:tag(type, { xmlns = 'jitsi:visitors', password = room:get_password() or '' }):up();
|
||||
|
||||
module:send(connect_done);
|
||||
end
|
||||
|
||||
-- an event received from visitors component, which receives iqs from jicofo
|
||||
local function connect_vnode(event)
|
||||
local room, vnode = event.room, event.vnode;
|
||||
@@ -75,7 +96,15 @@ local function connect_vnode(event)
|
||||
fmuc_pr.attr.to = jid.join(user, conference_service , res);
|
||||
fmuc_pr.attr.from = o.jid;
|
||||
-- add <x>
|
||||
fmuc_pr:tag('x', { xmlns = MUC_NS }):up();
|
||||
fmuc_pr:tag('x', { xmlns = MUC_NS });
|
||||
|
||||
-- if there is a password on the main room let's add the password for the vnode join
|
||||
-- as we will set the password to the vnode room and we will need it
|
||||
local pass = room:get_password();
|
||||
if pass and pass ~= '' then
|
||||
fmuc_pr:tag('password'):text(pass);
|
||||
end
|
||||
fmuc_pr:up();
|
||||
|
||||
module:send(fmuc_pr);
|
||||
|
||||
@@ -83,9 +112,26 @@ local function connect_vnode(event)
|
||||
end
|
||||
end
|
||||
visitors_nodes[room.jid].nodes[conference_service] = sent_main_participants;
|
||||
|
||||
send_visitors_iq(conference_service, room, 'connect');
|
||||
end
|
||||
module:hook('jitsi-connect-vnode', connect_vnode);
|
||||
|
||||
-- listens for responses to the iq sent for connecting vnode
|
||||
local function stanza_handler(event)
|
||||
local origin, stanza = event.origin, event.stanza;
|
||||
|
||||
if stanza.name ~= 'iq' then
|
||||
return;
|
||||
end
|
||||
|
||||
if stanza.attr.type == 'result' and sent_iq_cache:get(stanza.attr.id) then
|
||||
sent_iq_cache:set(stanza.attr.id, nil);
|
||||
return true;
|
||||
end
|
||||
end
|
||||
module:hook('iq/host', stanza_handler, 10);
|
||||
|
||||
-- an event received from visitors component, which receives iqs from jicofo
|
||||
local function disconnect_vnode(event)
|
||||
local room, vnode = event.room, event.vnode;
|
||||
@@ -211,7 +257,7 @@ process_host_module(main_muc_component_config, function(host_module, host)
|
||||
end
|
||||
end);
|
||||
-- forwards messages from main participants to vnodes
|
||||
host_module:hook("muc-occupant-groupchat", function(event)
|
||||
host_module:hook('muc-occupant-groupchat', function(event)
|
||||
local room, stanza, occupant = event.room, event.stanza, event.occupant;
|
||||
|
||||
-- filter sending messages from transcribers/jibris to visitors
|
||||
@@ -231,7 +277,7 @@ process_host_module(main_muc_component_config, function(host_module, host)
|
||||
end);
|
||||
-- receiving messages from visitor nodes and forward them to local main participants
|
||||
-- and forward them to the rest of visitor nodes
|
||||
host_module:hook("muc-occupant-groupchat", function(event)
|
||||
host_module:hook('muc-occupant-groupchat', function(event)
|
||||
local occupant, room, stanza = event.occupant, event.room, event.stanza;
|
||||
local to = stanza.attr.to;
|
||||
local from = stanza.attr.from;
|
||||
@@ -260,4 +306,15 @@ process_host_module(main_muc_component_config, function(host_module, host)
|
||||
|
||||
return true;
|
||||
end, 55); -- prosody check for unknown participant chat is prio 50, we want to override it
|
||||
|
||||
host_module:hook('muc-config-submitted/muc#roomconfig_roomsecret', function(event)
|
||||
if event.status_codes['104'] then
|
||||
local room = event.room;
|
||||
-- we need to update all vnodes
|
||||
local vnodes = visitors_nodes[room.jid].nodes;
|
||||
for conference_service in pairs(vnodes) do
|
||||
send_visitors_iq(conference_service, room, 'update');
|
||||
end
|
||||
end
|
||||
end, -100); -- we want to run last in order to check is the status code 104
|
||||
end);
|
||||
|
||||
Reference in New Issue
Block a user