summaryrefslogtreecommitdiff
path: root/src/sp_config_keywords.c
diff options
context:
space:
mode:
authorxXx-caillou-xXx2017-12-20 18:09:53 +0100
committerjvoisin2017-12-20 18:09:53 +0100
commite7f541396715ee2895abcf73044b91ae9b746201 (patch)
treeba0e9765e7f14f04b92585df1f3fcd1830ab4b00 /src/sp_config_keywords.c
parent8d6cc4f2b63c3f0dc31fe6cecd34ac023ea1cccb (diff)
Better parsing of the rules
Thanks to this huge commit from @xXx-caillou-xXx, we can now write amazingly flexible rules.
Diffstat (limited to 'src/sp_config_keywords.c')
-rw-r--r--src/sp_config_keywords.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/src/sp_config_keywords.c b/src/sp_config_keywords.c
index dd9a880..2d294ee 100644
--- a/src/sp_config_keywords.c
+++ b/src/sp_config_keywords.c
@@ -178,7 +178,7 @@ int parse_cookie(char *line) {
178int parse_disabled_functions(char *line) { 178int parse_disabled_functions(char *line) {
179 int ret = 0; 179 int ret = 0;
180 bool enable = true, disable = false, allow = false, drop = false; 180 bool enable = true, disable = false, allow = false, drop = false;
181 char *pos = NULL; 181 char *pos = NULL, *var = NULL, *param = NULL;
182 char *line_number = NULL; 182 char *line_number = NULL;
183 sp_disabled_function *df = pecalloc(sizeof(*df), 1, 1); 183 sp_disabled_function *df = pecalloc(sizeof(*df), 1, 1);
184 df->pos = -1; 184 df->pos = -1;
@@ -196,16 +196,18 @@ int parse_disabled_functions(char *line) {
196 {parse_empty, SP_TOKEN_ALLOW, &(allow)}, 196 {parse_empty, SP_TOKEN_ALLOW, &(allow)},
197 {parse_empty, SP_TOKEN_DROP, &(drop)}, 197 {parse_empty, SP_TOKEN_DROP, &(drop)},
198 {parse_str, SP_TOKEN_HASH, &(df->hash)}, 198 {parse_str, SP_TOKEN_HASH, &(df->hash)},
199 {parse_str, SP_TOKEN_PARAM, &(df->param)}, 199 {parse_str, SP_TOKEN_PARAM, &(param)},
200 {parse_regexp, SP_TOKEN_VALUE_REGEXP, &(df->value_r)}, 200 {parse_regexp, SP_TOKEN_VALUE_REGEXP, &(df->value_r)},
201 {parse_str, SP_TOKEN_VALUE, &(df->value)}, 201 {parse_str, SP_TOKEN_VALUE, &(df->value)},
202 {parse_str, SP_TOKEN_KEY, &(df->key)},
203 {parse_regexp, SP_TOKEN_KEY_REGEXP, &(df->r_key)},
202 {parse_regexp, SP_TOKEN_PARAM_REGEXP, &(df->r_param)}, 204 {parse_regexp, SP_TOKEN_PARAM_REGEXP, &(df->r_param)},
203 {parse_php_type, SP_TOKEN_PARAM_TYPE, &(df->param_type)}, 205 {parse_php_type, SP_TOKEN_PARAM_TYPE, &(df->param_type)},
204 {parse_str, SP_TOKEN_RET, &(df->ret)}, 206 {parse_str, SP_TOKEN_RET, &(df->ret)},
205 {parse_cidr, SP_TOKEN_CIDR, &(df->cidr)}, 207 {parse_cidr, SP_TOKEN_CIDR, &(df->cidr)},
206 {parse_regexp, SP_TOKEN_RET_REGEXP, &(df->r_ret)}, 208 {parse_regexp, SP_TOKEN_RET_REGEXP, &(df->r_ret)},
207 {parse_php_type, SP_TOKEN_RET_TYPE, &(df->ret_type)}, 209 {parse_php_type, SP_TOKEN_RET_TYPE, &(df->ret_type)},
208 {parse_str, SP_TOKEN_LOCAL_VAR, &(df->var)}, 210 {parse_str, SP_TOKEN_LOCAL_VAR, &(var)},
209 {parse_str, SP_TOKEN_VALUE_ARG_POS, &(pos)}, 211 {parse_str, SP_TOKEN_VALUE_ARG_POS, &(pos)},
210 {parse_str, SP_TOKEN_LINE_NUMBER, &(line_number)}, 212 {parse_str, SP_TOKEN_LINE_NUMBER, &(line_number)},
211 {0}}; 213 {0}};
@@ -229,9 +231,10 @@ int parse_disabled_functions(char *line) {
229 MUTUALLY_EXCLUSIVE(df->r_function, df->function, "r_function", "function"); 231 MUTUALLY_EXCLUSIVE(df->r_function, df->function, "r_function", "function");
230 MUTUALLY_EXCLUSIVE(df->filename, df->r_filename, "r_filename", "filename"); 232 MUTUALLY_EXCLUSIVE(df->filename, df->r_filename, "r_filename", "filename");
231 MUTUALLY_EXCLUSIVE(df->ret, df->r_ret, "r_ret", "ret"); 233 MUTUALLY_EXCLUSIVE(df->ret, df->r_ret, "r_ret", "ret");
234 MUTUALLY_EXCLUSIVE(df->key, df->r_key, "r_key", "key");
232#undef MUTUALLY_EXCLUSIVE 235#undef MUTUALLY_EXCLUSIVE
233 236
234 if (1 < ((df->r_param ? 1 : 0) + (df->param ? 1 : 0) + 237 if (1 < ((df->r_param ? 1 : 0) + (param ? 1 : 0) +
235 ((-1 != df->pos) ? 1 : 0))) { 238 ((-1 != df->pos) ? 1 : 0))) {
236 sp_log_err( 239 sp_log_err(
237 "config", 240 "config",
@@ -239,7 +242,13 @@ int parse_disabled_functions(char *line) {
239 "'.r_param', '.param' and '.pos' are mutually exclusive on line %zu.", 242 "'.r_param', '.param' and '.pos' are mutually exclusive on line %zu.",
240 line, sp_line_no); 243 line, sp_line_no);
241 return -1; 244 return -1;
242 } else if ((df->r_ret || df->ret) && (df->r_param || df->param)) { 245 } else if ((df->r_key || df->key) && (df->value_r || df->value)) {
246 sp_log_err("config",
247 "Invalid configuration line: 'sp.disabled_functions%s':"
248 "`key` and `value` are mutually exclusive on line %zu.",
249 line, sp_line_no);
250 return -1;
251 } else if ((df->r_ret || df->ret) && (df->r_param || param)) {
243 sp_log_err("config", 252 sp_log_err("config",
244 "Invalid configuration line: 'sp.disabled_functions%s':" 253 "Invalid configuration line: 'sp.disabled_functions%s':"
245 "`ret` and `param` are mutually exclusive on line %zu.", 254 "`ret` and `param` are mutually exclusive on line %zu.",
@@ -293,22 +302,28 @@ int parse_disabled_functions(char *line) {
293 df->functions_list = parse_functions_list(df->function); 302 df->functions_list = parse_functions_list(df->function);
294 } 303 }
295 304
296 if (df->param && strchr(df->param, '[')) { // assume that this is an array 305 if (param) {
297 df->param_array_keys = sp_list_new(); 306 df->param = parse_var(param);
298 if (0 != array_to_list(&df->param, &df->param_array_keys)) { 307 if (!df->param) {
299 pefree(df->param_array_keys, 1); 308 sp_log_err("config", "Invalid value '%s' for `param` on line %zu.",
309 param, sp_line_no);
300 return -1; 310 return -1;
301 } 311 }
302 df->param_is_array = 1;
303 } 312 }
304 313
305 if (df->var && strchr(df->var, '[')) { // assume that this is an array 314 if (var) {
306 df->var_array_keys = sp_list_new(); 315 if (*var) {
307 if (0 != array_to_list(&df->var, &df->var_array_keys)) { 316 df->var = parse_var(var);
308 pefree(df->var_array_keys, 1); 317 if (!df->var) {
318 sp_log_err("config", "Invalid value '%s' for `var` on line %zu.",
319 var, sp_line_no);
320 return -1;
321 }
322 } else {
323 sp_log_err("config", "Empty value in `var` on line %zu.",
324 sp_line_no);
309 return -1; 325 return -1;
310 } 326 }
311 df->var_is_array = 1;
312 } 327 }
313 328
314 switch (get_construct_type(df)) { 329 switch (get_construct_type(df)) {