File

plugins/mod_iq.lua @ 9450:b890ceb1c24f

util.poll: Increase max epoll events per call This makes the struct roughly the same size in both epoll and select mode (64bit). There doesn’t seem to be much guidance on an appropriate size, it does not seem to matter too much since if there are more events they will simply show up in the next epoll_wait call. The number of exactly concurrent events should be fairly low most of the time anyways.
author Kim Alvefur <zash@zash.se>
date Mon, 08 Oct 2018 15:33:15 +0200
parent 8728:41c959c5c84b
child 12977:74b9e05af71e
line wrap: on
line source

-- Prosody IM
-- Copyright (C) 2008-2010 Matthew Wild
-- Copyright (C) 2008-2010 Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--


local st = require "util.stanza";

local full_sessions = prosody.full_sessions;

if module:get_host_type() == "local" then
	module:hook("iq/full", function(data)
		-- IQ to full JID received
		local origin, stanza = data.origin, data.stanza;

		local session = full_sessions[stanza.attr.to];
		if not (session and session.send(stanza)) then
			if stanza.attr.type == "get" or stanza.attr.type == "set" then
				origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
			end
		end
		return true;
	end);
end

module:hook("iq/bare", function(data)
	-- IQ to bare JID received
	local stanza = data.stanza;
	local type = stanza.attr.type;

	-- TODO fire post processing events
	if type == "get" or type == "set" then
		local child = stanza.tags[1];
		local xmlns = child.attr.xmlns or "jabber:client";
		local ret = module:fire_event("iq/bare/"..xmlns..":"..child.name, data);
		if ret ~= nil then return ret; end
		return module:fire_event("iq-"..type.."/bare/"..xmlns..":"..child.name, data);
	else
		return module:fire_event("iq-"..type.."/bare/"..stanza.attr.id, data);
	end
end);

module:hook("iq/self", function(data)
	-- IQ to self JID received
	local stanza = data.stanza;
	local type = stanza.attr.type;

	if type == "get" or type == "set" then
		local child = stanza.tags[1];
		local xmlns = child.attr.xmlns or "jabber:client";
		local ret = module:fire_event("iq/self/"..xmlns..":"..child.name, data);
		if ret ~= nil then return ret; end
		return module:fire_event("iq-"..type.."/self/"..xmlns..":"..child.name, data);
	else
		return module:fire_event("iq-"..type.."/self/"..stanza.attr.id, data);
	end
end);

module:hook("iq/host", function(data)
	-- IQ to a local host received
	local stanza = data.stanza;
	local type = stanza.attr.type;

	if type == "get" or type == "set" then
		local child = stanza.tags[1];
		local xmlns = child.attr.xmlns or "jabber:client";
		local ret = module:fire_event("iq/host/"..xmlns..":"..child.name, data);
		if ret ~= nil then return ret; end
		return module:fire_event("iq-"..type.."/host/"..xmlns..":"..child.name, data);
	else
		return module:fire_event("iq-"..type.."/host/"..stanza.attr.id, data);
	end
end);