diff --git a/Makefile.am b/Makefile.am index 6ebf12f6..9ad9d378 100644 --- a/Makefile.am +++ b/Makefile.am @@ -127,6 +127,7 @@ TESTS+=test/test-cases/regression/config-body_limits.json TESTS+=test/test-cases/regression/config-calling_phases_by_name.json TESTS+=test/test-cases/regression/config-include-bad.json TESTS+=test/test-cases/regression/config-include.json +TESTS+=test/test-cases/regression/config-warning.json TESTS+=test/test-cases/regression/config-remove_by_id.json TESTS+=test/test-cases/regression/config-remove_by_msg.json TESTS+=test/test-cases/regression/config-remove_by_tag.json diff --git a/examples/multiprocess_c/multi.c b/examples/multiprocess_c/multi.c index 1a0af821..442516be 100644 --- a/examples/multiprocess_c/multi.c +++ b/examples/multiprocess_c/multi.c @@ -97,6 +97,7 @@ int main (int argc, char **argv) { int ret; const char *error = NULL; + const char *warn = NULL; int i = 0; pid_t pid; int f; @@ -108,7 +109,7 @@ int main (int argc, char **argv) rules = msc_create_rules_set(); - ret = msc_rules_add_file(rules, main_rule_uri, &error); + ret = msc_rules_add_file(rules, main_rule_uri, &warn, &error); if (ret < 0) { fprintf(stderr, "Problems loading the rules --\n"); fprintf(stderr, "%s\n", error); diff --git a/examples/simple_example_using_c/test.c b/examples/simple_example_using_c/test.c index 38272b01..1008e05a 100644 --- a/examples/simple_example_using_c/test.c +++ b/examples/simple_example_using_c/test.c @@ -27,6 +27,7 @@ int main (int argc, char **argv) { int ret; const char *error = NULL; + const char *warn = NULL; ModSecurity *modsec; Transaction *transaction = NULL; RulesSet *rules; @@ -38,7 +39,7 @@ int main (int argc, char **argv) rules = msc_create_rules_set(); - ret = msc_rules_add_file(rules, main_rule_uri, &error); + ret = msc_rules_add_file(rules, main_rule_uri, &warn, &error); if (ret < 0) { fprintf(stderr, "Problems loading the rules --\n"); fprintf(stderr, "%s\n", error); @@ -48,7 +49,7 @@ int main (int argc, char **argv) ret = msc_rules_add_remote(rules, "test", "https://www.modsecurity.org/modsecurity-regression-test-secremoterules.txt", - &error); + &warn, &error); if (ret < 0) { fprintf(stderr, "Problems loading the rules --\n"); fprintf(stderr, "%s\n", error); diff --git a/headers/modsecurity/actions/action.h b/headers/modsecurity/actions/action.h index f44b1158..7d8c7a52 100644 --- a/headers/modsecurity/actions/action.h +++ b/headers/modsecurity/actions/action.h @@ -120,6 +120,19 @@ class Action { } }; +class ActionNotSupported : public Action { + public: + ActionNotSupported() : Action() + { }; + + explicit ActionNotSupported(const std::string& action) + : Action(action) + { }; + + ActionNotSupported(const ActionNotSupported &other) = delete; + ActionNotSupported &operator=(const ActionNotSupported& a) = delete; +}; + } // namespace actions } // namespace modsecurity diff --git a/headers/modsecurity/rules_set.h b/headers/modsecurity/rules_set.h index 77324155..d737a84a 100644 --- a/headers/modsecurity/rules_set.h +++ b/headers/modsecurity/rules_set.h @@ -75,6 +75,7 @@ class RulesSet : public RulesSetProperties { int evaluate(int phase, Transaction *transaction); std::string getParserError(); + std::string getParserWarnings(); void debug(int level, const std::string &id, const std::string &uri, const std::string &msg); @@ -95,11 +96,14 @@ extern "C" { RulesSet *msc_create_rules_set(void); void msc_rules_dump(RulesSet *rules); -int msc_rules_merge(RulesSet *rules_dst, RulesSet *rules_from, const char **error); +int msc_rules_merge(RulesSet *rules_dst, RulesSet *rules_from, + const char **warn, const char **error); int msc_rules_add_remote(RulesSet *rules, const char *key, const char *uri, - const char **error); -int msc_rules_add_file(RulesSet *rules, const char *file, const char **error); -int msc_rules_add(RulesSet *rules, const char *plain_rules, const char **error); + const char **warn, const char **error); +int msc_rules_add_file(RulesSet *rules, const char *file, + const char **warn, const char **error); +int msc_rules_add(RulesSet *rules, const char *plain_rules, + const char **warn, const char **error); int msc_rules_cleanup(RulesSet *rules); #ifdef __cplusplus diff --git a/headers/modsecurity/rules_set_properties.h b/headers/modsecurity/rules_set_properties.h index e90b1ec8..ed27c5cf 100644 --- a/headers/modsecurity/rules_set_properties.h +++ b/headers/modsecurity/rules_set_properties.h @@ -457,6 +457,7 @@ class RulesSetProperties { RulesExceptions m_exceptions; std::list m_components; std::ostringstream m_parserError; + std::ostringstream m_parserWarn; ConfigSet m_responseBodyTypeToBeInspected; ConfigString m_httpblKey; ConfigString m_uploadDirectory; diff --git a/src/parser/driver.cc b/src/parser/driver.cc index acb7d6b8..7e4fdbe7 100644 --- a/src/parser/driver.cc +++ b/src/parser/driver.cc @@ -180,7 +180,7 @@ int Driver::addSecRule(std::unique_ptr r) { */ if (rule->getId() == 0) { m_parserError << "Rules must have an ID. File: "; - m_parserError << rule->getFileName() << " at line: "; + m_parserError << *rule->getFileName() << " at line: "; m_parserError << std::to_string(rule->getLineNumber()) << std::endl; return false; } @@ -282,5 +282,30 @@ void Driver::error(const yy::location& l, const std::string& m, } +void Driver::warn(const yy::location& l, const std::string& m) { + warn(l, m, ""); +} + + +void Driver::warn(const yy::location& l, const std::string& m, + const std::string& c) { + if (m_parserWarn.tellp() != 0) { + m_parserWarn << std::endl; + } + m_parserWarn << "Warning. "; + m_parserWarn << "File: " << *l.end.filename << ". "; + m_parserWarn << "Line: " << l.end.line << ". "; + m_parserWarn << "Column: " << l.end.column - 1 << ". "; + + if (m.empty() == false) { + m_parserWarn << "" << m << " "; + } + + if (c.empty() == false) { + m_parserWarn << c; + } +} + + } // namespace Parser } // namespace modsecurity diff --git a/src/parser/driver.h b/src/parser/driver.h index ed7fd077..61e3d7d4 100644 --- a/src/parser/driver.h +++ b/src/parser/driver.h @@ -86,6 +86,10 @@ class Driver : public RulesSetProperties { void error(const yy::location& l, const std::string& m, const std::string& c); + void warn(const yy::location& l, const std::string& m); + void warn(const yy::location& l, const std::string& m, + const std::string& c); + std::list loc; std::string buffer; diff --git a/src/parser/seclang-parser.cc b/src/parser/seclang-parser.cc index ed981cf4..29264394 100644 --- a/src/parser/seclang-parser.cc +++ b/src/parser/seclang-parser.cc @@ -42,7 +42,7 @@ // Unqualified %code blocks. -#line 329 "seclang-parser.yy" +#line 335 "seclang-parser.yy" #include "src/parser/driver.h" @@ -1318,7 +1318,7 @@ namespace yy { // User initialization code. -#line 322 "seclang-parser.yy" +#line 328 "seclang-parser.yy" { // Initialize the initial location. yyla.location.begin.filename = yyla.location.end.filename = new std::string(driver.file); @@ -1690,7 +1690,7 @@ namespace yy { switch (yyn) { case 2: // input: "end of file" -#line 716 "seclang-parser.yy" +#line 722 "seclang-parser.yy" { return 0; } @@ -1698,7 +1698,7 @@ namespace yy { break; case 6: // audit_log: "CONFIG_DIR_AUDIT_DIR_MOD" -#line 729 "seclang-parser.yy" +#line 735 "seclang-parser.yy" { driver.m_auditLog->setStorageDirMode(strtol(yystack_[0].value.as < std::string > ().c_str(), NULL, 8)); } @@ -1706,7 +1706,7 @@ namespace yy { break; case 7: // audit_log: "CONFIG_DIR_AUDIT_DIR" -#line 735 "seclang-parser.yy" +#line 741 "seclang-parser.yy" { driver.m_auditLog->setStorageDir(yystack_[0].value.as < std::string > ()); } @@ -1714,7 +1714,7 @@ namespace yy { break; case 8: // audit_log: "CONFIG_DIR_AUDIT_ENG" "CONFIG_VALUE_RELEVANT_ONLY" -#line 741 "seclang-parser.yy" +#line 747 "seclang-parser.yy" { driver.m_auditLog->setStatus(modsecurity::audit_log::AuditLog::RelevantOnlyAuditLogStatus); } @@ -1722,7 +1722,7 @@ namespace yy { break; case 9: // audit_log: "CONFIG_DIR_AUDIT_ENG" "CONFIG_VALUE_OFF" -#line 745 "seclang-parser.yy" +#line 751 "seclang-parser.yy" { driver.m_auditLog->setStatus(modsecurity::audit_log::AuditLog::OffAuditLogStatus); } @@ -1730,7 +1730,7 @@ namespace yy { break; case 10: // audit_log: "CONFIG_DIR_AUDIT_ENG" "CONFIG_VALUE_ON" -#line 749 "seclang-parser.yy" +#line 755 "seclang-parser.yy" { driver.m_auditLog->setStatus(modsecurity::audit_log::AuditLog::OnAuditLogStatus); } @@ -1738,7 +1738,7 @@ namespace yy { break; case 11: // audit_log: "CONFIG_DIR_AUDIT_FLE_MOD" -#line 755 "seclang-parser.yy" +#line 761 "seclang-parser.yy" { driver.m_auditLog->setFileMode(strtol(yystack_[0].value.as < std::string > ().c_str(), NULL, 8)); } @@ -1746,7 +1746,7 @@ namespace yy { break; case 12: // audit_log: "CONFIG_DIR_AUDIT_LOG2" -#line 761 "seclang-parser.yy" +#line 767 "seclang-parser.yy" { driver.m_auditLog->setFilePath2(yystack_[0].value.as < std::string > ()); } @@ -1754,7 +1754,7 @@ namespace yy { break; case 13: // audit_log: "CONFIG_DIR_AUDIT_LOG_P" -#line 767 "seclang-parser.yy" +#line 773 "seclang-parser.yy" { driver.m_auditLog->setParts(yystack_[0].value.as < std::string > ()); } @@ -1762,7 +1762,7 @@ namespace yy { break; case 14: // audit_log: "CONFIG_DIR_AUDIT_LOG" -#line 773 "seclang-parser.yy" +#line 779 "seclang-parser.yy" { driver.m_auditLog->setFilePath1(yystack_[0].value.as < std::string > ()); } @@ -1770,7 +1770,7 @@ namespace yy { break; case 15: // audit_log: CONFIG_DIR_AUDIT_LOG_FMT JSON -#line 778 "seclang-parser.yy" +#line 784 "seclang-parser.yy" { driver.m_auditLog->setFormat(modsecurity::audit_log::AuditLog::JSONAuditLogFormat); } @@ -1778,7 +1778,7 @@ namespace yy { break; case 16: // audit_log: CONFIG_DIR_AUDIT_LOG_FMT NATIVE -#line 783 "seclang-parser.yy" +#line 789 "seclang-parser.yy" { driver.m_auditLog->setFormat(modsecurity::audit_log::AuditLog::NativeAuditLogFormat); } @@ -1786,7 +1786,7 @@ namespace yy { break; case 17: // audit_log: "CONFIG_DIR_AUDIT_STS" -#line 789 "seclang-parser.yy" +#line 795 "seclang-parser.yy" { std::string relevant_status(yystack_[0].value.as < std::string > ()); driver.m_auditLog->setRelevantStatus(relevant_status); @@ -1795,7 +1795,7 @@ namespace yy { break; case 18: // audit_log: "CONFIG_DIR_AUDIT_TPE" "CONFIG_VALUE_SERIAL" -#line 796 "seclang-parser.yy" +#line 802 "seclang-parser.yy" { driver.m_auditLog->setType(modsecurity::audit_log::AuditLog::SerialAuditLogType); } @@ -1803,7 +1803,7 @@ namespace yy { break; case 19: // audit_log: "CONFIG_DIR_AUDIT_TPE" "CONFIG_VALUE_PARALLEL" -#line 800 "seclang-parser.yy" +#line 806 "seclang-parser.yy" { driver.m_auditLog->setType(modsecurity::audit_log::AuditLog::ParallelAuditLogType); } @@ -1811,7 +1811,7 @@ namespace yy { break; case 20: // audit_log: "CONFIG_DIR_AUDIT_TPE" "CONFIG_VALUE_HTTPS" -#line 804 "seclang-parser.yy" +#line 810 "seclang-parser.yy" { driver.m_auditLog->setType(modsecurity::audit_log::AuditLog::HttpsAuditLogType); } @@ -1819,7 +1819,7 @@ namespace yy { break; case 21: // audit_log: "CONFIG_UPDLOAD_KEEP_FILES" "CONFIG_VALUE_ON" -#line 810 "seclang-parser.yy" +#line 816 "seclang-parser.yy" { driver.m_uploadKeepFiles = modsecurity::RulesSetProperties::TrueConfigBoolean; } @@ -1827,7 +1827,7 @@ namespace yy { break; case 22: // audit_log: "CONFIG_UPDLOAD_KEEP_FILES" "CONFIG_VALUE_OFF" -#line 814 "seclang-parser.yy" +#line 820 "seclang-parser.yy" { driver.m_uploadKeepFiles = modsecurity::RulesSetProperties::FalseConfigBoolean; } @@ -1835,7 +1835,7 @@ namespace yy { break; case 23: // audit_log: "CONFIG_UPDLOAD_KEEP_FILES" "CONFIG_VALUE_RELEVANT_ONLY" -#line 818 "seclang-parser.yy" +#line 824 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecUploadKeepFiles RelevantOnly is not currently supported. Accepted values are On or Off"); YYERROR; @@ -1844,7 +1844,7 @@ namespace yy { break; case 24: // audit_log: "CONFIG_UPLOAD_FILE_LIMIT" -#line 823 "seclang-parser.yy" +#line 829 "seclang-parser.yy" { driver.m_uploadFileLimit.m_set = true; driver.m_uploadFileLimit.m_value = strtol(yystack_[0].value.as < std::string > ().c_str(), NULL, 10); @@ -1853,7 +1853,7 @@ namespace yy { break; case 25: // audit_log: "CONFIG_UPLOAD_FILE_MODE" -#line 828 "seclang-parser.yy" +#line 834 "seclang-parser.yy" { driver.m_uploadFileMode.m_set = true; driver.m_uploadFileMode.m_value = strtol(yystack_[0].value.as < std::string > ().c_str(), NULL, 8); @@ -1862,7 +1862,7 @@ namespace yy { break; case 26: // audit_log: "CONFIG_UPLOAD_DIR" -#line 833 "seclang-parser.yy" +#line 839 "seclang-parser.yy" { driver.m_uploadDirectory.m_set = true; driver.m_uploadDirectory.m_value = yystack_[0].value.as < std::string > (); @@ -1871,7 +1871,7 @@ namespace yy { break; case 27: // audit_log: "CONFIG_UPDLOAD_SAVE_TMP_FILES" "CONFIG_VALUE_ON" -#line 838 "seclang-parser.yy" +#line 844 "seclang-parser.yy" { driver.m_tmpSaveUploadedFiles = modsecurity::RulesSetProperties::TrueConfigBoolean; } @@ -1879,7 +1879,7 @@ namespace yy { break; case 28: // audit_log: "CONFIG_UPDLOAD_SAVE_TMP_FILES" "CONFIG_VALUE_OFF" -#line 842 "seclang-parser.yy" +#line 848 "seclang-parser.yy" { driver.m_tmpSaveUploadedFiles = modsecurity::RulesSetProperties::FalseConfigBoolean; } @@ -1887,7 +1887,7 @@ namespace yy { break; case 29: // actions: "QUOTATION_MARK" actions_may_quoted "QUOTATION_MARK" -#line 849 "seclang-parser.yy" +#line 855 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[1].value.as < std::unique_ptr > > > ()); } @@ -1895,7 +1895,7 @@ namespace yy { break; case 30: // actions: actions_may_quoted -#line 853 "seclang-parser.yy" +#line 859 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); } @@ -1903,7 +1903,7 @@ namespace yy { break; case 31: // actions_may_quoted: actions_may_quoted "," act -#line 860 "seclang-parser.yy" +#line 866 "seclang-parser.yy" { ACTION_INIT(yystack_[0].value.as < std::unique_ptr > (), yystack_[3].location) yystack_[2].value.as < std::unique_ptr > > > ()->push_back(std::move(yystack_[0].value.as < std::unique_ptr > ())); @@ -1913,7 +1913,7 @@ namespace yy { break; case 32: // actions_may_quoted: act -#line 866 "seclang-parser.yy" +#line 872 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); ACTION_INIT(yystack_[0].value.as < std::unique_ptr > (), yystack_[1].location) @@ -1924,7 +1924,7 @@ namespace yy { break; case 33: // op: op_before_init -#line 876 "seclang-parser.yy" +#line 882 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > () = std::move(yystack_[0].value.as < std::unique_ptr > ()); std::string error; @@ -1937,7 +1937,7 @@ namespace yy { break; case 34: // op: "NOT" op_before_init -#line 885 "seclang-parser.yy" +#line 891 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > () = std::move(yystack_[0].value.as < std::unique_ptr > ()); yylhs.value.as < std::unique_ptr > ()->m_negation = true; @@ -1951,7 +1951,7 @@ namespace yy { break; case 35: // op: run_time_string -#line 895 "seclang-parser.yy" +#line 901 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr > ()))); std::string error; @@ -1964,7 +1964,7 @@ namespace yy { break; case 36: // op: "NOT" run_time_string -#line 904 "seclang-parser.yy" +#line 910 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr > ()))); yylhs.value.as < std::unique_ptr > ()->m_negation = true; @@ -1978,7 +1978,7 @@ namespace yy { break; case 37: // op_before_init: "OPERATOR_UNCONDITIONAL_MATCH" -#line 917 "seclang-parser.yy" +#line 923 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::UnconditionalMatch()); } @@ -1986,7 +1986,7 @@ namespace yy { break; case 38: // op_before_init: "OPERATOR_DETECT_SQLI" -#line 921 "seclang-parser.yy" +#line 927 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::DetectSQLi()); } @@ -1994,7 +1994,7 @@ namespace yy { break; case 39: // op_before_init: "OPERATOR_DETECT_XSS" -#line 925 "seclang-parser.yy" +#line 931 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::DetectXSS()); } @@ -2002,7 +2002,7 @@ namespace yy { break; case 40: // op_before_init: "OPERATOR_VALIDATE_URL_ENCODING" -#line 929 "seclang-parser.yy" +#line 935 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateUrlEncoding()); } @@ -2010,7 +2010,7 @@ namespace yy { break; case 41: // op_before_init: "OPERATOR_VALIDATE_UTF8_ENCODING" -#line 933 "seclang-parser.yy" +#line 939 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateUtf8Encoding()); } @@ -2018,7 +2018,7 @@ namespace yy { break; case 42: // op_before_init: "OPERATOR_INSPECT_FILE" run_time_string -#line 937 "seclang-parser.yy" +#line 943 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::InspectFile(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2026,7 +2026,7 @@ namespace yy { break; case 43: // op_before_init: "OPERATOR_FUZZY_HASH" run_time_string -#line 941 "seclang-parser.yy" +#line 947 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::FuzzyHash(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2034,7 +2034,7 @@ namespace yy { break; case 44: // op_before_init: "OPERATOR_VALIDATE_BYTE_RANGE" run_time_string -#line 945 "seclang-parser.yy" +#line 951 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateByteRange(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2042,7 +2042,7 @@ namespace yy { break; case 45: // op_before_init: "OPERATOR_VALIDATE_DTD" run_time_string -#line 949 "seclang-parser.yy" +#line 955 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateDTD(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2050,7 +2050,7 @@ namespace yy { break; case 46: // op_before_init: "OPERATOR_VALIDATE_HASH" run_time_string -#line 953 "seclang-parser.yy" +#line 959 "seclang-parser.yy" { /* $$ = new operators::ValidateHash($1); */ OPERATOR_NOT_SUPPORTED("ValidateHash", yystack_[2].location); @@ -2059,7 +2059,7 @@ namespace yy { break; case 47: // op_before_init: "OPERATOR_VALIDATE_SCHEMA" run_time_string -#line 958 "seclang-parser.yy" +#line 964 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateSchema(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2067,7 +2067,7 @@ namespace yy { break; case 48: // op_before_init: "OPERATOR_VERIFY_CC" run_time_string -#line 962 "seclang-parser.yy" +#line 968 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifyCC(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2075,7 +2075,7 @@ namespace yy { break; case 49: // op_before_init: "OPERATOR_VERIFY_CPF" run_time_string -#line 966 "seclang-parser.yy" +#line 972 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifyCPF(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2083,7 +2083,7 @@ namespace yy { break; case 50: // op_before_init: "OPERATOR_VERIFY_SSN" run_time_string -#line 970 "seclang-parser.yy" +#line 976 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifySSN(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2091,7 +2091,7 @@ namespace yy { break; case 51: // op_before_init: "OPERATOR_VERIFY_SVNR" run_time_string -#line 974 "seclang-parser.yy" +#line 980 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifySVNR(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2099,7 +2099,7 @@ namespace yy { break; case 52: // op_before_init: "OPERATOR_GSB_LOOKUP" run_time_string -#line 978 "seclang-parser.yy" +#line 984 "seclang-parser.yy" { /* $$ = new operators::GsbLookup($1); */ OPERATOR_NOT_SUPPORTED("GsbLookup", yystack_[2].location); @@ -2108,7 +2108,7 @@ namespace yy { break; case 53: // op_before_init: "OPERATOR_RSUB" run_time_string -#line 983 "seclang-parser.yy" +#line 989 "seclang-parser.yy" { /* $$ = new operators::Rsub($1); */ OPERATOR_NOT_SUPPORTED("Rsub", yystack_[2].location); @@ -2117,7 +2117,7 @@ namespace yy { break; case 54: // op_before_init: "OPERATOR_WITHIN" run_time_string -#line 988 "seclang-parser.yy" +#line 994 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Within(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2125,7 +2125,7 @@ namespace yy { break; case 55: // op_before_init: "OPERATOR_CONTAINS_WORD" run_time_string -#line 992 "seclang-parser.yy" +#line 998 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ContainsWord(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2133,7 +2133,7 @@ namespace yy { break; case 56: // op_before_init: "OPERATOR_CONTAINS" run_time_string -#line 996 "seclang-parser.yy" +#line 1002 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Contains(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2141,7 +2141,7 @@ namespace yy { break; case 57: // op_before_init: "OPERATOR_ENDS_WITH" run_time_string -#line 1000 "seclang-parser.yy" +#line 1006 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::EndsWith(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2149,7 +2149,7 @@ namespace yy { break; case 58: // op_before_init: "OPERATOR_EQ" run_time_string -#line 1004 "seclang-parser.yy" +#line 1010 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Eq(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2157,7 +2157,7 @@ namespace yy { break; case 59: // op_before_init: "OPERATOR_GE" run_time_string -#line 1008 "seclang-parser.yy" +#line 1014 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Ge(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2165,7 +2165,7 @@ namespace yy { break; case 60: // op_before_init: "OPERATOR_GT" run_time_string -#line 1012 "seclang-parser.yy" +#line 1018 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Gt(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2173,7 +2173,7 @@ namespace yy { break; case 61: // op_before_init: "OPERATOR_IP_MATCH_FROM_FILE" run_time_string -#line 1016 "seclang-parser.yy" +#line 1022 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::IpMatchF(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2181,7 +2181,7 @@ namespace yy { break; case 62: // op_before_init: "OPERATOR_IP_MATCH" run_time_string -#line 1020 "seclang-parser.yy" +#line 1026 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::IpMatch(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2189,7 +2189,7 @@ namespace yy { break; case 63: // op_before_init: "OPERATOR_LE" run_time_string -#line 1024 "seclang-parser.yy" +#line 1030 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Le(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2197,7 +2197,7 @@ namespace yy { break; case 64: // op_before_init: "OPERATOR_LT" run_time_string -#line 1028 "seclang-parser.yy" +#line 1034 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Lt(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2205,7 +2205,7 @@ namespace yy { break; case 65: // op_before_init: "OPERATOR_PM_FROM_FILE" run_time_string -#line 1032 "seclang-parser.yy" +#line 1038 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::PmFromFile(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2213,7 +2213,7 @@ namespace yy { break; case 66: // op_before_init: "OPERATOR_PM" run_time_string -#line 1036 "seclang-parser.yy" +#line 1042 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Pm(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2221,7 +2221,7 @@ namespace yy { break; case 67: // op_before_init: "OPERATOR_RBL" run_time_string -#line 1040 "seclang-parser.yy" +#line 1046 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Rbl(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2229,7 +2229,7 @@ namespace yy { break; case 68: // op_before_init: "OPERATOR_RX" run_time_string -#line 1044 "seclang-parser.yy" +#line 1050 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2237,7 +2237,7 @@ namespace yy { break; case 69: // op_before_init: "OPERATOR_RX_GLOBAL" run_time_string -#line 1048 "seclang-parser.yy" +#line 1054 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::RxGlobal(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2245,7 +2245,7 @@ namespace yy { break; case 70: // op_before_init: "OPERATOR_STR_EQ" run_time_string -#line 1052 "seclang-parser.yy" +#line 1058 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::StrEq(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2253,7 +2253,7 @@ namespace yy { break; case 71: // op_before_init: "OPERATOR_STR_MATCH" run_time_string -#line 1056 "seclang-parser.yy" +#line 1062 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::StrMatch(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2261,7 +2261,7 @@ namespace yy { break; case 72: // op_before_init: "OPERATOR_BEGINS_WITH" run_time_string -#line 1060 "seclang-parser.yy" +#line 1066 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::BeginsWith(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2269,7 +2269,7 @@ namespace yy { break; case 73: // op_before_init: "OPERATOR_GEOLOOKUP" -#line 1064 "seclang-parser.yy" +#line 1070 "seclang-parser.yy" { #if defined(WITH_GEOIP) or defined(WITH_MAXMIND) OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::GeoLookup()); @@ -2284,7 +2284,7 @@ namespace yy { break; case 75: // expression: "DIRECTIVE" variables op actions -#line 1079 "seclang-parser.yy" +#line 1085 "seclang-parser.yy" { std::vector> *a = new std::vector>(); std::vector > *t = new std::vector >(); @@ -2320,7 +2320,7 @@ namespace yy { break; case 76: // expression: "DIRECTIVE" variables op -#line 1111 "seclang-parser.yy" +#line 1117 "seclang-parser.yy" { variables::Variables *v = new variables::Variables(); for (auto &i : *yystack_[1].value.as < std::unique_ptr > > > ().get()) { @@ -2343,7 +2343,7 @@ namespace yy { break; case 77: // expression: "CONFIG_DIR_SEC_ACTION" actions -#line 1130 "seclang-parser.yy" +#line 1136 "seclang-parser.yy" { std::vector> *a = new std::vector>(); std::vector > *t = new std::vector >(); @@ -2368,7 +2368,7 @@ namespace yy { break; case 78: // expression: "DIRECTIVE_SECRULESCRIPT" actions -#line 1151 "seclang-parser.yy" +#line 1157 "seclang-parser.yy" { std::string err; std::vector> *a = new std::vector>(); @@ -2402,7 +2402,7 @@ namespace yy { break; case 79: // expression: "CONFIG_DIR_SEC_DEFAULT_ACTION" actions -#line 1181 "seclang-parser.yy" +#line 1187 "seclang-parser.yy" { bool hasDisruptive = false; std::vector> *actions = new std::vector>(); @@ -2459,7 +2459,7 @@ namespace yy { break; case 80: // expression: "CONFIG_DIR_SEC_MARKER" -#line 1234 "seclang-parser.yy" +#line 1240 "seclang-parser.yy" { driver.addSecMarker(modsecurity::utils::string::removeBracketsIfNeeded(yystack_[0].value.as < std::string > ()), /* file name */ std::unique_ptr(new std::string(*yystack_[0].location.end.filename)), @@ -2470,7 +2470,7 @@ namespace yy { break; case 81: // expression: "CONFIG_DIR_RULE_ENG" "CONFIG_VALUE_OFF" -#line 1241 "seclang-parser.yy" +#line 1247 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DisabledRuleEngine; } @@ -2478,7 +2478,7 @@ namespace yy { break; case 82: // expression: "CONFIG_DIR_RULE_ENG" "CONFIG_VALUE_ON" -#line 1245 "seclang-parser.yy" +#line 1251 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::EnabledRuleEngine; } @@ -2486,7 +2486,7 @@ namespace yy { break; case 83: // expression: "CONFIG_DIR_RULE_ENG" "CONFIG_VALUE_DETC" -#line 1249 "seclang-parser.yy" +#line 1255 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DetectionOnlyRuleEngine; } @@ -2494,7 +2494,7 @@ namespace yy { break; case 84: // expression: "CONFIG_DIR_REQ_BODY" "CONFIG_VALUE_ON" -#line 1253 "seclang-parser.yy" +#line 1259 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } @@ -2502,7 +2502,7 @@ namespace yy { break; case 85: // expression: "CONFIG_DIR_REQ_BODY" "CONFIG_VALUE_OFF" -#line 1257 "seclang-parser.yy" +#line 1263 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } @@ -2510,7 +2510,7 @@ namespace yy { break; case 86: // expression: "CONFIG_DIR_RES_BODY" "CONFIG_VALUE_ON" -#line 1261 "seclang-parser.yy" +#line 1267 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } @@ -2518,7 +2518,7 @@ namespace yy { break; case 87: // expression: "CONFIG_DIR_RES_BODY" "CONFIG_VALUE_OFF" -#line 1265 "seclang-parser.yy" +#line 1271 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } @@ -2526,7 +2526,7 @@ namespace yy { break; case 88: // expression: "CONFIG_SEC_ARGUMENT_SEPARATOR" -#line 1269 "seclang-parser.yy" +#line 1275 "seclang-parser.yy" { if (yystack_[0].value.as < std::string > ().length() != 1) { driver.error(yystack_[1].location, "Argument separator should be set to a single character."); @@ -2539,7 +2539,7 @@ namespace yy { break; case 89: // expression: "CONFIG_COMPONENT_SIG" -#line 1278 "seclang-parser.yy" +#line 1284 "seclang-parser.yy" { driver.m_components.push_back(yystack_[0].value.as < std::string > ()); } @@ -2547,7 +2547,7 @@ namespace yy { break; case 90: // expression: "CONFIG_CONN_ENGINE" "CONFIG_VALUE_ON" -#line 1282 "seclang-parser.yy" +#line 1288 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecConnEngine is not yet supported."); YYERROR; @@ -2556,238 +2556,250 @@ namespace yy { break; case 91: // expression: "CONFIG_CONN_ENGINE" "CONFIG_VALUE_OFF" -#line 1287 "seclang-parser.yy" +#line 1293 "seclang-parser.yy" { + driver.error(yystack_[2].location, "SecConnEngine is not yet supported."); + YYERROR; } -#line 2563 "seclang-parser.cc" +#line 2565 "seclang-parser.cc" break; case 92: // expression: "CONFIG_SEC_WEB_APP_ID" -#line 1290 "seclang-parser.yy" +#line 1298 "seclang-parser.yy" { driver.m_secWebAppId.m_value = yystack_[0].value.as < std::string > (); driver.m_secWebAppId.m_set = true; } -#line 2572 "seclang-parser.cc" +#line 2574 "seclang-parser.cc" break; case 93: // expression: "CONFIG_SEC_SERVER_SIG" -#line 1295 "seclang-parser.yy" +#line 1303 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecServerSignature is not supported."); YYERROR; } -#line 2581 "seclang-parser.cc" +#line 2583 "seclang-parser.cc" break; case 94: // expression: "CONFIG_SEC_CACHE_TRANSFORMATIONS" -#line 1300 "seclang-parser.yy" +#line 1308 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCacheTransformations is not supported."); YYERROR; } -#line 2590 "seclang-parser.cc" +#line 2592 "seclang-parser.cc" break; case 95: // expression: "CONFIG_SEC_DISABLE_BACKEND_COMPRESS" "CONFIG_VALUE_ON" -#line 1305 "seclang-parser.yy" +#line 1313 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecDisableBackendCompression is not supported."); YYERROR; } -#line 2599 "seclang-parser.cc" +#line 2601 "seclang-parser.cc" break; case 96: // expression: "CONFIG_SEC_DISABLE_BACKEND_COMPRESS" "CONFIG_VALUE_OFF" -#line 1310 "seclang-parser.yy" +#line 1318 "seclang-parser.yy" { + driver.error(yystack_[2].location, "SecDisableBackendCompression is not supported."); + YYERROR; } -#line 2606 "seclang-parser.cc" +#line 2610 "seclang-parser.cc" break; case 97: // expression: "CONFIG_CONTENT_INJECTION" "CONFIG_VALUE_ON" -#line 1313 "seclang-parser.yy" +#line 1323 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecContentInjection is not yet supported."); YYERROR; } -#line 2615 "seclang-parser.cc" +#line 2619 "seclang-parser.cc" break; case 98: // expression: "CONFIG_CONTENT_INJECTION" "CONFIG_VALUE_OFF" -#line 1318 "seclang-parser.yy" +#line 1328 "seclang-parser.yy" { + driver.error(yystack_[2].location, "SecContentInjection is not yet supported."); + YYERROR; } -#line 2622 "seclang-parser.cc" +#line 2628 "seclang-parser.cc" break; case 99: // expression: "CONFIG_SEC_CHROOT_DIR" -#line 1321 "seclang-parser.yy" +#line 1333 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecChrootDir is not supported."); YYERROR; } -#line 2631 "seclang-parser.cc" +#line 2637 "seclang-parser.cc" break; case 100: // expression: "CONFIG_SEC_HASH_ENGINE" "CONFIG_VALUE_ON" -#line 1326 "seclang-parser.yy" +#line 1338 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecHashEngine is not yet supported."); YYERROR; } -#line 2640 "seclang-parser.cc" +#line 2646 "seclang-parser.cc" break; case 101: // expression: "CONFIG_SEC_HASH_ENGINE" "CONFIG_VALUE_OFF" -#line 1331 "seclang-parser.yy" +#line 1343 "seclang-parser.yy" { + driver.error(yystack_[2].location, "SecHashEngine is not yet supported."); + YYERROR; } -#line 2647 "seclang-parser.cc" +#line 2655 "seclang-parser.cc" break; case 102: // expression: "CONFIG_SEC_HASH_KEY" -#line 1334 "seclang-parser.yy" +#line 1348 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashKey is not yet supported."); YYERROR; } -#line 2656 "seclang-parser.cc" +#line 2664 "seclang-parser.cc" break; case 103: // expression: "CONFIG_SEC_HASH_PARAM" -#line 1339 "seclang-parser.yy" +#line 1353 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashParam is not yet supported."); YYERROR; } -#line 2665 "seclang-parser.cc" +#line 2673 "seclang-parser.cc" break; case 104: // expression: "CONFIG_SEC_HASH_METHOD_RX" -#line 1344 "seclang-parser.yy" +#line 1358 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodRx is not yet supported."); YYERROR; } -#line 2674 "seclang-parser.cc" +#line 2682 "seclang-parser.cc" break; case 105: // expression: "CONFIG_SEC_HASH_METHOD_PM" -#line 1349 "seclang-parser.yy" +#line 1363 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodPm is not yet supported."); YYERROR; } -#line 2683 "seclang-parser.cc" +#line 2691 "seclang-parser.cc" break; case 106: // expression: "CONFIG_DIR_GSB_DB" -#line 1354 "seclang-parser.yy" +#line 1368 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGsbLookupDb is not supported."); YYERROR; } -#line 2692 "seclang-parser.cc" +#line 2700 "seclang-parser.cc" break; case 107: // expression: "CONFIG_SEC_GUARDIAN_LOG" -#line 1359 "seclang-parser.yy" +#line 1373 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGuardianLog is not supported."); YYERROR; } -#line 2701 "seclang-parser.cc" +#line 2709 "seclang-parser.cc" break; case 108: // expression: "CONFIG_SEC_INTERCEPT_ON_ERROR" "CONFIG_VALUE_ON" -#line 1364 "seclang-parser.yy" +#line 1378 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecInterceptOnError is not yet supported."); YYERROR; } -#line 2710 "seclang-parser.cc" +#line 2718 "seclang-parser.cc" break; case 109: // expression: "CONFIG_SEC_INTERCEPT_ON_ERROR" "CONFIG_VALUE_OFF" -#line 1369 "seclang-parser.yy" +#line 1383 "seclang-parser.yy" { + driver.error(yystack_[2].location, "SecInterceptOnError is not yet supported."); + YYERROR; } -#line 2717 "seclang-parser.cc" +#line 2727 "seclang-parser.cc" break; case 110: // expression: "CONFIG_SEC_CONN_R_STATE_LIMIT" -#line 1372 "seclang-parser.yy" +#line 1388 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnReadStateLimit is not yet supported."); YYERROR; } -#line 2726 "seclang-parser.cc" +#line 2736 "seclang-parser.cc" break; case 111: // expression: "CONFIG_SEC_CONN_W_STATE_LIMIT" -#line 1377 "seclang-parser.yy" +#line 1393 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnWriteStateLimit is not yet supported."); YYERROR; } -#line 2735 "seclang-parser.cc" +#line 2745 "seclang-parser.cc" break; case 112: // expression: "CONFIG_SEC_SENSOR_ID" -#line 1382 "seclang-parser.yy" +#line 1398 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecSensorId is not yet supported."); YYERROR; } -#line 2744 "seclang-parser.cc" +#line 2754 "seclang-parser.cc" break; case 113: // expression: "CONFIG_SEC_RULE_INHERITANCE" "CONFIG_VALUE_ON" -#line 1387 "seclang-parser.yy" +#line 1403 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecRuleInheritance is not yet supported."); YYERROR; } -#line 2753 "seclang-parser.cc" +#line 2763 "seclang-parser.cc" break; case 114: // expression: "CONFIG_SEC_RULE_INHERITANCE" "CONFIG_VALUE_OFF" -#line 1392 "seclang-parser.yy" +#line 1408 "seclang-parser.yy" { + driver.error(yystack_[2].location, "SecRuleInheritance is not yet supported."); + YYERROR; } -#line 2760 "seclang-parser.cc" +#line 2772 "seclang-parser.cc" break; case 115: // expression: "CONFIG_SEC_RULE_PERF_TIME" -#line 1395 "seclang-parser.yy" +#line 1413 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecRulePerfTime is not yet supported."); YYERROR; } -#line 2769 "seclang-parser.cc" +#line 2781 "seclang-parser.cc" break; case 116: // expression: "CONFIG_SEC_STREAM_IN_BODY_INSPECTION" -#line 1400 "seclang-parser.yy" +#line 1418 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamInBodyInspection is not supported."); YYERROR; } -#line 2778 "seclang-parser.cc" +#line 2790 "seclang-parser.cc" break; case 117: // expression: "CONFIG_SEC_STREAM_OUT_BODY_INSPECTION" -#line 1405 "seclang-parser.yy" +#line 1423 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamOutBodyInspection is not supported."); YYERROR; } -#line 2787 "seclang-parser.cc" +#line 2799 "seclang-parser.cc" break; case 118: // expression: "CONFIG_SEC_RULE_REMOVE_BY_ID" -#line 1410 "seclang-parser.yy" +#line 1428 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.load(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2800,11 +2812,11 @@ namespace yy { YYERROR; } } -#line 2804 "seclang-parser.cc" +#line 2816 "seclang-parser.cc" break; case 119: // expression: "CONFIG_SEC_RULE_REMOVE_BY_TAG" -#line 1423 "seclang-parser.yy" +#line 1441 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByTag(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2817,11 +2829,11 @@ namespace yy { YYERROR; } } -#line 2821 "seclang-parser.cc" +#line 2833 "seclang-parser.cc" break; case 120: // expression: "CONFIG_SEC_RULE_REMOVE_BY_MSG" -#line 1436 "seclang-parser.yy" +#line 1454 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByMsg(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2834,11 +2846,11 @@ namespace yy { YYERROR; } } -#line 2838 "seclang-parser.cc" +#line 2850 "seclang-parser.cc" break; case 121: // expression: "CONFIG_SEC_RULE_UPDATE_TARGET_BY_TAG" variables_pre_process -#line 1449 "seclang-parser.yy" +#line 1467 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadUpdateTargetByTag(yystack_[1].value.as < std::string > (), std::move(yystack_[0].value.as < std::unique_ptr > > > ()), &error) == false) { @@ -2851,11 +2863,11 @@ namespace yy { YYERROR; } } -#line 2855 "seclang-parser.cc" +#line 2867 "seclang-parser.cc" break; case 122: // expression: "CONFIG_SEC_RULE_UPDATE_TARGET_BY_MSG" variables_pre_process -#line 1462 "seclang-parser.yy" +#line 1480 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadUpdateTargetByMsg(yystack_[1].value.as < std::string > (), std::move(yystack_[0].value.as < std::unique_ptr > > > ()), &error) == false) { @@ -2868,11 +2880,11 @@ namespace yy { YYERROR; } } -#line 2872 "seclang-parser.cc" +#line 2884 "seclang-parser.cc" break; case 123: // expression: "CONFIG_SEC_RULE_UPDATE_TARGET_BY_ID" variables_pre_process -#line 1475 "seclang-parser.yy" +#line 1493 "seclang-parser.yy" { std::string error; std::istringstream iss(yystack_[1].value.as < std::string > ()); @@ -2898,11 +2910,11 @@ namespace yy { YYERROR; } } -#line 2902 "seclang-parser.cc" +#line 2914 "seclang-parser.cc" break; case 124: // expression: "CONFIG_SEC_RULE_UPDATE_ACTION_BY_ID" actions -#line 1501 "seclang-parser.yy" +#line 1519 "seclang-parser.yy" { std::string error; std::istringstream iss(yystack_[1].value.as < std::string > ()); @@ -2929,11 +2941,11 @@ namespace yy { YYERROR; } } -#line 2933 "seclang-parser.cc" +#line 2945 "seclang-parser.cc" break; case 125: // expression: "CONFIG_DIR_DEBUG_LVL" -#line 1529 "seclang-parser.yy" +#line 1547 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { driver.m_debugLog->setDebugLogLevel(atoi(yystack_[0].value.as < std::string > ().c_str())); @@ -2945,11 +2957,11 @@ namespace yy { YYERROR; } } -#line 2949 "seclang-parser.cc" +#line 2961 "seclang-parser.cc" break; case 126: // expression: "CONFIG_DIR_DEBUG_LOG" -#line 1541 "seclang-parser.yy" +#line 1559 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { std::string error; @@ -2968,11 +2980,11 @@ namespace yy { YYERROR; } } -#line 2972 "seclang-parser.cc" +#line 2984 "seclang-parser.cc" break; case 127: // expression: "CONFIG_DIR_GEO_DB" -#line 1561 "seclang-parser.yy" +#line 1579 "seclang-parser.yy" { #if defined(WITH_GEOIP) or defined(WITH_MAXMIND) std::string err; @@ -2999,38 +3011,38 @@ namespace yy { YYERROR; #endif // WITH_GEOIP } -#line 3003 "seclang-parser.cc" +#line 3015 "seclang-parser.cc" break; case 128: // expression: "CONFIG_DIR_ARGS_LIMIT" -#line 1588 "seclang-parser.yy" +#line 1606 "seclang-parser.yy" { driver.m_argumentsLimit.m_set = true; driver.m_argumentsLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3012 "seclang-parser.cc" +#line 3024 "seclang-parser.cc" break; case 129: // expression: "CONFIG_DIR_REQ_BODY_LIMIT" -#line 1594 "seclang-parser.yy" +#line 1612 "seclang-parser.yy" { driver.m_requestBodyLimit.m_set = true; driver.m_requestBodyLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3021 "seclang-parser.cc" +#line 3033 "seclang-parser.cc" break; case 130: // expression: "CONFIG_DIR_REQ_BODY_NO_FILES_LIMIT" -#line 1599 "seclang-parser.yy" +#line 1617 "seclang-parser.yy" { driver.m_requestBodyNoFilesLimit.m_set = true; driver.m_requestBodyNoFilesLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3030 "seclang-parser.cc" +#line 3042 "seclang-parser.cc" break; case 131: // expression: "CONFIG_DIR_REQ_BODY_IN_MEMORY_LIMIT" -#line 1604 "seclang-parser.yy" +#line 1622 "seclang-parser.yy" { std::stringstream ss; ss << "As of ModSecurity version 3.0, SecRequestBodyInMemoryLimit is no longer "; @@ -3039,68 +3051,90 @@ namespace yy { driver.error(yystack_[1].location, ss.str()); YYERROR; } -#line 3043 "seclang-parser.cc" +#line 3055 "seclang-parser.cc" break; case 132: // expression: "CONFIG_DIR_RES_BODY_LIMIT" -#line 1613 "seclang-parser.yy" +#line 1631 "seclang-parser.yy" { driver.m_responseBodyLimit.m_set = true; driver.m_responseBodyLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3052 "seclang-parser.cc" +#line 3064 "seclang-parser.cc" break; case 133: // expression: "CONFIG_DIR_REQ_BODY_LIMIT_ACTION" "CONFIG_VALUE_PROCESS_PARTIAL" -#line 1618 "seclang-parser.yy" +#line 1636 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3060 "seclang-parser.cc" +#line 3072 "seclang-parser.cc" break; case 134: // expression: "CONFIG_DIR_REQ_BODY_LIMIT_ACTION" "CONFIG_VALUE_REJECT" -#line 1622 "seclang-parser.yy" +#line 1640 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3068 "seclang-parser.cc" +#line 3080 "seclang-parser.cc" break; case 135: // expression: "CONFIG_DIR_RES_BODY_LIMIT_ACTION" "CONFIG_VALUE_PROCESS_PARTIAL" -#line 1626 "seclang-parser.yy" +#line 1644 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3076 "seclang-parser.cc" +#line 3088 "seclang-parser.cc" break; case 136: // expression: "CONFIG_DIR_RES_BODY_LIMIT_ACTION" "CONFIG_VALUE_REJECT" -#line 1630 "seclang-parser.yy" +#line 1648 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3084 "seclang-parser.cc" +#line 3096 "seclang-parser.cc" break; case 137: // expression: "CONFIG_SEC_REMOTE_RULES_FAIL_ACTION" "CONFIG_VALUE_ABORT" -#line 1634 "seclang-parser.yy" +#line 1652 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::AbortOnFailedRemoteRulesAction; } -#line 3092 "seclang-parser.cc" +#line 3104 "seclang-parser.cc" break; case 138: // expression: "CONFIG_SEC_REMOTE_RULES_FAIL_ACTION" "CONFIG_VALUE_WARN" -#line 1638 "seclang-parser.yy" +#line 1656 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::WarnOnFailedRemoteRulesAction; } -#line 3100 "seclang-parser.cc" +#line 3112 "seclang-parser.cc" + break; + + case 139: // expression: "CONFIG_DIR_PCRE_MATCH_LIMIT_RECURSION" +#line 1660 "seclang-parser.yy" + { +/* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended + driver.error(@0, "SecPcreMatchLimitRecursion is not currently supported. Default PCRE values are being used for now"); + YYERROR; +*/ + } +#line 3123 "seclang-parser.cc" + break; + + case 140: // expression: "CONFIG_DIR_PCRE_MATCH_LIMIT" +#line 1667 "seclang-parser.yy" + { +/* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended + driver.error(@0, "SecPcreMatchLimit is not currently supported. Default PCRE values are being used for now"); + YYERROR; +*/ + } +#line 3134 "seclang-parser.cc" break; case 141: // expression: "CONGIG_DIR_RESPONSE_BODY_MP" -#line 1652 "seclang-parser.yy" +#line 1674 "seclang-parser.yy" { std::istringstream buf(yystack_[0].value.as < std::string > ()); std::istream_iterator beg(buf), end; @@ -3112,72 +3146,98 @@ namespace yy { driver.m_responseBodyTypeToBeInspected.m_value.insert(*it); } } -#line 3116 "seclang-parser.cc" +#line 3150 "seclang-parser.cc" break; case 142: // expression: "CONGIG_DIR_RESPONSE_BODY_MP_CLEAR" -#line 1664 "seclang-parser.yy" +#line 1686 "seclang-parser.yy" { driver.m_responseBodyTypeToBeInspected.m_set = true; driver.m_responseBodyTypeToBeInspected.m_clear = true; driver.m_responseBodyTypeToBeInspected.m_value.clear(); } -#line 3126 "seclang-parser.cc" +#line 3160 "seclang-parser.cc" break; case 143: // expression: "CONFIG_XML_EXTERNAL_ENTITY" "CONFIG_VALUE_OFF" -#line 1670 "seclang-parser.yy" +#line 1692 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 3134 "seclang-parser.cc" +#line 3168 "seclang-parser.cc" break; case 144: // expression: "CONFIG_XML_EXTERNAL_ENTITY" "CONFIG_VALUE_ON" -#line 1674 "seclang-parser.yy" +#line 1696 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 3142 "seclang-parser.cc" +#line 3176 "seclang-parser.cc" break; case 145: // expression: "CONGIG_DIR_SEC_TMP_DIR" -#line 1678 "seclang-parser.yy" +#line 1700 "seclang-parser.yy" { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended - std::stringstream ss; - ss << "As of ModSecurity version 3.0, SecTmpDir is no longer supported."; - ss << " Instead, you can use your web server configurations to control when"; - ss << "and where to swap. ModSecurity will follow the web server decision."; + std::stringstream ss; + ss << "As of ModSecurity version 3.0, SecTmpDir is no longer supported."; + ss << " Instead, you can use your web server configurations to control when"; + ss << "and where to swap. ModSecurity will follow the web server decision."; driver.error(@0, ss.str()); YYERROR; */ } -#line 3157 "seclang-parser.cc" +#line 3191 "seclang-parser.cc" + break; + + case 146: // expression: "CONGIG_DIR_SEC_DATA_DIR" +#line 1711 "seclang-parser.yy" + { +/* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended + std::stringstream ss; + ss << "SecDataDir is not currently supported."; + ss << " Collections are kept in memory (in_memory-per_process) for now."; + ss << " When using a backend such as LMDB, temp data path is currently defined by the backend."; + driver.error(@0, ss.str()); + YYERROR; +*/ + } +#line 3206 "seclang-parser.cc" break; case 148: // expression: "CONGIG_DIR_SEC_COOKIE_FORMAT" -#line 1699 "seclang-parser.yy" +#line 1723 "seclang-parser.yy" { if (atoi(yystack_[0].value.as < std::string > ().c_str()) == 1) { driver.error(yystack_[1].location, "SecCookieFormat 1 is not yet supported."); YYERROR; } } -#line 3168 "seclang-parser.cc" +#line 3217 "seclang-parser.cc" break; case 149: // expression: "CONFIG_SEC_COOKIEV0_SEPARATOR" -#line 1706 "seclang-parser.yy" +#line 1730 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCookieV0Separator is not yet supported."); YYERROR; } -#line 3177 "seclang-parser.cc" +#line 3226 "seclang-parser.cc" + break; + + case 150: // expression: "CONGIG_DIR_SEC_STATUS_ENGINE" +#line 1735 "seclang-parser.yy" + { +/* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended + driver.error(@0, "SecStatusEngine is not yet supported."); + YYERROR; +*/ + } +#line 3237 "seclang-parser.cc" break; case 151: // expression: "CONFIG_DIR_UNICODE_MAP_FILE" -#line 1716 "seclang-parser.yy" +#line 1742 "seclang-parser.yy" { std::string error; std::vector param; @@ -3231,31 +3291,31 @@ namespace yy { } } -#line 3235 "seclang-parser.cc" +#line 3295 "seclang-parser.cc" break; case 152: // expression: "CONFIG_SEC_COLLECTION_TIMEOUT" -#line 1770 "seclang-parser.yy" +#line 1796 "seclang-parser.yy" { /* Parser error disabled to avoid breaking default CRS installations with crs-setup.conf-recommended driver.error(@0, "SecCollectionTimeout is not yet supported."); YYERROR; */ } -#line 3246 "seclang-parser.cc" +#line 3306 "seclang-parser.cc" break; case 153: // expression: "CONFIG_SEC_HTTP_BLKEY" -#line 1777 "seclang-parser.yy" +#line 1803 "seclang-parser.yy" { driver.m_httpblKey.m_set = true; driver.m_httpblKey.m_value = yystack_[0].value.as < std::string > (); } -#line 3255 "seclang-parser.cc" +#line 3315 "seclang-parser.cc" break; case 154: // variables: variables_pre_process -#line 1785 "seclang-parser.yy" +#line 1811 "seclang-parser.yy" { std::unique_ptr > > originalList = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); std::unique_ptr>> newList(new std::vector>()); @@ -3289,2370 +3349,2365 @@ namespace yy { } yylhs.value.as < std::unique_ptr > > > () = std::move(newNewList); } -#line 3293 "seclang-parser.cc" +#line 3353 "seclang-parser.cc" break; case 155: // variables_pre_process: variables_may_be_quoted -#line 1822 "seclang-parser.yy" +#line 1848 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); } -#line 3301 "seclang-parser.cc" +#line 3361 "seclang-parser.cc" break; case 156: // variables_pre_process: "QUOTATION_MARK" variables_may_be_quoted "QUOTATION_MARK" -#line 1826 "seclang-parser.yy" +#line 1852 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[1].value.as < std::unique_ptr > > > ()); } -#line 3309 "seclang-parser.cc" +#line 3369 "seclang-parser.cc" break; case 157: // variables_may_be_quoted: variables_may_be_quoted PIPE var -#line 1833 "seclang-parser.yy" +#line 1859 "seclang-parser.yy" { yystack_[2].value.as < std::unique_ptr > > > ()->push_back(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[2].value.as < std::unique_ptr > > > ()); } -#line 3318 "seclang-parser.cc" +#line 3378 "seclang-parser.cc" break; case 158: // variables_may_be_quoted: variables_may_be_quoted PIPE VAR_EXCLUSION var -#line 1838 "seclang-parser.yy" +#line 1864 "seclang-parser.yy" { std::unique_ptr c(new VariableModificatorExclusion(std::move(yystack_[0].value.as < std::unique_ptr > ()))); yystack_[3].value.as < std::unique_ptr > > > ()->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[3].value.as < std::unique_ptr > > > ()); } -#line 3328 "seclang-parser.cc" +#line 3388 "seclang-parser.cc" break; case 159: // variables_may_be_quoted: variables_may_be_quoted PIPE VAR_COUNT var -#line 1844 "seclang-parser.yy" +#line 1870 "seclang-parser.yy" { std::unique_ptr c(new VariableModificatorCount(std::move(yystack_[0].value.as < std::unique_ptr > ()))); yystack_[3].value.as < std::unique_ptr > > > ()->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[3].value.as < std::unique_ptr > > > ()); } -#line 3338 "seclang-parser.cc" +#line 3398 "seclang-parser.cc" break; case 160: // variables_may_be_quoted: var -#line 1850 "seclang-parser.yy" +#line 1876 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); b->push_back(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > > > () = std::move(b); } -#line 3348 "seclang-parser.cc" +#line 3408 "seclang-parser.cc" break; case 161: // variables_may_be_quoted: VAR_EXCLUSION var -#line 1856 "seclang-parser.yy" +#line 1882 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); std::unique_ptr c(new VariableModificatorExclusion(std::move(yystack_[0].value.as < std::unique_ptr > ()))); b->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(b); } -#line 3359 "seclang-parser.cc" +#line 3419 "seclang-parser.cc" break; case 162: // variables_may_be_quoted: VAR_COUNT var -#line 1863 "seclang-parser.yy" +#line 1889 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); std::unique_ptr c(new VariableModificatorCount(std::move(yystack_[0].value.as < std::unique_ptr > ()))); b->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(b); } -#line 3370 "seclang-parser.cc" +#line 3430 "seclang-parser.cc" break; case 163: // var: VARIABLE_ARGS "Dictionary element" -#line 1873 "seclang-parser.yy" +#line 1899 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3378 "seclang-parser.cc" +#line 3438 "seclang-parser.cc" break; case 164: // var: VARIABLE_ARGS "Dictionary element, selected by regexp" -#line 1877 "seclang-parser.yy" +#line 1903 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3386 "seclang-parser.cc" +#line 3446 "seclang-parser.cc" break; case 165: // var: VARIABLE_ARGS -#line 1881 "seclang-parser.yy" +#line 1907 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_NoDictElement()); } -#line 3394 "seclang-parser.cc" +#line 3454 "seclang-parser.cc" break; case 166: // var: VARIABLE_ARGS_POST "Dictionary element" -#line 1885 "seclang-parser.yy" +#line 1911 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3402 "seclang-parser.cc" +#line 3462 "seclang-parser.cc" break; case 167: // var: VARIABLE_ARGS_POST "Dictionary element, selected by regexp" -#line 1889 "seclang-parser.yy" +#line 1915 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3410 "seclang-parser.cc" +#line 3470 "seclang-parser.cc" break; case 168: // var: VARIABLE_ARGS_POST -#line 1893 "seclang-parser.yy" +#line 1919 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_NoDictElement()); } -#line 3418 "seclang-parser.cc" +#line 3478 "seclang-parser.cc" break; case 169: // var: VARIABLE_ARGS_GET "Dictionary element" -#line 1897 "seclang-parser.yy" +#line 1923 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3426 "seclang-parser.cc" +#line 3486 "seclang-parser.cc" break; case 170: // var: VARIABLE_ARGS_GET "Dictionary element, selected by regexp" -#line 1901 "seclang-parser.yy" +#line 1927 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3434 "seclang-parser.cc" +#line 3494 "seclang-parser.cc" break; case 171: // var: VARIABLE_ARGS_GET -#line 1905 "seclang-parser.yy" +#line 1931 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_NoDictElement()); } -#line 3442 "seclang-parser.cc" +#line 3502 "seclang-parser.cc" break; case 172: // var: VARIABLE_FILES_SIZES "Dictionary element" -#line 1909 "seclang-parser.yy" +#line 1935 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3450 "seclang-parser.cc" +#line 3510 "seclang-parser.cc" break; case 173: // var: VARIABLE_FILES_SIZES "Dictionary element, selected by regexp" -#line 1913 "seclang-parser.yy" +#line 1939 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3458 "seclang-parser.cc" +#line 3518 "seclang-parser.cc" break; case 174: // var: VARIABLE_FILES_SIZES -#line 1917 "seclang-parser.yy" +#line 1943 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_NoDictElement()); } -#line 3466 "seclang-parser.cc" +#line 3526 "seclang-parser.cc" break; case 175: // var: VARIABLE_FILES_NAMES "Dictionary element" -#line 1921 "seclang-parser.yy" +#line 1947 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3474 "seclang-parser.cc" +#line 3534 "seclang-parser.cc" break; case 176: // var: VARIABLE_FILES_NAMES "Dictionary element, selected by regexp" -#line 1925 "seclang-parser.yy" +#line 1951 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3482 "seclang-parser.cc" +#line 3542 "seclang-parser.cc" break; case 177: // var: VARIABLE_FILES_NAMES -#line 1929 "seclang-parser.yy" +#line 1955 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_NoDictElement()); } -#line 3490 "seclang-parser.cc" +#line 3550 "seclang-parser.cc" break; case 178: // var: VARIABLE_FILES_TMP_CONTENT "Dictionary element" -#line 1933 "seclang-parser.yy" +#line 1959 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3498 "seclang-parser.cc" +#line 3558 "seclang-parser.cc" break; case 179: // var: VARIABLE_FILES_TMP_CONTENT "Dictionary element, selected by regexp" -#line 1937 "seclang-parser.yy" +#line 1963 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3506 "seclang-parser.cc" +#line 3566 "seclang-parser.cc" break; case 180: // var: VARIABLE_FILES_TMP_CONTENT -#line 1941 "seclang-parser.yy" +#line 1967 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_NoDictElement()); } -#line 3514 "seclang-parser.cc" +#line 3574 "seclang-parser.cc" break; case 181: // var: VARIABLE_MULTIPART_FILENAME "Dictionary element" -#line 1945 "seclang-parser.yy" +#line 1971 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3522 "seclang-parser.cc" +#line 3582 "seclang-parser.cc" break; case 182: // var: VARIABLE_MULTIPART_FILENAME "Dictionary element, selected by regexp" -#line 1949 "seclang-parser.yy" +#line 1975 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3530 "seclang-parser.cc" +#line 3590 "seclang-parser.cc" break; case 183: // var: VARIABLE_MULTIPART_FILENAME -#line 1953 "seclang-parser.yy" +#line 1979 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_NoDictElement()); } -#line 3538 "seclang-parser.cc" +#line 3598 "seclang-parser.cc" break; case 184: // var: VARIABLE_MULTIPART_NAME "Dictionary element" -#line 1957 "seclang-parser.yy" +#line 1983 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3546 "seclang-parser.cc" +#line 3606 "seclang-parser.cc" break; case 185: // var: VARIABLE_MULTIPART_NAME "Dictionary element, selected by regexp" -#line 1961 "seclang-parser.yy" +#line 1987 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3554 "seclang-parser.cc" +#line 3614 "seclang-parser.cc" break; case 186: // var: VARIABLE_MULTIPART_NAME -#line 1965 "seclang-parser.yy" +#line 1991 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_NoDictElement()); } -#line 3562 "seclang-parser.cc" +#line 3622 "seclang-parser.cc" break; case 187: // var: VARIABLE_MATCHED_VARS_NAMES "Dictionary element" -#line 1969 "seclang-parser.yy" +#line 1995 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3570 "seclang-parser.cc" +#line 3630 "seclang-parser.cc" break; case 188: // var: VARIABLE_MATCHED_VARS_NAMES "Dictionary element, selected by regexp" -#line 1973 "seclang-parser.yy" +#line 1999 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3578 "seclang-parser.cc" +#line 3638 "seclang-parser.cc" break; case 189: // var: VARIABLE_MATCHED_VARS_NAMES -#line 1977 "seclang-parser.yy" +#line 2003 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_NoDictElement()); } -#line 3586 "seclang-parser.cc" +#line 3646 "seclang-parser.cc" break; case 190: // var: VARIABLE_MATCHED_VARS "Dictionary element" -#line 1981 "seclang-parser.yy" +#line 2007 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3594 "seclang-parser.cc" +#line 3654 "seclang-parser.cc" break; case 191: // var: VARIABLE_MATCHED_VARS "Dictionary element, selected by regexp" -#line 1985 "seclang-parser.yy" +#line 2011 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3602 "seclang-parser.cc" +#line 3662 "seclang-parser.cc" break; case 192: // var: VARIABLE_MATCHED_VARS -#line 1989 "seclang-parser.yy" +#line 2015 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_NoDictElement()); } -#line 3610 "seclang-parser.cc" +#line 3670 "seclang-parser.cc" break; case 193: // var: VARIABLE_FILES "Dictionary element" -#line 1993 "seclang-parser.yy" +#line 2019 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3618 "seclang-parser.cc" +#line 3678 "seclang-parser.cc" break; case 194: // var: VARIABLE_FILES "Dictionary element, selected by regexp" -#line 1997 "seclang-parser.yy" +#line 2023 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3626 "seclang-parser.cc" +#line 3686 "seclang-parser.cc" break; case 195: // var: VARIABLE_FILES -#line 2001 "seclang-parser.yy" +#line 2027 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_NoDictElement()); } -#line 3634 "seclang-parser.cc" +#line 3694 "seclang-parser.cc" break; case 196: // var: VARIABLE_REQUEST_COOKIES "Dictionary element" -#line 2005 "seclang-parser.yy" +#line 2031 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3642 "seclang-parser.cc" +#line 3702 "seclang-parser.cc" break; case 197: // var: VARIABLE_REQUEST_COOKIES "Dictionary element, selected by regexp" -#line 2009 "seclang-parser.yy" +#line 2035 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3650 "seclang-parser.cc" +#line 3710 "seclang-parser.cc" break; case 198: // var: VARIABLE_REQUEST_COOKIES -#line 2013 "seclang-parser.yy" +#line 2039 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_NoDictElement()); } -#line 3658 "seclang-parser.cc" +#line 3718 "seclang-parser.cc" break; case 199: // var: VARIABLE_REQUEST_HEADERS "Dictionary element" -#line 2017 "seclang-parser.yy" +#line 2043 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3666 "seclang-parser.cc" +#line 3726 "seclang-parser.cc" break; case 200: // var: VARIABLE_REQUEST_HEADERS "Dictionary element, selected by regexp" -#line 2021 "seclang-parser.yy" +#line 2047 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3674 "seclang-parser.cc" +#line 3734 "seclang-parser.cc" break; case 201: // var: VARIABLE_REQUEST_HEADERS -#line 2025 "seclang-parser.yy" +#line 2051 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_NoDictElement()); } -#line 3682 "seclang-parser.cc" +#line 3742 "seclang-parser.cc" break; case 202: // var: VARIABLE_RESPONSE_HEADERS "Dictionary element" -#line 2029 "seclang-parser.yy" +#line 2055 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3690 "seclang-parser.cc" +#line 3750 "seclang-parser.cc" break; case 203: // var: VARIABLE_RESPONSE_HEADERS "Dictionary element, selected by regexp" -#line 2033 "seclang-parser.yy" +#line 2059 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3698 "seclang-parser.cc" +#line 3758 "seclang-parser.cc" break; case 204: // var: VARIABLE_RESPONSE_HEADERS -#line 2037 "seclang-parser.yy" +#line 2063 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_NoDictElement()); } -#line 3706 "seclang-parser.cc" +#line 3766 "seclang-parser.cc" break; case 205: // var: VARIABLE_GEO "Dictionary element" -#line 2041 "seclang-parser.yy" +#line 2067 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3714 "seclang-parser.cc" +#line 3774 "seclang-parser.cc" break; case 206: // var: VARIABLE_GEO "Dictionary element, selected by regexp" -#line 2045 "seclang-parser.yy" +#line 2071 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3722 "seclang-parser.cc" +#line 3782 "seclang-parser.cc" break; case 207: // var: VARIABLE_GEO -#line 2049 "seclang-parser.yy" +#line 2075 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_NoDictElement()); } -#line 3730 "seclang-parser.cc" +#line 3790 "seclang-parser.cc" break; case 208: // var: VARIABLE_REQUEST_COOKIES_NAMES "Dictionary element" -#line 2053 "seclang-parser.yy" +#line 2079 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3738 "seclang-parser.cc" +#line 3798 "seclang-parser.cc" break; case 209: // var: VARIABLE_REQUEST_COOKIES_NAMES "Dictionary element, selected by regexp" -#line 2057 "seclang-parser.yy" +#line 2083 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3746 "seclang-parser.cc" +#line 3806 "seclang-parser.cc" break; case 210: // var: VARIABLE_REQUEST_COOKIES_NAMES -#line 2061 "seclang-parser.yy" +#line 2087 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_NoDictElement()); } -#line 3754 "seclang-parser.cc" +#line 3814 "seclang-parser.cc" break; case 211: // var: VARIABLE_RULE "Dictionary element" -#line 2065 "seclang-parser.yy" +#line 2091 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3762 "seclang-parser.cc" +#line 3822 "seclang-parser.cc" break; case 212: // var: VARIABLE_RULE "Dictionary element, selected by regexp" -#line 2069 "seclang-parser.yy" +#line 2095 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3770 "seclang-parser.cc" +#line 3830 "seclang-parser.cc" break; case 213: // var: VARIABLE_RULE -#line 2073 "seclang-parser.yy" +#line 2099 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_NoDictElement()); } -#line 3778 "seclang-parser.cc" +#line 3838 "seclang-parser.cc" break; case 214: // var: "RUN_TIME_VAR_ENV" "Dictionary element" -#line 2077 "seclang-parser.yy" +#line 2103 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3786 "seclang-parser.cc" +#line 3846 "seclang-parser.cc" break; case 215: // var: "RUN_TIME_VAR_ENV" "Dictionary element, selected by regexp" -#line 2081 "seclang-parser.yy" +#line 2107 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3794 "seclang-parser.cc" +#line 3854 "seclang-parser.cc" break; case 216: // var: "RUN_TIME_VAR_ENV" -#line 2085 "seclang-parser.yy" +#line 2111 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV")); } -#line 3802 "seclang-parser.cc" +#line 3862 "seclang-parser.cc" break; case 217: // var: "RUN_TIME_VAR_XML" "Dictionary element" -#line 2089 "seclang-parser.yy" +#line 2115 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML_WithNSPath(yystack_[0].value.as < std::string > ())); } -#line 3810 "seclang-parser.cc" +#line 3870 "seclang-parser.cc" break; case 218: // var: "RUN_TIME_VAR_XML" "Dictionary element, selected by regexp" -#line 2093 "seclang-parser.yy" +#line 2119 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML_WithNSPath(yystack_[0].value.as < std::string > ())); } -#line 3818 "seclang-parser.cc" +#line 3878 "seclang-parser.cc" break; case 219: // var: "RUN_TIME_VAR_XML" -#line 2097 "seclang-parser.yy" +#line 2123 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML_WithoutNSPath()); } -#line 3826 "seclang-parser.cc" +#line 3886 "seclang-parser.cc" break; case 220: // var: "FILES_TMPNAMES" "Dictionary element" -#line 2101 "seclang-parser.yy" +#line 2127 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3834 "seclang-parser.cc" +#line 3894 "seclang-parser.cc" break; case 221: // var: "FILES_TMPNAMES" "Dictionary element, selected by regexp" -#line 2105 "seclang-parser.yy" +#line 2131 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3842 "seclang-parser.cc" +#line 3902 "seclang-parser.cc" break; case 222: // var: "FILES_TMPNAMES" -#line 2109 "seclang-parser.yy" +#line 2135 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_NoDictElement()); } -#line 3850 "seclang-parser.cc" +#line 3910 "seclang-parser.cc" break; case 223: // var: "RESOURCE" run_time_string -#line 2113 "seclang-parser.yy" +#line 2139 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 3858 "seclang-parser.cc" +#line 3918 "seclang-parser.cc" break; case 224: // var: "RESOURCE" "Dictionary element" -#line 2117 "seclang-parser.yy" +#line 2143 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3866 "seclang-parser.cc" +#line 3926 "seclang-parser.cc" break; case 225: // var: "RESOURCE" "Dictionary element, selected by regexp" -#line 2121 "seclang-parser.yy" +#line 2147 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3874 "seclang-parser.cc" +#line 3934 "seclang-parser.cc" break; case 226: // var: "RESOURCE" -#line 2125 "seclang-parser.yy" +#line 2151 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_NoDictElement()); } -#line 3882 "seclang-parser.cc" +#line 3942 "seclang-parser.cc" break; case 227: // var: "VARIABLE_IP" run_time_string -#line 2129 "seclang-parser.yy" +#line 2155 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 3890 "seclang-parser.cc" +#line 3950 "seclang-parser.cc" break; case 228: // var: "VARIABLE_IP" "Dictionary element" -#line 2133 "seclang-parser.yy" +#line 2159 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3898 "seclang-parser.cc" +#line 3958 "seclang-parser.cc" break; case 229: // var: "VARIABLE_IP" "Dictionary element, selected by regexp" -#line 2137 "seclang-parser.yy" +#line 2163 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3906 "seclang-parser.cc" +#line 3966 "seclang-parser.cc" break; case 230: // var: "VARIABLE_IP" -#line 2141 "seclang-parser.yy" +#line 2167 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_NoDictElement()); } -#line 3914 "seclang-parser.cc" +#line 3974 "seclang-parser.cc" break; case 231: // var: "VARIABLE_GLOBAL" run_time_string -#line 2145 "seclang-parser.yy" +#line 2171 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 3922 "seclang-parser.cc" +#line 3982 "seclang-parser.cc" break; case 232: // var: "VARIABLE_GLOBAL" "Dictionary element" -#line 2149 "seclang-parser.yy" +#line 2175 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3930 "seclang-parser.cc" +#line 3990 "seclang-parser.cc" break; case 233: // var: "VARIABLE_GLOBAL" "Dictionary element, selected by regexp" -#line 2153 "seclang-parser.yy" +#line 2179 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3938 "seclang-parser.cc" +#line 3998 "seclang-parser.cc" break; case 234: // var: "VARIABLE_GLOBAL" -#line 2157 "seclang-parser.yy" +#line 2183 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_NoDictElement()); } -#line 3946 "seclang-parser.cc" +#line 4006 "seclang-parser.cc" break; case 235: // var: "VARIABLE_USER" run_time_string -#line 2161 "seclang-parser.yy" +#line 2187 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 3954 "seclang-parser.cc" +#line 4014 "seclang-parser.cc" break; case 236: // var: "VARIABLE_USER" "Dictionary element" -#line 2165 "seclang-parser.yy" +#line 2191 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3962 "seclang-parser.cc" +#line 4022 "seclang-parser.cc" break; case 237: // var: "VARIABLE_USER" "Dictionary element, selected by regexp" -#line 2169 "seclang-parser.yy" +#line 2195 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3970 "seclang-parser.cc" +#line 4030 "seclang-parser.cc" break; case 238: // var: "VARIABLE_USER" -#line 2173 "seclang-parser.yy" +#line 2199 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_NoDictElement()); } -#line 3978 "seclang-parser.cc" +#line 4038 "seclang-parser.cc" break; case 239: // var: "VARIABLE_TX" run_time_string -#line 2177 "seclang-parser.yy" +#line 2203 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 3986 "seclang-parser.cc" +#line 4046 "seclang-parser.cc" break; case 240: // var: "VARIABLE_TX" "Dictionary element" -#line 2181 "seclang-parser.yy" +#line 2207 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3994 "seclang-parser.cc" +#line 4054 "seclang-parser.cc" break; case 241: // var: "VARIABLE_TX" "Dictionary element, selected by regexp" -#line 2185 "seclang-parser.yy" +#line 2211 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4002 "seclang-parser.cc" +#line 4062 "seclang-parser.cc" break; case 242: // var: "VARIABLE_TX" -#line 2189 "seclang-parser.yy" +#line 2215 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_NoDictElement()); } -#line 4010 "seclang-parser.cc" +#line 4070 "seclang-parser.cc" break; case 243: // var: "VARIABLE_SESSION" run_time_string -#line 2193 "seclang-parser.yy" +#line 2219 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 4018 "seclang-parser.cc" +#line 4078 "seclang-parser.cc" break; case 244: // var: "VARIABLE_SESSION" "Dictionary element" -#line 2197 "seclang-parser.yy" +#line 2223 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4026 "seclang-parser.cc" +#line 4086 "seclang-parser.cc" break; case 245: // var: "VARIABLE_SESSION" "Dictionary element, selected by regexp" -#line 2201 "seclang-parser.yy" +#line 2227 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4034 "seclang-parser.cc" +#line 4094 "seclang-parser.cc" break; case 246: // var: "VARIABLE_SESSION" -#line 2205 "seclang-parser.yy" +#line 2231 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_NoDictElement()); } -#line 4042 "seclang-parser.cc" +#line 4102 "seclang-parser.cc" break; case 247: // var: "Variable ARGS_NAMES" "Dictionary element" -#line 2209 "seclang-parser.yy" +#line 2235 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4050 "seclang-parser.cc" +#line 4110 "seclang-parser.cc" break; case 248: // var: "Variable ARGS_NAMES" "Dictionary element, selected by regexp" -#line 2213 "seclang-parser.yy" +#line 2239 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4058 "seclang-parser.cc" +#line 4118 "seclang-parser.cc" break; case 249: // var: "Variable ARGS_NAMES" -#line 2217 "seclang-parser.yy" +#line 2243 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_NoDictElement()); } -#line 4066 "seclang-parser.cc" +#line 4126 "seclang-parser.cc" break; case 250: // var: VARIABLE_ARGS_GET_NAMES "Dictionary element" -#line 2221 "seclang-parser.yy" +#line 2247 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4074 "seclang-parser.cc" +#line 4134 "seclang-parser.cc" break; case 251: // var: VARIABLE_ARGS_GET_NAMES "Dictionary element, selected by regexp" -#line 2225 "seclang-parser.yy" +#line 2251 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4082 "seclang-parser.cc" +#line 4142 "seclang-parser.cc" break; case 252: // var: VARIABLE_ARGS_GET_NAMES -#line 2229 "seclang-parser.yy" +#line 2255 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_NoDictElement()); } -#line 4090 "seclang-parser.cc" +#line 4150 "seclang-parser.cc" break; case 253: // var: VARIABLE_ARGS_POST_NAMES "Dictionary element" -#line 2234 "seclang-parser.yy" +#line 2260 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4098 "seclang-parser.cc" +#line 4158 "seclang-parser.cc" break; case 254: // var: VARIABLE_ARGS_POST_NAMES "Dictionary element, selected by regexp" -#line 2238 "seclang-parser.yy" +#line 2264 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4106 "seclang-parser.cc" +#line 4166 "seclang-parser.cc" break; case 255: // var: VARIABLE_ARGS_POST_NAMES -#line 2242 "seclang-parser.yy" +#line 2268 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_NoDictElement()); } -#line 4114 "seclang-parser.cc" +#line 4174 "seclang-parser.cc" break; case 256: // var: VARIABLE_REQUEST_HEADERS_NAMES "Dictionary element" -#line 2247 "seclang-parser.yy" +#line 2273 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4122 "seclang-parser.cc" +#line 4182 "seclang-parser.cc" break; case 257: // var: VARIABLE_REQUEST_HEADERS_NAMES "Dictionary element, selected by regexp" -#line 2251 "seclang-parser.yy" +#line 2277 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4130 "seclang-parser.cc" +#line 4190 "seclang-parser.cc" break; case 258: // var: VARIABLE_REQUEST_HEADERS_NAMES -#line 2255 "seclang-parser.yy" +#line 2281 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_NoDictElement()); } -#line 4138 "seclang-parser.cc" +#line 4198 "seclang-parser.cc" break; case 259: // var: VARIABLE_RESPONSE_CONTENT_TYPE -#line 2260 "seclang-parser.yy" +#line 2286 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentType()); } -#line 4146 "seclang-parser.cc" +#line 4206 "seclang-parser.cc" break; case 260: // var: VARIABLE_RESPONSE_HEADERS_NAMES "Dictionary element" -#line 2265 "seclang-parser.yy" +#line 2291 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4154 "seclang-parser.cc" +#line 4214 "seclang-parser.cc" break; case 261: // var: VARIABLE_RESPONSE_HEADERS_NAMES "Dictionary element, selected by regexp" -#line 2269 "seclang-parser.yy" +#line 2295 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4162 "seclang-parser.cc" +#line 4222 "seclang-parser.cc" break; case 262: // var: VARIABLE_RESPONSE_HEADERS_NAMES -#line 2273 "seclang-parser.yy" +#line 2299 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_NoDictElement()); } -#line 4170 "seclang-parser.cc" +#line 4230 "seclang-parser.cc" break; case 263: // var: VARIABLE_ARGS_COMBINED_SIZE -#line 2277 "seclang-parser.yy" +#line 2303 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsCombinedSize()); } -#line 4178 "seclang-parser.cc" +#line 4238 "seclang-parser.cc" break; case 264: // var: "AUTH_TYPE" -#line 2281 "seclang-parser.yy" +#line 2307 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::AuthType()); } -#line 4186 "seclang-parser.cc" +#line 4246 "seclang-parser.cc" break; case 265: // var: "FILES_COMBINED_SIZE" -#line 2285 "seclang-parser.yy" +#line 2311 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesCombinedSize()); } -#line 4194 "seclang-parser.cc" +#line 4254 "seclang-parser.cc" break; case 266: // var: "FULL_REQUEST" -#line 2289 "seclang-parser.yy" +#line 2315 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequest()); } -#line 4202 "seclang-parser.cc" +#line 4262 "seclang-parser.cc" break; case 267: // var: "FULL_REQUEST_LENGTH" -#line 2293 "seclang-parser.yy" +#line 2319 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequestLength()); } -#line 4210 "seclang-parser.cc" +#line 4270 "seclang-parser.cc" break; case 268: // var: "INBOUND_DATA_ERROR" -#line 2297 "seclang-parser.yy" +#line 2323 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::InboundDataError()); } -#line 4218 "seclang-parser.cc" +#line 4278 "seclang-parser.cc" break; case 269: // var: "MATCHED_VAR" -#line 2301 "seclang-parser.yy" +#line 2327 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVar()); } -#line 4226 "seclang-parser.cc" +#line 4286 "seclang-parser.cc" break; case 270: // var: "MATCHED_VAR_NAME" -#line 2305 "seclang-parser.yy" +#line 2331 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarName()); } -#line 4234 "seclang-parser.cc" +#line 4294 "seclang-parser.cc" break; case 271: // var: VARIABLE_MULTIPART_BOUNDARY_QUOTED -#line 2309 "seclang-parser.yy" +#line 2335 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryQuoted()); } -#line 4242 "seclang-parser.cc" +#line 4302 "seclang-parser.cc" break; case 272: // var: VARIABLE_MULTIPART_BOUNDARY_WHITESPACE -#line 2313 "seclang-parser.yy" +#line 2339 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryWhiteSpace()); } -#line 4250 "seclang-parser.cc" +#line 4310 "seclang-parser.cc" break; case 273: // var: "MULTIPART_CRLF_LF_LINES" -#line 2317 "seclang-parser.yy" +#line 2343 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartCrlfLFLines()); } -#line 4258 "seclang-parser.cc" +#line 4318 "seclang-parser.cc" break; case 274: // var: "MULTIPART_DATA_AFTER" -#line 2321 "seclang-parser.yy" +#line 2347 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateAfter()); } -#line 4266 "seclang-parser.cc" +#line 4326 "seclang-parser.cc" break; case 275: // var: VARIABLE_MULTIPART_DATA_BEFORE -#line 2325 "seclang-parser.yy" +#line 2351 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateBefore()); } -#line 4274 "seclang-parser.cc" +#line 4334 "seclang-parser.cc" break; case 276: // var: "MULTIPART_FILE_LIMIT_EXCEEDED" -#line 2329 "seclang-parser.yy" +#line 2355 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartFileLimitExceeded()); } -#line 4282 "seclang-parser.cc" +#line 4342 "seclang-parser.cc" break; case 277: // var: "MULTIPART_HEADER_FOLDING" -#line 2333 "seclang-parser.yy" +#line 2359 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartHeaderFolding()); } -#line 4290 "seclang-parser.cc" +#line 4350 "seclang-parser.cc" break; case 278: // var: "MULTIPART_INVALID_HEADER_FOLDING" -#line 2337 "seclang-parser.yy" +#line 2363 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidHeaderFolding()); } -#line 4298 "seclang-parser.cc" +#line 4358 "seclang-parser.cc" break; case 279: // var: VARIABLE_MULTIPART_INVALID_PART -#line 2341 "seclang-parser.yy" +#line 2367 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidPart()); } -#line 4306 "seclang-parser.cc" +#line 4366 "seclang-parser.cc" break; case 280: // var: "MULTIPART_INVALID_QUOTING" -#line 2345 "seclang-parser.yy" +#line 2371 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidQuoting()); } -#line 4314 "seclang-parser.cc" +#line 4374 "seclang-parser.cc" break; case 281: // var: VARIABLE_MULTIPART_LF_LINE -#line 2349 "seclang-parser.yy" +#line 2375 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartLFLine()); } -#line 4322 "seclang-parser.cc" +#line 4382 "seclang-parser.cc" break; case 282: // var: VARIABLE_MULTIPART_MISSING_SEMICOLON -#line 2353 "seclang-parser.yy" +#line 2379 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4330 "seclang-parser.cc" +#line 4390 "seclang-parser.cc" break; case 283: // var: VARIABLE_MULTIPART_SEMICOLON_MISSING -#line 2357 "seclang-parser.yy" +#line 2383 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4338 "seclang-parser.cc" +#line 4398 "seclang-parser.cc" break; case 284: // var: "MULTIPART_STRICT_ERROR" -#line 2361 "seclang-parser.yy" +#line 2387 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartStrictError()); } -#line 4346 "seclang-parser.cc" +#line 4406 "seclang-parser.cc" break; case 285: // var: "MULTIPART_UNMATCHED_BOUNDARY" -#line 2365 "seclang-parser.yy" +#line 2391 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartUnmatchedBoundary()); } -#line 4354 "seclang-parser.cc" +#line 4414 "seclang-parser.cc" break; case 286: // var: "OUTBOUND_DATA_ERROR" -#line 2369 "seclang-parser.yy" +#line 2395 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::OutboundDataError()); } -#line 4362 "seclang-parser.cc" +#line 4422 "seclang-parser.cc" break; case 287: // var: "PATH_INFO" -#line 2373 "seclang-parser.yy" +#line 2399 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::PathInfo()); } -#line 4370 "seclang-parser.cc" +#line 4430 "seclang-parser.cc" break; case 288: // var: "QUERY_STRING" -#line 2377 "seclang-parser.yy" +#line 2403 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::QueryString()); } -#line 4378 "seclang-parser.cc" +#line 4438 "seclang-parser.cc" break; case 289: // var: "REMOTE_ADDR" -#line 2381 "seclang-parser.yy" +#line 2407 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteAddr()); } -#line 4386 "seclang-parser.cc" +#line 4446 "seclang-parser.cc" break; case 290: // var: "REMOTE_HOST" -#line 2385 "seclang-parser.yy" +#line 2411 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteHost()); } -#line 4394 "seclang-parser.cc" +#line 4454 "seclang-parser.cc" break; case 291: // var: "REMOTE_PORT" -#line 2389 "seclang-parser.yy" +#line 2415 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemotePort()); } -#line 4402 "seclang-parser.cc" +#line 4462 "seclang-parser.cc" break; case 292: // var: "REQBODY_ERROR" -#line 2393 "seclang-parser.yy" +#line 2419 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyError()); } -#line 4410 "seclang-parser.cc" +#line 4470 "seclang-parser.cc" break; case 293: // var: "REQBODY_ERROR_MSG" -#line 2397 "seclang-parser.yy" +#line 2423 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyErrorMsg()); } -#line 4418 "seclang-parser.cc" +#line 4478 "seclang-parser.cc" break; case 294: // var: "REQBODY_PROCESSOR" -#line 2401 "seclang-parser.yy" +#line 2427 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessor()); } -#line 4426 "seclang-parser.cc" +#line 4486 "seclang-parser.cc" break; case 295: // var: "REQBODY_PROCESSOR_ERROR" -#line 2405 "seclang-parser.yy" +#line 2431 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorError()); } -#line 4434 "seclang-parser.cc" +#line 4494 "seclang-parser.cc" break; case 296: // var: "REQBODY_PROCESSOR_ERROR_MSG" -#line 2409 "seclang-parser.yy" +#line 2435 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorErrorMsg()); } -#line 4442 "seclang-parser.cc" +#line 4502 "seclang-parser.cc" break; case 297: // var: "REQUEST_BASENAME" -#line 2413 "seclang-parser.yy" +#line 2439 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBasename()); } -#line 4450 "seclang-parser.cc" +#line 4510 "seclang-parser.cc" break; case 298: // var: "REQUEST_BODY" -#line 2417 "seclang-parser.yy" +#line 2443 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBody()); } -#line 4458 "seclang-parser.cc" +#line 4518 "seclang-parser.cc" break; case 299: // var: "REQUEST_BODY_LENGTH" -#line 2421 "seclang-parser.yy" +#line 2447 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBodyLength()); } -#line 4466 "seclang-parser.cc" +#line 4526 "seclang-parser.cc" break; case 300: // var: "REQUEST_FILENAME" -#line 2425 "seclang-parser.yy" +#line 2451 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestFilename()); } -#line 4474 "seclang-parser.cc" +#line 4534 "seclang-parser.cc" break; case 301: // var: "REQUEST_LINE" -#line 2429 "seclang-parser.yy" +#line 2455 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestLine()); } -#line 4482 "seclang-parser.cc" +#line 4542 "seclang-parser.cc" break; case 302: // var: "REQUEST_METHOD" -#line 2433 "seclang-parser.yy" +#line 2459 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestMethod()); } -#line 4490 "seclang-parser.cc" +#line 4550 "seclang-parser.cc" break; case 303: // var: "REQUEST_PROTOCOL" -#line 2437 "seclang-parser.yy" +#line 2463 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestProtocol()); } -#line 4498 "seclang-parser.cc" +#line 4558 "seclang-parser.cc" break; case 304: // var: "REQUEST_URI" -#line 2441 "seclang-parser.yy" +#line 2467 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURI()); } -#line 4506 "seclang-parser.cc" +#line 4566 "seclang-parser.cc" break; case 305: // var: "REQUEST_URI_RAW" -#line 2445 "seclang-parser.yy" +#line 2471 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURIRaw()); } -#line 4514 "seclang-parser.cc" +#line 4574 "seclang-parser.cc" break; case 306: // var: "RESPONSE_BODY" -#line 2449 "seclang-parser.yy" +#line 2475 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseBody()); } -#line 4522 "seclang-parser.cc" +#line 4582 "seclang-parser.cc" break; case 307: // var: "RESPONSE_CONTENT_LENGTH" -#line 2453 "seclang-parser.yy" +#line 2479 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentLength()); } -#line 4530 "seclang-parser.cc" +#line 4590 "seclang-parser.cc" break; case 308: // var: "RESPONSE_PROTOCOL" -#line 2457 "seclang-parser.yy" +#line 2483 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseProtocol()); } -#line 4538 "seclang-parser.cc" +#line 4598 "seclang-parser.cc" break; case 309: // var: "RESPONSE_STATUS" -#line 2461 "seclang-parser.yy" +#line 2487 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseStatus()); } -#line 4546 "seclang-parser.cc" +#line 4606 "seclang-parser.cc" break; case 310: // var: "SERVER_ADDR" -#line 2465 "seclang-parser.yy" +#line 2491 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerAddr()); } -#line 4554 "seclang-parser.cc" +#line 4614 "seclang-parser.cc" break; case 311: // var: "SERVER_NAME" -#line 2469 "seclang-parser.yy" +#line 2495 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerName()); } -#line 4562 "seclang-parser.cc" +#line 4622 "seclang-parser.cc" break; case 312: // var: "SERVER_PORT" -#line 2473 "seclang-parser.yy" +#line 2499 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerPort()); } -#line 4570 "seclang-parser.cc" +#line 4630 "seclang-parser.cc" break; case 313: // var: "SESSIONID" -#line 2477 "seclang-parser.yy" +#line 2503 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::SessionID()); } -#line 4578 "seclang-parser.cc" +#line 4638 "seclang-parser.cc" break; case 314: // var: "UNIQUE_ID" -#line 2481 "seclang-parser.yy" +#line 2507 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UniqueID()); } -#line 4586 "seclang-parser.cc" +#line 4646 "seclang-parser.cc" break; case 315: // var: "URLENCODED_ERROR" -#line 2485 "seclang-parser.yy" +#line 2511 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UrlEncodedError()); } -#line 4594 "seclang-parser.cc" +#line 4654 "seclang-parser.cc" break; case 316: // var: "USERID" -#line 2489 "seclang-parser.yy" +#line 2515 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UserID()); } -#line 4602 "seclang-parser.cc" +#line 4662 "seclang-parser.cc" break; case 317: // var: "VARIABLE_STATUS" -#line 2493 "seclang-parser.yy" +#line 2519 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4610 "seclang-parser.cc" +#line 4670 "seclang-parser.cc" break; case 318: // var: "VARIABLE_STATUS_LINE" -#line 2497 "seclang-parser.yy" +#line 2523 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4618 "seclang-parser.cc" +#line 4678 "seclang-parser.cc" break; case 319: // var: "WEBAPPID" -#line 2501 "seclang-parser.yy" +#line 2527 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::WebAppId()); } -#line 4626 "seclang-parser.cc" +#line 4686 "seclang-parser.cc" break; case 320: // var: "RUN_TIME_VAR_DUR" -#line 2505 "seclang-parser.yy" +#line 2531 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new Duration(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4637 "seclang-parser.cc" +#line 4697 "seclang-parser.cc" break; case 321: // var: "RUN_TIME_VAR_BLD" -#line 2513 "seclang-parser.yy" +#line 2539 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new ModsecBuild(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4648 "seclang-parser.cc" +#line 4708 "seclang-parser.cc" break; case 322: // var: "RUN_TIME_VAR_HSV" -#line 2520 "seclang-parser.yy" +#line 2546 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new HighestSeverity(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4659 "seclang-parser.cc" +#line 4719 "seclang-parser.cc" break; case 323: // var: "RUN_TIME_VAR_REMOTE_USER" -#line 2527 "seclang-parser.yy" +#line 2553 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new RemoteUser(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4670 "seclang-parser.cc" +#line 4730 "seclang-parser.cc" break; case 324: // var: "RUN_TIME_VAR_TIME" -#line 2534 "seclang-parser.yy" +#line 2560 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new Time(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4681 "seclang-parser.cc" +#line 4741 "seclang-parser.cc" break; case 325: // var: "RUN_TIME_VAR_TIME_DAY" -#line 2541 "seclang-parser.yy" +#line 2567 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeDay(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4692 "seclang-parser.cc" +#line 4752 "seclang-parser.cc" break; case 326: // var: "RUN_TIME_VAR_TIME_EPOCH" -#line 2548 "seclang-parser.yy" +#line 2574 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeEpoch(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4703 "seclang-parser.cc" +#line 4763 "seclang-parser.cc" break; case 327: // var: "RUN_TIME_VAR_TIME_HOUR" -#line 2555 "seclang-parser.yy" +#line 2581 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeHour(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4714 "seclang-parser.cc" +#line 4774 "seclang-parser.cc" break; case 328: // var: "RUN_TIME_VAR_TIME_MIN" -#line 2562 "seclang-parser.yy" +#line 2588 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeMin(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4725 "seclang-parser.cc" +#line 4785 "seclang-parser.cc" break; case 329: // var: "RUN_TIME_VAR_TIME_MON" -#line 2569 "seclang-parser.yy" +#line 2595 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeMon(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4736 "seclang-parser.cc" +#line 4796 "seclang-parser.cc" break; case 330: // var: "RUN_TIME_VAR_TIME_SEC" -#line 2576 "seclang-parser.yy" +#line 2602 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeSec(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4747 "seclang-parser.cc" +#line 4807 "seclang-parser.cc" break; case 331: // var: "RUN_TIME_VAR_TIME_WDAY" -#line 2583 "seclang-parser.yy" +#line 2609 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeWDay(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4758 "seclang-parser.cc" +#line 4818 "seclang-parser.cc" break; case 332: // var: "RUN_TIME_VAR_TIME_YEAR" -#line 2590 "seclang-parser.yy" +#line 2616 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeYear(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4769 "seclang-parser.cc" +#line 4829 "seclang-parser.cc" break; case 333: // act: "Accuracy" -#line 2600 "seclang-parser.yy" +#line 2626 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Accuracy(yystack_[0].value.as < std::string > ())); } -#line 4777 "seclang-parser.cc" +#line 4837 "seclang-parser.cc" break; case 334: // act: "Allow" -#line 2604 "seclang-parser.yy" +#line 2630 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Allow(yystack_[0].value.as < std::string > ())); } -#line 4785 "seclang-parser.cc" +#line 4845 "seclang-parser.cc" break; case 335: // act: "Append" -#line 2608 "seclang-parser.yy" +#line 2634 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("Append", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("Append", yystack_[1].location); } -#line 4793 "seclang-parser.cc" +#line 4853 "seclang-parser.cc" break; case 336: // act: "AuditLog" -#line 2612 "seclang-parser.yy" +#line 2638 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::AuditLog()); } -#line 4801 "seclang-parser.cc" +#line 4861 "seclang-parser.cc" break; case 337: // act: "Block" -#line 2616 "seclang-parser.yy" +#line 2642 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Block()); } -#line 4809 "seclang-parser.cc" +#line 4869 "seclang-parser.cc" break; case 338: // act: "Capture" -#line 2620 "seclang-parser.yy" +#line 2646 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Capture()); } -#line 4817 "seclang-parser.cc" +#line 4877 "seclang-parser.cc" break; case 339: // act: "Chain" -#line 2624 "seclang-parser.yy" +#line 2650 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Chain()); } -#line 4825 "seclang-parser.cc" +#line 4885 "seclang-parser.cc" break; case 340: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_ON" -#line 2628 "seclang-parser.yy" +#line 2654 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("CtlAuditEngine", yystack_[2].location); - //ACTION_CONTAINER($$, new actions::Action($1)); - } -#line 4834 "seclang-parser.cc" - break; - - case 341: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_OFF" -#line 2633 "seclang-parser.yy" - { - ACTION_NOT_SUPPORTED("CtlAuditEngine", yystack_[2].location); - //ACTION_CONTAINER($$, new actions::Action($1)); - } -#line 4843 "seclang-parser.cc" - break; - - case 342: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_RELEVANT_ONLY" -#line 2638 "seclang-parser.yy" - { - ACTION_NOT_SUPPORTED("CtlAuditEngine", yystack_[2].location); - //ACTION_CONTAINER($$, new actions::Action($1)); - } -#line 4852 "seclang-parser.cc" - break; - - case 343: // act: "ACTION_CTL_AUDIT_LOG_PARTS" -#line 2643 "seclang-parser.yy" - { - ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditLogParts(yystack_[0].value.as < std::string > ())); - } -#line 4860 "seclang-parser.cc" - break; - - case 344: // act: "ACTION_CTL_BDY_JSON" -#line 2647 "seclang-parser.yy" - { - ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorJSON(yystack_[0].value.as < std::string > ())); - } -#line 4868 "seclang-parser.cc" - break; - - case 345: // act: "ACTION_CTL_BDY_XML" -#line 2651 "seclang-parser.yy" - { - ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorXML(yystack_[0].value.as < std::string > ())); - } -#line 4876 "seclang-parser.cc" - break; - - case 346: // act: "ACTION_CTL_BDY_URLENCODED" -#line 2655 "seclang-parser.yy" - { - ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorURLENCODED(yystack_[0].value.as < std::string > ())); - } -#line 4884 "seclang-parser.cc" - break; - - case 347: // act: "ACTION_CTL_FORCE_REQ_BODY_VAR" "CONFIG_VALUE_ON" -#line 2659 "seclang-parser.yy" - { - ACTION_NOT_SUPPORTED("CtlForceRequestBodyVariable", yystack_[2].location); - //ACTION_CONTAINER($$, new actions::Action($1)); + ACTION_NOT_SUPPORTED_OLD("ctl:auditEngine", yystack_[2].location); } #line 4893 "seclang-parser.cc" break; - case 348: // act: "ACTION_CTL_FORCE_REQ_BODY_VAR" "CONFIG_VALUE_OFF" -#line 2664 "seclang-parser.yy" + case 341: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_OFF" +#line 2658 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("CtlForceRequestBodyVariable", yystack_[2].location); - //ACTION_CONTAINER($$, new actions::Action($1)); + ACTION_NOT_SUPPORTED_OLD("ctl:auditEngine", yystack_[2].location); } -#line 4902 "seclang-parser.cc" +#line 4901 "seclang-parser.cc" + break; + + case 342: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_RELEVANT_ONLY" +#line 2662 "seclang-parser.yy" + { + ACTION_NOT_SUPPORTED_OLD("ctl:auditEngine", yystack_[2].location); + } +#line 4909 "seclang-parser.cc" + break; + + case 343: // act: "ACTION_CTL_AUDIT_LOG_PARTS" +#line 2666 "seclang-parser.yy" + { + ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditLogParts(yystack_[0].value.as < std::string > ())); + } +#line 4917 "seclang-parser.cc" + break; + + case 344: // act: "ACTION_CTL_BDY_JSON" +#line 2670 "seclang-parser.yy" + { + ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorJSON(yystack_[0].value.as < std::string > ())); + } +#line 4925 "seclang-parser.cc" + break; + + case 345: // act: "ACTION_CTL_BDY_XML" +#line 2674 "seclang-parser.yy" + { + ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorXML(yystack_[0].value.as < std::string > ())); + } +#line 4933 "seclang-parser.cc" + break; + + case 346: // act: "ACTION_CTL_BDY_URLENCODED" +#line 2678 "seclang-parser.yy" + { + ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorURLENCODED(yystack_[0].value.as < std::string > ())); + } +#line 4941 "seclang-parser.cc" + break; + + case 347: // act: "ACTION_CTL_FORCE_REQ_BODY_VAR" "CONFIG_VALUE_ON" +#line 2682 "seclang-parser.yy" + { + ACTION_NOT_SUPPORTED(yylhs.value.as < std::unique_ptr > (), "ctl:forceRequestBodyVariable", yystack_[2].location); + } +#line 4949 "seclang-parser.cc" + break; + + case 348: // act: "ACTION_CTL_FORCE_REQ_BODY_VAR" "CONFIG_VALUE_OFF" +#line 2686 "seclang-parser.yy" + { + ACTION_NOT_SUPPORTED(yylhs.value.as < std::unique_ptr > (), "ctl:forceRequestBodyVariable", yystack_[2].location); + } +#line 4957 "seclang-parser.cc" break; case 349: // act: "ACTION_CTL_REQUEST_BODY_ACCESS" "CONFIG_VALUE_ON" -#line 2669 "seclang-parser.yy" +#line 2690 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "true")); } -#line 4910 "seclang-parser.cc" +#line 4965 "seclang-parser.cc" break; case 350: // act: "ACTION_CTL_REQUEST_BODY_ACCESS" "CONFIG_VALUE_OFF" -#line 2673 "seclang-parser.yy" +#line 2694 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "false")); } -#line 4918 "seclang-parser.cc" +#line 4973 "seclang-parser.cc" break; case 351: // act: "ACTION_CTL_RULE_ENGINE" "CONFIG_VALUE_ON" -#line 2677 "seclang-parser.yy" +#line 2698 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=on")); } -#line 4926 "seclang-parser.cc" +#line 4981 "seclang-parser.cc" break; case 352: // act: "ACTION_CTL_RULE_ENGINE" "CONFIG_VALUE_OFF" -#line 2681 "seclang-parser.yy" +#line 2702 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=off")); } -#line 4934 "seclang-parser.cc" +#line 4989 "seclang-parser.cc" break; case 353: // act: "ACTION_CTL_RULE_ENGINE" "CONFIG_VALUE_DETC" -#line 2685 "seclang-parser.yy" +#line 2706 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=detectiononly")); } -#line 4942 "seclang-parser.cc" +#line 4997 "seclang-parser.cc" break; case 354: // act: "ACTION_CTL_RULE_REMOVE_BY_ID" -#line 2689 "seclang-parser.yy" +#line 2710 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveById(yystack_[0].value.as < std::string > ())); } -#line 4950 "seclang-parser.cc" +#line 5005 "seclang-parser.cc" break; case 355: // act: "ACTION_CTL_RULE_REMOVE_BY_TAG" -#line 2693 "seclang-parser.yy" +#line 2714 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveByTag(yystack_[0].value.as < std::string > ())); } -#line 4958 "seclang-parser.cc" +#line 5013 "seclang-parser.cc" break; case 356: // act: "ACTION_CTL_RULE_REMOVE_TARGET_BY_ID" -#line 2697 "seclang-parser.yy" +#line 2718 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetById(yystack_[0].value.as < std::string > ())); } -#line 4966 "seclang-parser.cc" +#line 5021 "seclang-parser.cc" break; case 357: // act: "ACTION_CTL_RULE_REMOVE_TARGET_BY_TAG" -#line 2701 "seclang-parser.yy" +#line 2722 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetByTag(yystack_[0].value.as < std::string > ())); } -#line 4974 "seclang-parser.cc" +#line 5029 "seclang-parser.cc" break; case 358: // act: "Deny" -#line 2705 "seclang-parser.yy" +#line 2726 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Deny()); } -#line 4982 "seclang-parser.cc" +#line 5037 "seclang-parser.cc" break; case 359: // act: "DeprecateVar" -#line 2709 "seclang-parser.yy" +#line 2730 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("DeprecateVar", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("DeprecateVar", yystack_[1].location); } -#line 4990 "seclang-parser.cc" +#line 5045 "seclang-parser.cc" break; case 360: // act: "Drop" -#line 2713 "seclang-parser.yy" +#line 2734 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Drop()); } -#line 4998 "seclang-parser.cc" +#line 5053 "seclang-parser.cc" break; case 361: // act: "Exec" -#line 2717 "seclang-parser.yy" +#line 2738 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Exec(yystack_[0].value.as < std::string > ())); } -#line 5006 "seclang-parser.cc" +#line 5061 "seclang-parser.cc" break; case 362: // act: "ExpireVar" -#line 2721 "seclang-parser.yy" +#line 2742 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ExpireVar(yystack_[0].value.as < std::string > ())); } -#line 5014 "seclang-parser.cc" +#line 5069 "seclang-parser.cc" break; case 363: // act: "Id" -#line 2725 "seclang-parser.yy" +#line 2746 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::RuleId(yystack_[0].value.as < std::string > ())); } -#line 5022 "seclang-parser.cc" +#line 5077 "seclang-parser.cc" break; case 364: // act: "InitCol" run_time_string -#line 2729 "seclang-parser.yy" +#line 2750 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::InitCol(yystack_[1].value.as < std::string > (), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5030 "seclang-parser.cc" +#line 5085 "seclang-parser.cc" break; case 365: // act: "LogData" run_time_string -#line 2733 "seclang-parser.yy" +#line 2754 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::LogData(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5038 "seclang-parser.cc" +#line 5093 "seclang-parser.cc" break; case 366: // act: "Log" -#line 2737 "seclang-parser.yy" +#line 2758 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Log()); } -#line 5046 "seclang-parser.cc" +#line 5101 "seclang-parser.cc" break; case 367: // act: "Maturity" -#line 2741 "seclang-parser.yy" +#line 2762 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Maturity(yystack_[0].value.as < std::string > ())); } -#line 5054 "seclang-parser.cc" +#line 5109 "seclang-parser.cc" break; case 368: // act: "Msg" run_time_string -#line 2745 "seclang-parser.yy" +#line 2766 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Msg(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5062 "seclang-parser.cc" +#line 5117 "seclang-parser.cc" break; case 369: // act: "MultiMatch" -#line 2749 "seclang-parser.yy" +#line 2770 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::MultiMatch()); } -#line 5070 "seclang-parser.cc" +#line 5125 "seclang-parser.cc" break; case 370: // act: "NoAuditLog" -#line 2753 "seclang-parser.yy" +#line 2774 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoAuditLog()); } -#line 5078 "seclang-parser.cc" +#line 5133 "seclang-parser.cc" break; case 371: // act: "NoLog" -#line 2757 "seclang-parser.yy" +#line 2778 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoLog()); } -#line 5086 "seclang-parser.cc" +#line 5141 "seclang-parser.cc" break; case 372: // act: "Pass" -#line 2761 "seclang-parser.yy" +#line 2782 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Pass()); } -#line 5094 "seclang-parser.cc" +#line 5149 "seclang-parser.cc" break; case 373: // act: "Pause" -#line 2765 "seclang-parser.yy" +#line 2786 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("Pause", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("Pause", yystack_[1].location); } -#line 5102 "seclang-parser.cc" +#line 5157 "seclang-parser.cc" break; case 374: // act: "Phase" -#line 2769 "seclang-parser.yy" +#line 2790 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Phase(yystack_[0].value.as < std::string > ())); } -#line 5110 "seclang-parser.cc" +#line 5165 "seclang-parser.cc" break; case 375: // act: "Prepend" -#line 2773 "seclang-parser.yy" +#line 2794 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("Prepend", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("Prepend", yystack_[1].location); } -#line 5118 "seclang-parser.cc" +#line 5173 "seclang-parser.cc" break; case 376: // act: "Proxy" -#line 2777 "seclang-parser.yy" +#line 2798 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("Proxy", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("Proxy", yystack_[1].location); } -#line 5126 "seclang-parser.cc" +#line 5181 "seclang-parser.cc" break; case 377: // act: "Redirect" run_time_string -#line 2781 "seclang-parser.yy" +#line 2802 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Redirect(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5134 "seclang-parser.cc" +#line 5189 "seclang-parser.cc" break; case 378: // act: "Rev" -#line 2785 "seclang-parser.yy" +#line 2806 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Rev(yystack_[0].value.as < std::string > ())); } -#line 5142 "seclang-parser.cc" +#line 5197 "seclang-parser.cc" break; case 379: // act: "SanitiseArg" -#line 2789 "seclang-parser.yy" +#line 2810 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("SanitiseArg", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("SanitiseArg", yystack_[1].location); } -#line 5150 "seclang-parser.cc" +#line 5205 "seclang-parser.cc" break; case 380: // act: "SanitiseMatched" -#line 2793 "seclang-parser.yy" +#line 2814 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("SanitiseMatched", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("SanitiseMatched", yystack_[1].location); } -#line 5158 "seclang-parser.cc" +#line 5213 "seclang-parser.cc" break; case 381: // act: "SanitiseMatchedBytes" -#line 2797 "seclang-parser.yy" +#line 2818 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("SanitiseMatchedBytes", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("SanitiseMatchedBytes", yystack_[1].location); } -#line 5166 "seclang-parser.cc" +#line 5221 "seclang-parser.cc" break; case 382: // act: "SanitiseRequestHeader" -#line 2801 "seclang-parser.yy" +#line 2822 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("SanitiseRequestHeader", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("SanitiseRequestHeader", yystack_[1].location); } -#line 5174 "seclang-parser.cc" +#line 5229 "seclang-parser.cc" break; case 383: // act: "SanitiseResponseHeader" -#line 2805 "seclang-parser.yy" +#line 2826 "seclang-parser.yy" { - ACTION_NOT_SUPPORTED("SanitiseResponseHeader", yystack_[1].location); + ACTION_NOT_SUPPORTED_OLD("SanitiseResponseHeader", yystack_[1].location); } -#line 5182 "seclang-parser.cc" +#line 5237 "seclang-parser.cc" break; case 384: // act: "SetEnv" run_time_string -#line 2809 "seclang-parser.yy" +#line 2830 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetENV(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5190 "seclang-parser.cc" +#line 5245 "seclang-parser.cc" break; case 385: // act: "SetRsc" run_time_string -#line 2813 "seclang-parser.yy" +#line 2834 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetRSC(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5198 "seclang-parser.cc" +#line 5253 "seclang-parser.cc" break; case 386: // act: "SetSid" run_time_string -#line 2817 "seclang-parser.yy" +#line 2838 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetSID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5206 "seclang-parser.cc" +#line 5261 "seclang-parser.cc" break; case 387: // act: "SetUID" run_time_string -#line 2821 "seclang-parser.yy" +#line 2842 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetUID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5214 "seclang-parser.cc" +#line 5269 "seclang-parser.cc" break; case 388: // act: "SetVar" setvar_action -#line 2825 "seclang-parser.yy" +#line 2846 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > () = std::move(yystack_[0].value.as < std::unique_ptr > ()); } -#line 5222 "seclang-parser.cc" +#line 5277 "seclang-parser.cc" break; case 389: // act: "Severity" -#line 2829 "seclang-parser.yy" +#line 2850 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Severity(yystack_[0].value.as < std::string > ())); } -#line 5230 "seclang-parser.cc" +#line 5285 "seclang-parser.cc" break; case 390: // act: "Skip" -#line 2833 "seclang-parser.yy" +#line 2854 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Skip(yystack_[0].value.as < std::string > ())); } -#line 5238 "seclang-parser.cc" +#line 5293 "seclang-parser.cc" break; case 391: // act: "SkipAfter" -#line 2837 "seclang-parser.yy" +#line 2858 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SkipAfter(yystack_[0].value.as < std::string > ())); } -#line 5246 "seclang-parser.cc" +#line 5301 "seclang-parser.cc" break; case 392: // act: "Status" -#line 2841 "seclang-parser.yy" +#line 2862 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::data::Status(yystack_[0].value.as < std::string > ())); } -#line 5254 "seclang-parser.cc" +#line 5309 "seclang-parser.cc" break; case 393: // act: "Tag" run_time_string -#line 2845 "seclang-parser.yy" +#line 2866 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Tag(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5262 "seclang-parser.cc" +#line 5317 "seclang-parser.cc" break; case 394: // act: "Ver" -#line 2849 "seclang-parser.yy" +#line 2870 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Ver(yystack_[0].value.as < std::string > ())); } -#line 5270 "seclang-parser.cc" +#line 5325 "seclang-parser.cc" break; case 395: // act: "xmlns" -#line 2853 "seclang-parser.yy" +#line 2874 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::XmlNS(yystack_[0].value.as < std::string > ())); } -#line 5278 "seclang-parser.cc" +#line 5333 "seclang-parser.cc" break; case 396: // act: "ACTION_TRANSFORMATION_PARITY_ZERO_7_BIT" -#line 2857 "seclang-parser.yy" +#line 2878 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityZero7bit()); } -#line 5286 "seclang-parser.cc" +#line 5341 "seclang-parser.cc" break; case 397: // act: "ACTION_TRANSFORMATION_PARITY_ODD_7_BIT" -#line 2861 "seclang-parser.yy" +#line 2882 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityOdd7bit()); } -#line 5294 "seclang-parser.cc" +#line 5349 "seclang-parser.cc" break; case 398: // act: "ACTION_TRANSFORMATION_PARITY_EVEN_7_BIT" -#line 2865 "seclang-parser.yy" +#line 2886 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityEven7bit()); } -#line 5302 "seclang-parser.cc" +#line 5357 "seclang-parser.cc" break; case 399: // act: "ACTION_TRANSFORMATION_SQL_HEX_DECODE" -#line 2869 "seclang-parser.yy" +#line 2890 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::SqlHexDecode()); } -#line 5310 "seclang-parser.cc" +#line 5365 "seclang-parser.cc" break; case 400: // act: "ACTION_TRANSFORMATION_BASE_64_ENCODE" -#line 2873 "seclang-parser.yy" +#line 2894 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Encode()); } -#line 5318 "seclang-parser.cc" +#line 5373 "seclang-parser.cc" break; case 401: // act: "ACTION_TRANSFORMATION_BASE_64_DECODE" -#line 2877 "seclang-parser.yy" +#line 2898 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Decode()); } -#line 5326 "seclang-parser.cc" +#line 5381 "seclang-parser.cc" break; case 402: // act: "ACTION_TRANSFORMATION_BASE_64_DECODE_EXT" -#line 2881 "seclang-parser.yy" +#line 2902 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64DecodeExt()); } -#line 5334 "seclang-parser.cc" +#line 5389 "seclang-parser.cc" break; case 403: // act: "ACTION_TRANSFORMATION_CMD_LINE" -#line 2885 "seclang-parser.yy" +#line 2906 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CmdLine()); } -#line 5342 "seclang-parser.cc" +#line 5397 "seclang-parser.cc" break; case 404: // act: "ACTION_TRANSFORMATION_SHA1" -#line 2889 "seclang-parser.yy" +#line 2910 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Sha1()); } -#line 5350 "seclang-parser.cc" +#line 5405 "seclang-parser.cc" break; case 405: // act: "ACTION_TRANSFORMATION_MD5" -#line 2893 "seclang-parser.yy" +#line 2914 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Md5()); } -#line 5358 "seclang-parser.cc" +#line 5413 "seclang-parser.cc" break; case 406: // act: "ACTION_TRANSFORMATION_ESCAPE_SEQ_DECODE" -#line 2897 "seclang-parser.yy" +#line 2918 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::EscapeSeqDecode()); } -#line 5366 "seclang-parser.cc" +#line 5421 "seclang-parser.cc" break; case 407: // act: "ACTION_TRANSFORMATION_HEX_ENCODE" -#line 2901 "seclang-parser.yy" +#line 2922 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexEncode()); } -#line 5374 "seclang-parser.cc" +#line 5429 "seclang-parser.cc" break; case 408: // act: "ACTION_TRANSFORMATION_HEX_DECODE" -#line 2905 "seclang-parser.yy" +#line 2926 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexDecode()); } -#line 5382 "seclang-parser.cc" +#line 5437 "seclang-parser.cc" break; case 409: // act: "ACTION_TRANSFORMATION_LOWERCASE" -#line 2909 "seclang-parser.yy" +#line 2930 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::LowerCase()); } -#line 5390 "seclang-parser.cc" +#line 5445 "seclang-parser.cc" break; case 410: // act: "ACTION_TRANSFORMATION_PHP_ARGS_NAMES" -#line 2913 "seclang-parser.yy" +#line 2934 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::PhpArgsNames()); } -#line 5398 "seclang-parser.cc" +#line 5453 "seclang-parser.cc" break; case 411: // act: "ACTION_TRANSFORMATION_UPPERCASE" -#line 2917 "seclang-parser.yy" +#line 2938 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UpperCase()); } -#line 5406 "seclang-parser.cc" +#line 5461 "seclang-parser.cc" break; case 412: // act: "ACTION_TRANSFORMATION_URL_DECODE_UNI" -#line 2921 "seclang-parser.yy" +#line 2942 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecodeUni()); } -#line 5414 "seclang-parser.cc" +#line 5469 "seclang-parser.cc" break; case 413: // act: "ACTION_TRANSFORMATION_URL_DECODE" -#line 2925 "seclang-parser.yy" +#line 2946 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecode()); } -#line 5422 "seclang-parser.cc" +#line 5477 "seclang-parser.cc" break; case 414: // act: "ACTION_TRANSFORMATION_URL_ENCODE" -#line 2929 "seclang-parser.yy" +#line 2950 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlEncode()); } -#line 5430 "seclang-parser.cc" +#line 5485 "seclang-parser.cc" break; case 415: // act: "ACTION_TRANSFORMATION_NONE" -#line 2933 "seclang-parser.yy" +#line 2954 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::None()); } -#line 5438 "seclang-parser.cc" +#line 5493 "seclang-parser.cc" break; case 416: // act: "ACTION_TRANSFORMATION_COMPRESS_WHITESPACE" -#line 2937 "seclang-parser.yy" +#line 2958 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CompressWhitespace()); } -#line 5446 "seclang-parser.cc" +#line 5501 "seclang-parser.cc" break; case 417: // act: "ACTION_TRANSFORMATION_REMOVE_WHITESPACE" -#line 2941 "seclang-parser.yy" +#line 2962 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveWhitespace()); } -#line 5454 "seclang-parser.cc" +#line 5509 "seclang-parser.cc" break; case 418: // act: "ACTION_TRANSFORMATION_REPLACE_NULLS" -#line 2945 "seclang-parser.yy" +#line 2966 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceNulls()); } -#line 5462 "seclang-parser.cc" +#line 5517 "seclang-parser.cc" break; case 419: // act: "ACTION_TRANSFORMATION_REMOVE_NULLS" -#line 2949 "seclang-parser.yy" +#line 2970 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveNulls()); } -#line 5470 "seclang-parser.cc" +#line 5525 "seclang-parser.cc" break; case 420: // act: "ACTION_TRANSFORMATION_HTML_ENTITY_DECODE" -#line 2953 "seclang-parser.yy" +#line 2974 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HtmlEntityDecode()); } -#line 5478 "seclang-parser.cc" +#line 5533 "seclang-parser.cc" break; case 421: // act: "ACTION_TRANSFORMATION_JS_DECODE" -#line 2957 "seclang-parser.yy" +#line 2978 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::JsDecode()); } -#line 5486 "seclang-parser.cc" +#line 5541 "seclang-parser.cc" break; case 422: // act: "ACTION_TRANSFORMATION_CSS_DECODE" -#line 2961 "seclang-parser.yy" +#line 2982 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CssDecode()); } -#line 5494 "seclang-parser.cc" +#line 5549 "seclang-parser.cc" break; case 423: // act: "ACTION_TRANSFORMATION_TRIM" -#line 2965 "seclang-parser.yy" +#line 2986 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Trim()); } -#line 5502 "seclang-parser.cc" +#line 5557 "seclang-parser.cc" break; case 424: // act: "ACTION_TRANSFORMATION_TRIM_LEFT" -#line 2969 "seclang-parser.yy" +#line 2990 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimLeft()); } -#line 5510 "seclang-parser.cc" +#line 5565 "seclang-parser.cc" break; case 425: // act: "ACTION_TRANSFORMATION_TRIM_RIGHT" -#line 2973 "seclang-parser.yy" +#line 2994 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimRight()); } -#line 5518 "seclang-parser.cc" +#line 5573 "seclang-parser.cc" break; case 426: // act: "ACTION_TRANSFORMATION_NORMALISE_PATH_WIN" -#line 2977 "seclang-parser.yy" +#line 2998 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePathWin()); } -#line 5526 "seclang-parser.cc" +#line 5581 "seclang-parser.cc" break; case 427: // act: "ACTION_TRANSFORMATION_NORMALISE_PATH" -#line 2981 "seclang-parser.yy" +#line 3002 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePath()); } -#line 5534 "seclang-parser.cc" +#line 5589 "seclang-parser.cc" break; case 428: // act: "ACTION_TRANSFORMATION_LENGTH" -#line 2985 "seclang-parser.yy" +#line 3006 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Length()); } -#line 5542 "seclang-parser.cc" +#line 5597 "seclang-parser.cc" break; case 429: // act: "ACTION_TRANSFORMATION_UTF8_TO_UNICODE" -#line 2989 "seclang-parser.yy" +#line 3010 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Utf8ToUnicode()); } -#line 5550 "seclang-parser.cc" +#line 5605 "seclang-parser.cc" break; case 430: // act: "ACTION_TRANSFORMATION_REMOVE_COMMENTS_CHAR" -#line 2993 "seclang-parser.yy" +#line 3014 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveCommentsChar()); } -#line 5558 "seclang-parser.cc" +#line 5613 "seclang-parser.cc" break; case 431: // act: "ACTION_TRANSFORMATION_REMOVE_COMMENTS" -#line 2997 "seclang-parser.yy" +#line 3018 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveComments()); } -#line 5566 "seclang-parser.cc" +#line 5621 "seclang-parser.cc" break; case 432: // act: "ACTION_TRANSFORMATION_REPLACE_COMMENTS" -#line 3001 "seclang-parser.yy" +#line 3022 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceComments()); } -#line 5574 "seclang-parser.cc" +#line 5629 "seclang-parser.cc" break; case 433: // setvar_action: "NOT" var -#line 3008 "seclang-parser.yy" +#line 3029 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::unsetOperation, std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5582 "seclang-parser.cc" +#line 5637 "seclang-parser.cc" break; case 434: // setvar_action: var -#line 3012 "seclang-parser.yy" +#line 3033 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::setToOneOperation, std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5590 "seclang-parser.cc" +#line 5645 "seclang-parser.cc" break; case 435: // setvar_action: var SETVAR_OPERATION_EQUALS run_time_string -#line 3016 "seclang-parser.yy" +#line 3037 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::setOperation, std::move(yystack_[2].value.as < std::unique_ptr > ()), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5598 "seclang-parser.cc" +#line 5653 "seclang-parser.cc" break; case 436: // setvar_action: var SETVAR_OPERATION_EQUALS_PLUS run_time_string -#line 3020 "seclang-parser.yy" +#line 3041 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::sumAndSetOperation, std::move(yystack_[2].value.as < std::unique_ptr > ()), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5606 "seclang-parser.cc" +#line 5661 "seclang-parser.cc" break; case 437: // setvar_action: var SETVAR_OPERATION_EQUALS_MINUS run_time_string -#line 3024 "seclang-parser.yy" +#line 3045 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::substractAndSetOperation, std::move(yystack_[2].value.as < std::unique_ptr > ()), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5614 "seclang-parser.cc" +#line 5669 "seclang-parser.cc" break; case 438: // run_time_string: run_time_string "FREE_TEXT_QUOTE_MACRO_EXPANSION" -#line 3031 "seclang-parser.yy" +#line 3052 "seclang-parser.yy" { yystack_[1].value.as < std::unique_ptr > ()->append(yystack_[0].value.as < std::string > ()); yylhs.value.as < std::unique_ptr > () = std::move(yystack_[1].value.as < std::unique_ptr > ()); } -#line 5623 "seclang-parser.cc" +#line 5678 "seclang-parser.cc" break; case 439: // run_time_string: run_time_string var -#line 3036 "seclang-parser.yy" +#line 3057 "seclang-parser.yy" { yystack_[1].value.as < std::unique_ptr > ()->append(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > () = std::move(yystack_[1].value.as < std::unique_ptr > ()); } -#line 5632 "seclang-parser.cc" +#line 5687 "seclang-parser.cc" break; case 440: // run_time_string: "FREE_TEXT_QUOTE_MACRO_EXPANSION" -#line 3041 "seclang-parser.yy" +#line 3062 "seclang-parser.yy" { std::unique_ptr r(new RunTimeString()); r->append(yystack_[0].value.as < std::string > ()); yylhs.value.as < std::unique_ptr > () = std::move(r); } -#line 5642 "seclang-parser.cc" +#line 5697 "seclang-parser.cc" break; case 441: // run_time_string: var -#line 3047 "seclang-parser.yy" +#line 3068 "seclang-parser.yy" { std::unique_ptr r(new RunTimeString()); r->append(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > () = std::move(r); } -#line 5652 "seclang-parser.cc" +#line 5707 "seclang-parser.cc" break; -#line 5656 "seclang-parser.cc" +#line 5711 "seclang-parser.cc" default: break; @@ -7148,51 +7203,51 @@ namespace yy { const short seclang_parser::yyrline_[] = { - 0, 715, 715, 719, 720, 723, 728, 734, 740, 744, - 748, 754, 760, 766, 772, 777, 782, 788, 795, 799, - 803, 809, 813, 817, 822, 827, 832, 837, 841, 848, - 852, 859, 865, 875, 884, 894, 903, 916, 920, 924, - 928, 932, 936, 940, 944, 948, 952, 957, 961, 965, - 969, 973, 977, 982, 987, 991, 995, 999, 1003, 1007, - 1011, 1015, 1019, 1023, 1027, 1031, 1035, 1039, 1043, 1047, - 1051, 1055, 1059, 1063, 1077, 1078, 1110, 1129, 1150, 1180, - 1233, 1240, 1244, 1248, 1252, 1256, 1260, 1264, 1268, 1277, - 1281, 1286, 1289, 1294, 1299, 1304, 1309, 1312, 1317, 1320, - 1325, 1330, 1333, 1338, 1343, 1348, 1353, 1358, 1363, 1368, - 1371, 1376, 1381, 1386, 1391, 1394, 1399, 1404, 1409, 1422, - 1435, 1448, 1461, 1474, 1500, 1528, 1540, 1560, 1587, 1593, - 1598, 1603, 1612, 1617, 1621, 1625, 1629, 1633, 1637, 1641, - 1646, 1651, 1663, 1669, 1673, 1677, 1688, 1697, 1698, 1705, - 1710, 1715, 1769, 1776, 1784, 1821, 1825, 1832, 1837, 1843, - 1849, 1855, 1862, 1872, 1876, 1880, 1884, 1888, 1892, 1896, - 1900, 1904, 1908, 1912, 1916, 1920, 1924, 1928, 1932, 1936, - 1940, 1944, 1948, 1952, 1956, 1960, 1964, 1968, 1972, 1976, - 1980, 1984, 1988, 1992, 1996, 2000, 2004, 2008, 2012, 2016, - 2020, 2024, 2028, 2032, 2036, 2040, 2044, 2048, 2052, 2056, - 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, - 2100, 2104, 2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, - 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, - 2180, 2184, 2188, 2192, 2196, 2200, 2204, 2208, 2212, 2216, - 2220, 2224, 2228, 2233, 2237, 2241, 2246, 2250, 2254, 2259, - 2264, 2268, 2272, 2276, 2280, 2284, 2288, 2292, 2296, 2300, - 2304, 2308, 2312, 2316, 2320, 2324, 2328, 2332, 2336, 2340, - 2344, 2348, 2352, 2356, 2360, 2364, 2368, 2372, 2376, 2380, - 2384, 2388, 2392, 2396, 2400, 2404, 2408, 2412, 2416, 2420, - 2424, 2428, 2432, 2436, 2440, 2444, 2448, 2452, 2456, 2460, - 2464, 2468, 2472, 2476, 2480, 2484, 2488, 2492, 2496, 2500, - 2504, 2512, 2519, 2526, 2533, 2540, 2547, 2554, 2561, 2568, - 2575, 2582, 2589, 2599, 2603, 2607, 2611, 2615, 2619, 2623, - 2627, 2632, 2637, 2642, 2646, 2650, 2654, 2658, 2663, 2668, - 2672, 2676, 2680, 2684, 2688, 2692, 2696, 2700, 2704, 2708, - 2712, 2716, 2720, 2724, 2728, 2732, 2736, 2740, 2744, 2748, - 2752, 2756, 2760, 2764, 2768, 2772, 2776, 2780, 2784, 2788, - 2792, 2796, 2800, 2804, 2808, 2812, 2816, 2820, 2824, 2828, - 2832, 2836, 2840, 2844, 2848, 2852, 2856, 2860, 2864, 2868, - 2872, 2876, 2880, 2884, 2888, 2892, 2896, 2900, 2904, 2908, - 2912, 2916, 2920, 2924, 2928, 2932, 2936, 2940, 2944, 2948, - 2952, 2956, 2960, 2964, 2968, 2972, 2976, 2980, 2984, 2988, - 2992, 2996, 3000, 3007, 3011, 3015, 3019, 3023, 3030, 3035, - 3040, 3046 + 0, 721, 721, 725, 726, 729, 734, 740, 746, 750, + 754, 760, 766, 772, 778, 783, 788, 794, 801, 805, + 809, 815, 819, 823, 828, 833, 838, 843, 847, 854, + 858, 865, 871, 881, 890, 900, 909, 922, 926, 930, + 934, 938, 942, 946, 950, 954, 958, 963, 967, 971, + 975, 979, 983, 988, 993, 997, 1001, 1005, 1009, 1013, + 1017, 1021, 1025, 1029, 1033, 1037, 1041, 1045, 1049, 1053, + 1057, 1061, 1065, 1069, 1083, 1084, 1116, 1135, 1156, 1186, + 1239, 1246, 1250, 1254, 1258, 1262, 1266, 1270, 1274, 1283, + 1287, 1292, 1297, 1302, 1307, 1312, 1317, 1322, 1327, 1332, + 1337, 1342, 1347, 1352, 1357, 1362, 1367, 1372, 1377, 1382, + 1387, 1392, 1397, 1402, 1407, 1412, 1417, 1422, 1427, 1440, + 1453, 1466, 1479, 1492, 1518, 1546, 1558, 1578, 1605, 1611, + 1616, 1621, 1630, 1635, 1639, 1643, 1647, 1651, 1655, 1659, + 1666, 1673, 1685, 1691, 1695, 1699, 1710, 1721, 1722, 1729, + 1734, 1741, 1795, 1802, 1810, 1847, 1851, 1858, 1863, 1869, + 1875, 1881, 1888, 1898, 1902, 1906, 1910, 1914, 1918, 1922, + 1926, 1930, 1934, 1938, 1942, 1946, 1950, 1954, 1958, 1962, + 1966, 1970, 1974, 1978, 1982, 1986, 1990, 1994, 1998, 2002, + 2006, 2010, 2014, 2018, 2022, 2026, 2030, 2034, 2038, 2042, + 2046, 2050, 2054, 2058, 2062, 2066, 2070, 2074, 2078, 2082, + 2086, 2090, 2094, 2098, 2102, 2106, 2110, 2114, 2118, 2122, + 2126, 2130, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 2162, + 2166, 2170, 2174, 2178, 2182, 2186, 2190, 2194, 2198, 2202, + 2206, 2210, 2214, 2218, 2222, 2226, 2230, 2234, 2238, 2242, + 2246, 2250, 2254, 2259, 2263, 2267, 2272, 2276, 2280, 2285, + 2290, 2294, 2298, 2302, 2306, 2310, 2314, 2318, 2322, 2326, + 2330, 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2362, 2366, + 2370, 2374, 2378, 2382, 2386, 2390, 2394, 2398, 2402, 2406, + 2410, 2414, 2418, 2422, 2426, 2430, 2434, 2438, 2442, 2446, + 2450, 2454, 2458, 2462, 2466, 2470, 2474, 2478, 2482, 2486, + 2490, 2494, 2498, 2502, 2506, 2510, 2514, 2518, 2522, 2526, + 2530, 2538, 2545, 2552, 2559, 2566, 2573, 2580, 2587, 2594, + 2601, 2608, 2615, 2625, 2629, 2633, 2637, 2641, 2645, 2649, + 2653, 2657, 2661, 2665, 2669, 2673, 2677, 2681, 2685, 2689, + 2693, 2697, 2701, 2705, 2709, 2713, 2717, 2721, 2725, 2729, + 2733, 2737, 2741, 2745, 2749, 2753, 2757, 2761, 2765, 2769, + 2773, 2777, 2781, 2785, 2789, 2793, 2797, 2801, 2805, 2809, + 2813, 2817, 2821, 2825, 2829, 2833, 2837, 2841, 2845, 2849, + 2853, 2857, 2861, 2865, 2869, 2873, 2877, 2881, 2885, 2889, + 2893, 2897, 2901, 2905, 2909, 2913, 2917, 2921, 2925, 2929, + 2933, 2937, 2941, 2945, 2949, 2953, 2957, 2961, 2965, 2969, + 2973, 2977, 2981, 2985, 2989, 2993, 2997, 3001, 3005, 3009, + 3013, 3017, 3021, 3028, 3032, 3036, 3040, 3044, 3051, 3056, + 3061, 3067 }; void @@ -7224,9 +7279,9 @@ namespace yy { } // yy -#line 7228 "seclang-parser.cc" +#line 7283 "seclang-parser.cc" -#line 3053 "seclang-parser.yy" +#line 3074 "seclang-parser.yy" void yy::seclang_parser::error (const location_type& l, const std::string& m) { diff --git a/src/parser/seclang-parser.hh b/src/parser/seclang-parser.hh index d4d7cb0d..1c807228 100644 --- a/src/parser/seclang-parser.hh +++ b/src/parser/seclang-parser.hh @@ -324,7 +324,13 @@ using namespace modsecurity::operators; if (t) -#define ACTION_NOT_SUPPORTED(a, b) \ +#define ACTION_NOT_SUPPORTED(a, b, c) \ + std::unique_ptr d(new actions::ActionNotSupported(b)); \ + a = std::move(d); \ + driver.warn(c, "Action " + std::string(b) + " is not supported in version 3."); + + +#define ACTION_NOT_SUPPORTED_OLD(a, b) \ driver.error(b, "Action: " + std::string(a) + " is not yet supported."); \ YYERROR; @@ -354,7 +360,7 @@ using namespace modsecurity::operators; a = std::move(c); -#line 358 "seclang-parser.hh" +#line 364 "seclang-parser.hh" # include # include // std::abort @@ -488,7 +494,7 @@ using namespace modsecurity::operators; #endif namespace yy { -#line 492 "seclang-parser.hh" +#line 498 "seclang-parser.hh" @@ -8629,7 +8635,7 @@ switch (yykind) } } // yy -#line 8633 "seclang-parser.hh" +#line 8639 "seclang-parser.hh" diff --git a/src/parser/seclang-parser.yy b/src/parser/seclang-parser.yy index db3e37f2..6ef02fa0 100644 --- a/src/parser/seclang-parser.yy +++ b/src/parser/seclang-parser.yy @@ -285,7 +285,13 @@ using namespace modsecurity::operators; if (t) -#define ACTION_NOT_SUPPORTED(a, b) \ +#define ACTION_NOT_SUPPORTED(a, b, c) \ + std::unique_ptr d(new actions::ActionNotSupported(b)); \ + a = std::move(d); \ + driver.warn(c, "Action " + std::string(b) + " is not supported in version 3."); + + +#define ACTION_NOT_SUPPORTED_OLD(a, b) \ driver.error(b, "Action: " + std::string(a) + " is not yet supported."); \ YYERROR; @@ -1285,6 +1291,8 @@ expression: } | CONFIG_CONN_ENGINE CONFIG_VALUE_OFF { + driver.error(@0, "SecConnEngine is not yet supported."); + YYERROR; } | CONFIG_SEC_WEB_APP_ID { @@ -1308,6 +1316,8 @@ expression: } | CONFIG_SEC_DISABLE_BACKEND_COMPRESS CONFIG_VALUE_OFF { + driver.error(@0, "SecDisableBackendCompression is not supported."); + YYERROR; } | CONFIG_CONTENT_INJECTION CONFIG_VALUE_ON { @@ -1316,6 +1326,8 @@ expression: } | CONFIG_CONTENT_INJECTION CONFIG_VALUE_OFF { + driver.error(@0, "SecContentInjection is not yet supported."); + YYERROR; } | CONFIG_SEC_CHROOT_DIR { @@ -1329,6 +1341,8 @@ expression: } | CONFIG_SEC_HASH_ENGINE CONFIG_VALUE_OFF { + driver.error(@0, "SecHashEngine is not yet supported."); + YYERROR; } | CONFIG_SEC_HASH_KEY { @@ -1367,6 +1381,8 @@ expression: } | CONFIG_SEC_INTERCEPT_ON_ERROR CONFIG_VALUE_OFF { + driver.error(@0, "SecInterceptOnError is not yet supported."); + YYERROR; } | CONFIG_SEC_CONN_R_STATE_LIMIT { @@ -1390,6 +1406,8 @@ expression: } | CONFIG_SEC_RULE_INHERITANCE CONFIG_VALUE_OFF { + driver.error(@0, "SecRuleInheritance is not yet supported."); + YYERROR; } | CONFIG_SEC_RULE_PERF_TIME { @@ -1639,15 +1657,19 @@ expression: driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::WarnOnFailedRemoteRulesAction; } | CONFIG_DIR_PCRE_MATCH_LIMIT_RECURSION + { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended driver.error(@0, "SecPcreMatchLimitRecursion is not currently supported. Default PCRE values are being used for now"); YYERROR; */ + } | CONFIG_DIR_PCRE_MATCH_LIMIT + { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended driver.error(@0, "SecPcreMatchLimit is not currently supported. Default PCRE values are being used for now"); YYERROR; */ + } | CONGIG_DIR_RESPONSE_BODY_MP { std::istringstream buf($1); @@ -1677,23 +1699,25 @@ expression: | CONGIG_DIR_SEC_TMP_DIR { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended - std::stringstream ss; - ss << "As of ModSecurity version 3.0, SecTmpDir is no longer supported."; - ss << " Instead, you can use your web server configurations to control when"; - ss << "and where to swap. ModSecurity will follow the web server decision."; + std::stringstream ss; + ss << "As of ModSecurity version 3.0, SecTmpDir is no longer supported."; + ss << " Instead, you can use your web server configurations to control when"; + ss << "and where to swap. ModSecurity will follow the web server decision."; driver.error(@0, ss.str()); YYERROR; */ } | CONGIG_DIR_SEC_DATA_DIR + { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended - std::stringstream ss; - ss << "SecDataDir is not currently supported."; - ss << " Collections are kept in memory (in_memory-per_process) for now."; - ss << " When using a backend such as LMDB, temp data path is currently defined by the backend."; + std::stringstream ss; + ss << "SecDataDir is not currently supported."; + ss << " Collections are kept in memory (in_memory-per_process) for now."; + ss << " When using a backend such as LMDB, temp data path is currently defined by the backend."; driver.error(@0, ss.str()); YYERROR; */ + } | CONGIG_DIR_SEC_ARG_SEP | CONGIG_DIR_SEC_COOKIE_FORMAT { @@ -1708,10 +1732,12 @@ expression: YYERROR; } | CONGIG_DIR_SEC_STATUS_ENGINE + { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended driver.error(@0, "SecStatusEngine is not yet supported."); YYERROR; */ + } | CONFIG_DIR_UNICODE_MAP_FILE { std::string error; @@ -2606,7 +2632,7 @@ act: } | ACTION_APPEND { - ACTION_NOT_SUPPORTED("Append", @0); + ACTION_NOT_SUPPORTED_OLD("Append", @0); } | ACTION_AUDIT_LOG { @@ -2626,18 +2652,15 @@ act: } | ACTION_CTL_AUDIT_ENGINE CONFIG_VALUE_ON { - ACTION_NOT_SUPPORTED("CtlAuditEngine", @0); - //ACTION_CONTAINER($$, new actions::Action($1)); + ACTION_NOT_SUPPORTED_OLD("ctl:auditEngine", @0); } | ACTION_CTL_AUDIT_ENGINE CONFIG_VALUE_OFF { - ACTION_NOT_SUPPORTED("CtlAuditEngine", @0); - //ACTION_CONTAINER($$, new actions::Action($1)); + ACTION_NOT_SUPPORTED_OLD("ctl:auditEngine", @0); } | ACTION_CTL_AUDIT_ENGINE CONFIG_VALUE_RELEVANT_ONLY { - ACTION_NOT_SUPPORTED("CtlAuditEngine", @0); - //ACTION_CONTAINER($$, new actions::Action($1)); + ACTION_NOT_SUPPORTED_OLD("ctl:auditEngine", @0); } | ACTION_CTL_AUDIT_LOG_PARTS { @@ -2657,13 +2680,11 @@ act: } | ACTION_CTL_FORCE_REQ_BODY_VAR CONFIG_VALUE_ON { - ACTION_NOT_SUPPORTED("CtlForceRequestBodyVariable", @0); - //ACTION_CONTAINER($$, new actions::Action($1)); + ACTION_NOT_SUPPORTED($$, "ctl:forceRequestBodyVariable", @0); } | ACTION_CTL_FORCE_REQ_BODY_VAR CONFIG_VALUE_OFF { - ACTION_NOT_SUPPORTED("CtlForceRequestBodyVariable", @0); - //ACTION_CONTAINER($$, new actions::Action($1)); + ACTION_NOT_SUPPORTED($$, "ctl:forceRequestBodyVariable", @0); } | ACTION_CTL_REQUEST_BODY_ACCESS CONFIG_VALUE_ON { @@ -2707,7 +2728,7 @@ act: } | ACTION_DEPRECATE_VAR { - ACTION_NOT_SUPPORTED("DeprecateVar", @0); + ACTION_NOT_SUPPORTED_OLD("DeprecateVar", @0); } | ACTION_DROP { @@ -2763,7 +2784,7 @@ act: } | ACTION_PAUSE { - ACTION_NOT_SUPPORTED("Pause", @0); + ACTION_NOT_SUPPORTED_OLD("Pause", @0); } | ACTION_PHASE { @@ -2771,11 +2792,11 @@ act: } | ACTION_PREPEND { - ACTION_NOT_SUPPORTED("Prepend", @0); + ACTION_NOT_SUPPORTED_OLD("Prepend", @0); } | ACTION_PROXY { - ACTION_NOT_SUPPORTED("Proxy", @0); + ACTION_NOT_SUPPORTED_OLD("Proxy", @0); } | ACTION_REDIRECT run_time_string { @@ -2787,23 +2808,23 @@ act: } | ACTION_SANITISE_ARG { - ACTION_NOT_SUPPORTED("SanitiseArg", @0); + ACTION_NOT_SUPPORTED_OLD("SanitiseArg", @0); } | ACTION_SANITISE_MATCHED { - ACTION_NOT_SUPPORTED("SanitiseMatched", @0); + ACTION_NOT_SUPPORTED_OLD("SanitiseMatched", @0); } | ACTION_SANITISE_MATCHED_BYTES { - ACTION_NOT_SUPPORTED("SanitiseMatchedBytes", @0); + ACTION_NOT_SUPPORTED_OLD("SanitiseMatchedBytes", @0); } | ACTION_SANITISE_REQUEST_HEADER { - ACTION_NOT_SUPPORTED("SanitiseRequestHeader", @0); + ACTION_NOT_SUPPORTED_OLD("SanitiseRequestHeader", @0); } | ACTION_SANITISE_RESPONSE_HEADER { - ACTION_NOT_SUPPORTED("SanitiseResponseHeader", @0); + ACTION_NOT_SUPPORTED_OLD("SanitiseResponseHeader", @0); } | ACTION_SETENV run_time_string { diff --git a/src/rule_with_actions.cc b/src/rule_with_actions.cc index 048af1f5..4937aa6e 100644 --- a/src/rule_with_actions.cc +++ b/src/rule_with_actions.cc @@ -87,7 +87,9 @@ RuleWithActions::RuleWithActions( std::vector> newActions; if (actions) { for (auto &a : *actions) { - if (std::dynamic_pointer_cast(a)) { + if (std::dynamic_pointer_cast(a)) { + continue; + } else if (std::dynamic_pointer_cast(a)) { confs.push_back(std::dynamic_pointer_cast(a)); continue; } else if (std::dynamic_pointer_cast(a)) { diff --git a/src/rules_set.cc b/src/rules_set.cc index 87e6e8e1..d6edc83d 100644 --- a/src/rules_set.cc +++ b/src/rules_set.cc @@ -58,6 +58,11 @@ int RulesSet::loadFromUri(const char *uri) { return -1; } + auto warn = driver->m_parserWarn.str(); + if (warn.size() > 0) { + m_parserWarn << warn; + } + int rules = this->merge(driver); delete driver; @@ -73,12 +78,19 @@ int RulesSet::load(const char *file, const std::string &ref) { delete driver; return -1; } + int rules = this->merge(driver); if (rules == -1) { m_parserError << driver->m_parserError.str(); delete driver; return -1; } + + auto warn = driver->m_parserWarn.str(); + if (warn.size() > 0) { + m_parserWarn << warn; + } + delete driver; return rules; @@ -150,10 +162,14 @@ bool RulesSet::containsDuplicatedIds(RulesWarnings *warning, RulesErrors *error) std::string RulesSet::getParserError() { - return this->m_parserError.str(); + return m_parserError.str(); } +std::string RulesSet::getParserWarnings() { + return m_parserWarn.str(); +} + int RulesSet::evaluate(int phase, Transaction *t) { if (phase >= modsecurity::Phases::NUMBER_OF_PHASES) { return 0; @@ -344,41 +360,67 @@ extern "C" void msc_rules_dump(RulesSet *rules) { extern "C" int msc_rules_merge(RulesSet *rules_dst, - RulesSet *rules_from, const char **error) { + RulesSet *rules_from, + const char **warn, const char **error) { int ret = rules_dst->merge(rules_from); if (ret < 0) { *error = strdup(rules_dst->getParserError().c_str()); } + + auto warnings = rules_dst->getParserWarnings(); + if (warnings.size() > 0) { + *warn = strdup(warnings.c_str()); + } + return ret; } extern "C" int msc_rules_add_remote(RulesSet *rules, - const char *key, const char *uri, const char **error) { + const char *key, const char *uri, + const char **warn, const char **error) { int ret = rules->loadRemote(key, uri); if (ret < 0) { *error = strdup(rules->getParserError().c_str()); } + + auto warnings = rules->getParserWarnings(); + if (warnings.size() > 0) { + *warn = strdup(warnings.c_str()); + } + return ret; } extern "C" int msc_rules_add_file(RulesSet *rules, const char *file, - const char **error) { + const char **warn, const char **error) { int ret = rules->loadFromUri(file); if (ret < 0) { *error = strdup(rules->getParserError().c_str()); } + + auto warnings = rules->getParserWarnings(); + if (warnings.size() > 0) { + *warn = strdup(warnings.c_str()); + } + return ret; } extern "C" int msc_rules_add(RulesSet *rules, const char *plain_rules, - const char **error) { + const char **warn, const char **error) { int ret = rules->load(plain_rules); if (ret < 0) { *error = strdup(rules->getParserError().c_str()); } + + auto warnings = rules->getParserWarnings(); + if (warnings.size() > 0) { + *warn = strdup(warnings.c_str()); + } + return ret; } diff --git a/test/regression/regression.cc b/test/regression/regression.cc index 9d1ba597..05201377 100644 --- a/test/regression/regression.cc +++ b/test/regression/regression.cc @@ -157,7 +157,7 @@ modsecurity::ModSecurity *setupModSec() { } -modsecurity::RulesSet *setupModSecRules(RegressionTestResult *r) { +modsecurity::RulesSet *setupModSecRules(RegressionTestResult *r, std::string &warning) { CustomDebugLog *debug_log = new CustomDebugLog(); auto rules = new modsecurity::RulesSet(debug_log); rules->load("SecDebugLogLevel 9"); @@ -165,8 +165,11 @@ modsecurity::RulesSet *setupModSecRules(RegressionTestResult *r) { if (rules->load(r->getRules().c_str(), r->getFileName()) >= 0 && r->getExpectedParserError().empty()) { + warning.assign(rules->getParserWarnings()); return rules; } + warning.assign(rules->getParserWarnings()); + if (!r->getExpectedParserError().empty()) { Regex re(r->getExpectedParserError()); @@ -287,6 +290,7 @@ void processLogs(RegressionTest *t, const std::string &serverLog, const std::string &audit_log, const std::string &debug_log, + const std::string &parser_warning, int status_code) { @@ -318,6 +322,13 @@ void processLogs(RegressionTest *t, reason << KWHT << "Expecting: " << RESET \ << t->audit_log + ""; testRes->failed(reason.str()); + } else if (!contains(parser_warning, t->parser_warn)) { + std::stringstream reason; + reason << "Parser warning was not matching the " \ + << "expected results." << std::endl; + reason << KWHT << "Expecting: " << RESET \ + << t->parser_warn + ""; + testRes->failed(reason.str()); } else { testRes->passed(); return; @@ -331,6 +342,8 @@ void processLogs(RegressionTest *t, testRes->reason << serverLog << std::endl; testRes->reason << KWHT << "Audit log:" << RESET << std::endl; testRes->reason << audit_log << std::endl; + testRes->reason << KWHT << "Parser warning:" << RESET << std::endl; + testRes->reason << parser_warning << std::endl; } } @@ -346,6 +359,7 @@ RegressionTestResult *perform_regression_test( std::string error_log; std::string audit_log; std::string debug_log; + std::string parser_warning; int status_code = 200; if (t->enabled == 0) { @@ -363,7 +377,7 @@ RegressionTestResult *perform_regression_test( goto ret; } - modsec_rules = setupModSecRules(testRes); + modsec_rules = setupModSecRules(testRes, parser_warning); if (modsec_rules == nullptr) { goto ret; } @@ -381,6 +395,7 @@ RegressionTestResult *perform_regression_test( error_log, audit_log, debug_log, + parser_warning, status_code); ret: diff --git a/test/regression/regression_test.cc b/test/regression/regression_test.cc index 22bbfb4b..608112e0 100644 --- a/test/regression/regression_test.cc +++ b/test/regression/regression_test.cc @@ -197,6 +197,9 @@ RegressionTest *RegressionTest::from_yajl_node(const yajl_val &node) { if (strcmp(key2, "parser_error") == 0) { u->parser_error = YAJL_GET_STRING(val2); } + if (strcmp(key2, "parser_warn") == 0) { + u->parser_warn = YAJL_GET_STRING(val2); + } } } if (strcmp(key, "rules") == 0) { diff --git a/test/regression/regression_test.h b/test/regression/regression_test.h index 738e5df6..25b0b4e9 100644 --- a/test/regression/regression_test.h +++ b/test/regression/regression_test.h @@ -58,6 +58,7 @@ class RegressionTest { std::string debug_log; std::string error_log; std::string parser_error; + std::string parser_warn; std::string clientIp; std::string serverIp; diff --git a/test/test-cases/regression/config-warning.json b/test/test-cases/regression/config-warning.json new file mode 100644 index 00000000..4e0c639e --- /dev/null +++ b/test/test-cases/regression/config-warning.json @@ -0,0 +1,63 @@ +[ + { + "enabled":1, + "version_min":300000, + "title":"Testing parser warning (1/n)", + "expected":{ + "parser_warn": "Action ctl:forceRequestBodyVariable is not supported in version 3" + }, + "client":{ + "ip":"200.249.12.31", + "port":12300 + }, + "request":{ + "headers":{ + "Host":"a.b.com", + "Accept":"*/*", + "User-Agent":"My sweet little browser", + "Cookie": "PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120" + }, + "uri":"/path1", + "method":"GET" + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "rules":[ + "SecRuleEngine On", + "SecRule REQUEST_URI \"@contains path1\" \"phase:1,block,id:5,ctl:forceRequestBodyVariable=Off\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"Testing parser warning (2/n)", + "expected":{ + "parser_warn": "config-warning.json. Line: 2. Column: 58. Action ctl:forceRequestBodyVariable is not supported in version 3." + }, + "client":{ + "ip":"200.249.12.31", + "port":12300 + }, + "request":{ + "headers":{ + "Host":"a.b.com", + "Accept":"*/*", + "User-Agent":"My sweet little browser", + "Cookie": "PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120" + }, + "uri":"/path1", + "method":"GET" + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "rules":[ + "SecRuleEngine On", + "SecRule REQUEST_URI \"@contains path1\" \"phase:1,block,id:5,ctl:forceRequestBodyVariable=Off\"", + "SecRule REQUEST_URI \"@contains path1\" \"phase:1,block,id:7,ctl:forceRequestBodyVariable=On\"" + ] + } +]