File

mod_muc_batched_probe/mod_muc_batched_probe.lua @ 5405:c7a5caad28ef

mod_http_oauth2: Enforce response type encoded in client_id The client promises to only use this response type, so we should hold them to that. This makes it fail earlier if the response type is disabled or the client is trying to use one that it promised not to use. Better than failing after login and consent.
author Kim Alvefur <zash@zash.se>
date Tue, 02 May 2023 16:31:25 +0200
parent 4190:e06258fc6cf1
line wrap: on
line source

-- This module allows you to probe the MUC presences for multiple occupants.
-- Copyright (C) 2020 JC Brand

local st = require "util.stanza";
local mod_muc = module:depends"muc";
local get_room_from_jid = rawget(mod_muc, "get_room_from_jid") or
	function (jid)
		local rooms = rawget(mod_muc, "rooms");
		return rooms[jid];
	end

module:log("debug", "Module loaded");

local function respondToBatchedProbe(event)
	local stanza = event.stanza;
	if stanza.attr.type ~= "get" then
		return;
	end
	local query = stanza:get_child("query", "http://jabber.org/protocol/muc#user");
	if not query then
		return;
	end;

	local origin = event.origin;
	local room = get_room_from_jid(stanza.attr.to);
	local probing_occupant = room:get_occupant_by_real_jid(stanza.attr.from);
	if probing_occupant == nil then
		origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat", room.jid));
		return true;
	end

	for item in query:children() do
		local probed_jid = item.attr.jid;
		local probed_occupant = room:get_occupant_by_nick(probed_jid);
		if probed_occupant == nil then
			local pr = room:build_unavailable_presence(probed_jid, stanza.attr.from);
			if pr then
				room:route_stanza(pr);
			end
		else
			local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"});
			room:publicise_occupant_status(probed_occupant, x, nil, nil, nil, nil, false, probing_occupant);
		end
	end
	origin.send(st.reply(stanza));
	return true;
end


module:hook("iq/bare", respondToBatchedProbe, 1);