diff options
| author | xXx-caillou-xXx | 2017-12-20 18:09:53 +0100 |
|---|---|---|
| committer | jvoisin | 2017-12-20 18:09:53 +0100 |
| commit | e7f541396715ee2895abcf73044b91ae9b746201 (patch) | |
| tree | ba0e9765e7f14f04b92585df1f3fcd1830ab4b00 /src/sp_config_keywords.c | |
| parent | 8d6cc4f2b63c3f0dc31fe6cecd34ac023ea1cccb (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.c | 45 |
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) { | |||
| 178 | int parse_disabled_functions(char *line) { | 178 | int 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)) { |
