plugins/mod_blocklist.lua
changeset 8278 13dad833e821
parent 8043 62c540d51d50
child 8744 0fd63ed1f647
equal deleted inserted replaced
8277:3798955049e3 8278:13dad833e821
    20 local jid_prep = require"util.jid".prep;
    20 local jid_prep = require"util.jid".prep;
    21 local jid_split = require"util.jid".split;
    21 local jid_split = require"util.jid".split;
    22 
    22 
    23 local storage = module:open_store();
    23 local storage = module:open_store();
    24 local sessions = prosody.hosts[module.host].sessions;
    24 local sessions = prosody.hosts[module.host].sessions;
       
    25 local full_sessions = prosody.full_sessions;
    25 
    26 
    26 -- First level cache of blocklists by username.
    27 -- First level cache of blocklists by username.
    27 -- Weak table so may randomly expire at any time.
    28 -- Weak table so may randomly expire at any time.
    28 local cache = setmetatable({}, { __mode = "v" });
    29 local cache = setmetatable({}, { __mode = "v" });
    29 
    30 
   269 	end
   270 	end
   270 	return drop_stanza(event); -- result or error
   271 	return drop_stanza(event); -- result or error
   271 end
   272 end
   272 
   273 
   273 local function bounce_message(event)
   274 local function bounce_message(event)
   274 	local type = event.stanza.attr.type;
   275 	local stanza = event.stanza;
       
   276 	local type = stanza.attr.type;
   275 	if type == "chat" or not type or type == "normal" then
   277 	if type == "chat" or not type or type == "normal" then
       
   278 		if full_sessions[stanza.attr.to] then
       
   279 			-- See #690
       
   280 			return drop_stanza(event);
       
   281 		end
   276 		return bounce_stanza(event);
   282 		return bounce_stanza(event);
   277 	end
   283 	end
   278 	return drop_stanza(event); -- drop headlines, groupchats etc
   284 	return drop_stanza(event); -- drop headlines, groupchats etc
   279 end
   285 end
   280 
   286 
   303 -- Hook all the events!
   309 -- Hook all the events!
   304 local prio_in, prio_out = 100, 100;
   310 local prio_in, prio_out = 100, 100;
   305 module:hook("presence/bare", drop_stanza, prio_in);
   311 module:hook("presence/bare", drop_stanza, prio_in);
   306 module:hook("presence/full", drop_stanza, prio_in);
   312 module:hook("presence/full", drop_stanza, prio_in);
   307 
   313 
   308 -- FIXME See #690
       
   309 module:hook("message/bare", bounce_message, prio_in);
   314 module:hook("message/bare", bounce_message, prio_in);
   310 module:hook("message/full", bounce_message, prio_in);
   315 module:hook("message/full", bounce_message, prio_in);
   311 
   316 
   312 module:hook("iq/bare", bounce_iq, prio_in);
   317 module:hook("iq/bare", bounce_iq, prio_in);
   313 module:hook("iq/full", bounce_iq, prio_in);
   318 module:hook("iq/full", bounce_iq, prio_in);