Comparison

mod_host_guard/mod_host_guard.lua @ 682:3ab1cf30a848

mod_host_guard: using route/remote event hook to stop outgoing connections to filtered entities, yet the returned error is highly misleading.
author Marco Cirillo <maranda@lightwitch.org>
date Sun, 27 May 2012 01:34:53 +0000
parent 681:03ef667c96c3
child 683:939f8fc84d49
comparison
equal deleted inserted replaced
681:03ef667c96c3 682:3ab1cf30a848
7 local guard_ball_wl = module:get_option_set("host_guard_blockall_exceptions", {}) 7 local guard_ball_wl = module:get_option_set("host_guard_blockall_exceptions", {})
8 local guard_protect = module:get_option_set("host_guard_selective", {}) 8 local guard_protect = module:get_option_set("host_guard_selective", {})
9 local guard_block_bl = module:get_option_set("host_guard_blacklist", {}) 9 local guard_block_bl = module:get_option_set("host_guard_blacklist", {})
10 10
11 local config = require "core.configmanager" 11 local config = require "core.configmanager"
12 local error_reply = require "util.stanza".error_reply
12 local nameprep = require "util.encodings".stringprep.nameprep 13 local nameprep = require "util.encodings".stringprep.nameprep
13 14
14 local function s2s_hook (event) 15 local function s2s_hook (event)
15 local origin, stanza = event.session or event.origin, event.stanza or false 16 local origin, stanza = event.session or event.origin, event.stanza or false
16 local to_host, from_host = (not stanza and origin.to_host) or stanza.attr.to, (not stanza and origin.from_host) or stanza.attr.from 17 local to_host, from_host = (not stanza and origin.to_host) or stanza.attr.to, (not stanza and origin.from_host) or stanza.attr.from
17 18
18 if origin.type == "s2sin" or origin.type == "s2sin_unauthed" then 19 if origin.type == "s2sin" or origin.type == "s2sin_unauthed" then
19 if guard_blockall:contains(to_host) and not guard_ball_wl:contains(from_host) or 20 if guard_blockall:contains(to_host) and not guard_ball_wl:contains(from_host) or
20 guard_block_bl:contains(from_host) and guard_protect:contains(to_host) then 21 guard_block_bl:contains(from_host) and guard_protect:contains(to_host) then
21 module:log("error", "remote service %s attempted to access restricted host %s", stanza.attr.from, stanza.attr.to) 22 module:log("error", "remote service %s attempted to access restricted host %s", from_host, to_host)
22 origin:close({condition = "policy-violation", text = "You're not authorized, good bye."}) 23 origin:close({condition = "policy-violation", text = "You're not authorized, good bye."})
23 return false 24 return false
24 end 25 end
25 end 26 end
26 27
27 return nil 28 return nil
28 end 29 end
29 30
31 local function rr_hook (event)
32 local from_host, to_host, stanza = event.from_host, event.to_host, event.stanza
33
34 if guard_blockall:contains(from_host) and not guard_ball_wl:contains(to_host) or
35 guard_block_bl:contains(to_host) and guard_protect:contains(from_host) then
36 module:log("info", "attempted to connect to a filtered remote host %s", to_host)
37 return false
38 end
39
40 return nil
41 end
42
30 local function handle_activation (host) 43 local function handle_activation (host)
31 if guard_blockall:contains(host) or guard_protect:contains(host) then 44 if guard_blockall:contains(host) or guard_protect:contains(host) then
32 if hosts[host] and hosts[host].events then 45 if hosts[host] and hosts[host].events then
33 hosts[host].events.add_handler("s2sin-established", s2s_hook, 500) 46 hosts[host].events.add_handler("s2sin-established", s2s_hook, 500)
47 hosts[host].events.add_handler("route/remote", rr_hook, 500)
34 hosts[host].events.add_handler("stanza/jabber:server:dialback:result", s2s_hook, 500) 48 hosts[host].events.add_handler("stanza/jabber:server:dialback:result", s2s_hook, 500)
35 module:log ("debug", "adding host protection for: "..host) 49 module:log ("debug", "adding host protection for: "..host)
36 end 50 end
37 end 51 end
38 end 52 end
39 53
40 local function handle_deactivation (host) 54 local function handle_deactivation (host)
41 if guard_blockall:contains(host) or guard_protect:contains(host) then 55 if guard_blockall:contains(host) or guard_protect:contains(host) then
42 if hosts[host] and hosts[host].events then 56 if hosts[host] and hosts[host].events then
43 hosts[host].events.remove_handler("s2sin-established", s2s_hook) 57 hosts[host].events.remove_handler("s2sin-established", s2s_hook)
58 hosts[host].events.remove_handler("route/remote", rr_hook)
44 hosts[host].events.remove_handler("stanza/jabber:server:dialback:result", s2s_hook) 59 hosts[host].events.remove_handler("stanza/jabber:server:dialback:result", s2s_hook)
45 module:log ("debug", "removing host protection for: "..host) 60 module:log ("debug", "removing host protection for: "..host)
46 end 61 end
47 end 62 end
48 end 63 end
49 64
50 local function init_hosts() 65 local function init_hosts()
51 for n,table in pairs(hosts) do 66 for n,table in pairs(hosts) do
52 hosts[n].events.remove_handler("s2sin-established", s2s_hook) 67 hosts[n].events.remove_handler("s2sin-established", s2s_hook)
68 hosts[n].events.remove_handler("route/remote", rr_hook)
53 hosts[n].events.remove_handler("stanza/jabber:server:dialback:result", s2s_hook) 69 hosts[n].events.remove_handler("stanza/jabber:server:dialback:result", s2s_hook)
54 if guard_blockall:contains(n) or guard_protect:contains(n) then handle_activation(n) end 70 if guard_blockall:contains(n) or guard_protect:contains(n) then handle_activation(n) end
55 end 71 end
56 end 72 end
57 73