Software /
code /
prosody-modules
Diff
mod_s2s_blackwhitelist/mod_s2s_blackwhitelist.lua @ 215:281db5eefcb4
mod_s2s_blackwhitelist: adding blacklist and whitelist plugin for s2s connections
author | Gaurav <gauravsri@gmail.com> |
---|---|
date | Fri, 16 Jul 2010 10:02:31 -0700 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_s2s_blackwhitelist/mod_s2s_blackwhitelist.lua Fri Jul 16 10:02:31 2010 -0700 @@ -0,0 +1,187 @@ + +local s2smanager = require "core.s2smanager"; +local config = require "core.configmanager"; +local nameprep = require "util.encodings".stringprep.nameprep; + +local s2s_blacklist = module:get_option_array("s2s_blacklist"); +local s2s_whitelist = module:get_option_array("s2s_whitelist"); +local s2s_enable_blackwhitelist = module:get_option_string("s2s_enable_blackwhitelist"); +local is_blacklist_enabled = false; +local is_whitelist_enabled = false; + +if s2s_enable_blackwhitelist == "blacklist" then + if type(s2s_blacklist) == "table" then + is_blacklist_enabled = true; + module:log("debug", "s2s-blacklist is enabled"); + local count=#s2s_blacklist; + for i=1,count do + module:log("debug", "s2s-blacklist adding [%s]", s2s_blacklist[i]); + end + end +elseif s2s_enable_blackwhitelist == "whitelist" then + if type(s2s_whitelist) == "table" then + is_whitelist_enabled = true; + module:log("debug", "s2s-whitelist is enabled"); + local count=#s2s_whitelist; + for i=1,count do + module:log("debug", "s2s-whitelist adding [%s]", s2s_whitelist[i]); + end + end +end + +local function reload_list() + s2s_blacklist = module:get_option_array("s2s_blacklist"); + s2s_whitelist = module:get_option_array("s2s_whitelist"); + s2s_enable_blackwhitelist = module:get_option_string("s2s_enable_blackwhitelist"); + + if s2s_enable_blackwhitelist == "blacklist" then + if type(s2s_blacklist) == "table" then + is_blacklist_enabled = true; + module:log("debug", "s2s-blacklist is enabled"); + local count=#s2s_blacklist; + for i=1,count do + module:log("debug", "s2s-blacklist adding [%s]", s2s_blacklist[i]); + end + end + elseif s2s_enable_blackwhitelist == "whitelist" then + if type(s2s_whitelist) == "table" then + is_whitelist_enabled = true; + module:log("debug", "s2s-whitelist is enabled"); + local count=#s2s_whitelist; + for i=1,count do + module:log("debug", "s2s-whitelist adding [%s]", s2s_whitelist[i]); + end + end + end +end + +local _make_connect = s2smanager.make_connect; +function s2smanager.make_connect(session, connect_host, connect_port) + local host = session.to_host; + if not session.s2sValidation then + if (host and is_blacklist_enabled == true) then + local count=#s2s_blacklist; + for i=1,count do + if s2s_blacklist[i] == host then + module:log ("error", "blacklisted host received %s", s2s_blacklist[i]); + s2smanager.destroy_session(session, "This host does not serve "..host); + return false; + end + end + elseif (host and is_whitelist_enabled == true) then + local count=#s2s_whitelist; + local found=false; + for i=1,count do + if s2s_whitelist[i] == host then + found=true; + end + end + if found == false then + module:log ("error", "host %s couldn't be found in whitelist", host); + s2smanager.destroy_session(session, "This host does not serve "..host); + return false; + end + end + end + return _make_connect(session, connect_host, connect_port); +end + +local _stream_opened = s2smanager.streamopened; +function s2smanager.streamopened(session, attr) + local host = attr.from and nameprep(attr.from); + if not host then + session.s2sValidation = false; + else + session.s2sValidation = true; + end + + if (host and is_blacklist_enabled == true) then + local count=#s2s_blacklist; + for i=1,count do + if s2s_blacklist[i] == host then + module:log ("error", "blacklisted host received %s", s2s_blacklist[i]); + session:close({condition = "host-unknown", text = "This host does not serve " .. host}); + return; + end + end + elseif (host and is_whitelist_enabled == true) then + local count=#s2s_whitelist; + local found=false; + for i=1,count do + if s2s_whitelist[i] == host then + found=true; + end + end + if found == false then + module:log ("error", "host %s couldn't be found in whitelist", host); + session:close({condition = "host-unknown", text = "This host does not serve " .. host}); + return; + end + end + _stream_opened(session, attr); +end + + +local function server_dialback_result_hook (event) + local origin, stanza = event.origin, event.stanza; + + if origin.type == "s2sin" or origin.type == "s2sin_unauthed" then + + local host = stanza.attr.from; + + if (host and is_blacklist_enabled == true) then + local count=#s2s_blacklist; + for i=1,count do + if s2s_blacklist[i] == host then + module:log ("error", "blacklisted host received %s", s2s_blacklist[i]); + origin:close({condition = "host-unknown", text = "This host does not serve " .. host}); + return true; + end + end + elseif (host and is_whitelist_enabled == true) then + local count=#s2s_whitelist; + local found=false; + for i=1,count do + if s2s_whitelist[i] == host then + found=true; + end + end + if found == false then + module:log ("error", "host %s couldn't be found in whitelist", host); + origin:close({condition = "host-unknown", text = "This host does not serve " .. host}); + return true; + end + end + + end + + return nil; +end + +local function handle_activated_host (host) + if (hosts[host] and hosts[host].events) then + hosts[host].events.add_handler("stanza/jabber:server:dialback:result", server_dialback_result_hook, 100); + module:log ("debug", "adding hook for %s", host); + end +end + +local function handle_deactivated_host (host) + if (hosts[host] and hosts[host].events) then + hosts[host].events.remove_handler("stanza/jabber:server:dialback:result", server_dialback_result_hook); + module:log ("debug", "removing hook for %s", host); + end +end + +prosody.events.add_handler("host-activated", handle_activated_host); +prosody.events.add_handler("component-activated", handle_activated_host); +prosody.events.add_handler("host-deactivated", handle_deactivated_host); +prosody.events.add_handler("component-deactivated", handle_deactivated_host); +prosody.events.add_handler("config-reloaded", reload_list); + +for name, host in pairs(hosts) do + if host and host.events then + host.events.add_handler("stanza/jabber:server:dialback:result", server_dialback_result_hook, 100); + module:log ("debug", "adding hook for %s", name); + end +end +