Mercurial > prosody-modules
comparison mod_firewall/mod_firewall.lua @ 965:d4e24fb289c0
mod_firewall: Improve zone handling, make it more efficient, and support dynamic dependencies in the compiler. ENTERING and LEAVING conditions now work at expected (not matching stanzas flowing within a zone).
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 05 Apr 2013 19:21:46 +0100 |
| parents | d773a51af9b1 |
| children | a65df6e97d94 |
comparison
equal
deleted
inserted
replaced
| 964:04e85eb3dfef | 965:d4e24fb289c0 |
|---|---|
| 70 group_contains = { | 70 group_contains = { |
| 71 global_code = [[local group_contains = module:depends("groups").group_contains]]; | 71 global_code = [[local group_contains = module:depends("groups").group_contains]]; |
| 72 }; | 72 }; |
| 73 is_admin = { global_code = [[local is_admin = require "core.usermanager".is_admin]]}; | 73 is_admin = { global_code = [[local is_admin = require "core.usermanager".is_admin]]}; |
| 74 core_post_stanza = { global_code = [[local core_post_stanza = prosody.core_post_stanza]] }; | 74 core_post_stanza = { global_code = [[local core_post_stanza = prosody.core_post_stanza]] }; |
| 75 zone = { global_code = function (zone) | |
| 76 assert(zone:match("^%a[%w_]*$"), "Invalid zone name: "..zone); | |
| 77 return ("local zone_%s = zones[%q] or {};"):format(zone, zone); | |
| 78 end }; | |
| 75 }; | 79 }; |
| 76 | 80 |
| 77 local function include_dep(dep, code) | 81 local function include_dep(dep, code) |
| 82 local dep, dep_param = dep:match("^([^:]+):?(.*)$"); | |
| 78 local dep_info = available_deps[dep]; | 83 local dep_info = available_deps[dep]; |
| 79 if not dep_info then | 84 if not dep_info then |
| 80 module:log("error", "Dependency not found: %s", dep); | 85 module:log("error", "Dependency not found: %s", dep); |
| 81 return; | 86 return; |
| 82 end | 87 end |
| 89 code.included_deps[dep] = false; -- Pending flag (used to detect circular references) | 94 code.included_deps[dep] = false; -- Pending flag (used to detect circular references) |
| 90 for _, dep_dep in ipairs(dep_info.depends or {}) do | 95 for _, dep_dep in ipairs(dep_info.depends or {}) do |
| 91 include_dep(dep_dep, code); | 96 include_dep(dep_dep, code); |
| 92 end | 97 end |
| 93 if dep_info.global_code then | 98 if dep_info.global_code then |
| 94 table.insert(code.global_header, dep_info.global_code); | 99 if dep_param ~= "" then |
| 100 table.insert(code.global_header, dep_info.global_code(dep_param)); | |
| 101 else | |
| 102 table.insert(code.global_header, dep_info.global_code); | |
| 103 end | |
| 95 end | 104 end |
| 96 if dep_info.local_code then | 105 if dep_info.local_code then |
| 97 table.insert(code, "\n\t-- "..dep.."\n\t"..dep_info.local_code.."\n\n\t"); | 106 if dep_param ~= "" then |
| 107 table.insert(code, "\n\t-- "..dep.."\n\t"..dep_info.local_code(dep_param).."\n\n\t"); | |
| 108 else | |
| 109 table.insert(code, "\n\t-- "..dep.."\n\t"..dep_info.local_code.."\n\n\t"); | |
| 110 end | |
| 98 end | 111 end |
| 99 code.included_deps[dep] = true; | 112 code.included_deps[dep] = true; |
| 100 end | 113 end |
| 101 | 114 |
| 102 local condition_handlers = module:require("conditions"); | 115 local condition_handlers = module:require("conditions"); |
