Accepts multiple ctl:ruleRemoveTargetById in the same request

This commit is contained in:
brenosilva
2012-07-26 06:30:46 +00:00
parent cd32253c5d
commit 5be1b1dce4
2 changed files with 60 additions and 42 deletions

View File

@@ -47,9 +47,12 @@ static apr_status_t msre_rule_process(msre_rule *rule, modsec_rec *msr);
static int fetch_target_exception(msre_rule *rule, modsec_rec *msr, msre_var *var) { static int fetch_target_exception(msre_rule *rule, modsec_rec *msr, msre_var *var) {
const char *targets = NULL, *exceptions = NULL; const char *targets = NULL, *exceptions = NULL;
char *savedptr = NULL, *target = NULL, *value = NULL; char *savedptr = NULL, *target = NULL, *value = NULL;
char *c = NULL, *name = NULL; char *c = NULL, *name = NULL, *id = NULL;
char *variable = NULL, *myvar = NULL; char *variable = NULL, *myvar = NULL;
char *myvalue = NULL, *myname = NULL; char *myvalue = NULL, *myname = NULL;
const apr_array_header_t *tarr = NULL;
const apr_table_entry_t *telts = NULL;
int i, match;
if(msr == NULL) if(msr == NULL)
return 0; return 0;
@@ -75,7 +78,15 @@ static int fetch_target_exception(msre_rule *rule, modsec_rec *msr, msre_var *va
myname = myvar; myname = myvar;
} }
exceptions = (const char *)apr_table_get(msr->removed_targets, rule->actionset->id); tarr = apr_table_elts(msr->removed_targets);
telts = (const apr_table_entry_t*)tarr->elts;
match = 0;
for (i = 0; i < tarr->nelts; i++) {
id = (char *)telts[i].key;
if(strcasecmp(id, rule->actionset->id) == 0) {
exceptions = (char *)telts[i].val;
targets = apr_pstrdup(msr->mp, exceptions); targets = apr_pstrdup(msr->mp, exceptions);
@@ -107,18 +118,18 @@ static int fetch_target_exception(msre_rule *rule, modsec_rec *msr, msre_var *va
if (msr->txcfg->debuglog_level >= 9) { if (msr->txcfg->debuglog_level >= 9) {
msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", target); msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", target);
} }
return 1; match = 1;
} }
} else if (value == NULL && myvalue == NULL) { } else if (value == NULL && myvalue == NULL) {
if (msr->txcfg->debuglog_level >= 9) { if (msr->txcfg->debuglog_level >= 9) {
msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", target); msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", target);
} }
return 1; match = 1;
} else if (value == NULL && myvalue != NULL) { } else if (value == NULL && myvalue != NULL) {
if (msr->txcfg->debuglog_level >= 9) { if (msr->txcfg->debuglog_level >= 9) {
msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", target); msr_log(msr, 9, "fetch_target_exception: Target %s will not be processed.", target);
} }
return 1; match = 1;
} }
} }
@@ -133,6 +144,13 @@ static int fetch_target_exception(msre_rule *rule, modsec_rec *msr, msre_var *va
} }
}
}
if(match)
return 1;
return 0; return 0;
} }

View File

@@ -1070,7 +1070,7 @@ static apr_status_t msre_action_ctl_execute(modsec_rec *msr, apr_pool_t *mptmp,
msr_log(msr, 4, "Ctl: ruleRemoveTargetById id=%s targets=%s", p1, p2); msr_log(msr, 4, "Ctl: ruleRemoveTargetById id=%s targets=%s", p1, p2);
} }
apr_table_setn(msr->removed_targets, p1, (const char *)apr_pstrdup(msr->mp, p2)); apr_table_addn(msr->removed_targets, p1, (const char *)apr_pstrdup(msr->mp, p2));
return 1; return 1;
} else } else