From 7ba5c76c78249be055d78a73a388937e5924c76e Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Sat, 25 Jul 2015 03:04:57 -0300 Subject: [PATCH] Returns elegant errors if rules load operation failed --- src/parser/driver.cc | 9 +- src/parser/driver.h | 4 +- src/parser/seclang-scanner.ll | 139 ++++++++++++++++------------- test/regression/regression.cc | 37 ++++++-- test/regression/regression_test.cc | 3 + test/regression/regression_test.h | 1 + 6 files changed, 117 insertions(+), 76 deletions(-) diff --git a/src/parser/driver.cc b/src/parser/driver.cc index 0777cd1e..5e44238b 100644 --- a/src/parser/driver.cc +++ b/src/parser/driver.cc @@ -70,10 +70,11 @@ int Driver::addSecRule(Rule *rule) { int Driver::parse(const std::string &f, const std::string &ref) { + loc.push_back(*(new yy::location())); if (ref.empty()) { - this->ref = "<>"; + this->ref.push_back("<>"); } else { - this->ref = ref; + this->ref.push_back(ref); } buffer = f; @@ -119,8 +120,8 @@ void Driver::error(const yy::location& l, const std::string& m) { void Driver::error(const yy::location& l, const std::string& m, const std::string& c) { if (parserError.tellp() == 0) { - parserError << "Configuration error, "; - parserError << "File: " << ref << ". "; + parserError << "Rules error. "; + parserError << "File: " << ref.back() << ". "; parserError << "Line: " << l.end.line << ". "; parserError << "Column: " << l.end.column << ". "; } diff --git a/src/parser/driver.h b/src/parser/driver.h index bc376d08..32e31e90 100644 --- a/src/parser/driver.h +++ b/src/parser/driver.h @@ -75,9 +75,9 @@ class Driver : public RulesProperties { void error(const yy::location& l, const std::string& m, const std::string& c); - yy::location loc; + std::list loc; - std::string ref; + std::list ref; std::string buffer; }; diff --git a/src/parser/seclang-scanner.ll b/src/parser/seclang-scanner.ll index fac8e303..656a1dae 100755 --- a/src/parser/seclang-scanner.ll +++ b/src/parser/seclang-scanner.ll @@ -112,90 +112,98 @@ FREE_TEXT_NEW_LINE [^\"|\n]+ %{ // Code run each time a pattern is matched. - # define YY_USER_ACTION driver.loc.columns (yyleng); + # define YY_USER_ACTION driver.loc.back().columns (yyleng); %} %% %{ // Code run each time yylex is called. - driver.loc.step(); + driver.loc.back().step(); %} -{DIRECTIVE} { return yy::seclang_parser::make_DIRECTIVE(yytext, driver.loc); } -{TRANSFORMATION} { return yy::seclang_parser::make_TRANSFORMATION(yytext, driver.loc); } -{CONFIG_DIR_RULE_ENG} { return yy::seclang_parser::make_CONFIG_DIR_RULE_ENG(yytext, driver.loc); } -{CONFIG_DIR_RES_BODY} { return yy::seclang_parser::make_CONFIG_DIR_RES_BODY(yytext, driver.loc); } -{CONFIG_DIR_REQ_BODY} { return yy::seclang_parser::make_CONFIG_DIR_REQ_BODY(yytext, driver.loc); } +{DIRECTIVE} { return yy::seclang_parser::make_DIRECTIVE(yytext, driver.loc.back()); } +{TRANSFORMATION} { return yy::seclang_parser::make_TRANSFORMATION(yytext, driver.loc.back()); } +{CONFIG_DIR_RULE_ENG} { return yy::seclang_parser::make_CONFIG_DIR_RULE_ENG(yytext, driver.loc.back()); } +{CONFIG_DIR_RES_BODY} { return yy::seclang_parser::make_CONFIG_DIR_RES_BODY(yytext, driver.loc.back()); } +{CONFIG_DIR_REQ_BODY} { return yy::seclang_parser::make_CONFIG_DIR_REQ_BODY(yytext, driver.loc.back()); } %{ /* Audit log entries */ %} -{CONFIG_DIR_AUDIT_DIR}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_DIR(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_AUDIT_DIR_MOD}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_DIR_MOD(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_AUDIT_ENG} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_ENG(yytext, driver.loc); } -{CONFIG_DIR_AUDIT_FLE_MOD}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_FLE_MOD(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_AUDIT_LOG2}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_LOG2(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_AUDIT_LOG}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_LOG(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_AUDIT_LOG_P}[ ]{AUDIT_PARTS} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_LOG_P(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_AUDIT_STS}[ ]["]{FREE_TEXT}["] { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_STS(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_AUDIT_TPE} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_TPE(yytext, driver.loc); } +{CONFIG_DIR_AUDIT_DIR}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_DIR(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_AUDIT_DIR_MOD}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_DIR_MOD(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_AUDIT_ENG} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_ENG(yytext, driver.loc.back()); } +{CONFIG_DIR_AUDIT_FLE_MOD}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_FLE_MOD(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_AUDIT_LOG2}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_LOG2(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_AUDIT_LOG}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_LOG(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_AUDIT_LOG_P}[ ]{AUDIT_PARTS} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_LOG_P(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_AUDIT_STS}[ ]["]{FREE_TEXT}["] { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_STS(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_AUDIT_TPE} { return yy::seclang_parser::make_CONFIG_DIR_AUDIT_TPE(yytext, driver.loc.back()); } %{ /* Debug log entries */ %} -{CONFIG_DIR_DEBUG_LOG}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_DEBUG_LOG(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_DEBUG_LVL}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_DEBUG_LVL(strchr(yytext, ' ') + 1, driver.loc); } +{CONFIG_DIR_DEBUG_LOG}[ ]{CONFIG_VALUE_PATH} { return yy::seclang_parser::make_CONFIG_DIR_DEBUG_LOG(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_DEBUG_LVL}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_DEBUG_LVL(strchr(yytext, ' ') + 1, driver.loc.back()); } %{ /* Variables */ %} -{VARIABLE}:?{DICT_ELEMENT}? { return yy::seclang_parser::make_VARIABLE(yytext, driver.loc); } -{RUN_TIME_VAR_DUR} { return yy::seclang_parser::make_RUN_TIME_VAR_DUR(yytext, driver.loc); } -{RUN_TIME_VAR_ENV}:?{DICT_ELEMENT}? { return yy::seclang_parser::make_RUN_TIME_VAR_ENV(yytext, driver.loc); } -{RUN_TIME_VAR_BLD} { return yy::seclang_parser::make_RUN_TIME_VAR_BLD(yytext, driver.loc); } -{RUN_TIME_VAR_HSV} { return yy::seclang_parser::make_RUN_TIME_VAR_HSV(yytext, driver.loc); } +{VARIABLE}:?{DICT_ELEMENT}? { return yy::seclang_parser::make_VARIABLE(yytext, driver.loc.back()); } +{RUN_TIME_VAR_DUR} { return yy::seclang_parser::make_RUN_TIME_VAR_DUR(yytext, driver.loc.back()); } +{RUN_TIME_VAR_ENV}:?{DICT_ELEMENT}? { return yy::seclang_parser::make_RUN_TIME_VAR_ENV(yytext, driver.loc.back()); } +{RUN_TIME_VAR_BLD} { return yy::seclang_parser::make_RUN_TIME_VAR_BLD(yytext, driver.loc.back()); } +{RUN_TIME_VAR_HSV} { return yy::seclang_parser::make_RUN_TIME_VAR_HSV(yytext, driver.loc.back()); } %{ /* Variables: TIME */ %} -{RUN_TIME_VAR_TIME} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_DAY} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_DAY(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_EPOCH} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_EPOCH(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_HOUR} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_HOUR(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_MIN} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_MIN(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_MON} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_MON(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_SEC} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_SEC(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_WDAY} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_WDAY(yytext, driver.loc); } -{RUN_TIME_VAR_TIME_YEAR} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_YEAR(yytext, driver.loc); } +{RUN_TIME_VAR_TIME} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_DAY} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_DAY(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_EPOCH} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_EPOCH(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_HOUR} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_HOUR(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_MIN} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_MIN(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_MON} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_MON(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_SEC} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_SEC(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_WDAY} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_WDAY(yytext, driver.loc.back()); } +{RUN_TIME_VAR_TIME_YEAR} { return yy::seclang_parser::make_RUN_TIME_VAR_TIME_YEAR(yytext, driver.loc.back()); } %{ /* Geo DB loopkup */ %} -{CONFIG_DIR_GEO_DB}[ ]{FREE_TEXT_NEW_LINE} { return yy::seclang_parser::make_CONFIG_DIR_GEO_DB(strchr(yytext, ' ') + 1, driver.loc); } +{CONFIG_DIR_GEO_DB}[ ]{FREE_TEXT_NEW_LINE} { return yy::seclang_parser::make_CONFIG_DIR_GEO_DB(strchr(yytext, ' ') + 1, driver.loc.back()); } %{ /* Request body limit */ %} -{CONFIG_DIR_REQ_BODY_LIMIT}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_REQ_BODY_LIMIT(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_REQ_BODY_LIMIT_ACTION} { return yy::seclang_parser::make_CONFIG_DIR_REQ_BODY_LIMIT_ACTION(yytext, driver.loc); } +{CONFIG_DIR_REQ_BODY_LIMIT}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_REQ_BODY_LIMIT(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_REQ_BODY_LIMIT_ACTION} { return yy::seclang_parser::make_CONFIG_DIR_REQ_BODY_LIMIT_ACTION(yytext, driver.loc.back()); } %{ /* Reponse body limit */ %} -{CONFIG_DIR_RES_BODY_LIMIT}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_RES_BODY_LIMIT(strchr(yytext, ' ') + 1, driver.loc); } -{CONFIG_DIR_RES_BODY_LIMIT_ACTION} { return yy::seclang_parser::make_CONFIG_DIR_RES_BODY_LIMIT_ACTION(yytext, driver.loc); } +{CONFIG_DIR_RES_BODY_LIMIT}[ ]{CONFIG_VALUE_NUMBER} { return yy::seclang_parser::make_CONFIG_DIR_RES_BODY_LIMIT(strchr(yytext, ' ') + 1, driver.loc.back()); } +{CONFIG_DIR_RES_BODY_LIMIT_ACTION} { return yy::seclang_parser::make_CONFIG_DIR_RES_BODY_LIMIT_ACTION(yytext, driver.loc.back()); } -{CONFIG_COMPONENT_SIG}[ ]["]{FREE_TEXT}["] { return yy::seclang_parser::make_CONFIG_COMPONENT_SIG(strchr(yytext, ' ') + 2, driver.loc); } +{CONFIG_COMPONENT_SIG}[ ]["]{FREE_TEXT}["] { return yy::seclang_parser::make_CONFIG_COMPONENT_SIG(strchr(yytext, ' ') + 2, driver.loc.back()); } -{CONFIG_VALUE_WARN} { return yy::seclang_parser::make_CONFIG_VALUE_WARN(yytext, driver.loc); } -{CONFIG_VALUE_ABORT} { return yy::seclang_parser::make_CONFIG_VALUE_ABORT(yytext, driver.loc); } -{CONFIG_VALUE_ON} { return yy::seclang_parser::make_CONFIG_VALUE_ON(yytext, driver.loc); } -{CONFIG_VALUE_OFF} { return yy::seclang_parser::make_CONFIG_VALUE_OFF(yytext, driver.loc); } -{CONFIG_VALUE_SERIAL} { return yy::seclang_parser::make_CONFIG_VALUE_SERIAL(yytext, driver.loc); } -{CONFIG_VALUE_PARALLEL} { return yy::seclang_parser::make_CONFIG_VALUE_PARALLEL(yytext, driver.loc); } -{CONFIG_VALUE_DETC} { return yy::seclang_parser::make_CONFIG_VALUE_DETC(yytext, driver.loc); } -{CONFIG_VALUE_RELEVANT_ONLY} { return yy::seclang_parser::make_CONFIG_VALUE_RELEVANT_ONLY(yytext, driver.loc); } -{CONFIG_VALUE_PROCESS_PARTIAL} { return yy::seclang_parser::make_CONFIG_VALUE_PROCESS_PARTIAL(yytext, driver.loc); } -{CONFIG_VALUE_REJECT} { return yy::seclang_parser::make_CONFIG_VALUE_REJECT(yytext, driver.loc); } +{CONFIG_VALUE_WARN} { return yy::seclang_parser::make_CONFIG_VALUE_WARN(yytext, driver.loc.back()); } +{CONFIG_VALUE_ABORT} { return yy::seclang_parser::make_CONFIG_VALUE_ABORT(yytext, driver.loc.back()); } +{CONFIG_VALUE_ON} { return yy::seclang_parser::make_CONFIG_VALUE_ON(yytext, driver.loc.back()); } +{CONFIG_VALUE_OFF} { return yy::seclang_parser::make_CONFIG_VALUE_OFF(yytext, driver.loc.back()); } +{CONFIG_VALUE_SERIAL} { return yy::seclang_parser::make_CONFIG_VALUE_SERIAL(yytext, driver.loc.back()); } +{CONFIG_VALUE_PARALLEL} { return yy::seclang_parser::make_CONFIG_VALUE_PARALLEL(yytext, driver.loc.back()); } +{CONFIG_VALUE_DETC} { return yy::seclang_parser::make_CONFIG_VALUE_DETC(yytext, driver.loc.back()); } +{CONFIG_VALUE_RELEVANT_ONLY} { return yy::seclang_parser::make_CONFIG_VALUE_RELEVANT_ONLY(yytext, driver.loc.back()); } +{CONFIG_VALUE_PROCESS_PARTIAL} { return yy::seclang_parser::make_CONFIG_VALUE_PROCESS_PARTIAL(yytext, driver.loc.back()); } +{CONFIG_VALUE_REJECT} { return yy::seclang_parser::make_CONFIG_VALUE_REJECT(yytext, driver.loc.back()); } -["]{OPERATOR}[ ]{FREE_TEXT}["] { return yy::seclang_parser::make_OPERATOR(yytext, driver.loc); } -["]{OPERATORNOARG}["] { return yy::seclang_parser::make_OPERATOR(yytext, driver.loc); } -{ACTION} { return yy::seclang_parser::make_ACTION(yytext, driver.loc); } -{ACTION_SEVERITY} { return yy::seclang_parser::make_ACTION_SEVERITY(yytext, driver.loc); } -["] { return yy::seclang_parser::make_QUOTATION_MARK(driver.loc); } -[,] { return yy::seclang_parser::make_COMMA(driver.loc); } -[|] { return yy::seclang_parser::make_PIPE(driver.loc); } -{VARIABLENOCOLON} { return yy::seclang_parser::make_VARIABLE(yytext, driver.loc); } -[ \t]+ { return yy::seclang_parser::make_SPACE(driver.loc); } -[\n]+ { driver.loc.lines(yyleng); driver.loc.step(); } -. { driver.error (driver.loc, "invalid character", yytext); } +["]{OPERATOR}[ ]{FREE_TEXT}["] { return yy::seclang_parser::make_OPERATOR(yytext, driver.loc.back()); } +["]{OPERATORNOARG}["] { return yy::seclang_parser::make_OPERATOR(yytext, driver.loc.back()); } +{ACTION} { return yy::seclang_parser::make_ACTION(yytext, driver.loc.back()); } +{ACTION_SEVERITY} { return yy::seclang_parser::make_ACTION_SEVERITY(yytext, driver.loc.back()); } +["] { return yy::seclang_parser::make_QUOTATION_MARK(driver.loc.back()); } +[,] { return yy::seclang_parser::make_COMMA(driver.loc.back()); } +[|] { return yy::seclang_parser::make_PIPE(driver.loc.back()); } +{VARIABLENOCOLON} { return yy::seclang_parser::make_VARIABLE(yytext, driver.loc.back()); } +[ \t]+ { return yy::seclang_parser::make_SPACE(driver.loc.back()); } +[\n]+ { driver.loc.back().lines(yyleng); driver.loc.back().step(); } +. { driver.error (driver.loc.back(), "invalid character", yytext); } <> { + if (driver.ref.size() > 0) { + driver.ref.pop_back(); + } + + if (driver.loc.size() > 1) { + driver.loc.pop_back(); + } + if (yyin) { fclose(yyin); } @@ -203,7 +211,7 @@ FREE_TEXT_NEW_LINE [^\"|\n]+ yypop_buffer_state(); if (!YY_CURRENT_BUFFER) { - return yy::seclang_parser::make_END(driver.loc); + return yy::seclang_parser::make_END(driver.loc.back()); } } @@ -211,6 +219,12 @@ FREE_TEXT_NEW_LINE [^\"|\n]+ {CONFIG_INCLUDE}[ ]{CONFIG_VALUE_PATH} { const char *file = strchr(yytext, ' ') + 1; yyin = fopen(file, "r" ); + if (!yyin) { + driver.error (driver.loc.back(), "", yytext + std::string(": Not able to open file.")); + throw yy::seclang_parser::syntax_error(driver.loc.back(), ""); + } + driver.ref.push_back(file); + driver.loc.push_back(*(new yy::location())); yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE )); } @@ -222,7 +236,8 @@ FREE_TEXT_NEW_LINE [^\"|\n]+ std::vector conf = split(yytext, ' '); key = conf[1]; url = conf[2]; - + driver.ref.push_back(url); + driver.loc.push_back(*(new yy::location())); YY_BUFFER_STATE temp = YY_CURRENT_BUFFER; yypush_buffer_state(temp); @@ -242,7 +257,7 @@ FREE_TEXT_NEW_LINE [^\"|\n]+ yy_scan_string(c.content.c_str()); } -{CONFIG_SEC_REMOTE_RULES_FAIL_ACTION} { return yy::seclang_parser::make_CONFIG_SEC_REMOTE_RULES_FAIL_ACTION(yytext, driver.loc); } +{CONFIG_SEC_REMOTE_RULES_FAIL_ACTION} { return yy::seclang_parser::make_CONFIG_SEC_REMOTE_RULES_FAIL_ACTION(yytext, driver.loc.back()); } %% diff --git a/test/regression/regression.cc b/test/regression/regression.cc index 2da96b30..788e026a 100644 --- a/test/regression/regression.cc +++ b/test/regression/regression.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include "modsecurity/modsecurity.h" #include "modsecurity/rules.h" @@ -89,14 +90,34 @@ void perform_unit_test(std::vector *tests, " (ModSecurity regression test utility)"); modsec_rules = new ModSecurity::Rules(debug_log); - if (modsec_rules->load(t->rules.c_str()) == false) { - std::cerr << "parse failed." << std::endl; - std::cout << std::endl; - std::cout << "-------------" << std::endl; - std::cout << modsec_rules->getParserError() << std::endl; - std::cout << "-------------" << std::endl; - return; + if (modsec_rules->load(t->rules.c_str(), filename) == false) { + if (t->parser_error.empty() == true) { + std::cerr << "parse failed." << std::endl; + std::cout << modsec_rules->getParserError() << std::endl; + return; + } + + std::regex re(t->parser_error); + std::smatch match; + std::string s = modsec_rules->getParserError(); + + if (std::regex_search(s, match, re) && match.size() >= 1) { + std::cout << "passed!" << std::endl; + return; + } else { + std::cout << "Expected a parser error." << std::endl; + std::cout << "Expected: " << t->parser_error << std::endl; + std::cout << "Produced: " << s << std::endl; + return; + } + + } else { + if (t->parser_error.empty() == false) { + std::cout << "Expected a parser error." << std::endl; + std::cout << "Expected: " << t->parser_error << std::endl; + } } + modsec_assay = new ModSecurity::Assay(modsec, modsec_rules); modsec_assay->processConnection(t->clientIp.c_str(), @@ -219,6 +240,7 @@ int main(int argc, char **argv) { keyList.push_back(a.first); } keyList.sort(); + for (std::string a : keyList) { std::vector *tests = test[a]; ModSecurityTestResults res; @@ -227,7 +249,6 @@ int main(int argc, char **argv) { test_log << res.log_raw_debug_log; } - test_log.close(); return 0; diff --git a/test/regression/regression_test.cc b/test/regression/regression_test.cc index 2ee64f8f..72c0b202 100644 --- a/test/regression/regression_test.cc +++ b/test/regression/regression_test.cc @@ -188,6 +188,9 @@ RegressionTest *RegressionTest::from_yajl_node(const yajl_val &node) { if (strcmp(key2, "redirect_url") == 0) { u->redirect_url = YAJL_GET_STRING(val2); } + if (strcmp(key2, "parser_error") == 0) { + u->parser_error = YAJL_GET_STRING(val2); + } } } if (strcmp(key, "rules") == 0) { diff --git a/test/regression/regression_test.h b/test/regression/regression_test.h index adf0fd9e..fab2b0e0 100644 --- a/test/regression/regression_test.h +++ b/test/regression/regression_test.h @@ -50,6 +50,7 @@ class RegressionTest { std::string audit_log; std::string debug_log; std::string error_log; + std::string parser_error; std::string clientIp; std::string serverIp;