changeset 1180:513aa2e0c045

mod_host_blacklist: Similar to mod_s2s_blacklist, but stanza-based. Works between hosts on the same server, at a slight performance impact.
author Matthew Wild <mwild1@gmail.com>
date Tue, 03 Sep 2013 11:07:00 +0100
parents 27b4e01ddbc4
children 005b0429cf46
files mod_host_blacklist/mod_host_blacklist.lua
diffstat 1 files changed, 25 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_host_blacklist/mod_host_blacklist.lua	Tue Sep 03 11:07:00 2013 +0100
@@ -0,0 +1,25 @@
+local jid_split = require "util.jid".split;
+local st = require "util.stanza";
+local set = require "util.set";
+local select = select;
+
+local blacklist = module:get_option_inherited_set("host_blacklist", {});
+
+local function stanza_checker(attr)
+	return function (event)
+		local host = select(2, jid_split(stanza.attr[attr]));
+		if blacklist:contains(host) then
+			module:send(st.error_reply(event.stanza, "cancel", "not-allowed", "Communication with this domain is restricted"));
+		end
+	end
+end
+
+check_incoming_stanza = stanza_checker("from");
+check_outgoing_stanza = stanza_checker("to");
+
+for stanza_type in set.new{"presence","message","iq"}:items() do
+	for jid_type in set.new{"bare", "full", "host"}:items() do
+		module:hook("pre-"..stanza_type.."/"..jid_type, check_outgoing_stanza, 500);
+		module:hook(stanza_type.."/"..jid_type, check_incoming_stanza, 500);
+	end
+end