"Fossies" - the Fresh Open Source Software Archive

Member "jitsi-meet-7329/resources/prosody-plugins/mod_muc_size.lua" (9 Jun 2023, 6191 Bytes) of package /linux/misc/jitsi-meet-7329.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Lua source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 -- Prosody IM
    2 -- Copyright (C) 2021-present 8x8, Inc.
    3 --
    4 
    5 local jid = require "util.jid";
    6 local it = require "util.iterators";
    7 local json = require "util.json";
    8 local iterators = require "util.iterators";
    9 local array = require"util.array";
   10 
   11 local have_async = pcall(require, "util.async");
   12 if not have_async then
   13     module:log("error", "requires a version of Prosody with util.async");
   14     return;
   15 end
   16 
   17 local async_handler_wrapper = module:require "util".async_handler_wrapper;
   18 
   19 local tostring = tostring;
   20 local neturl = require "net.url";
   21 local parse = neturl.parseQuery;
   22 
   23 -- option to enable/disable room API token verifications
   24 local enableTokenVerification
   25     = module:get_option_boolean("enable_roomsize_token_verification", false);
   26 
   27 local token_util = module:require "token/util".new(module);
   28 local get_room_from_jid = module:require "util".get_room_from_jid;
   29 
   30 -- no token configuration but required
   31 if token_util == nil and enableTokenVerification then
   32     log("error", "no token configuration but it is required");
   33     return;
   34 end
   35 
   36 -- required parameter for custom muc component prefix,
   37 -- defaults to "conference"
   38 local muc_domain_prefix
   39     = module:get_option_string("muc_mapper_domain_prefix", "conference");
   40 
   41 --- Verifies room name, domain name with the values in the token
   42 -- @param token the token we received
   43 -- @param room_address the full room address jid
   44 -- @return true if values are ok or false otherwise
   45 function verify_token(token, room_address)
   46     if not enableTokenVerification then
   47         return true;
   48     end
   49 
   50     -- if enableTokenVerification is enabled and we do not have token
   51     -- stop here, cause the main virtual host can have guest access enabled
   52     -- (allowEmptyToken = true) and we will allow access to rooms info without
   53     -- a token
   54     if token == nil then
   55         log("warn", "no token provided");
   56         return false;
   57     end
   58 
   59     local session = {};
   60     session.auth_token = token;
   61     local verified, reason = token_util:process_and_verify_token(session);
   62     if not verified then
   63         log("warn", "not a valid token %s", tostring(reason));
   64         return false;
   65     end
   66 
   67     if not token_util:verify_room(session, room_address) then
   68         log("warn", "Token %s not allowed to join: %s",
   69             tostring(token), tostring(room_address));
   70         return false;
   71     end
   72 
   73     return true;
   74 end
   75 
   76 --- Handles request for retrieving the room size
   77 -- @param event the http event, holds the request query
   78 -- @return GET response, containing a json with participants count,
   79 --         the value is without counting the focus.
   80 function handle_get_room_size(event)
   81     if (not event.request.url.query) then
   82         return { status_code = 400; };
   83     end
   84 
   85     local params = parse(event.request.url.query);
   86     local room_name = params["room"];
   87     local domain_name = params["domain"];
   88     local subdomain = params["subdomain"];
   89 
   90     local room_address
   91         = jid.join(room_name, muc_domain_prefix.."."..domain_name);
   92 
   93     if subdomain and subdomain ~= "" then
   94         room_address = "["..subdomain.."]"..room_address;
   95     end
   96 
   97     if not verify_token(params["token"], room_address) then
   98         return { status_code = 403; };
   99     end
  100 
  101     local room = get_room_from_jid(room_address);
  102     local participant_count = 0;
  103 
  104     log("debug", "Querying room %s", tostring(room_address));
  105 
  106     if room then
  107         local occupants = room._occupants;
  108         if occupants then
  109             participant_count = iterators.count(room:each_occupant());
  110         end
  111         log("debug",
  112             "there are %s occupants in room", tostring(participant_count));
  113     else
  114         log("debug", "no such room exists");
  115         return { status_code = 404; };
  116     end
  117 
  118     if participant_count > 1 then
  119         participant_count = participant_count - 1;
  120     end
  121 
  122     return { status_code = 200; body = [[{"participants":]]..participant_count..[[}]] };
  123 end
  124 
  125 --- Handles request for retrieving the room participants details
  126 -- @param event the http event, holds the request query
  127 -- @return GET response, containing a json with participants details
  128 function handle_get_room (event)
  129     if (not event.request.url.query) then
  130         return { status_code = 400; };
  131     end
  132 
  133     local params = parse(event.request.url.query);
  134     local room_name = params["room"];
  135     local domain_name = params["domain"];
  136     local subdomain = params["subdomain"];
  137     local room_address
  138         = jid.join(room_name, muc_domain_prefix.."."..domain_name);
  139 
  140     if subdomain and subdomain ~= "" then
  141         room_address = "["..subdomain.."]"..room_address;
  142     end
  143 
  144     if not verify_token(params["token"], room_address) then
  145         return { status_code = 403; };
  146     end
  147 
  148     local room = get_room_from_jid(room_address);
  149     local participant_count = 0;
  150     local occupants_json = array();
  151 
  152     log("debug", "Querying room %s", tostring(room_address));
  153 
  154     if room then
  155         local occupants = room._occupants;
  156         if occupants then
  157             participant_count = iterators.count(room:each_occupant());
  158             for _, occupant in room:each_occupant() do
  159                 -- filter focus as we keep it as hidden participant
  160                 if string.sub(occupant.nick,-string.len("/focus"))~="/focus" then
  161                     for _, pr in occupant:each_session() do
  162                     local nick = pr:get_child_text("nick", "http://jabber.org/protocol/nick") or "";
  163                     local email = pr:get_child_text("email") or "";
  164                     occupants_json:push({
  165                         jid = tostring(occupant.nick),
  166                         email = tostring(email),
  167                         display_name = tostring(nick)});
  168                     end
  169                 end
  170             end
  171         end
  172         log("debug",
  173             "there are %s occupants in room", tostring(participant_count));
  174     else
  175         log("debug", "no such room exists");
  176         return { status_code = 404; };
  177     end
  178 
  179     if participant_count > 1 then
  180         participant_count = participant_count - 1;
  181     end
  182 
  183     return { status_code = 200; body = json.encode(occupants_json); };
  184 end;
  185 
  186 function module.load()
  187     module:depends("http");
  188     module:provides("http", {
  189         default_path = "/";
  190         route = {
  191             ["GET room-size"] = function (event) return async_handler_wrapper(event,handle_get_room_size) end;
  192             ["GET sessions"] = function () return tostring(it.count(it.keys(prosody.full_sessions))); end;
  193             ["GET room"] = function (event) return async_handler_wrapper(event,handle_get_room) end;
  194         };
  195     });
  196 end
  197