Mercurial > prosody-modules
comparison mod_firewall/conditions.lib.lua @ 947:c91cac3b823f
mod_firewall: General stanza filtering plugin with a declarative rule-based syntax
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 03 Apr 2013 16:11:20 +0100 |
| parents | |
| children | bec5b6e2eab8 |
comparison
equal
deleted
inserted
replaced
| 946:2c5430ff1c11 | 947:c91cac3b823f |
|---|---|
| 1 local condition_handlers = {}; | |
| 2 | |
| 3 local jid = require "util.jid"; | |
| 4 | |
| 5 -- Return a code string for a condition that checks whether the contents | |
| 6 -- of variable with the name 'name' matches any of the values in the | |
| 7 -- comma/space/pipe delimited list 'values'. | |
| 8 local function compile_comparison_list(name, values) | |
| 9 local conditions = {}; | |
| 10 for value in values:gmatch("[^%s,|]+") do | |
| 11 table.insert(conditions, ("%s == %q"):format(name, value)); | |
| 12 end | |
| 13 return table.concat(conditions, " or "); | |
| 14 end | |
| 15 | |
| 16 function condition_handlers.KIND(kind) | |
| 17 return compile_comparison_list("name", kind), { "name" }; | |
| 18 end | |
| 19 | |
| 20 local wildcard_equivs = { ["*"] = ".*", ["?"] = "." }; | |
| 21 | |
| 22 local function compile_jid_match_part(part, match) | |
| 23 if not match then | |
| 24 return part.." == nil" | |
| 25 end | |
| 26 local pattern = match:match("<(.*)>"); | |
| 27 -- TODO: Support Lua pattern matching (main issue syntax... << >>?) | |
| 28 if pattern then | |
| 29 if pattern ~= "*" then | |
| 30 return ("%s:match(%q)"):format(part, pattern:gsub(".", wildcard_equivs)); | |
| 31 end | |
| 32 else | |
| 33 return ("%s == %q"):format(part, match); | |
| 34 end | |
| 35 end | |
| 36 | |
| 37 local function compile_jid_match(which, match_jid) | |
| 38 local match_node, match_host, match_resource = jid.split(match_jid); | |
| 39 local conditions = { | |
| 40 compile_jid_match_part(which.."_node", match_node); | |
| 41 compile_jid_match_part(which.."_host", match_host); | |
| 42 match_resource and compile_jid_match_part(which.."_resource", match_resource) or nil; | |
| 43 }; | |
| 44 return table.concat(conditions, " and "); | |
| 45 end | |
| 46 | |
| 47 function condition_handlers.TO(to) | |
| 48 return compile_jid_match("to", to), { "split_to" }; | |
| 49 end | |
| 50 | |
| 51 function condition_handlers.FROM(from) | |
| 52 return compile_jid_match("from", from), { "split_from" }; | |
| 53 end | |
| 54 | |
| 55 function condition_handlers.TYPE(type) | |
| 56 return compile_comparison_list("type", type), { "type" }; | |
| 57 end | |
| 58 | |
| 59 function condition_handlers.ENTERING(zone) | |
| 60 return ("(zones[%q] and (zones[%q][to_host] or " | |
| 61 .."zones[%q][to] or " | |
| 62 .."zones[%q][bare_to]))" | |
| 63 ) | |
| 64 :format(zone, zone, zone, zone), { "split_to", "bare_to" }; | |
| 65 end | |
| 66 | |
| 67 function condition_handlers.LEAVING(zone) | |
| 68 return ("zones[%q] and (zones[%q][from_host] or " | |
| 69 .."(zones[%q][from] or " | |
| 70 .."zones[%q][bare_from]))") | |
| 71 :format(zone, zone, zone, zone), { "split_from", "bare_from" }; | |
| 72 end | |
| 73 | |
| 74 function condition_handlers.PAYLOAD(payload_ns) | |
| 75 return ("stanza:get_child(nil, %q)"):format(payload_ns); | |
| 76 end | |
| 77 | |
| 78 function condition_handlers.FROM_GROUP(group_name) | |
| 79 return ("group_contains(%q, bare_from)"):format(group_name), { "group_contains", "bare_from" }; | |
| 80 end | |
| 81 | |
| 82 function condition_handlers.TO_GROUP(group_name) | |
| 83 return ("group_contains(%q, bare_to)"):format(group_name), { "group_contains", "bare_to" }; | |
| 84 end | |
| 85 | |
| 86 function condition_handlers.FROM_ADMIN_OF(host) | |
| 87 return ("is_admin(bare_from, %s)"):format(host ~= "*" and host or nil), { "is_admin", "bare_from" }; | |
| 88 end | |
| 89 | |
| 90 function condition_handlers.TO_ADMIN_OF(host) | |
| 91 return ("is_admin(bare_to, %s)"):format(host ~= "*" and host or nil), { "is_admin", "bare_to" }; | |
| 92 end | |
| 93 | |
| 94 return condition_handlers; |
