Comparison

mod_firewall/conditions.lib.lua @ 2519:d4bc434a60a4

mod_firewall: Update functions that use meta() to allow functions with deps inside expressions
author Matthew Wild <mwild1@gmail.com>
date Sun, 19 Feb 2017 21:08:30 +0000
parent 2465:bd69ffe071e6
child 2520:c6fd8975704b
comparison
equal deleted inserted replaced
2518:0e1054c19f9d 2519:d4bc434a60a4
122 if path:find("=") then 122 if path:find("=") then
123 local query, match_type, value = path:match("(.-)([~/$]*)=(.*)"); 123 local query, match_type, value = path:match("(.-)([~/$]*)=(.*)");
124 if not(query:match("#$") or query:match("@[^/]+")) then 124 if not(query:match("#$") or query:match("@[^/]+")) then
125 error("Stanza path does not return a string (append # for text content or @name for value of named attribute)", 0); 125 error("Stanza path does not return a string (append # for text content or @name for value of named attribute)", 0);
126 end 126 end
127 local meta_deps = {};
127 local quoted_value = ("%q"):format(value); 128 local quoted_value = ("%q"):format(value);
128 if match_type:find("$", 1, true) then 129 if match_type:find("$", 1, true) then
129 match_type = match_type:gsub("%$", ""); 130 match_type = match_type:gsub("%$", "");
130 quoted_value = meta(quoted_value); 131 quoted_value = meta(quoted_value, meta_deps);
131 end 132 end
132 if match_type == "~" then -- Lua pattern match 133 if match_type == "~" then -- Lua pattern match
133 return ("(stanza:find(%q) or ''):match(%s)"):format(query, quoted_value); 134 return ("(stanza:find(%q) or ''):match(%s)"):format(query, quoted_value), meta_deps;
134 elseif match_type == "/" then -- find literal substring 135 elseif match_type == "/" then -- find literal substring
135 return ("(stanza:find(%q) or ''):find(%s, 1, true)"):format(query, quoted_value); 136 return ("(stanza:find(%q) or ''):find(%s, 1, true)"):format(query, quoted_value), meta_deps;
136 elseif match_type == "" then -- exact match 137 elseif match_type == "" then -- exact match
137 return ("stanza:find(%q) == %s"):format(query, quoted_value); 138 return ("stanza:find(%q) == %s"):format(query, quoted_value), meta_deps;
138 else 139 else
139 error("Unrecognised comparison '"..match_type.."='", 0); 140 error("Unrecognised comparison '"..match_type.."='", 0);
140 end 141 end
141 end 142 end
142 return ("stanza:find(%q)"):format(path); 143 return ("stanza:find(%q)"):format(path);
218 return table.concat(conditions, " or "), { "time:hour,min" }; 219 return table.concat(conditions, " or "), { "time:hour,min" };
219 end 220 end
220 221
221 function condition_handlers.LIMIT(spec) 222 function condition_handlers.LIMIT(spec)
222 local name, param = spec:match("^(%w+) on (.+)$"); 223 local name, param = spec:match("^(%w+) on (.+)$");
224 local meta_deps = {};
223 225
224 if not name then 226 if not name then
225 name = spec:match("^%w+$"); 227 name = spec:match("^%w+$");
226 if not name then 228 if not name then
227 error("Unable to parse LIMIT specification"); 229 error("Unable to parse LIMIT specification");
228 end 230 end
229 else 231 else
230 param = meta(("%q"):format(param)); 232 param = meta(("%q"):format(param), meta_deps);
231 end 233 end
232 234
233 if not param then 235 if not param then
234 return ("not global_throttle_%s:poll(1)"):format(name), { "globalthrottle:"..name }; 236 return ("not global_throttle_%s:poll(1)"):format(name), { "globalthrottle:"..name, unpack(meta_deps) };
235 end 237 end
236 return ("not multi_throttle_%s:poll_on(%s, 1)"):format(name, param), { "multithrottle:"..name }; 238 return ("not multi_throttle_%s:poll_on(%s, 1)"):format(name, param), { "multithrottle:"..name, unpack(meta_deps) };
237 end 239 end
238 240
239 function condition_handlers.ORIGIN_MARKED(name_and_time) 241 function condition_handlers.ORIGIN_MARKED(name_and_time)
240 local name, time = name_and_time:match("^%s*([%w_]+)%s+%(([^)]+)s%)%s*$"); 242 local name, time = name_and_time:match("^%s*([%w_]+)%s+%(([^)]+)s%)%s*$");
241 if not name then 243 if not name then