From 7a48245aed517c5cba0455b5d4e99cdaea14129e Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Tue, 19 Feb 2019 21:31:35 -0300 Subject: [PATCH] Creates RuleUnconditional Makes RuleScript child of RuleWithActions instead of Operator --- headers/modsecurity/rule.h | 2 + headers/modsecurity/rule_marker.h | 3 + headers/modsecurity/rule_message.h | 42 +- headers/modsecurity/rule_unconditional.h | 59 + headers/modsecurity/rule_with_actions.h | 24 +- headers/modsecurity/rule_with_operator.h | 7 - src/Makefile.am | 2 + src/operators/begins_with.cc | 2 +- src/operators/begins_with.h | 2 +- src/operators/contains.cc | 2 +- src/operators/contains.h | 2 +- src/operators/contains_word.cc | 2 +- src/operators/contains_word.h | 2 +- src/operators/detect_sqli.cc | 2 +- src/operators/detect_sqli.h | 2 +- src/operators/detect_xss.cc | 2 +- src/operators/detect_xss.h | 2 +- src/operators/ends_with.cc | 2 +- src/operators/ends_with.h | 2 +- src/operators/operator.cc | 4 +- src/operators/operator.h | 11 +- src/operators/pm.cc | 2 +- src/operators/pm.h | 2 +- src/operators/rbl.cc | 2 +- src/operators/rbl.h | 2 +- src/operators/rx.cc | 2 +- src/operators/rx.h | 10 +- src/operators/validate_byte_range.cc | 2 +- src/operators/validate_byte_range.h | 2 +- src/operators/validate_url_encoding.cc | 2 +- src/operators/validate_url_encoding.h | 2 +- src/operators/validate_utf8_encoding.cc | 2 +- src/operators/validate_utf8_encoding.h | 2 +- src/operators/verify_cc.cc | 2 +- src/operators/verify_cc.h | 2 +- src/operators/verify_cpf.cc | 2 +- src/operators/verify_cpf.h | 10 +- src/operators/verify_ssn.cc | 2 +- src/operators/verify_ssn.h | 10 +- src/operators/verify_svnr.cc | 2 +- src/operators/verify_svnr.h | 10 +- src/operators/within.cc | 2 +- src/operators/within.h | 2 +- src/parser/driver.cc | 6 +- src/parser/driver.h | 6 +- src/parser/seclang-parser.cc | 1678 +++++++++--------- src/parser/seclang-parser.hh | 7 +- src/parser/seclang-parser.yy | 5 +- src/rule_script.cc | 7 +- src/rule_script.h | 4 +- src/rule_unconditional.cc | 61 + src/rule_with_actions.cc | 174 +- src/rule_with_operator.cc | 93 +- src/rules_set.cc | 31 +- src/variables/duration.cc | 2 +- src/variables/duration.h | 2 +- src/variables/env.cc | 2 +- src/variables/env.h | 2 +- src/variables/global.h | 8 +- src/variables/highest_severity.cc | 2 +- src/variables/highest_severity.h | 2 +- src/variables/ip.h | 8 +- src/variables/modsec_build.cc | 2 +- src/variables/modsec_build.h | 2 +- src/variables/remote_user.cc | 2 +- src/variables/remote_user.h | 2 +- src/variables/resource.h | 8 +- src/variables/rule.h | 26 +- src/variables/session.h | 8 +- src/variables/time.cc | 2 +- src/variables/time.h | 2 +- src/variables/time_day.cc | 2 +- src/variables/time_day.h | 2 +- src/variables/time_epoch.cc | 2 +- src/variables/time_epoch.h | 2 +- src/variables/time_hour.cc | 2 +- src/variables/time_hour.h | 2 +- src/variables/time_min.cc | 2 +- src/variables/time_min.h | 2 +- src/variables/time_mon.cc | 2 +- src/variables/time_mon.h | 2 +- src/variables/time_sec.cc | 2 +- src/variables/time_sec.h | 2 +- src/variables/time_wday.cc | 2 +- src/variables/time_wday.h | 2 +- src/variables/time_year.cc | 2 +- src/variables/time_year.h | 2 +- src/variables/tx.h | 8 +- src/variables/user.h | 8 +- src/variables/variable.h | 14 +- src/variables/web_app_id.h | 2 +- src/variables/xml.cc | 4 +- src/variables/xml.h | 4 +- test/test-cases/regression/action-allow.json | 2 +- 94 files changed, 1315 insertions(+), 1167 deletions(-) create mode 100644 headers/modsecurity/rule_unconditional.h create mode 100644 src/rule_unconditional.cc diff --git a/headers/modsecurity/rule.h b/headers/modsecurity/rule.h index c23b5bb5..a8426c61 100644 --- a/headers/modsecurity/rule.h +++ b/headers/modsecurity/rule.h @@ -73,6 +73,8 @@ class Rule { m_phase(modsecurity::Phases::RequestHeadersPhase) { } + virtual bool evaluate(Transaction *transaction) = 0; + virtual bool evaluate(Transaction *transaction, std::shared_ptr rm) = 0; diff --git a/headers/modsecurity/rule_marker.h b/headers/modsecurity/rule_marker.h index add2112a..06d5b499 100644 --- a/headers/modsecurity/rule_marker.h +++ b/headers/modsecurity/rule_marker.h @@ -47,7 +47,10 @@ class RuleMarker : public Rule { virtual bool evaluate(Transaction *transaction, std::shared_ptr rm) override { + return evaluate(transaction); + } + virtual bool evaluate(Transaction *transaction) override { if (transaction->isInsideAMarker()) { if (*transaction->getCurrentMarker() == *m_name) { transaction->removeMarker(); diff --git a/headers/modsecurity/rule_message.h b/headers/modsecurity/rule_message.h index c36d5431..b7f23060 100644 --- a/headers/modsecurity/rule_message.h +++ b/headers/modsecurity/rule_message.h @@ -42,7 +42,13 @@ class RuleMessage { ClientLogMessageInfo = 4 }; - explicit RuleMessage(RuleWithOperator *rule, Transaction *trans) : + /** + * + * FIXME: RuleMessage is currently too big, doing a lot of + * unnecessary data duplication. Needs to be shrink down. + * + */ + RuleMessage(RuleWithActions *rule, Transaction *trans) : m_accuracy(rule->m_accuracy), m_clientIpAddress(trans->m_clientIpAddress), m_data(""), @@ -66,6 +72,38 @@ class RuleMessage { m_ver(rule->m_ver) { } + explicit RuleMessage(RuleMessage *rule) : + m_accuracy(rule->m_accuracy), + m_clientIpAddress(rule->m_clientIpAddress), + m_data(rule->m_data), + m_id(rule->m_id), + m_isDisruptive(rule->m_isDisruptive), + m_match(rule->m_match), + m_maturity(rule->m_maturity), + m_message(rule->m_message), + m_noAuditLog(rule->m_noAuditLog), + m_phase(rule->m_phase), + m_reference(rule->m_reference), + m_rev(rule->m_rev), + m_rule(rule->m_rule), + m_ruleFile(rule->m_ruleFile), + m_ruleId(rule->m_ruleId), + m_ruleLine(rule->m_ruleLine), + m_saveMessage(rule->m_saveMessage), + m_serverIpAddress(rule->m_serverIpAddress), + m_severity(rule->m_severity), + m_uriNoQueryStringDecoded(rule->m_uriNoQueryStringDecoded), + m_ver(rule->m_ver) + { } + + void clean() { + m_data = ""; + m_match = ""; + m_isDisruptive = false; + m_reference = ""; + m_severity = 0; + m_ver = ""; + } std::string log() { return log(this, 0); @@ -104,7 +142,7 @@ class RuleMessage { int m_phase; std::string m_reference; std::string m_rev; - RuleWithOperator *m_rule; + RuleWithActions *m_rule; std::shared_ptr m_ruleFile; int m_ruleId; int m_ruleLine; diff --git a/headers/modsecurity/rule_unconditional.h b/headers/modsecurity/rule_unconditional.h new file mode 100644 index 00000000..04abb90a --- /dev/null +++ b/headers/modsecurity/rule_unconditional.h @@ -0,0 +1,59 @@ +/* + * ModSecurity, http://www.modsecurity.org/ + * Copyright (c) 2015 Trustwave Holdings, Inc. (http://www.trustwave.com/) + * + * You may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * If any of the files related to licensing are missing or if you have any + * other questions related to licensing please contact Trustwave Holdings, Inc. + * directly using the email address security@modsecurity.org. + * + */ + +#ifdef __cplusplus +#include +#include +#include +#include +#include +#include +#endif + +#ifndef HEADERS_MODSECURITY_RULE_UNCONDITIONAL_H_ +#define HEADERS_MODSECURITY_RULE_UNCONDITIONAL_H_ + +#include "modsecurity/modsecurity.h" +#include "modsecurity/variable_value.h" +#include "modsecurity/rule.h" +#include "modsecurity/rules_set.h" +#include "modsecurity/rule_with_actions.h" +#include "modsecurity/actions/action.h" + +#ifdef __cplusplus + +namespace modsecurity { + + +class RuleUnconditional : public RuleWithActions { + public: + RuleUnconditional( + std::vector *actions, + Transformations *transformations, + std::unique_ptr fileName, + int lineNumber) + : RuleWithActions(actions, transformations, std::move(fileName), lineNumber) { } + + virtual bool evaluate(Transaction *transaction, std::shared_ptr ruleMessage) override; + + private: +}; + + +} // namespace modsecurity + +#endif + +#endif // HEADERS_MODSECURITY_RULE_UNCONDITIONAL_H_ diff --git a/headers/modsecurity/rule_with_actions.h b/headers/modsecurity/rule_with_actions.h index 0426769a..5cd12e56 100644 --- a/headers/modsecurity/rule_with_actions.h +++ b/headers/modsecurity/rule_with_actions.h @@ -45,6 +45,21 @@ class RuleWithActions : public Rule { ~RuleWithActions(); + virtual bool evaluate(Transaction *transaction, std::shared_ptr ruleMessage) override; + + virtual bool evaluate(Transaction *transaction) override; + + + void executeActionsIndependentOfChainedRuleResult( + Transaction *trasn, + bool *containsDisruptive, + std::shared_ptr ruleMessage); + + void executeActionsAfterFullMatch( + Transaction *trasn, + bool containsDisruptive, + std::shared_ptr ruleMessage); + void executeAction(Transaction *trans, bool containsBlock, std::shared_ptr ruleMessage, @@ -63,10 +78,6 @@ class RuleWithActions : public Rule { std::string *path, int *nth) const; - void executeActionsIndependentOfChainedRuleResult(Transaction *trasn, - bool *b, std::shared_ptr ruleMessage); - void executeActionsAfterFullMatch(Transaction *trasn, - bool containsDisruptive, std::shared_ptr ruleMessage); std::vector getActionsByName(const std::string& name, Transaction *t); @@ -95,6 +106,9 @@ class RuleWithActions : public Rule { int64_t m_ruleId; + std::unique_ptr m_chainedRuleChild; + RuleWithActions *m_chainedRuleParent; + private: /* actions */ actions::Action *m_disruptiveAction; @@ -118,4 +132,4 @@ class RuleWithActions : public Rule { #endif -#endif // HEADERS_MODSECURITY_RULE_WITH_ACTIONS_H_ \ No newline at end of file +#endif // HEADERS_MODSECURITY_RULE_WITH_ACTIONS_H_ diff --git a/headers/modsecurity/rule_with_operator.h b/headers/modsecurity/rule_with_operator.h index 69ae0bfa..63aff6c4 100644 --- a/headers/modsecurity/rule_with_operator.h +++ b/headers/modsecurity/rule_with_operator.h @@ -62,7 +62,6 @@ class RuleWithOperator : public RuleWithActions { const std::string &value); static void cleanMatchedVars(Transaction *trasn); - inline bool isUnconditional() const { return m_operator == NULL; } std::string getOperatorName() const; @@ -70,15 +69,9 @@ class RuleWithOperator : public RuleWithActions { return std::to_string(m_ruleId); } - std::unique_ptr m_chainedRuleChild; - RuleWithOperator *m_chainedRuleParent; - private: modsecurity::variables::Variables *m_variables; operators::Operator *m_operator; - - - bool m_unconditional:1; }; diff --git a/src/Makefile.am b/src/Makefile.am index df46cbff..e6496ccc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -43,6 +43,7 @@ pkginclude_HEADERS = \ ../headers/modsecurity/modsecurity.h \ ../headers/modsecurity/rule.h \ ../headers/modsecurity/rule_marker.h \ + ../headers/modsecurity/rule_unconditional.h \ ../headers/modsecurity/rule_with_actions.h \ ../headers/modsecurity/rule_with_operator.h \ ../headers/modsecurity/rules.h \ @@ -285,6 +286,7 @@ libmodsecurity_la_SOURCES = \ debug_log/debug_log_writer.cc \ run_time_string.cc \ rule.cc \ + rule_unconditional.cc \ rule_with_actions.cc \ rule_with_operator.cc \ rule_message.cc \ diff --git a/src/operators/begins_with.cc b/src/operators/begins_with.cc index b1719971..e2766ec3 100644 --- a/src/operators/begins_with.cc +++ b/src/operators/begins_with.cc @@ -24,7 +24,7 @@ namespace modsecurity { namespace operators { -bool BeginsWith::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool BeginsWith::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) { std::string p(m_string->evaluate(transaction)); diff --git a/src/operators/begins_with.h b/src/operators/begins_with.h index 10a85de3..e8470d98 100644 --- a/src/operators/begins_with.h +++ b/src/operators/begins_with.h @@ -32,7 +32,7 @@ class BeginsWith : public Operator { explicit BeginsWith(std::unique_ptr param) : Operator("BeginsWith", std::move(param)) { } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, const std::string &str, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) override; }; diff --git a/src/operators/contains.cc b/src/operators/contains.cc index a32f768e..e63e8adc 100644 --- a/src/operators/contains.cc +++ b/src/operators/contains.cc @@ -21,7 +21,7 @@ namespace modsecurity { namespace operators { -bool Contains::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool Contains::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &input, std::shared_ptr ruleMessage) { std::string p(m_string->evaluate(transaction)); size_t offset = input.find(p); diff --git a/src/operators/contains.h b/src/operators/contains.h index 283e2e54..8bab0852 100644 --- a/src/operators/contains.h +++ b/src/operators/contains.h @@ -34,7 +34,7 @@ class Contains : public Operator { /** @ingroup ModSecurity_Operator */ explicit Contains(std::unique_ptr param) : Operator("Contains", std::move(param)) { } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) override; }; diff --git a/src/operators/contains_word.cc b/src/operators/contains_word.cc index 4664b4b3..262b9b19 100644 --- a/src/operators/contains_word.cc +++ b/src/operators/contains_word.cc @@ -36,7 +36,7 @@ bool ContainsWord::acceptableChar(const std::string& a, size_t pos) { return true; } -bool ContainsWord::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool ContainsWord::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) { std::string paramTarget(m_string->evaluate(transaction)); diff --git a/src/operators/contains_word.h b/src/operators/contains_word.h index 8106bff6..c9698d21 100644 --- a/src/operators/contains_word.h +++ b/src/operators/contains_word.h @@ -32,7 +32,7 @@ class ContainsWord : public Operator { explicit ContainsWord(std::unique_ptr param) : Operator("ContainsWord", std::move(param)) { } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) override; diff --git a/src/operators/detect_sqli.cc b/src/operators/detect_sqli.cc index 81144d26..f2032c6d 100644 --- a/src/operators/detect_sqli.cc +++ b/src/operators/detect_sqli.cc @@ -25,7 +25,7 @@ namespace modsecurity { namespace operators { -bool DetectSQLi::evaluate(Transaction *t, RuleWithOperator *rule, +bool DetectSQLi::evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) { char fingerprint[8]; int issqli; diff --git a/src/operators/detect_sqli.h b/src/operators/detect_sqli.h index 6bf50c91..2dc0d748 100644 --- a/src/operators/detect_sqli.h +++ b/src/operators/detect_sqli.h @@ -32,7 +32,7 @@ class DetectSQLi : public Operator { m_match_message.assign("detected SQLi using libinjection."); } - bool evaluate(Transaction *t, RuleWithOperator *rule, + bool evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; }; diff --git a/src/operators/detect_xss.cc b/src/operators/detect_xss.cc index 788d18b8..859c20f8 100644 --- a/src/operators/detect_xss.cc +++ b/src/operators/detect_xss.cc @@ -25,7 +25,7 @@ namespace modsecurity { namespace operators { -bool DetectXSS::evaluate(Transaction *t, RuleWithOperator *rule, +bool DetectXSS::evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) { int is_xss; diff --git a/src/operators/detect_xss.h b/src/operators/detect_xss.h index 22f0e2ca..266fdf36 100644 --- a/src/operators/detect_xss.h +++ b/src/operators/detect_xss.h @@ -31,7 +31,7 @@ class DetectXSS : public Operator { m_match_message.assign("detected XSS using libinjection."); } - bool evaluate(Transaction *t, RuleWithOperator *rule, + bool evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; }; diff --git a/src/operators/ends_with.cc b/src/operators/ends_with.cc index 96d4cadf..632fc8fe 100644 --- a/src/operators/ends_with.cc +++ b/src/operators/ends_with.cc @@ -23,7 +23,7 @@ namespace modsecurity { namespace operators { -bool EndsWith::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool EndsWith::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) { bool ret = false; std::string p(m_string->evaluate(transaction)); diff --git a/src/operators/ends_with.h b/src/operators/ends_with.h index 2da09876..c5352618 100644 --- a/src/operators/ends_with.h +++ b/src/operators/ends_with.h @@ -33,7 +33,7 @@ class EndsWith : public Operator { : Operator("EndsWith", std::move(param)) { m_couldContainsMacro = true; } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) override; }; diff --git a/src/operators/operator.cc b/src/operators/operator.cc index c1375188..3bb12ce8 100644 --- a/src/operators/operator.cc +++ b/src/operators/operator.cc @@ -70,7 +70,7 @@ namespace operators { bool Operator::evaluateInternal(Transaction *transaction, - RuleWithOperator *rule, const std::string& a, std::shared_ptr rm) { + RuleWithActions *rule, const std::string& a, std::shared_ptr rm) { bool res = evaluate(transaction, rule, a, rm); if (m_negation) { @@ -81,7 +81,7 @@ bool Operator::evaluateInternal(Transaction *transaction, } bool Operator::evaluateInternal(Transaction *transaction, - RuleWithOperator *rule, const std::string& a) { + RuleWithActions *rule, const std::string& a) { bool res = evaluate(transaction, rule, a); if (m_negation) { diff --git a/src/operators/operator.h b/src/operators/operator.h index 1ced33d0..523b9209 100644 --- a/src/operators/operator.h +++ b/src/operators/operator.h @@ -111,24 +111,23 @@ class Operator { std::string key, std::string value); bool evaluateInternal(Transaction *t, const std::string& a); - bool evaluateInternal(Transaction *t, RuleWithOperator *rule, + bool evaluateInternal(Transaction *t, RuleWithActions *rule, const std::string& a); - bool evaluateInternal(Transaction *t, RuleWithOperator *rule, + bool evaluateInternal(Transaction *t, RuleWithActions *rule, const std::string& a, std::shared_ptr ruleMessage); virtual bool evaluate(Transaction *transaction, const std::string &str); - virtual bool evaluate(Transaction *transaction, RuleWithOperator *rule, + virtual bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str) { return evaluate(transaction, str); } - virtual bool evaluate(Transaction *transaction, RuleWithOperator *rule, + virtual bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) { return evaluate(transaction, str); } - static void logOffset(std::shared_ptr ruleMessage, - int offset, int len) { + static void logOffset(std::shared_ptr ruleMessage, int offset, int len) { if (ruleMessage) { ruleMessage->m_reference.append("o" + std::to_string(offset) + "," diff --git a/src/operators/pm.cc b/src/operators/pm.cc index 76b429d7..8c747ed3 100644 --- a/src/operators/pm.cc +++ b/src/operators/pm.cc @@ -81,7 +81,7 @@ void Pm::postOrderTraversal(acmp_btree_node_t *node) { } -bool Pm::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool Pm::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &input, std::shared_ptr ruleMessage) { int rc; ACMPT pt; diff --git a/src/operators/pm.h b/src/operators/pm.h index d4531851..0c2e58f3 100644 --- a/src/operators/pm.h +++ b/src/operators/pm.h @@ -41,7 +41,7 @@ class Pm : public Operator { m_p = acmp_create(0); } ~Pm(); - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) override; diff --git a/src/operators/rbl.cc b/src/operators/rbl.cc index d8a86ac9..6753435f 100644 --- a/src/operators/rbl.cc +++ b/src/operators/rbl.cc @@ -200,7 +200,7 @@ void Rbl::furtherInfo(struct sockaddr_in *sin, const std::string &ipStr, } -bool Rbl::evaluate(Transaction *t, RuleWithOperator *rule, +bool Rbl::evaluate(Transaction *t, RuleWithActions *rule, const std::string& ipStr, std::shared_ptr ruleMessage) { struct addrinfo *info = NULL; diff --git a/src/operators/rbl.h b/src/operators/rbl.h index 7a1fd89a..4cc1fc25 100644 --- a/src/operators/rbl.h +++ b/src/operators/rbl.h @@ -76,7 +76,7 @@ class Rbl : public Operator { m_provider = RblProvider::httpbl; } } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; diff --git a/src/operators/rx.cc b/src/operators/rx.cc index f13be151..0ba983d7 100644 --- a/src/operators/rx.cc +++ b/src/operators/rx.cc @@ -36,7 +36,7 @@ bool Rx::init(const std::string &arg, std::string *error) { } -bool Rx::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool Rx::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) { std::list matches; Regex *re; diff --git a/src/operators/rx.h b/src/operators/rx.h index e9ea78fc..97cc12a3 100644 --- a/src/operators/rx.h +++ b/src/operators/rx.h @@ -49,15 +49,7 @@ class Rx : public Operator { } } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, - const std::string &input) override { - return evaluate(transaction, NULL, input, NULL); - } - bool evaluate(Transaction *transaction, - const std::string &input) override { - return evaluate(transaction, NULL, input); - } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; diff --git a/src/operators/validate_byte_range.cc b/src/operators/validate_byte_range.cc index cef63725..47f67b5c 100644 --- a/src/operators/validate_byte_range.cc +++ b/src/operators/validate_byte_range.cc @@ -110,7 +110,7 @@ bool ValidateByteRange::init(const std::string &file, } -bool ValidateByteRange::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool ValidateByteRange::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &input, std::shared_ptr ruleMessage) { bool ret = true; diff --git a/src/operators/validate_byte_range.h b/src/operators/validate_byte_range.h index 7667f329..d50f2997 100644 --- a/src/operators/validate_byte_range.h +++ b/src/operators/validate_byte_range.h @@ -37,7 +37,7 @@ class ValidateByteRange : public Operator { } ~ValidateByteRange() override { } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &input, std::shared_ptr ruleMessage) override; bool getRange(const std::string &rangeRepresentation, std::string *error); diff --git a/src/operators/validate_url_encoding.cc b/src/operators/validate_url_encoding.cc index a9110663..f04a5fa7 100644 --- a/src/operators/validate_url_encoding.cc +++ b/src/operators/validate_url_encoding.cc @@ -68,7 +68,7 @@ int ValidateUrlEncoding::validate_url_encoding(const char *input, } -bool ValidateUrlEncoding::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool ValidateUrlEncoding::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &input, std::shared_ptr ruleMessage) { size_t offset = 0; bool res = false; diff --git a/src/operators/validate_url_encoding.h b/src/operators/validate_url_encoding.h index 52b51d73..80d61b96 100644 --- a/src/operators/validate_url_encoding.h +++ b/src/operators/validate_url_encoding.h @@ -31,7 +31,7 @@ class ValidateUrlEncoding : public Operator { ValidateUrlEncoding() : Operator("ValidateUrlEncoding") { } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &input, std::shared_ptr ruleMessage) override; diff --git a/src/operators/validate_utf8_encoding.cc b/src/operators/validate_utf8_encoding.cc index 2ef23fbb..9374116a 100644 --- a/src/operators/validate_utf8_encoding.cc +++ b/src/operators/validate_utf8_encoding.cc @@ -113,7 +113,7 @@ int ValidateUtf8Encoding::detect_utf8_character( return unicode_len; } -bool ValidateUtf8Encoding::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool ValidateUtf8Encoding::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) { unsigned int i, bytes_left; diff --git a/src/operators/validate_utf8_encoding.h b/src/operators/validate_utf8_encoding.h index 376212c2..e01c19a2 100644 --- a/src/operators/validate_utf8_encoding.h +++ b/src/operators/validate_utf8_encoding.h @@ -38,7 +38,7 @@ class ValidateUtf8Encoding : public Operator { ValidateUtf8Encoding() : Operator("ValidateUtf8Encoding") { } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) override; diff --git a/src/operators/verify_cc.cc b/src/operators/verify_cc.cc index c121c474..f23c7a1f 100644 --- a/src/operators/verify_cc.cc +++ b/src/operators/verify_cc.cc @@ -117,7 +117,7 @@ bool VerifyCC::init(const std::string ¶m2, std::string *error) { } -bool VerifyCC::evaluate(Transaction *t, RuleWithOperator *rule, +bool VerifyCC::evaluate(Transaction *t, RuleWithActions *rule, const std::string& i, std::shared_ptr ruleMessage) { int offset = 0; int target_length = i.length(); diff --git a/src/operators/verify_cc.h b/src/operators/verify_cc.h index d9ad9414..ee97f2b4 100644 --- a/src/operators/verify_cc.h +++ b/src/operators/verify_cc.h @@ -35,7 +35,7 @@ class VerifyCC : public Operator { m_pce(NULL) { } ~VerifyCC(); - bool evaluate(Transaction *t, RuleWithOperator *rule, + bool evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; bool init(const std::string ¶m, std::string *error) override; diff --git a/src/operators/verify_cpf.cc b/src/operators/verify_cpf.cc index 03a1fe02..0ec49ac4 100644 --- a/src/operators/verify_cpf.cc +++ b/src/operators/verify_cpf.cc @@ -108,7 +108,7 @@ bool VerifyCPF::verify(const char *cpfnumber, int len) { } -bool VerifyCPF::evaluate(Transaction *t, RuleWithOperator *rule, +bool VerifyCPF::evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) { std::list matches; bool is_cpf = false; diff --git a/src/operators/verify_cpf.h b/src/operators/verify_cpf.h index 83dc03d2..c5b0dfa5 100644 --- a/src/operators/verify_cpf.h +++ b/src/operators/verify_cpf.h @@ -46,15 +46,7 @@ class VerifyCPF : public Operator { bool operator=(const VerifyCPF &a) = delete; VerifyCPF(const VerifyCPF &a) = delete; - bool evaluate(Transaction *transaction, RuleWithOperator *rule, - const std::string &input) override { - return evaluate(transaction, NULL, input, NULL); - } - bool evaluate(Transaction *transaction, - const std::string &input) override { - return evaluate(transaction, NULL, input); - } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; diff --git a/src/operators/verify_ssn.cc b/src/operators/verify_ssn.cc index 775fc58d..00b0c5c2 100644 --- a/src/operators/verify_ssn.cc +++ b/src/operators/verify_ssn.cc @@ -110,7 +110,7 @@ invalid: } -bool VerifySSN::evaluate(Transaction *t, RuleWithOperator *rule, +bool VerifySSN::evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) { std::list matches; bool is_ssn = false; diff --git a/src/operators/verify_ssn.h b/src/operators/verify_ssn.h index 8fe47bdf..86f33413 100644 --- a/src/operators/verify_ssn.h +++ b/src/operators/verify_ssn.h @@ -46,15 +46,7 @@ class VerifySSN : public Operator { bool operator=(const VerifySSN &a) = delete; VerifySSN(const VerifySSN &a) = delete; - bool evaluate(Transaction *transaction, RuleWithOperator *rule, - const std::string &input) override { - return evaluate(transaction, NULL, input, NULL); - } - bool evaluate(Transaction *transaction, - const std::string &input) override { - return evaluate(transaction, NULL, input); - } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; diff --git a/src/operators/verify_svnr.cc b/src/operators/verify_svnr.cc index 5b89d2fe..248e6b4e 100644 --- a/src/operators/verify_svnr.cc +++ b/src/operators/verify_svnr.cc @@ -77,7 +77,7 @@ bool VerifySVNR::verify(const char *svnrnumber, int len) { } -bool VerifySVNR::evaluate(Transaction *t, RuleWithOperator *rule, +bool VerifySVNR::evaluate(Transaction *t, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) { std::list matches; bool is_svnr = false; diff --git a/src/operators/verify_svnr.h b/src/operators/verify_svnr.h index d608bdf5..6fe9df9a 100644 --- a/src/operators/verify_svnr.h +++ b/src/operators/verify_svnr.h @@ -32,15 +32,7 @@ class VerifySVNR : public Operator { bool operator=(const VerifySVNR &a) = delete; VerifySVNR(const VerifySVNR &a) = delete; - bool evaluate(Transaction *transaction, RuleWithOperator *rule, - const std::string &input) override { - return evaluate(transaction, NULL, input, NULL); - } - bool evaluate(Transaction *transaction, - const std::string &input) override { - return evaluate(transaction, NULL, input); - } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string& input, std::shared_ptr ruleMessage) override; diff --git a/src/operators/within.cc b/src/operators/within.cc index 86b0bc3d..f83f53a7 100644 --- a/src/operators/within.cc +++ b/src/operators/within.cc @@ -24,7 +24,7 @@ namespace modsecurity { namespace operators { -bool Within::evaluate(Transaction *transaction, RuleWithOperator *rule, +bool Within::evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) { bool res = false; size_t pos = 0; diff --git a/src/operators/within.h b/src/operators/within.h index 36ebe9b4..1a03aa68 100644 --- a/src/operators/within.h +++ b/src/operators/within.h @@ -33,7 +33,7 @@ class Within : public Operator { : Operator("Within", std::move(param)) { m_couldContainsMacro = true; } - bool evaluate(Transaction *transaction, RuleWithOperator *rule, + bool evaluate(Transaction *transaction, RuleWithActions *rule, const std::string &str, std::shared_ptr ruleMessage) override; }; diff --git a/src/parser/driver.cc b/src/parser/driver.cc index 03be1311..6e97ae0f 100644 --- a/src/parser/driver.cc +++ b/src/parser/driver.cc @@ -54,7 +54,7 @@ int Driver::addSecMarker(std::string marker, std::unique_ptr fileNa } -int Driver::addSecAction(std::unique_ptr rule) { +int Driver::addSecAction(std::unique_ptr rule) { if (rule->getPhase() >= modsecurity::Phases::NUMBER_OF_PHASES) { m_parserError << "Unknown phase: " << std::to_string(rule->getPhase()); m_parserError << std::endl; @@ -73,7 +73,7 @@ int Driver::addSecRuleScript(std::unique_ptr rule) { } -int Driver::addSecRule(std::unique_ptr r) { +int Driver::addSecRule(std::unique_ptr r) { if (r->getPhase() >= modsecurity::Phases::NUMBER_OF_PHASES) { m_parserError << "Unknown phase: " << std::to_string(r->getPhase()); m_parserError << std::endl; @@ -94,7 +94,7 @@ int Driver::addSecRule(std::unique_ptr r) { return true; } - std::shared_ptr rule(std::move(r)); + std::shared_ptr rule(std::move(r)); /* * Checking if the rule has an ID and also checking if this ID is not used * by other rule diff --git a/src/parser/driver.h b/src/parser/driver.h index 6fbcd006..ed7fd077 100644 --- a/src/parser/driver.h +++ b/src/parser/driver.h @@ -66,8 +66,8 @@ class Driver : public RulesSetProperties { Driver(); virtual ~Driver(); - int addSecRule(std::unique_ptr rule); - int addSecAction(std::unique_ptr rule); + int addSecRule(std::unique_ptr rule); + int addSecAction(std::unique_ptr rule); int addSecMarker(std::string marker, std::unique_ptr fileName, int lineNumber); int addSecRuleScript(std::unique_ptr rule); @@ -89,7 +89,7 @@ class Driver : public RulesSetProperties { std::list loc; std::string buffer; - RuleWithOperator *m_lastRule; + RuleWithActions *m_lastRule; RulesSetPhases m_rulesSetPhases; }; diff --git a/src/parser/seclang-parser.cc b/src/parser/seclang-parser.cc index bc5297bc..76720953 100644 --- a/src/parser/seclang-parser.cc +++ b/src/parser/seclang-parser.cc @@ -41,7 +41,7 @@ // Unqualified %code blocks. -#line 323 "seclang-parser.yy" +#line 324 "seclang-parser.yy" #include "src/parser/driver.h" @@ -1356,7 +1356,7 @@ namespace yy { // User initialization code. -#line 316 "seclang-parser.yy" +#line 317 "seclang-parser.yy" { // Initialize the initial location. yyla.location.begin.filename = yyla.location.end.filename = new std::string(driver.file); @@ -1716,7 +1716,7 @@ namespace yy { switch (yyn) { case 2: -#line 708 "seclang-parser.yy" +#line 709 "seclang-parser.yy" { return 0; } @@ -1724,7 +1724,7 @@ namespace yy { break; case 6: -#line 721 "seclang-parser.yy" +#line 722 "seclang-parser.yy" { driver.m_auditLog->setStorageDirMode(strtol(yystack_[0].value.as < std::string > ().c_str(), NULL, 8)); } @@ -1732,7 +1732,7 @@ namespace yy { break; case 7: -#line 727 "seclang-parser.yy" +#line 728 "seclang-parser.yy" { driver.m_auditLog->setStorageDir(yystack_[0].value.as < std::string > ()); } @@ -1740,7 +1740,7 @@ namespace yy { break; case 8: -#line 733 "seclang-parser.yy" +#line 734 "seclang-parser.yy" { driver.m_auditLog->setStatus(modsecurity::audit_log::AuditLog::RelevantOnlyAuditLogStatus); } @@ -1748,7 +1748,7 @@ namespace yy { break; case 9: -#line 737 "seclang-parser.yy" +#line 738 "seclang-parser.yy" { driver.m_auditLog->setStatus(modsecurity::audit_log::AuditLog::OffAuditLogStatus); } @@ -1756,7 +1756,7 @@ namespace yy { break; case 10: -#line 741 "seclang-parser.yy" +#line 742 "seclang-parser.yy" { driver.m_auditLog->setStatus(modsecurity::audit_log::AuditLog::OnAuditLogStatus); } @@ -1764,7 +1764,7 @@ namespace yy { break; case 11: -#line 747 "seclang-parser.yy" +#line 748 "seclang-parser.yy" { driver.m_auditLog->setFileMode(strtol(yystack_[0].value.as < std::string > ().c_str(), NULL, 8)); } @@ -1772,7 +1772,7 @@ namespace yy { break; case 12: -#line 753 "seclang-parser.yy" +#line 754 "seclang-parser.yy" { driver.m_auditLog->setFilePath2(yystack_[0].value.as < std::string > ()); } @@ -1780,7 +1780,7 @@ namespace yy { break; case 13: -#line 759 "seclang-parser.yy" +#line 760 "seclang-parser.yy" { driver.m_auditLog->setParts(yystack_[0].value.as < std::string > ()); } @@ -1788,7 +1788,7 @@ namespace yy { break; case 14: -#line 765 "seclang-parser.yy" +#line 766 "seclang-parser.yy" { driver.m_auditLog->setFilePath1(yystack_[0].value.as < std::string > ()); } @@ -1796,7 +1796,7 @@ namespace yy { break; case 15: -#line 770 "seclang-parser.yy" +#line 771 "seclang-parser.yy" { driver.m_auditLog->setFormat(modsecurity::audit_log::AuditLog::JSONAuditLogFormat); } @@ -1804,7 +1804,7 @@ namespace yy { break; case 16: -#line 775 "seclang-parser.yy" +#line 776 "seclang-parser.yy" { driver.m_auditLog->setFormat(modsecurity::audit_log::AuditLog::NativeAuditLogFormat); } @@ -1812,7 +1812,7 @@ namespace yy { break; case 17: -#line 781 "seclang-parser.yy" +#line 782 "seclang-parser.yy" { std::string relevant_status(yystack_[0].value.as < std::string > ()); driver.m_auditLog->setRelevantStatus(relevant_status); @@ -1821,7 +1821,7 @@ namespace yy { break; case 18: -#line 788 "seclang-parser.yy" +#line 789 "seclang-parser.yy" { driver.m_auditLog->setType(modsecurity::audit_log::AuditLog::SerialAuditLogType); } @@ -1829,7 +1829,7 @@ namespace yy { break; case 19: -#line 792 "seclang-parser.yy" +#line 793 "seclang-parser.yy" { driver.m_auditLog->setType(modsecurity::audit_log::AuditLog::ParallelAuditLogType); } @@ -1837,7 +1837,7 @@ namespace yy { break; case 20: -#line 796 "seclang-parser.yy" +#line 797 "seclang-parser.yy" { driver.m_auditLog->setType(modsecurity::audit_log::AuditLog::HttpsAuditLogType); } @@ -1845,7 +1845,7 @@ namespace yy { break; case 21: -#line 802 "seclang-parser.yy" +#line 803 "seclang-parser.yy" { driver.m_uploadKeepFiles = modsecurity::RulesSetProperties::TrueConfigBoolean; } @@ -1853,7 +1853,7 @@ namespace yy { break; case 22: -#line 806 "seclang-parser.yy" +#line 807 "seclang-parser.yy" { driver.m_uploadKeepFiles = modsecurity::RulesSetProperties::FalseConfigBoolean; } @@ -1861,7 +1861,7 @@ namespace yy { break; case 23: -#line 810 "seclang-parser.yy" +#line 811 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecUploadKeepFiles RelevantOnly is not currently supported. Accepted values are On or Off"); YYERROR; @@ -1870,7 +1870,7 @@ namespace yy { break; case 24: -#line 815 "seclang-parser.yy" +#line 816 "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); @@ -1879,7 +1879,7 @@ namespace yy { break; case 25: -#line 820 "seclang-parser.yy" +#line 821 "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); @@ -1888,7 +1888,7 @@ namespace yy { break; case 26: -#line 825 "seclang-parser.yy" +#line 826 "seclang-parser.yy" { driver.m_uploadDirectory.m_set = true; driver.m_uploadDirectory.m_value = yystack_[0].value.as < std::string > (); @@ -1897,7 +1897,7 @@ namespace yy { break; case 27: -#line 830 "seclang-parser.yy" +#line 831 "seclang-parser.yy" { driver.m_tmpSaveUploadedFiles = modsecurity::RulesSetProperties::TrueConfigBoolean; } @@ -1905,7 +1905,7 @@ namespace yy { break; case 28: -#line 834 "seclang-parser.yy" +#line 835 "seclang-parser.yy" { driver.m_tmpSaveUploadedFiles = modsecurity::RulesSetProperties::FalseConfigBoolean; } @@ -1913,7 +1913,7 @@ namespace yy { break; case 29: -#line 841 "seclang-parser.yy" +#line 842 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[1].value.as < std::unique_ptr > > > ()); } @@ -1921,7 +1921,7 @@ namespace yy { break; case 30: -#line 845 "seclang-parser.yy" +#line 846 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); } @@ -1929,7 +1929,7 @@ namespace yy { break; case 31: -#line 852 "seclang-parser.yy" +#line 853 "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 > ())); @@ -1939,7 +1939,7 @@ namespace yy { break; case 32: -#line 858 "seclang-parser.yy" +#line 859 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); ACTION_INIT(yystack_[0].value.as < std::unique_ptr > (), yystack_[1].location) @@ -1950,7 +1950,7 @@ namespace yy { break; case 33: -#line 868 "seclang-parser.yy" +#line 869 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > () = std::move(yystack_[0].value.as < std::unique_ptr > ()); std::string error; @@ -1963,7 +1963,7 @@ namespace yy { break; case 34: -#line 877 "seclang-parser.yy" +#line 878 "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; @@ -1977,7 +1977,7 @@ namespace yy { break; case 35: -#line 887 "seclang-parser.yy" +#line 888 "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; @@ -1990,7 +1990,7 @@ namespace yy { break; case 36: -#line 896 "seclang-parser.yy" +#line 897 "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; @@ -2004,7 +2004,7 @@ namespace yy { break; case 37: -#line 909 "seclang-parser.yy" +#line 910 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::UnconditionalMatch()); } @@ -2012,7 +2012,7 @@ namespace yy { break; case 38: -#line 913 "seclang-parser.yy" +#line 914 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::DetectSQLi()); } @@ -2020,7 +2020,7 @@ namespace yy { break; case 39: -#line 917 "seclang-parser.yy" +#line 918 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::DetectXSS()); } @@ -2028,7 +2028,7 @@ namespace yy { break; case 40: -#line 921 "seclang-parser.yy" +#line 922 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateUrlEncoding()); } @@ -2036,7 +2036,7 @@ namespace yy { break; case 41: -#line 925 "seclang-parser.yy" +#line 926 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateUtf8Encoding()); } @@ -2044,7 +2044,7 @@ namespace yy { break; case 42: -#line 929 "seclang-parser.yy" +#line 930 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::InspectFile(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2052,7 +2052,7 @@ namespace yy { break; case 43: -#line 933 "seclang-parser.yy" +#line 934 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::FuzzyHash(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2060,7 +2060,7 @@ namespace yy { break; case 44: -#line 937 "seclang-parser.yy" +#line 938 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateByteRange(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2068,7 +2068,7 @@ namespace yy { break; case 45: -#line 941 "seclang-parser.yy" +#line 942 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateDTD(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2076,7 +2076,7 @@ namespace yy { break; case 46: -#line 945 "seclang-parser.yy" +#line 946 "seclang-parser.yy" { /* $$ = new operators::ValidateHash($1); */ OPERATOR_NOT_SUPPORTED("ValidateHash", yystack_[2].location); @@ -2085,7 +2085,7 @@ namespace yy { break; case 47: -#line 950 "seclang-parser.yy" +#line 951 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ValidateSchema(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2093,7 +2093,7 @@ namespace yy { break; case 48: -#line 954 "seclang-parser.yy" +#line 955 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifyCC(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2101,7 +2101,7 @@ namespace yy { break; case 49: -#line 958 "seclang-parser.yy" +#line 959 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifyCPF(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2109,7 +2109,7 @@ namespace yy { break; case 50: -#line 962 "seclang-parser.yy" +#line 963 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifySSN(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2117,7 +2117,7 @@ namespace yy { break; case 51: -#line 966 "seclang-parser.yy" +#line 967 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::VerifySVNR(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2125,7 +2125,7 @@ namespace yy { break; case 52: -#line 970 "seclang-parser.yy" +#line 971 "seclang-parser.yy" { /* $$ = new operators::GsbLookup($1); */ OPERATOR_NOT_SUPPORTED("GsbLookup", yystack_[2].location); @@ -2134,7 +2134,7 @@ namespace yy { break; case 53: -#line 975 "seclang-parser.yy" +#line 976 "seclang-parser.yy" { /* $$ = new operators::Rsub($1); */ OPERATOR_NOT_SUPPORTED("Rsub", yystack_[2].location); @@ -2143,7 +2143,7 @@ namespace yy { break; case 54: -#line 980 "seclang-parser.yy" +#line 981 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Within(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2151,7 +2151,7 @@ namespace yy { break; case 55: -#line 984 "seclang-parser.yy" +#line 985 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::ContainsWord(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2159,7 +2159,7 @@ namespace yy { break; case 56: -#line 988 "seclang-parser.yy" +#line 989 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Contains(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2167,7 +2167,7 @@ namespace yy { break; case 57: -#line 992 "seclang-parser.yy" +#line 993 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::EndsWith(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2175,7 +2175,7 @@ namespace yy { break; case 58: -#line 996 "seclang-parser.yy" +#line 997 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Eq(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2183,7 +2183,7 @@ namespace yy { break; case 59: -#line 1000 "seclang-parser.yy" +#line 1001 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Ge(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2191,7 +2191,7 @@ namespace yy { break; case 60: -#line 1004 "seclang-parser.yy" +#line 1005 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Gt(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2199,7 +2199,7 @@ namespace yy { break; case 61: -#line 1008 "seclang-parser.yy" +#line 1009 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::IpMatchF(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2207,7 +2207,7 @@ namespace yy { break; case 62: -#line 1012 "seclang-parser.yy" +#line 1013 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::IpMatch(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2215,7 +2215,7 @@ namespace yy { break; case 63: -#line 1016 "seclang-parser.yy" +#line 1017 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Le(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2223,7 +2223,7 @@ namespace yy { break; case 64: -#line 1020 "seclang-parser.yy" +#line 1021 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Lt(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2231,7 +2231,7 @@ namespace yy { break; case 65: -#line 1024 "seclang-parser.yy" +#line 1025 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::PmFromFile(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2239,7 +2239,7 @@ namespace yy { break; case 66: -#line 1028 "seclang-parser.yy" +#line 1029 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Pm(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2247,7 +2247,7 @@ namespace yy { break; case 67: -#line 1032 "seclang-parser.yy" +#line 1033 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Rbl(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2255,7 +2255,7 @@ namespace yy { break; case 68: -#line 1036 "seclang-parser.yy" +#line 1037 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2263,7 +2263,7 @@ namespace yy { break; case 69: -#line 1040 "seclang-parser.yy" +#line 1041 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::StrEq(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2271,7 +2271,7 @@ namespace yy { break; case 70: -#line 1044 "seclang-parser.yy" +#line 1045 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::StrMatch(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2279,7 +2279,7 @@ namespace yy { break; case 71: -#line 1048 "seclang-parser.yy" +#line 1049 "seclang-parser.yy" { OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::BeginsWith(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } @@ -2287,7 +2287,7 @@ namespace yy { break; case 72: -#line 1052 "seclang-parser.yy" +#line 1053 "seclang-parser.yy" { #if defined(WITH_GEOIP) or defined(WITH_MAXMIND) OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr > (), new operators::GeoLookup()); @@ -2302,7 +2302,7 @@ namespace yy { break; case 74: -#line 1067 "seclang-parser.yy" +#line 1068 "seclang-parser.yy" { std::vector *a = new std::vector(); std::vector *t = new std::vector(); @@ -2336,7 +2336,7 @@ namespace yy { break; case 75: -#line 1097 "seclang-parser.yy" +#line 1098 "seclang-parser.yy" { variables::Variables *v = new variables::Variables(); for (auto &i : *yystack_[1].value.as < std::unique_ptr > > > ().get()) { @@ -2359,7 +2359,7 @@ namespace yy { break; case 76: -#line 1116 "seclang-parser.yy" +#line 1117 "seclang-parser.yy" { std::vector *a = new std::vector(); std::vector *t = new std::vector(); @@ -2370,9 +2370,7 @@ namespace yy { a->push_back(i.release()); } } - std::unique_ptr rule(new RuleWithOperator( - /* op */ NULL, - /* variables */ NULL, + std::unique_ptr rule(new RuleUnconditional( /* actions */ a, /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*yystack_[1].location.end.filename)), @@ -2380,11 +2378,11 @@ namespace yy { )); driver.addSecAction(std::move(rule)); } -#line 2384 "seclang-parser.cc" +#line 2382 "seclang-parser.cc" break; case 77: -#line 1137 "seclang-parser.yy" +#line 1136 "seclang-parser.yy" { std::string err; std::vector *a = new std::vector(); @@ -2412,11 +2410,11 @@ namespace yy { YYERROR; } } -#line 2416 "seclang-parser.cc" +#line 2414 "seclang-parser.cc" break; case 78: -#line 1165 "seclang-parser.yy" +#line 1164 "seclang-parser.yy" { bool hasDisruptive = false; std::vector *actions = new std::vector(); @@ -2473,78 +2471,78 @@ namespace yy { delete actions; } -#line 2477 "seclang-parser.cc" +#line 2475 "seclang-parser.cc" break; case 79: -#line 1222 "seclang-parser.yy" +#line 1221 "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)), /* line number */ yystack_[0].location.end.line ); } -#line 2488 "seclang-parser.cc" +#line 2486 "seclang-parser.cc" break; case 80: -#line 1229 "seclang-parser.yy" +#line 1228 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DisabledRuleEngine; } -#line 2496 "seclang-parser.cc" +#line 2494 "seclang-parser.cc" break; case 81: -#line 1233 "seclang-parser.yy" +#line 1232 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::EnabledRuleEngine; } -#line 2504 "seclang-parser.cc" +#line 2502 "seclang-parser.cc" break; case 82: -#line 1237 "seclang-parser.yy" +#line 1236 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DetectionOnlyRuleEngine; } -#line 2512 "seclang-parser.cc" +#line 2510 "seclang-parser.cc" break; case 83: -#line 1241 "seclang-parser.yy" +#line 1240 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 2520 "seclang-parser.cc" +#line 2518 "seclang-parser.cc" break; case 84: -#line 1245 "seclang-parser.yy" +#line 1244 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 2528 "seclang-parser.cc" +#line 2526 "seclang-parser.cc" break; case 85: -#line 1249 "seclang-parser.yy" +#line 1248 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 2536 "seclang-parser.cc" +#line 2534 "seclang-parser.cc" break; case 86: -#line 1253 "seclang-parser.yy" +#line 1252 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 2544 "seclang-parser.cc" +#line 2542 "seclang-parser.cc" break; case 87: -#line 1257 "seclang-parser.yy" +#line 1256 "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."); @@ -2553,259 +2551,259 @@ namespace yy { driver.m_secArgumentSeparator.m_value = yystack_[0].value.as < std::string > (); driver.m_secArgumentSeparator.m_set = true; } -#line 2557 "seclang-parser.cc" +#line 2555 "seclang-parser.cc" break; case 88: -#line 1266 "seclang-parser.yy" +#line 1265 "seclang-parser.yy" { driver.m_components.push_back(yystack_[0].value.as < std::string > ()); } -#line 2565 "seclang-parser.cc" +#line 2563 "seclang-parser.cc" break; case 89: -#line 1270 "seclang-parser.yy" +#line 1269 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecConnEngine is not yet supported."); YYERROR; } -#line 2574 "seclang-parser.cc" +#line 2572 "seclang-parser.cc" break; case 90: -#line 1275 "seclang-parser.yy" +#line 1274 "seclang-parser.yy" { } -#line 2581 "seclang-parser.cc" +#line 2579 "seclang-parser.cc" break; case 91: -#line 1278 "seclang-parser.yy" +#line 1277 "seclang-parser.yy" { driver.m_secWebAppId.m_value = yystack_[0].value.as < std::string > (); driver.m_secWebAppId.m_set = true; } -#line 2590 "seclang-parser.cc" +#line 2588 "seclang-parser.cc" break; case 92: -#line 1283 "seclang-parser.yy" +#line 1282 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecServerSignature is not supported."); YYERROR; } -#line 2599 "seclang-parser.cc" +#line 2597 "seclang-parser.cc" break; case 93: -#line 1288 "seclang-parser.yy" +#line 1287 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCacheTransformations is not supported."); YYERROR; } -#line 2608 "seclang-parser.cc" +#line 2606 "seclang-parser.cc" break; case 94: -#line 1293 "seclang-parser.yy" +#line 1292 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecDisableBackendCompression is not supported."); YYERROR; } -#line 2617 "seclang-parser.cc" +#line 2615 "seclang-parser.cc" break; case 95: -#line 1298 "seclang-parser.yy" +#line 1297 "seclang-parser.yy" { } -#line 2624 "seclang-parser.cc" +#line 2622 "seclang-parser.cc" break; case 96: -#line 1301 "seclang-parser.yy" +#line 1300 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecContentInjection is not yet supported."); YYERROR; } -#line 2633 "seclang-parser.cc" +#line 2631 "seclang-parser.cc" break; case 97: -#line 1306 "seclang-parser.yy" +#line 1305 "seclang-parser.yy" { } -#line 2640 "seclang-parser.cc" +#line 2638 "seclang-parser.cc" break; case 98: -#line 1309 "seclang-parser.yy" +#line 1308 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecChrootDir is not supported."); YYERROR; } -#line 2649 "seclang-parser.cc" +#line 2647 "seclang-parser.cc" break; case 99: -#line 1314 "seclang-parser.yy" +#line 1313 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecHashEngine is not yet supported."); YYERROR; } -#line 2658 "seclang-parser.cc" +#line 2656 "seclang-parser.cc" break; case 100: -#line 1319 "seclang-parser.yy" +#line 1318 "seclang-parser.yy" { } -#line 2665 "seclang-parser.cc" +#line 2663 "seclang-parser.cc" break; case 101: -#line 1322 "seclang-parser.yy" +#line 1321 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashKey is not yet supported."); YYERROR; } -#line 2674 "seclang-parser.cc" +#line 2672 "seclang-parser.cc" break; case 102: -#line 1327 "seclang-parser.yy" +#line 1326 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashParam is not yet supported."); YYERROR; } -#line 2683 "seclang-parser.cc" +#line 2681 "seclang-parser.cc" break; case 103: -#line 1332 "seclang-parser.yy" +#line 1331 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodRx is not yet supported."); YYERROR; } -#line 2692 "seclang-parser.cc" +#line 2690 "seclang-parser.cc" break; case 104: -#line 1337 "seclang-parser.yy" +#line 1336 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodPm is not yet supported."); YYERROR; } -#line 2701 "seclang-parser.cc" +#line 2699 "seclang-parser.cc" break; case 105: -#line 1342 "seclang-parser.yy" +#line 1341 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGsbLookupDb is not supported."); YYERROR; } -#line 2710 "seclang-parser.cc" +#line 2708 "seclang-parser.cc" break; case 106: -#line 1347 "seclang-parser.yy" +#line 1346 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGuardianLog is not supported."); YYERROR; } -#line 2719 "seclang-parser.cc" +#line 2717 "seclang-parser.cc" break; case 107: -#line 1352 "seclang-parser.yy" +#line 1351 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecInterceptOnError is not yet supported."); YYERROR; } -#line 2728 "seclang-parser.cc" +#line 2726 "seclang-parser.cc" break; case 108: -#line 1357 "seclang-parser.yy" +#line 1356 "seclang-parser.yy" { } -#line 2735 "seclang-parser.cc" +#line 2733 "seclang-parser.cc" break; case 109: -#line 1360 "seclang-parser.yy" +#line 1359 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnReadStateLimit is not yet supported."); YYERROR; } -#line 2744 "seclang-parser.cc" +#line 2742 "seclang-parser.cc" break; case 110: -#line 1365 "seclang-parser.yy" +#line 1364 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnWriteStateLimit is not yet supported."); YYERROR; } -#line 2753 "seclang-parser.cc" +#line 2751 "seclang-parser.cc" break; case 111: -#line 1370 "seclang-parser.yy" +#line 1369 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecSensorId is not yet supported."); YYERROR; } -#line 2762 "seclang-parser.cc" +#line 2760 "seclang-parser.cc" break; case 112: -#line 1375 "seclang-parser.yy" +#line 1374 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecRuleInheritance is not yet supported."); YYERROR; } -#line 2771 "seclang-parser.cc" +#line 2769 "seclang-parser.cc" break; case 113: -#line 1380 "seclang-parser.yy" +#line 1379 "seclang-parser.yy" { } -#line 2778 "seclang-parser.cc" +#line 2776 "seclang-parser.cc" break; case 114: -#line 1383 "seclang-parser.yy" +#line 1382 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecRulePerfTime is not yet supported."); YYERROR; } -#line 2787 "seclang-parser.cc" +#line 2785 "seclang-parser.cc" break; case 115: -#line 1388 "seclang-parser.yy" +#line 1387 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamInBodyInspection is not supported."); YYERROR; } -#line 2796 "seclang-parser.cc" +#line 2794 "seclang-parser.cc" break; case 116: -#line 1393 "seclang-parser.yy" +#line 1392 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamOutBodyInspection is not supported."); YYERROR; } -#line 2805 "seclang-parser.cc" +#line 2803 "seclang-parser.cc" break; case 117: -#line 1398 "seclang-parser.yy" +#line 1397 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.load(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2818,11 +2816,11 @@ namespace yy { YYERROR; } } -#line 2822 "seclang-parser.cc" +#line 2820 "seclang-parser.cc" break; case 118: -#line 1411 "seclang-parser.yy" +#line 1410 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByTag(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2835,11 +2833,11 @@ namespace yy { YYERROR; } } -#line 2839 "seclang-parser.cc" +#line 2837 "seclang-parser.cc" break; case 119: -#line 1424 "seclang-parser.yy" +#line 1423 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByMsg(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2852,11 +2850,11 @@ namespace yy { YYERROR; } } -#line 2856 "seclang-parser.cc" +#line 2854 "seclang-parser.cc" break; case 120: -#line 1437 "seclang-parser.yy" +#line 1436 "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) { @@ -2869,11 +2867,11 @@ namespace yy { YYERROR; } } -#line 2873 "seclang-parser.cc" +#line 2871 "seclang-parser.cc" break; case 121: -#line 1450 "seclang-parser.yy" +#line 1449 "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) { @@ -2886,11 +2884,11 @@ namespace yy { YYERROR; } } -#line 2890 "seclang-parser.cc" +#line 2888 "seclang-parser.cc" break; case 122: -#line 1463 "seclang-parser.yy" +#line 1462 "seclang-parser.yy" { std::string error; double ruleId; @@ -2916,11 +2914,11 @@ namespace yy { YYERROR; } } -#line 2920 "seclang-parser.cc" +#line 2918 "seclang-parser.cc" break; case 123: -#line 1489 "seclang-parser.yy" +#line 1488 "seclang-parser.yy" { std::string error; double ruleId; @@ -2947,11 +2945,11 @@ namespace yy { YYERROR; } } -#line 2951 "seclang-parser.cc" +#line 2949 "seclang-parser.cc" break; case 124: -#line 1517 "seclang-parser.yy" +#line 1516 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { driver.m_debugLog->setDebugLogLevel(atoi(yystack_[0].value.as < std::string > ().c_str())); @@ -2963,11 +2961,11 @@ namespace yy { YYERROR; } } -#line 2967 "seclang-parser.cc" +#line 2965 "seclang-parser.cc" break; case 125: -#line 1529 "seclang-parser.yy" +#line 1528 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { std::string error; @@ -2986,11 +2984,11 @@ namespace yy { YYERROR; } } -#line 2990 "seclang-parser.cc" +#line 2988 "seclang-parser.cc" break; case 126: -#line 1549 "seclang-parser.yy" +#line 1548 "seclang-parser.yy" { #if defined(WITH_GEOIP) or defined(WITH_MAXMIND) std::string err; @@ -3017,38 +3015,38 @@ namespace yy { YYERROR; #endif // WITH_GEOIP } -#line 3021 "seclang-parser.cc" +#line 3019 "seclang-parser.cc" break; case 127: -#line 1576 "seclang-parser.yy" +#line 1575 "seclang-parser.yy" { driver.m_argumentsLimit.m_set = true; driver.m_argumentsLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3030 "seclang-parser.cc" +#line 3028 "seclang-parser.cc" break; case 128: -#line 1582 "seclang-parser.yy" +#line 1581 "seclang-parser.yy" { driver.m_requestBodyLimit.m_set = true; driver.m_requestBodyLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3039 "seclang-parser.cc" +#line 3037 "seclang-parser.cc" break; case 129: -#line 1587 "seclang-parser.yy" +#line 1586 "seclang-parser.yy" { driver.m_requestBodyNoFilesLimit.m_set = true; driver.m_requestBodyNoFilesLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3048 "seclang-parser.cc" +#line 3046 "seclang-parser.cc" break; case 130: -#line 1592 "seclang-parser.yy" +#line 1591 "seclang-parser.yy" { std::stringstream ss; ss << "As of ModSecurity version 3.0, SecRequestBodyInMemoryLimit is no longer "; @@ -3057,68 +3055,68 @@ namespace yy { driver.error(yystack_[1].location, ss.str()); YYERROR; } -#line 3061 "seclang-parser.cc" +#line 3059 "seclang-parser.cc" break; case 131: -#line 1601 "seclang-parser.yy" +#line 1600 "seclang-parser.yy" { driver.m_responseBodyLimit.m_set = true; driver.m_responseBodyLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3070 "seclang-parser.cc" +#line 3068 "seclang-parser.cc" break; case 132: -#line 1606 "seclang-parser.yy" +#line 1605 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3078 "seclang-parser.cc" +#line 3076 "seclang-parser.cc" break; case 133: -#line 1610 "seclang-parser.yy" +#line 1609 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3086 "seclang-parser.cc" +#line 3084 "seclang-parser.cc" break; case 134: -#line 1614 "seclang-parser.yy" +#line 1613 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3094 "seclang-parser.cc" +#line 3092 "seclang-parser.cc" break; case 135: -#line 1618 "seclang-parser.yy" +#line 1617 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3102 "seclang-parser.cc" +#line 3100 "seclang-parser.cc" break; case 136: -#line 1622 "seclang-parser.yy" +#line 1621 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::AbortOnFailedRemoteRulesAction; } -#line 3110 "seclang-parser.cc" +#line 3108 "seclang-parser.cc" break; case 137: -#line 1626 "seclang-parser.yy" +#line 1625 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::WarnOnFailedRemoteRulesAction; } -#line 3118 "seclang-parser.cc" +#line 3116 "seclang-parser.cc" break; case 140: -#line 1640 "seclang-parser.yy" +#line 1639 "seclang-parser.yy" { std::istringstream buf(yystack_[0].value.as < std::string > ()); std::istream_iterator beg(buf), end; @@ -3130,37 +3128,37 @@ namespace yy { driver.m_responseBodyTypeToBeInspected.m_value.insert(*it); } } -#line 3134 "seclang-parser.cc" +#line 3132 "seclang-parser.cc" break; case 141: -#line 1652 "seclang-parser.yy" +#line 1651 "seclang-parser.yy" { driver.m_responseBodyTypeToBeInspected.m_set = true; driver.m_responseBodyTypeToBeInspected.m_clear = true; driver.m_responseBodyTypeToBeInspected.m_value.clear(); } -#line 3144 "seclang-parser.cc" +#line 3142 "seclang-parser.cc" break; case 142: -#line 1658 "seclang-parser.yy" +#line 1657 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 3152 "seclang-parser.cc" +#line 3150 "seclang-parser.cc" break; case 143: -#line 1662 "seclang-parser.yy" +#line 1661 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 3160 "seclang-parser.cc" +#line 3158 "seclang-parser.cc" break; case 144: -#line 1666 "seclang-parser.yy" +#line 1665 "seclang-parser.yy" { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended std::stringstream ss; @@ -3171,31 +3169,31 @@ namespace yy { YYERROR; */ } -#line 3175 "seclang-parser.cc" +#line 3173 "seclang-parser.cc" break; case 147: -#line 1687 "seclang-parser.yy" +#line 1686 "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 3186 "seclang-parser.cc" +#line 3184 "seclang-parser.cc" break; case 148: -#line 1694 "seclang-parser.yy" +#line 1693 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCookieV0Separator is not yet supported."); YYERROR; } -#line 3195 "seclang-parser.cc" +#line 3193 "seclang-parser.cc" break; case 150: -#line 1704 "seclang-parser.yy" +#line 1703 "seclang-parser.yy" { std::string error; std::vector param; @@ -3249,31 +3247,31 @@ namespace yy { } } -#line 3253 "seclang-parser.cc" +#line 3251 "seclang-parser.cc" break; case 151: -#line 1758 "seclang-parser.yy" +#line 1757 "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 3264 "seclang-parser.cc" +#line 3262 "seclang-parser.cc" break; case 152: -#line 1765 "seclang-parser.yy" +#line 1764 "seclang-parser.yy" { driver.m_httpblKey.m_set = true; driver.m_httpblKey.m_value = yystack_[0].value.as < std::string > (); } -#line 3273 "seclang-parser.cc" +#line 3271 "seclang-parser.cc" break; case 153: -#line 1773 "seclang-parser.yy" +#line 1772 "seclang-parser.yy" { std::unique_ptr > > originalList = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); std::unique_ptr>> newList(new std::vector>()); @@ -3307,2363 +3305,2363 @@ namespace yy { } yylhs.value.as < std::unique_ptr > > > () = std::move(newNewList); } -#line 3311 "seclang-parser.cc" +#line 3309 "seclang-parser.cc" break; case 154: -#line 1810 "seclang-parser.yy" +#line 1809 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); } -#line 3319 "seclang-parser.cc" +#line 3317 "seclang-parser.cc" break; case 155: -#line 1814 "seclang-parser.yy" +#line 1813 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[1].value.as < std::unique_ptr > > > ()); } -#line 3327 "seclang-parser.cc" +#line 3325 "seclang-parser.cc" break; case 156: -#line 1821 "seclang-parser.yy" +#line 1820 "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 3336 "seclang-parser.cc" +#line 3334 "seclang-parser.cc" break; case 157: -#line 1826 "seclang-parser.yy" +#line 1825 "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 3346 "seclang-parser.cc" +#line 3344 "seclang-parser.cc" break; case 158: -#line 1832 "seclang-parser.yy" +#line 1831 "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 3356 "seclang-parser.cc" +#line 3354 "seclang-parser.cc" break; case 159: -#line 1838 "seclang-parser.yy" +#line 1837 "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 3366 "seclang-parser.cc" +#line 3364 "seclang-parser.cc" break; case 160: -#line 1844 "seclang-parser.yy" +#line 1843 "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 3377 "seclang-parser.cc" +#line 3375 "seclang-parser.cc" break; case 161: -#line 1851 "seclang-parser.yy" +#line 1850 "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 3388 "seclang-parser.cc" +#line 3386 "seclang-parser.cc" break; case 162: -#line 1861 "seclang-parser.yy" +#line 1860 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3396 "seclang-parser.cc" +#line 3394 "seclang-parser.cc" break; case 163: -#line 1865 "seclang-parser.yy" +#line 1864 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3404 "seclang-parser.cc" +#line 3402 "seclang-parser.cc" break; case 164: -#line 1869 "seclang-parser.yy" +#line 1868 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_NoDictElement()); } -#line 3412 "seclang-parser.cc" +#line 3410 "seclang-parser.cc" break; case 165: -#line 1873 "seclang-parser.yy" +#line 1872 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3420 "seclang-parser.cc" +#line 3418 "seclang-parser.cc" break; case 166: -#line 1877 "seclang-parser.yy" +#line 1876 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3428 "seclang-parser.cc" +#line 3426 "seclang-parser.cc" break; case 167: -#line 1881 "seclang-parser.yy" +#line 1880 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_NoDictElement()); } -#line 3436 "seclang-parser.cc" +#line 3434 "seclang-parser.cc" break; case 168: -#line 1885 "seclang-parser.yy" +#line 1884 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3444 "seclang-parser.cc" +#line 3442 "seclang-parser.cc" break; case 169: -#line 1889 "seclang-parser.yy" +#line 1888 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3452 "seclang-parser.cc" +#line 3450 "seclang-parser.cc" break; case 170: -#line 1893 "seclang-parser.yy" +#line 1892 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_NoDictElement()); } -#line 3460 "seclang-parser.cc" +#line 3458 "seclang-parser.cc" break; case 171: -#line 1897 "seclang-parser.yy" +#line 1896 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3468 "seclang-parser.cc" +#line 3466 "seclang-parser.cc" break; case 172: -#line 1901 "seclang-parser.yy" +#line 1900 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3476 "seclang-parser.cc" +#line 3474 "seclang-parser.cc" break; case 173: -#line 1905 "seclang-parser.yy" +#line 1904 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_NoDictElement()); } -#line 3484 "seclang-parser.cc" +#line 3482 "seclang-parser.cc" break; case 174: -#line 1909 "seclang-parser.yy" +#line 1908 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3492 "seclang-parser.cc" +#line 3490 "seclang-parser.cc" break; case 175: -#line 1913 "seclang-parser.yy" +#line 1912 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3500 "seclang-parser.cc" +#line 3498 "seclang-parser.cc" break; case 176: -#line 1917 "seclang-parser.yy" +#line 1916 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_NoDictElement()); } -#line 3508 "seclang-parser.cc" +#line 3506 "seclang-parser.cc" break; case 177: -#line 1921 "seclang-parser.yy" +#line 1920 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3516 "seclang-parser.cc" +#line 3514 "seclang-parser.cc" break; case 178: -#line 1925 "seclang-parser.yy" +#line 1924 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3524 "seclang-parser.cc" +#line 3522 "seclang-parser.cc" break; case 179: -#line 1929 "seclang-parser.yy" +#line 1928 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_NoDictElement()); } -#line 3532 "seclang-parser.cc" +#line 3530 "seclang-parser.cc" break; case 180: -#line 1933 "seclang-parser.yy" +#line 1932 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3540 "seclang-parser.cc" +#line 3538 "seclang-parser.cc" break; case 181: -#line 1937 "seclang-parser.yy" +#line 1936 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3548 "seclang-parser.cc" +#line 3546 "seclang-parser.cc" break; case 182: -#line 1941 "seclang-parser.yy" +#line 1940 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_NoDictElement()); } -#line 3556 "seclang-parser.cc" +#line 3554 "seclang-parser.cc" break; case 183: -#line 1945 "seclang-parser.yy" +#line 1944 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3564 "seclang-parser.cc" +#line 3562 "seclang-parser.cc" break; case 184: -#line 1949 "seclang-parser.yy" +#line 1948 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3572 "seclang-parser.cc" +#line 3570 "seclang-parser.cc" break; case 185: -#line 1953 "seclang-parser.yy" +#line 1952 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_NoDictElement()); } -#line 3580 "seclang-parser.cc" +#line 3578 "seclang-parser.cc" break; case 186: -#line 1957 "seclang-parser.yy" +#line 1956 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3588 "seclang-parser.cc" +#line 3586 "seclang-parser.cc" break; case 187: -#line 1961 "seclang-parser.yy" +#line 1960 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3596 "seclang-parser.cc" +#line 3594 "seclang-parser.cc" break; case 188: -#line 1965 "seclang-parser.yy" +#line 1964 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_NoDictElement()); } -#line 3604 "seclang-parser.cc" +#line 3602 "seclang-parser.cc" break; case 189: -#line 1969 "seclang-parser.yy" +#line 1968 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3612 "seclang-parser.cc" +#line 3610 "seclang-parser.cc" break; case 190: -#line 1973 "seclang-parser.yy" +#line 1972 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3620 "seclang-parser.cc" +#line 3618 "seclang-parser.cc" break; case 191: -#line 1977 "seclang-parser.yy" +#line 1976 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_NoDictElement()); } -#line 3628 "seclang-parser.cc" +#line 3626 "seclang-parser.cc" break; case 192: -#line 1981 "seclang-parser.yy" +#line 1980 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3636 "seclang-parser.cc" +#line 3634 "seclang-parser.cc" break; case 193: -#line 1985 "seclang-parser.yy" +#line 1984 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3644 "seclang-parser.cc" +#line 3642 "seclang-parser.cc" break; case 194: -#line 1989 "seclang-parser.yy" +#line 1988 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_NoDictElement()); } -#line 3652 "seclang-parser.cc" +#line 3650 "seclang-parser.cc" break; case 195: -#line 1993 "seclang-parser.yy" +#line 1992 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3660 "seclang-parser.cc" +#line 3658 "seclang-parser.cc" break; case 196: -#line 1997 "seclang-parser.yy" +#line 1996 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3668 "seclang-parser.cc" +#line 3666 "seclang-parser.cc" break; case 197: -#line 2001 "seclang-parser.yy" +#line 2000 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_NoDictElement()); } -#line 3676 "seclang-parser.cc" +#line 3674 "seclang-parser.cc" break; case 198: -#line 2005 "seclang-parser.yy" +#line 2004 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3684 "seclang-parser.cc" +#line 3682 "seclang-parser.cc" break; case 199: -#line 2009 "seclang-parser.yy" +#line 2008 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3692 "seclang-parser.cc" +#line 3690 "seclang-parser.cc" break; case 200: -#line 2013 "seclang-parser.yy" +#line 2012 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_NoDictElement()); } -#line 3700 "seclang-parser.cc" +#line 3698 "seclang-parser.cc" break; case 201: -#line 2017 "seclang-parser.yy" +#line 2016 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3708 "seclang-parser.cc" +#line 3706 "seclang-parser.cc" break; case 202: -#line 2021 "seclang-parser.yy" +#line 2020 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3716 "seclang-parser.cc" +#line 3714 "seclang-parser.cc" break; case 203: -#line 2025 "seclang-parser.yy" +#line 2024 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_NoDictElement()); } -#line 3724 "seclang-parser.cc" +#line 3722 "seclang-parser.cc" break; case 204: -#line 2029 "seclang-parser.yy" +#line 2028 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3732 "seclang-parser.cc" +#line 3730 "seclang-parser.cc" break; case 205: -#line 2033 "seclang-parser.yy" +#line 2032 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3740 "seclang-parser.cc" +#line 3738 "seclang-parser.cc" break; case 206: -#line 2037 "seclang-parser.yy" +#line 2036 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_NoDictElement()); } -#line 3748 "seclang-parser.cc" +#line 3746 "seclang-parser.cc" break; case 207: -#line 2041 "seclang-parser.yy" +#line 2040 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3756 "seclang-parser.cc" +#line 3754 "seclang-parser.cc" break; case 208: -#line 2045 "seclang-parser.yy" +#line 2044 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3764 "seclang-parser.cc" +#line 3762 "seclang-parser.cc" break; case 209: -#line 2049 "seclang-parser.yy" +#line 2048 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_NoDictElement()); } -#line 3772 "seclang-parser.cc" +#line 3770 "seclang-parser.cc" break; case 210: -#line 2053 "seclang-parser.yy" +#line 2052 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3780 "seclang-parser.cc" +#line 3778 "seclang-parser.cc" break; case 211: -#line 2057 "seclang-parser.yy" +#line 2056 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3788 "seclang-parser.cc" +#line 3786 "seclang-parser.cc" break; case 212: -#line 2061 "seclang-parser.yy" +#line 2060 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_NoDictElement()); } -#line 3796 "seclang-parser.cc" +#line 3794 "seclang-parser.cc" break; case 213: -#line 2065 "seclang-parser.yy" +#line 2064 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3804 "seclang-parser.cc" +#line 3802 "seclang-parser.cc" break; case 214: -#line 2069 "seclang-parser.yy" +#line 2068 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3812 "seclang-parser.cc" +#line 3810 "seclang-parser.cc" break; case 215: -#line 2073 "seclang-parser.yy" +#line 2072 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV")); } -#line 3820 "seclang-parser.cc" +#line 3818 "seclang-parser.cc" break; case 216: -#line 2077 "seclang-parser.yy" +#line 2076 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML("XML:" + yystack_[0].value.as < std::string > ())); } -#line 3828 "seclang-parser.cc" +#line 3826 "seclang-parser.cc" break; case 217: -#line 2081 "seclang-parser.yy" +#line 2080 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML("XML:" + yystack_[0].value.as < std::string > ())); } -#line 3836 "seclang-parser.cc" +#line 3834 "seclang-parser.cc" break; case 218: -#line 2085 "seclang-parser.yy" +#line 2084 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML_NoDictElement()); } -#line 3844 "seclang-parser.cc" +#line 3842 "seclang-parser.cc" break; case 219: -#line 2089 "seclang-parser.yy" +#line 2088 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3852 "seclang-parser.cc" +#line 3850 "seclang-parser.cc" break; case 220: -#line 2093 "seclang-parser.yy" +#line 2092 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3860 "seclang-parser.cc" +#line 3858 "seclang-parser.cc" break; case 221: -#line 2097 "seclang-parser.yy" +#line 2096 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_NoDictElement()); } -#line 3868 "seclang-parser.cc" +#line 3866 "seclang-parser.cc" break; case 222: -#line 2101 "seclang-parser.yy" +#line 2100 "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 3876 "seclang-parser.cc" +#line 3874 "seclang-parser.cc" break; case 223: -#line 2105 "seclang-parser.yy" +#line 2104 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3884 "seclang-parser.cc" +#line 3882 "seclang-parser.cc" break; case 224: -#line 2109 "seclang-parser.yy" +#line 2108 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3892 "seclang-parser.cc" +#line 3890 "seclang-parser.cc" break; case 225: -#line 2113 "seclang-parser.yy" +#line 2112 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_NoDictElement()); } -#line 3900 "seclang-parser.cc" +#line 3898 "seclang-parser.cc" break; case 226: -#line 2117 "seclang-parser.yy" +#line 2116 "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 3908 "seclang-parser.cc" +#line 3906 "seclang-parser.cc" break; case 227: -#line 2121 "seclang-parser.yy" +#line 2120 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3916 "seclang-parser.cc" +#line 3914 "seclang-parser.cc" break; case 228: -#line 2125 "seclang-parser.yy" +#line 2124 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3924 "seclang-parser.cc" +#line 3922 "seclang-parser.cc" break; case 229: -#line 2129 "seclang-parser.yy" +#line 2128 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_NoDictElement()); } -#line 3932 "seclang-parser.cc" +#line 3930 "seclang-parser.cc" break; case 230: -#line 2133 "seclang-parser.yy" +#line 2132 "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 3940 "seclang-parser.cc" +#line 3938 "seclang-parser.cc" break; case 231: -#line 2137 "seclang-parser.yy" +#line 2136 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3948 "seclang-parser.cc" +#line 3946 "seclang-parser.cc" break; case 232: -#line 2141 "seclang-parser.yy" +#line 2140 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3956 "seclang-parser.cc" +#line 3954 "seclang-parser.cc" break; case 233: -#line 2145 "seclang-parser.yy" +#line 2144 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_NoDictElement()); } -#line 3964 "seclang-parser.cc" +#line 3962 "seclang-parser.cc" break; case 234: -#line 2149 "seclang-parser.yy" +#line 2148 "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 3972 "seclang-parser.cc" +#line 3970 "seclang-parser.cc" break; case 235: -#line 2153 "seclang-parser.yy" +#line 2152 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3980 "seclang-parser.cc" +#line 3978 "seclang-parser.cc" break; case 236: -#line 2157 "seclang-parser.yy" +#line 2156 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3988 "seclang-parser.cc" +#line 3986 "seclang-parser.cc" break; case 237: -#line 2161 "seclang-parser.yy" +#line 2160 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_NoDictElement()); } -#line 3996 "seclang-parser.cc" +#line 3994 "seclang-parser.cc" break; case 238: -#line 2165 "seclang-parser.yy" +#line 2164 "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 4004 "seclang-parser.cc" +#line 4002 "seclang-parser.cc" break; case 239: -#line 2169 "seclang-parser.yy" +#line 2168 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4012 "seclang-parser.cc" +#line 4010 "seclang-parser.cc" break; case 240: -#line 2173 "seclang-parser.yy" +#line 2172 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4020 "seclang-parser.cc" +#line 4018 "seclang-parser.cc" break; case 241: -#line 2177 "seclang-parser.yy" +#line 2176 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_NoDictElement()); } -#line 4028 "seclang-parser.cc" +#line 4026 "seclang-parser.cc" break; case 242: -#line 2181 "seclang-parser.yy" +#line 2180 "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 4036 "seclang-parser.cc" +#line 4034 "seclang-parser.cc" break; case 243: -#line 2185 "seclang-parser.yy" +#line 2184 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4044 "seclang-parser.cc" +#line 4042 "seclang-parser.cc" break; case 244: -#line 2189 "seclang-parser.yy" +#line 2188 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4052 "seclang-parser.cc" +#line 4050 "seclang-parser.cc" break; case 245: -#line 2193 "seclang-parser.yy" +#line 2192 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_NoDictElement()); } -#line 4060 "seclang-parser.cc" +#line 4058 "seclang-parser.cc" break; case 246: -#line 2197 "seclang-parser.yy" +#line 2196 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4068 "seclang-parser.cc" +#line 4066 "seclang-parser.cc" break; case 247: -#line 2201 "seclang-parser.yy" +#line 2200 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4076 "seclang-parser.cc" +#line 4074 "seclang-parser.cc" break; case 248: -#line 2205 "seclang-parser.yy" +#line 2204 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_NoDictElement()); } -#line 4084 "seclang-parser.cc" +#line 4082 "seclang-parser.cc" break; case 249: -#line 2209 "seclang-parser.yy" +#line 2208 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4092 "seclang-parser.cc" +#line 4090 "seclang-parser.cc" break; case 250: -#line 2213 "seclang-parser.yy" +#line 2212 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4100 "seclang-parser.cc" +#line 4098 "seclang-parser.cc" break; case 251: -#line 2217 "seclang-parser.yy" +#line 2216 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_NoDictElement()); } -#line 4108 "seclang-parser.cc" +#line 4106 "seclang-parser.cc" break; case 252: -#line 2222 "seclang-parser.yy" +#line 2221 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4116 "seclang-parser.cc" +#line 4114 "seclang-parser.cc" break; case 253: -#line 2226 "seclang-parser.yy" +#line 2225 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4124 "seclang-parser.cc" +#line 4122 "seclang-parser.cc" break; case 254: -#line 2230 "seclang-parser.yy" +#line 2229 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_NoDictElement()); } -#line 4132 "seclang-parser.cc" +#line 4130 "seclang-parser.cc" break; case 255: -#line 2235 "seclang-parser.yy" +#line 2234 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4140 "seclang-parser.cc" +#line 4138 "seclang-parser.cc" break; case 256: -#line 2239 "seclang-parser.yy" +#line 2238 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4148 "seclang-parser.cc" +#line 4146 "seclang-parser.cc" break; case 257: -#line 2243 "seclang-parser.yy" +#line 2242 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_NoDictElement()); } -#line 4156 "seclang-parser.cc" +#line 4154 "seclang-parser.cc" break; case 258: -#line 2248 "seclang-parser.yy" +#line 2247 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentType()); } -#line 4164 "seclang-parser.cc" +#line 4162 "seclang-parser.cc" break; case 259: -#line 2253 "seclang-parser.yy" +#line 2252 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4172 "seclang-parser.cc" +#line 4170 "seclang-parser.cc" break; case 260: -#line 2257 "seclang-parser.yy" +#line 2256 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4180 "seclang-parser.cc" +#line 4178 "seclang-parser.cc" break; case 261: -#line 2261 "seclang-parser.yy" +#line 2260 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_NoDictElement()); } -#line 4188 "seclang-parser.cc" +#line 4186 "seclang-parser.cc" break; case 262: -#line 2265 "seclang-parser.yy" +#line 2264 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsCombinedSize()); } -#line 4196 "seclang-parser.cc" +#line 4194 "seclang-parser.cc" break; case 263: -#line 2269 "seclang-parser.yy" +#line 2268 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::AuthType()); } -#line 4204 "seclang-parser.cc" +#line 4202 "seclang-parser.cc" break; case 264: -#line 2273 "seclang-parser.yy" +#line 2272 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesCombinedSize()); } -#line 4212 "seclang-parser.cc" +#line 4210 "seclang-parser.cc" break; case 265: -#line 2277 "seclang-parser.yy" +#line 2276 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequest()); } -#line 4220 "seclang-parser.cc" +#line 4218 "seclang-parser.cc" break; case 266: -#line 2281 "seclang-parser.yy" +#line 2280 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequestLength()); } -#line 4228 "seclang-parser.cc" +#line 4226 "seclang-parser.cc" break; case 267: -#line 2285 "seclang-parser.yy" +#line 2284 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::InboundDataError()); } -#line 4236 "seclang-parser.cc" +#line 4234 "seclang-parser.cc" break; case 268: -#line 2289 "seclang-parser.yy" +#line 2288 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVar()); } -#line 4244 "seclang-parser.cc" +#line 4242 "seclang-parser.cc" break; case 269: -#line 2293 "seclang-parser.yy" +#line 2292 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarName()); } -#line 4252 "seclang-parser.cc" +#line 4250 "seclang-parser.cc" break; case 270: -#line 2297 "seclang-parser.yy" +#line 2296 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryQuoted()); } -#line 4260 "seclang-parser.cc" +#line 4258 "seclang-parser.cc" break; case 271: -#line 2301 "seclang-parser.yy" +#line 2300 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryWhiteSpace()); } -#line 4268 "seclang-parser.cc" +#line 4266 "seclang-parser.cc" break; case 272: -#line 2305 "seclang-parser.yy" +#line 2304 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartCrlfLFLines()); } -#line 4276 "seclang-parser.cc" +#line 4274 "seclang-parser.cc" break; case 273: -#line 2309 "seclang-parser.yy" +#line 2308 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateAfter()); } -#line 4284 "seclang-parser.cc" +#line 4282 "seclang-parser.cc" break; case 274: -#line 2313 "seclang-parser.yy" +#line 2312 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateBefore()); } -#line 4292 "seclang-parser.cc" +#line 4290 "seclang-parser.cc" break; case 275: -#line 2317 "seclang-parser.yy" +#line 2316 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartFileLimitExceeded()); } -#line 4300 "seclang-parser.cc" +#line 4298 "seclang-parser.cc" break; case 276: -#line 2321 "seclang-parser.yy" +#line 2320 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartHeaderFolding()); } -#line 4308 "seclang-parser.cc" +#line 4306 "seclang-parser.cc" break; case 277: -#line 2325 "seclang-parser.yy" +#line 2324 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidHeaderFolding()); } -#line 4316 "seclang-parser.cc" +#line 4314 "seclang-parser.cc" break; case 278: -#line 2329 "seclang-parser.yy" +#line 2328 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidPart()); } -#line 4324 "seclang-parser.cc" +#line 4322 "seclang-parser.cc" break; case 279: -#line 2333 "seclang-parser.yy" +#line 2332 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidQuoting()); } -#line 4332 "seclang-parser.cc" +#line 4330 "seclang-parser.cc" break; case 280: -#line 2337 "seclang-parser.yy" +#line 2336 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartLFLine()); } -#line 4340 "seclang-parser.cc" +#line 4338 "seclang-parser.cc" break; case 281: -#line 2341 "seclang-parser.yy" +#line 2340 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4348 "seclang-parser.cc" +#line 4346 "seclang-parser.cc" break; case 282: -#line 2345 "seclang-parser.yy" +#line 2344 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4356 "seclang-parser.cc" +#line 4354 "seclang-parser.cc" break; case 283: -#line 2349 "seclang-parser.yy" +#line 2348 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartStrictError()); } -#line 4364 "seclang-parser.cc" +#line 4362 "seclang-parser.cc" break; case 284: -#line 2353 "seclang-parser.yy" +#line 2352 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartUnmatchedBoundary()); } -#line 4372 "seclang-parser.cc" +#line 4370 "seclang-parser.cc" break; case 285: -#line 2357 "seclang-parser.yy" +#line 2356 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::OutboundDataError()); } -#line 4380 "seclang-parser.cc" +#line 4378 "seclang-parser.cc" break; case 286: -#line 2361 "seclang-parser.yy" +#line 2360 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::PathInfo()); } -#line 4388 "seclang-parser.cc" +#line 4386 "seclang-parser.cc" break; case 287: -#line 2365 "seclang-parser.yy" +#line 2364 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::QueryString()); } -#line 4396 "seclang-parser.cc" +#line 4394 "seclang-parser.cc" break; case 288: -#line 2369 "seclang-parser.yy" +#line 2368 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteAddr()); } -#line 4404 "seclang-parser.cc" +#line 4402 "seclang-parser.cc" break; case 289: -#line 2373 "seclang-parser.yy" +#line 2372 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteHost()); } -#line 4412 "seclang-parser.cc" +#line 4410 "seclang-parser.cc" break; case 290: -#line 2377 "seclang-parser.yy" +#line 2376 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemotePort()); } -#line 4420 "seclang-parser.cc" +#line 4418 "seclang-parser.cc" break; case 291: -#line 2381 "seclang-parser.yy" +#line 2380 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyError()); } -#line 4428 "seclang-parser.cc" +#line 4426 "seclang-parser.cc" break; case 292: -#line 2385 "seclang-parser.yy" +#line 2384 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyErrorMsg()); } -#line 4436 "seclang-parser.cc" +#line 4434 "seclang-parser.cc" break; case 293: -#line 2389 "seclang-parser.yy" +#line 2388 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessor()); } -#line 4444 "seclang-parser.cc" +#line 4442 "seclang-parser.cc" break; case 294: -#line 2393 "seclang-parser.yy" +#line 2392 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorError()); } -#line 4452 "seclang-parser.cc" +#line 4450 "seclang-parser.cc" break; case 295: -#line 2397 "seclang-parser.yy" +#line 2396 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorErrorMsg()); } -#line 4460 "seclang-parser.cc" +#line 4458 "seclang-parser.cc" break; case 296: -#line 2401 "seclang-parser.yy" +#line 2400 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBasename()); } -#line 4468 "seclang-parser.cc" +#line 4466 "seclang-parser.cc" break; case 297: -#line 2405 "seclang-parser.yy" +#line 2404 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBody()); } -#line 4476 "seclang-parser.cc" +#line 4474 "seclang-parser.cc" break; case 298: -#line 2409 "seclang-parser.yy" +#line 2408 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBodyLength()); } -#line 4484 "seclang-parser.cc" +#line 4482 "seclang-parser.cc" break; case 299: -#line 2413 "seclang-parser.yy" +#line 2412 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestFilename()); } -#line 4492 "seclang-parser.cc" +#line 4490 "seclang-parser.cc" break; case 300: -#line 2417 "seclang-parser.yy" +#line 2416 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestLine()); } -#line 4500 "seclang-parser.cc" +#line 4498 "seclang-parser.cc" break; case 301: -#line 2421 "seclang-parser.yy" +#line 2420 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestMethod()); } -#line 4508 "seclang-parser.cc" +#line 4506 "seclang-parser.cc" break; case 302: -#line 2425 "seclang-parser.yy" +#line 2424 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestProtocol()); } -#line 4516 "seclang-parser.cc" +#line 4514 "seclang-parser.cc" break; case 303: -#line 2429 "seclang-parser.yy" +#line 2428 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURI()); } -#line 4524 "seclang-parser.cc" +#line 4522 "seclang-parser.cc" break; case 304: -#line 2433 "seclang-parser.yy" +#line 2432 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURIRaw()); } -#line 4532 "seclang-parser.cc" +#line 4530 "seclang-parser.cc" break; case 305: -#line 2437 "seclang-parser.yy" +#line 2436 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseBody()); } -#line 4540 "seclang-parser.cc" +#line 4538 "seclang-parser.cc" break; case 306: -#line 2441 "seclang-parser.yy" +#line 2440 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentLength()); } -#line 4548 "seclang-parser.cc" +#line 4546 "seclang-parser.cc" break; case 307: -#line 2445 "seclang-parser.yy" +#line 2444 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseProtocol()); } -#line 4556 "seclang-parser.cc" +#line 4554 "seclang-parser.cc" break; case 308: -#line 2449 "seclang-parser.yy" +#line 2448 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseStatus()); } -#line 4564 "seclang-parser.cc" +#line 4562 "seclang-parser.cc" break; case 309: -#line 2453 "seclang-parser.yy" +#line 2452 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerAddr()); } -#line 4572 "seclang-parser.cc" +#line 4570 "seclang-parser.cc" break; case 310: -#line 2457 "seclang-parser.yy" +#line 2456 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerName()); } -#line 4580 "seclang-parser.cc" +#line 4578 "seclang-parser.cc" break; case 311: -#line 2461 "seclang-parser.yy" +#line 2460 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerPort()); } -#line 4588 "seclang-parser.cc" +#line 4586 "seclang-parser.cc" break; case 312: -#line 2465 "seclang-parser.yy" +#line 2464 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::SessionID()); } -#line 4596 "seclang-parser.cc" +#line 4594 "seclang-parser.cc" break; case 313: -#line 2469 "seclang-parser.yy" +#line 2468 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UniqueID()); } -#line 4604 "seclang-parser.cc" +#line 4602 "seclang-parser.cc" break; case 314: -#line 2473 "seclang-parser.yy" +#line 2472 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UrlEncodedError()); } -#line 4612 "seclang-parser.cc" +#line 4610 "seclang-parser.cc" break; case 315: -#line 2477 "seclang-parser.yy" +#line 2476 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UserID()); } -#line 4620 "seclang-parser.cc" +#line 4618 "seclang-parser.cc" break; case 316: -#line 2481 "seclang-parser.yy" +#line 2480 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4628 "seclang-parser.cc" +#line 4626 "seclang-parser.cc" break; case 317: -#line 2485 "seclang-parser.yy" +#line 2484 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4636 "seclang-parser.cc" +#line 4634 "seclang-parser.cc" break; case 318: -#line 2489 "seclang-parser.yy" +#line 2488 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::WebAppId()); } -#line 4644 "seclang-parser.cc" +#line 4642 "seclang-parser.cc" break; case 319: -#line 2493 "seclang-parser.yy" +#line 2492 "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 4655 "seclang-parser.cc" +#line 4653 "seclang-parser.cc" break; case 320: -#line 2501 "seclang-parser.yy" +#line 2500 "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 4666 "seclang-parser.cc" +#line 4664 "seclang-parser.cc" break; case 321: -#line 2508 "seclang-parser.yy" +#line 2507 "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 4677 "seclang-parser.cc" +#line 4675 "seclang-parser.cc" break; case 322: -#line 2515 "seclang-parser.yy" +#line 2514 "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 4688 "seclang-parser.cc" +#line 4686 "seclang-parser.cc" break; case 323: -#line 2522 "seclang-parser.yy" +#line 2521 "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 4699 "seclang-parser.cc" +#line 4697 "seclang-parser.cc" break; case 324: -#line 2529 "seclang-parser.yy" +#line 2528 "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 4710 "seclang-parser.cc" +#line 4708 "seclang-parser.cc" break; case 325: -#line 2536 "seclang-parser.yy" +#line 2535 "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 4721 "seclang-parser.cc" +#line 4719 "seclang-parser.cc" break; case 326: -#line 2543 "seclang-parser.yy" +#line 2542 "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 4732 "seclang-parser.cc" +#line 4730 "seclang-parser.cc" break; case 327: -#line 2550 "seclang-parser.yy" +#line 2549 "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 4743 "seclang-parser.cc" +#line 4741 "seclang-parser.cc" break; case 328: -#line 2557 "seclang-parser.yy" +#line 2556 "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 4754 "seclang-parser.cc" +#line 4752 "seclang-parser.cc" break; case 329: -#line 2564 "seclang-parser.yy" +#line 2563 "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 4765 "seclang-parser.cc" +#line 4763 "seclang-parser.cc" break; case 330: -#line 2571 "seclang-parser.yy" +#line 2570 "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 4776 "seclang-parser.cc" +#line 4774 "seclang-parser.cc" break; case 331: -#line 2578 "seclang-parser.yy" +#line 2577 "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 4787 "seclang-parser.cc" +#line 4785 "seclang-parser.cc" break; case 332: -#line 2588 "seclang-parser.yy" +#line 2587 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Accuracy(yystack_[0].value.as < std::string > ())); } -#line 4795 "seclang-parser.cc" +#line 4793 "seclang-parser.cc" break; case 333: -#line 2592 "seclang-parser.yy" +#line 2591 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Allow(yystack_[0].value.as < std::string > ())); } -#line 4803 "seclang-parser.cc" +#line 4801 "seclang-parser.cc" break; case 334: -#line 2596 "seclang-parser.yy" +#line 2595 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Append", yystack_[1].location); } -#line 4811 "seclang-parser.cc" +#line 4809 "seclang-parser.cc" break; case 335: -#line 2600 "seclang-parser.yy" +#line 2599 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::AuditLog(yystack_[0].value.as < std::string > ())); } -#line 4819 "seclang-parser.cc" +#line 4817 "seclang-parser.cc" break; case 336: -#line 2604 "seclang-parser.yy" +#line 2603 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Block(yystack_[0].value.as < std::string > ())); } -#line 4827 "seclang-parser.cc" +#line 4825 "seclang-parser.cc" break; case 337: -#line 2608 "seclang-parser.yy" +#line 2607 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Capture(yystack_[0].value.as < std::string > ())); } -#line 4835 "seclang-parser.cc" +#line 4833 "seclang-parser.cc" break; case 338: -#line 2612 "seclang-parser.yy" +#line 2611 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Chain(yystack_[0].value.as < std::string > ())); } -#line 4843 "seclang-parser.cc" +#line 4841 "seclang-parser.cc" break; case 339: -#line 2616 "seclang-parser.yy" +#line 2615 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("CtlAuditEngine", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[1].value.as < std::string > ())); } -#line 4852 "seclang-parser.cc" +#line 4850 "seclang-parser.cc" break; case 340: -#line 2621 "seclang-parser.yy" +#line 2620 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("CtlAuditEngine", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[1].value.as < std::string > ())); } -#line 4861 "seclang-parser.cc" +#line 4859 "seclang-parser.cc" break; case 341: -#line 2626 "seclang-parser.yy" +#line 2625 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("CtlAuditEngine", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[1].value.as < std::string > ())); } -#line 4870 "seclang-parser.cc" +#line 4868 "seclang-parser.cc" break; case 342: -#line 2631 "seclang-parser.yy" +#line 2630 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditLogParts(yystack_[0].value.as < std::string > ())); } -#line 4878 "seclang-parser.cc" +#line 4876 "seclang-parser.cc" break; case 343: -#line 2635 "seclang-parser.yy" +#line 2634 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorJSON(yystack_[0].value.as < std::string > ())); } -#line 4886 "seclang-parser.cc" +#line 4884 "seclang-parser.cc" break; case 344: -#line 2639 "seclang-parser.yy" +#line 2638 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorXML(yystack_[0].value.as < std::string > ())); } -#line 4894 "seclang-parser.cc" +#line 4892 "seclang-parser.cc" break; case 345: -#line 2643 "seclang-parser.yy" +#line 2642 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorURLENCODED(yystack_[0].value.as < std::string > ())); } -#line 4902 "seclang-parser.cc" +#line 4900 "seclang-parser.cc" break; case 346: -#line 2647 "seclang-parser.yy" +#line 2646 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("CtlForceReequestBody", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[1].value.as < std::string > ())); } -#line 4911 "seclang-parser.cc" +#line 4909 "seclang-parser.cc" break; case 347: -#line 2652 "seclang-parser.yy" +#line 2651 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("CtlForceReequestBody", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[1].value.as < std::string > ())); } -#line 4920 "seclang-parser.cc" +#line 4918 "seclang-parser.cc" break; case 348: -#line 2657 "seclang-parser.yy" +#line 2656 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "true")); } -#line 4928 "seclang-parser.cc" +#line 4926 "seclang-parser.cc" break; case 349: -#line 2661 "seclang-parser.yy" +#line 2660 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "false")); } -#line 4936 "seclang-parser.cc" +#line 4934 "seclang-parser.cc" break; case 350: -#line 2665 "seclang-parser.yy" +#line 2664 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=on")); } -#line 4944 "seclang-parser.cc" +#line 4942 "seclang-parser.cc" break; case 351: -#line 2669 "seclang-parser.yy" +#line 2668 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=off")); } -#line 4952 "seclang-parser.cc" +#line 4950 "seclang-parser.cc" break; case 352: -#line 2673 "seclang-parser.yy" +#line 2672 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=detectiononly")); } -#line 4960 "seclang-parser.cc" +#line 4958 "seclang-parser.cc" break; case 353: -#line 2677 "seclang-parser.yy" +#line 2676 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveById(yystack_[0].value.as < std::string > ())); } -#line 4968 "seclang-parser.cc" +#line 4966 "seclang-parser.cc" break; case 354: -#line 2681 "seclang-parser.yy" +#line 2680 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveByTag(yystack_[0].value.as < std::string > ())); } -#line 4976 "seclang-parser.cc" +#line 4974 "seclang-parser.cc" break; case 355: -#line 2685 "seclang-parser.yy" +#line 2684 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetById(yystack_[0].value.as < std::string > ())); } -#line 4984 "seclang-parser.cc" +#line 4982 "seclang-parser.cc" break; case 356: -#line 2689 "seclang-parser.yy" +#line 2688 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetByTag(yystack_[0].value.as < std::string > ())); } -#line 4992 "seclang-parser.cc" +#line 4990 "seclang-parser.cc" break; case 357: -#line 2693 "seclang-parser.yy" +#line 2692 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Deny(yystack_[0].value.as < std::string > ())); } -#line 5000 "seclang-parser.cc" +#line 4998 "seclang-parser.cc" break; case 358: -#line 2697 "seclang-parser.yy" +#line 2696 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("DeprecateVar", yystack_[1].location); } -#line 5008 "seclang-parser.cc" +#line 5006 "seclang-parser.cc" break; case 359: -#line 2701 "seclang-parser.yy" +#line 2700 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Drop(yystack_[0].value.as < std::string > ())); } -#line 5016 "seclang-parser.cc" +#line 5014 "seclang-parser.cc" break; case 360: -#line 2705 "seclang-parser.yy" +#line 2704 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Exec(yystack_[0].value.as < std::string > ())); } -#line 5024 "seclang-parser.cc" +#line 5022 "seclang-parser.cc" break; case 361: -#line 2709 "seclang-parser.yy" +#line 2708 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("ExpireVar", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[0].value.as < std::string > ())); } -#line 5033 "seclang-parser.cc" +#line 5031 "seclang-parser.cc" break; case 362: -#line 2714 "seclang-parser.yy" +#line 2713 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::RuleId(yystack_[0].value.as < std::string > ())); } -#line 5041 "seclang-parser.cc" +#line 5039 "seclang-parser.cc" break; case 363: -#line 2718 "seclang-parser.yy" +#line 2717 "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 5049 "seclang-parser.cc" +#line 5047 "seclang-parser.cc" break; case 364: -#line 2722 "seclang-parser.yy" +#line 2721 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::LogData(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5057 "seclang-parser.cc" +#line 5055 "seclang-parser.cc" break; case 365: -#line 2726 "seclang-parser.yy" +#line 2725 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Log(yystack_[0].value.as < std::string > ())); } -#line 5065 "seclang-parser.cc" +#line 5063 "seclang-parser.cc" break; case 366: -#line 2730 "seclang-parser.yy" +#line 2729 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Maturity(yystack_[0].value.as < std::string > ())); } -#line 5073 "seclang-parser.cc" +#line 5071 "seclang-parser.cc" break; case 367: -#line 2734 "seclang-parser.yy" +#line 2733 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Msg(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5081 "seclang-parser.cc" +#line 5079 "seclang-parser.cc" break; case 368: -#line 2738 "seclang-parser.yy" +#line 2737 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::MultiMatch(yystack_[0].value.as < std::string > ())); } -#line 5089 "seclang-parser.cc" +#line 5087 "seclang-parser.cc" break; case 369: -#line 2742 "seclang-parser.yy" +#line 2741 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoAuditLog(yystack_[0].value.as < std::string > ())); } -#line 5097 "seclang-parser.cc" +#line 5095 "seclang-parser.cc" break; case 370: -#line 2746 "seclang-parser.yy" +#line 2745 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoLog(yystack_[0].value.as < std::string > ())); } -#line 5105 "seclang-parser.cc" +#line 5103 "seclang-parser.cc" break; case 371: -#line 2750 "seclang-parser.yy" +#line 2749 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Pass(yystack_[0].value.as < std::string > ())); } -#line 5113 "seclang-parser.cc" +#line 5111 "seclang-parser.cc" break; case 372: -#line 2754 "seclang-parser.yy" +#line 2753 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Pause", yystack_[1].location); } -#line 5121 "seclang-parser.cc" +#line 5119 "seclang-parser.cc" break; case 373: -#line 2758 "seclang-parser.yy" +#line 2757 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Phase(yystack_[0].value.as < std::string > ())); } -#line 5129 "seclang-parser.cc" +#line 5127 "seclang-parser.cc" break; case 374: -#line 2762 "seclang-parser.yy" +#line 2761 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Prepend", yystack_[1].location); } -#line 5137 "seclang-parser.cc" +#line 5135 "seclang-parser.cc" break; case 375: -#line 2766 "seclang-parser.yy" +#line 2765 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Proxy", yystack_[1].location); } -#line 5145 "seclang-parser.cc" +#line 5143 "seclang-parser.cc" break; case 376: -#line 2770 "seclang-parser.yy" +#line 2769 "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 5153 "seclang-parser.cc" +#line 5151 "seclang-parser.cc" break; case 377: -#line 2774 "seclang-parser.yy" +#line 2773 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Rev(yystack_[0].value.as < std::string > ())); } -#line 5161 "seclang-parser.cc" +#line 5159 "seclang-parser.cc" break; case 378: -#line 2778 "seclang-parser.yy" +#line 2777 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseArg", yystack_[1].location); } -#line 5169 "seclang-parser.cc" +#line 5167 "seclang-parser.cc" break; case 379: -#line 2782 "seclang-parser.yy" +#line 2781 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseMatched", yystack_[1].location); } -#line 5177 "seclang-parser.cc" +#line 5175 "seclang-parser.cc" break; case 380: -#line 2786 "seclang-parser.yy" +#line 2785 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseMatchedBytes", yystack_[1].location); } -#line 5185 "seclang-parser.cc" +#line 5183 "seclang-parser.cc" break; case 381: -#line 2790 "seclang-parser.yy" +#line 2789 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseRequestHeader", yystack_[1].location); } -#line 5193 "seclang-parser.cc" +#line 5191 "seclang-parser.cc" break; case 382: -#line 2794 "seclang-parser.yy" +#line 2793 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseResponseHeader", yystack_[1].location); } -#line 5201 "seclang-parser.cc" +#line 5199 "seclang-parser.cc" break; case 383: -#line 2798 "seclang-parser.yy" +#line 2797 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetENV(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5209 "seclang-parser.cc" +#line 5207 "seclang-parser.cc" break; case 384: -#line 2802 "seclang-parser.yy" +#line 2801 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetRSC(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5217 "seclang-parser.cc" +#line 5215 "seclang-parser.cc" break; case 385: -#line 2806 "seclang-parser.yy" +#line 2805 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetSID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5225 "seclang-parser.cc" +#line 5223 "seclang-parser.cc" break; case 386: -#line 2810 "seclang-parser.yy" +#line 2809 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetUID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5233 "seclang-parser.cc" +#line 5231 "seclang-parser.cc" break; case 387: -#line 2814 "seclang-parser.yy" +#line 2813 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > () = std::move(yystack_[0].value.as < std::unique_ptr > ()); } -#line 5241 "seclang-parser.cc" +#line 5239 "seclang-parser.cc" break; case 388: -#line 2818 "seclang-parser.yy" +#line 2817 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Severity(yystack_[0].value.as < std::string > ())); } -#line 5249 "seclang-parser.cc" +#line 5247 "seclang-parser.cc" break; case 389: -#line 2822 "seclang-parser.yy" +#line 2821 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Skip(yystack_[0].value.as < std::string > ())); } -#line 5257 "seclang-parser.cc" +#line 5255 "seclang-parser.cc" break; case 390: -#line 2826 "seclang-parser.yy" +#line 2825 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SkipAfter(yystack_[0].value.as < std::string > ())); } -#line 5265 "seclang-parser.cc" +#line 5263 "seclang-parser.cc" break; case 391: -#line 2830 "seclang-parser.yy" +#line 2829 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::data::Status(yystack_[0].value.as < std::string > ())); } -#line 5273 "seclang-parser.cc" +#line 5271 "seclang-parser.cc" break; case 392: -#line 2834 "seclang-parser.yy" +#line 2833 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Tag(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5281 "seclang-parser.cc" +#line 5279 "seclang-parser.cc" break; case 393: -#line 2838 "seclang-parser.yy" +#line 2837 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Ver(yystack_[0].value.as < std::string > ())); } -#line 5289 "seclang-parser.cc" +#line 5287 "seclang-parser.cc" break; case 394: -#line 2842 "seclang-parser.yy" +#line 2841 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::XmlNS(yystack_[0].value.as < std::string > ())); } -#line 5297 "seclang-parser.cc" +#line 5295 "seclang-parser.cc" break; case 395: -#line 2846 "seclang-parser.yy" +#line 2845 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityZero7bit(yystack_[0].value.as < std::string > ())); } -#line 5305 "seclang-parser.cc" +#line 5303 "seclang-parser.cc" break; case 396: -#line 2850 "seclang-parser.yy" +#line 2849 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityOdd7bit(yystack_[0].value.as < std::string > ())); } -#line 5313 "seclang-parser.cc" +#line 5311 "seclang-parser.cc" break; case 397: -#line 2854 "seclang-parser.yy" +#line 2853 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityEven7bit(yystack_[0].value.as < std::string > ())); } -#line 5321 "seclang-parser.cc" +#line 5319 "seclang-parser.cc" break; case 398: -#line 2858 "seclang-parser.yy" +#line 2857 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::SqlHexDecode(yystack_[0].value.as < std::string > ())); } -#line 5329 "seclang-parser.cc" +#line 5327 "seclang-parser.cc" break; case 399: -#line 2862 "seclang-parser.yy" +#line 2861 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Encode(yystack_[0].value.as < std::string > ())); } -#line 5337 "seclang-parser.cc" +#line 5335 "seclang-parser.cc" break; case 400: -#line 2866 "seclang-parser.yy" +#line 2865 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Decode(yystack_[0].value.as < std::string > ())); } -#line 5345 "seclang-parser.cc" +#line 5343 "seclang-parser.cc" break; case 401: -#line 2870 "seclang-parser.yy" +#line 2869 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64DecodeExt(yystack_[0].value.as < std::string > ())); } -#line 5353 "seclang-parser.cc" +#line 5351 "seclang-parser.cc" break; case 402: -#line 2874 "seclang-parser.yy" +#line 2873 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CmdLine(yystack_[0].value.as < std::string > ())); } -#line 5361 "seclang-parser.cc" +#line 5359 "seclang-parser.cc" break; case 403: -#line 2878 "seclang-parser.yy" +#line 2877 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Sha1(yystack_[0].value.as < std::string > ())); } -#line 5369 "seclang-parser.cc" +#line 5367 "seclang-parser.cc" break; case 404: -#line 2882 "seclang-parser.yy" +#line 2881 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Md5(yystack_[0].value.as < std::string > ())); } -#line 5377 "seclang-parser.cc" +#line 5375 "seclang-parser.cc" break; case 405: -#line 2886 "seclang-parser.yy" +#line 2885 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::EscapeSeqDecode(yystack_[0].value.as < std::string > ())); } -#line 5385 "seclang-parser.cc" +#line 5383 "seclang-parser.cc" break; case 406: -#line 2890 "seclang-parser.yy" +#line 2889 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexEncode(yystack_[0].value.as < std::string > ())); } -#line 5393 "seclang-parser.cc" +#line 5391 "seclang-parser.cc" break; case 407: -#line 2894 "seclang-parser.yy" +#line 2893 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexDecode(yystack_[0].value.as < std::string > ())); } -#line 5401 "seclang-parser.cc" +#line 5399 "seclang-parser.cc" break; case 408: -#line 2898 "seclang-parser.yy" +#line 2897 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::LowerCase(yystack_[0].value.as < std::string > ())); } -#line 5409 "seclang-parser.cc" +#line 5407 "seclang-parser.cc" break; case 409: -#line 2902 "seclang-parser.yy" +#line 2901 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UpperCase(yystack_[0].value.as < std::string > ())); } -#line 5417 "seclang-parser.cc" +#line 5415 "seclang-parser.cc" break; case 410: -#line 2906 "seclang-parser.yy" +#line 2905 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecodeUni(yystack_[0].value.as < std::string > ())); } -#line 5425 "seclang-parser.cc" +#line 5423 "seclang-parser.cc" break; case 411: -#line 2910 "seclang-parser.yy" +#line 2909 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecode(yystack_[0].value.as < std::string > ())); } -#line 5433 "seclang-parser.cc" +#line 5431 "seclang-parser.cc" break; case 412: -#line 2914 "seclang-parser.yy" +#line 2913 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlEncode(yystack_[0].value.as < std::string > ())); } -#line 5441 "seclang-parser.cc" +#line 5439 "seclang-parser.cc" break; case 413: -#line 2918 "seclang-parser.yy" +#line 2917 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::None(yystack_[0].value.as < std::string > ())); } -#line 5449 "seclang-parser.cc" +#line 5447 "seclang-parser.cc" break; case 414: -#line 2922 "seclang-parser.yy" +#line 2921 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CompressWhitespace(yystack_[0].value.as < std::string > ())); } -#line 5457 "seclang-parser.cc" +#line 5455 "seclang-parser.cc" break; case 415: -#line 2926 "seclang-parser.yy" +#line 2925 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveWhitespace(yystack_[0].value.as < std::string > ())); } -#line 5465 "seclang-parser.cc" +#line 5463 "seclang-parser.cc" break; case 416: -#line 2930 "seclang-parser.yy" +#line 2929 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceNulls(yystack_[0].value.as < std::string > ())); } -#line 5473 "seclang-parser.cc" +#line 5471 "seclang-parser.cc" break; case 417: -#line 2934 "seclang-parser.yy" +#line 2933 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveNulls(yystack_[0].value.as < std::string > ())); } -#line 5481 "seclang-parser.cc" +#line 5479 "seclang-parser.cc" break; case 418: -#line 2938 "seclang-parser.yy" +#line 2937 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HtmlEntityDecode(yystack_[0].value.as < std::string > ())); } -#line 5489 "seclang-parser.cc" +#line 5487 "seclang-parser.cc" break; case 419: -#line 2942 "seclang-parser.yy" +#line 2941 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::JsDecode(yystack_[0].value.as < std::string > ())); } -#line 5497 "seclang-parser.cc" +#line 5495 "seclang-parser.cc" break; case 420: -#line 2946 "seclang-parser.yy" +#line 2945 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CssDecode(yystack_[0].value.as < std::string > ())); } -#line 5505 "seclang-parser.cc" +#line 5503 "seclang-parser.cc" break; case 421: -#line 2950 "seclang-parser.yy" +#line 2949 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Trim(yystack_[0].value.as < std::string > ())); } -#line 5513 "seclang-parser.cc" +#line 5511 "seclang-parser.cc" break; case 422: -#line 2954 "seclang-parser.yy" +#line 2953 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimLeft(yystack_[0].value.as < std::string > ())); } -#line 5521 "seclang-parser.cc" +#line 5519 "seclang-parser.cc" break; case 423: -#line 2958 "seclang-parser.yy" +#line 2957 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimRight(yystack_[0].value.as < std::string > ())); } -#line 5529 "seclang-parser.cc" +#line 5527 "seclang-parser.cc" break; case 424: -#line 2962 "seclang-parser.yy" +#line 2961 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePathWin(yystack_[0].value.as < std::string > ())); } -#line 5537 "seclang-parser.cc" +#line 5535 "seclang-parser.cc" break; case 425: -#line 2966 "seclang-parser.yy" +#line 2965 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePath(yystack_[0].value.as < std::string > ())); } -#line 5545 "seclang-parser.cc" +#line 5543 "seclang-parser.cc" break; case 426: -#line 2970 "seclang-parser.yy" +#line 2969 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Length(yystack_[0].value.as < std::string > ())); } -#line 5553 "seclang-parser.cc" +#line 5551 "seclang-parser.cc" break; case 427: -#line 2974 "seclang-parser.yy" +#line 2973 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Utf8ToUnicode(yystack_[0].value.as < std::string > ())); } -#line 5561 "seclang-parser.cc" +#line 5559 "seclang-parser.cc" break; case 428: -#line 2978 "seclang-parser.yy" +#line 2977 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveCommentsChar(yystack_[0].value.as < std::string > ())); } -#line 5569 "seclang-parser.cc" +#line 5567 "seclang-parser.cc" break; case 429: -#line 2982 "seclang-parser.yy" +#line 2981 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveComments(yystack_[0].value.as < std::string > ())); } -#line 5577 "seclang-parser.cc" +#line 5575 "seclang-parser.cc" break; case 430: -#line 2986 "seclang-parser.yy" +#line 2985 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceComments(yystack_[0].value.as < std::string > ())); } -#line 5585 "seclang-parser.cc" +#line 5583 "seclang-parser.cc" break; case 431: -#line 2993 "seclang-parser.yy" +#line 2992 "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 5593 "seclang-parser.cc" +#line 5591 "seclang-parser.cc" break; case 432: -#line 2997 "seclang-parser.yy" +#line 2996 "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 5601 "seclang-parser.cc" +#line 5599 "seclang-parser.cc" break; case 433: -#line 3001 "seclang-parser.yy" +#line 3000 "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 5609 "seclang-parser.cc" +#line 5607 "seclang-parser.cc" break; case 434: -#line 3005 "seclang-parser.yy" +#line 3004 "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 5617 "seclang-parser.cc" +#line 5615 "seclang-parser.cc" break; case 435: -#line 3009 "seclang-parser.yy" +#line 3008 "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 5625 "seclang-parser.cc" +#line 5623 "seclang-parser.cc" break; case 436: -#line 3016 "seclang-parser.yy" +#line 3015 "seclang-parser.yy" { yystack_[1].value.as < std::unique_ptr > ()->appendText(yystack_[0].value.as < std::string > ()); yylhs.value.as < std::unique_ptr > () = std::move(yystack_[1].value.as < std::unique_ptr > ()); } -#line 5634 "seclang-parser.cc" +#line 5632 "seclang-parser.cc" break; case 437: -#line 3021 "seclang-parser.yy" +#line 3020 "seclang-parser.yy" { yystack_[1].value.as < std::unique_ptr > ()->appendVar(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 5643 "seclang-parser.cc" +#line 5641 "seclang-parser.cc" break; case 438: -#line 3026 "seclang-parser.yy" +#line 3025 "seclang-parser.yy" { std::unique_ptr r(new RunTimeString()); r->appendText(yystack_[0].value.as < std::string > ()); yylhs.value.as < std::unique_ptr > () = std::move(r); } -#line 5653 "seclang-parser.cc" +#line 5651 "seclang-parser.cc" break; case 439: -#line 3032 "seclang-parser.yy" +#line 3031 "seclang-parser.yy" { std::unique_ptr r(new RunTimeString()); r->appendVar(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > () = std::move(r); } -#line 5663 "seclang-parser.cc" +#line 5661 "seclang-parser.cc" break; -#line 5667 "seclang-parser.cc" +#line 5665 "seclang-parser.cc" default: break; @@ -7073,50 +7071,50 @@ namespace yy { const short seclang_parser::yyrline_[] = { - 0, 707, 707, 711, 712, 715, 720, 726, 732, 736, - 740, 746, 752, 758, 764, 769, 774, 780, 787, 791, - 795, 801, 805, 809, 814, 819, 824, 829, 833, 840, - 844, 851, 857, 867, 876, 886, 895, 908, 912, 916, - 920, 924, 928, 932, 936, 940, 944, 949, 953, 957, - 961, 965, 969, 974, 979, 983, 987, 991, 995, 999, - 1003, 1007, 1011, 1015, 1019, 1023, 1027, 1031, 1035, 1039, - 1043, 1047, 1051, 1065, 1066, 1096, 1115, 1136, 1164, 1221, - 1228, 1232, 1236, 1240, 1244, 1248, 1252, 1256, 1265, 1269, - 1274, 1277, 1282, 1287, 1292, 1297, 1300, 1305, 1308, 1313, - 1318, 1321, 1326, 1331, 1336, 1341, 1346, 1351, 1356, 1359, - 1364, 1369, 1374, 1379, 1382, 1387, 1392, 1397, 1410, 1423, - 1436, 1449, 1462, 1488, 1516, 1528, 1548, 1575, 1581, 1586, - 1591, 1600, 1605, 1609, 1613, 1617, 1621, 1625, 1629, 1634, - 1639, 1651, 1657, 1661, 1665, 1676, 1685, 1686, 1693, 1698, - 1703, 1757, 1764, 1772, 1809, 1813, 1820, 1825, 1831, 1837, - 1843, 1850, 1860, 1864, 1868, 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, 2221, 2225, 2229, 2234, 2238, 2242, 2247, 2252, - 2256, 2260, 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, - 2500, 2507, 2514, 2521, 2528, 2535, 2542, 2549, 2556, 2563, - 2570, 2577, 2587, 2591, 2595, 2599, 2603, 2607, 2611, 2615, - 2620, 2625, 2630, 2634, 2638, 2642, 2646, 2651, 2656, 2660, - 2664, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 2696, 2700, - 2704, 2708, 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, 2992, 2996, 3000, 3004, 3008, 3015, 3020, 3025, 3031 + 0, 708, 708, 712, 713, 716, 721, 727, 733, 737, + 741, 747, 753, 759, 765, 770, 775, 781, 788, 792, + 796, 802, 806, 810, 815, 820, 825, 830, 834, 841, + 845, 852, 858, 868, 877, 887, 896, 909, 913, 917, + 921, 925, 929, 933, 937, 941, 945, 950, 954, 958, + 962, 966, 970, 975, 980, 984, 988, 992, 996, 1000, + 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, + 1044, 1048, 1052, 1066, 1067, 1097, 1116, 1135, 1163, 1220, + 1227, 1231, 1235, 1239, 1243, 1247, 1251, 1255, 1264, 1268, + 1273, 1276, 1281, 1286, 1291, 1296, 1299, 1304, 1307, 1312, + 1317, 1320, 1325, 1330, 1335, 1340, 1345, 1350, 1355, 1358, + 1363, 1368, 1373, 1378, 1381, 1386, 1391, 1396, 1409, 1422, + 1435, 1448, 1461, 1487, 1515, 1527, 1547, 1574, 1580, 1585, + 1590, 1599, 1604, 1608, 1612, 1616, 1620, 1624, 1628, 1633, + 1638, 1650, 1656, 1660, 1664, 1675, 1684, 1685, 1692, 1697, + 1702, 1756, 1763, 1771, 1808, 1812, 1819, 1824, 1830, 1836, + 1842, 1849, 1859, 1863, 1867, 1871, 1875, 1879, 1883, 1887, + 1891, 1895, 1899, 1903, 1907, 1911, 1915, 1919, 1923, 1927, + 1931, 1935, 1939, 1943, 1947, 1951, 1955, 1959, 1963, 1967, + 1971, 1975, 1979, 1983, 1987, 1991, 1995, 1999, 2003, 2007, + 2011, 2015, 2019, 2023, 2027, 2031, 2035, 2039, 2043, 2047, + 2051, 2055, 2059, 2063, 2067, 2071, 2075, 2079, 2083, 2087, + 2091, 2095, 2099, 2103, 2107, 2111, 2115, 2119, 2123, 2127, + 2131, 2135, 2139, 2143, 2147, 2151, 2155, 2159, 2163, 2167, + 2171, 2175, 2179, 2183, 2187, 2191, 2195, 2199, 2203, 2207, + 2211, 2215, 2220, 2224, 2228, 2233, 2237, 2241, 2246, 2251, + 2255, 2259, 2263, 2267, 2271, 2275, 2279, 2283, 2287, 2291, + 2295, 2299, 2303, 2307, 2311, 2315, 2319, 2323, 2327, 2331, + 2335, 2339, 2343, 2347, 2351, 2355, 2359, 2363, 2367, 2371, + 2375, 2379, 2383, 2387, 2391, 2395, 2399, 2403, 2407, 2411, + 2415, 2419, 2423, 2427, 2431, 2435, 2439, 2443, 2447, 2451, + 2455, 2459, 2463, 2467, 2471, 2475, 2479, 2483, 2487, 2491, + 2499, 2506, 2513, 2520, 2527, 2534, 2541, 2548, 2555, 2562, + 2569, 2576, 2586, 2590, 2594, 2598, 2602, 2606, 2610, 2614, + 2619, 2624, 2629, 2633, 2637, 2641, 2645, 2650, 2655, 2659, + 2663, 2667, 2671, 2675, 2679, 2683, 2687, 2691, 2695, 2699, + 2703, 2707, 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, 2991, 2995, 2999, 3003, 3007, 3014, 3019, 3024, 3030 }; // Print the state stack on the debug stream. @@ -7150,9 +7148,9 @@ namespace yy { } // yy -#line 7154 "seclang-parser.cc" +#line 7152 "seclang-parser.cc" -#line 3038 "seclang-parser.yy" +#line 3037 "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 7cc96c7e..1a42b1ed 100644 --- a/src/parser/seclang-parser.hh +++ b/src/parser/seclang-parser.hh @@ -55,6 +55,7 @@ class Driver; } } +#include "modsecurity/rule_unconditional.h" #include "src/rule_script.h" #include "src/actions/accuracy.h" @@ -347,7 +348,7 @@ using namespace modsecurity::operators; a = std::move(c); -#line 351 "seclang-parser.hh" +#line 352 "seclang-parser.hh" # include # include // std::abort @@ -481,7 +482,7 @@ using namespace modsecurity::operators; #endif namespace yy { -#line 485 "seclang-parser.hh" +#line 486 "seclang-parser.hh" @@ -8111,7 +8112,7 @@ switch (yytype) } } // yy -#line 8115 "seclang-parser.hh" +#line 8116 "seclang-parser.hh" diff --git a/src/parser/seclang-parser.yy b/src/parser/seclang-parser.yy index 710ce719..02e8e9ea 100644 --- a/src/parser/seclang-parser.yy +++ b/src/parser/seclang-parser.yy @@ -17,6 +17,7 @@ class Driver; } } +#include "modsecurity/rule_unconditional.h" #include "src/rule_script.h" #include "src/actions/accuracy.h" @@ -1123,9 +1124,7 @@ expression: a->push_back(i.release()); } } - std::unique_ptr rule(new RuleWithOperator( - /* op */ NULL, - /* variables */ NULL, + std::unique_ptr rule(new RuleUnconditional( /* actions */ a, /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*@1.end.filename)), diff --git a/src/rule_script.cc b/src/rule_script.cc index 172e0011..e4ce5315 100644 --- a/src/rule_script.cc +++ b/src/rule_script.cc @@ -24,19 +24,16 @@ bool RuleScript::init(std::string *err) { bool RuleScript::evaluate(Transaction *trans, std::shared_ptr ruleMessage) { + ms_dbg_a(trans, 4, " Executing script: " + m_name + "."); bool containsDisruptive = false; - if (ruleMessage == NULL) { - ruleMessage = std::shared_ptr( - new RuleMessage(this, trans)); - } - executeActionsIndependentOfChainedRuleResult(trans, &containsDisruptive, ruleMessage); bool ret = m_lua.run(trans); + if (ret) { executeActionsAfterFullMatch(trans, containsDisruptive, ruleMessage); } diff --git a/src/rule_script.h b/src/rule_script.h index 62b03483..f8b79305 100644 --- a/src/rule_script.h +++ b/src/rule_script.h @@ -42,14 +42,14 @@ namespace modsecurity { using actions::Action; /** @ingroup ModSecurity_CPP_API */ -class RuleScript : public RuleWithOperator { +class RuleScript : public RuleWithActions { public: RuleScript(const std::string &name, std::vector *actions, Transformations *t, std::unique_ptr fileName, int lineNumber) - : RuleWithOperator(NULL, NULL, actions, t, std::move(fileName), lineNumber), + : RuleWithActions(actions, t, std::move(fileName), lineNumber), m_name(name) { } bool init(std::string *err); diff --git a/src/rule_unconditional.cc b/src/rule_unconditional.cc new file mode 100644 index 00000000..2e61428f --- /dev/null +++ b/src/rule_unconditional.cc @@ -0,0 +1,61 @@ +/* + * ModSecurity, http://www.modsecurity.org/ + * Copyright (c) 2015 Trustwave Holdings, Inc. (http://www.trustwave.com/) + * + * You may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * If any of the files related to licensing are missing or if you have any + * other questions related to licensing please contact Trustwave Holdings, Inc. + * directly using the email address security@modsecurity.org. + * + */ + +#include "modsecurity/rule_unconditional.h" +#include "modsecurity/rule_message.h" + +namespace modsecurity { + + +bool RuleUnconditional::evaluate(Transaction *trans, + std::shared_ptr ruleMessage) { + RuleWithActions::evaluate(trans, ruleMessage); + + // FIXME: This needs to be romeved on the runtime exeption review. + bool containsBlock = false; + + ms_dbg_a(trans, 4, "(Rule: " + std::to_string(m_ruleId) \ + + ") Executing unconditional rule..."); + + executeActionsIndependentOfChainedRuleResult(trans, + &containsBlock, ruleMessage); + + executeActionsAfterFullMatch(trans, containsBlock, ruleMessage); + + /* last rule in the chain. */ + bool isItToBeLogged = ruleMessage->m_saveMessage; + if (isItToBeLogged && !hasMultimatch() + && !ruleMessage->m_message.empty()) { + /* warn */ + trans->m_rulesMessages.push_back(*ruleMessage); + + /* error */ + if (!ruleMessage->m_isDisruptive) { + trans->serverLog(ruleMessage); + } + } + else if (hasBlockAction() && !hasMultimatch()) { + /* warn */ + trans->m_rulesMessages.push_back(*ruleMessage); + /* error */ + if (!ruleMessage->m_isDisruptive) { + trans->serverLog(ruleMessage); + } + } + + return true; +} + +} // namespace modsecurity diff --git a/src/rule_with_actions.cc b/src/rule_with_actions.cc index 4b9cf924..1c6b7fb2 100644 --- a/src/rule_with_actions.cc +++ b/src/rule_with_actions.cc @@ -65,6 +65,8 @@ RuleWithActions::RuleWithActions( m_accuracy(0), m_maturity(0), m_ruleId(0), + m_chainedRuleChild(nullptr), + m_chainedRuleParent(nullptr), m_disruptiveAction(nullptr), m_logData(nullptr), m_msg(nullptr), @@ -77,6 +79,7 @@ RuleWithActions::RuleWithActions( m_containsMultiMatchAction(false), m_containsStaticBlockAction(false), m_isChained(false) { + if (actions) { for (Action *a : *actions) { if (a->action_kind == Action::ConfigurationKind) { @@ -163,6 +166,29 @@ RuleWithActions::~RuleWithActions() { } } + +bool RuleWithActions::evaluate(Transaction *transaction) { + RuleMessage rm(this, transaction); + std::shared_ptr rm2 = std::make_shared(&rm); + return evaluate(transaction, rm2); +} + + +bool RuleWithActions::evaluate(Transaction *transaction, + std::shared_ptr ruleMessage) { + + /* Rule evaluate is pure virtual. + * + * Rule::evaluate(transaction, ruleMessage); + */ + + /* Matched vars needs to be clear at every new rule execution */ + transaction->m_matched.clear(); + + return true; +} + + void RuleWithActions::executeActionsIndependentOfChainedRuleResult(Transaction *trans, bool *containsBlock, std::shared_ptr ruleMessage) { @@ -203,6 +229,76 @@ void RuleWithActions::executeActionsIndependentOfChainedRuleResult(Transaction * } +void RuleWithActions::executeActionsAfterFullMatch(Transaction *trans, + bool containsBlock, std::shared_ptr ruleMessage) { + bool disruptiveAlreadyExecuted = false; + + for (auto &a : trans->m_rules->m_defaultActions[getPhase()]) { + if (a.get()->action_kind != actions::Action::RunTimeOnlyIfMatchKind) { + continue; + } + if (!a.get()->isDisruptive()) { + executeAction(trans, containsBlock, ruleMessage, a.get(), true); + } + } + + for (actions::Tag *a : this->m_actionsTag) { + ms_dbg_a(trans, 4, "Running (non-disruptive) action: " \ + + *a->m_name.get()); + a->evaluate(this, trans, ruleMessage); + } + + for (auto &b : + trans->m_rules->m_exceptions.m_action_pos_update_target_by_id) { + if (m_ruleId != b.first) { + continue; + } + actions::Action *a = dynamic_cast(b.second.get()); + executeAction(trans, containsBlock, ruleMessage, a, false); + disruptiveAlreadyExecuted = true; + } + for (Action *a : this->m_actionsRuntimePos) { + if (!a->isDisruptive() + && !(disruptiveAlreadyExecuted + && dynamic_cast(a))) { + executeAction(trans, containsBlock, ruleMessage, a, false); + } + } + if (!disruptiveAlreadyExecuted && m_disruptiveAction != nullptr) { + executeAction(trans, containsBlock, ruleMessage, + m_disruptiveAction, false); + } +} + + +void RuleWithActions::executeAction(Transaction *trans, + bool containsBlock, std::shared_ptr ruleMessage, + Action *a, bool defaultContext) { + if (a->isDisruptive() == false && *a->m_name.get() != "block") { + ms_dbg_a(trans, 9, "Running " \ + "action: " + *a->m_name.get()); + a->evaluate(this, trans, ruleMessage); + return; + } + + if (defaultContext && !containsBlock) { + ms_dbg_a(trans, 4, "Ignoring action: " + *a->m_name.get() + \ + " (rule does not cotains block)"); + return; + } + + if (trans->getRuleEngineState() == RulesSet::EnabledRuleEngine) { + ms_dbg_a(trans, 4, "Running (disruptive) action: " + *a->m_name.get() + \ + "."); + a->evaluate(this, trans, ruleMessage); + return; + } + + ms_dbg_a(trans, 4, "Not running any disruptive action (or block): " \ + + *a->m_name.get() + ". SecRuleEngine is not On."); +} + + inline void RuleWithActions::executeTransformation( actions::transformations::Transformation *a, std::shared_ptr *value, @@ -326,46 +422,6 @@ void RuleWithActions::executeTransformations( } } -void RuleWithActions::executeActionsAfterFullMatch(Transaction *trans, - bool containsBlock, std::shared_ptr ruleMessage) { - bool disruptiveAlreadyExecuted = false; - - for (auto &a : trans->m_rules->m_defaultActions[getPhase()]) { - if (a.get()->action_kind != actions::Action::RunTimeOnlyIfMatchKind) { - continue; - } - if (!a.get()->isDisruptive()) { - executeAction(trans, containsBlock, ruleMessage, a.get(), true); - } - } - - for (actions::Tag *a : this->m_actionsTag) { - ms_dbg_a(trans, 4, "Running (non-disruptive) action: " \ - + *a->m_name.get()); - a->evaluate(this, trans, ruleMessage); - } - - for (auto &b : - trans->m_rules->m_exceptions.m_action_pos_update_target_by_id) { - if (m_ruleId != b.first) { - continue; - } - actions::Action *a = dynamic_cast(b.second.get()); - executeAction(trans, containsBlock, ruleMessage, a, false); - disruptiveAlreadyExecuted = true; - } - for (Action *a : this->m_actionsRuntimePos) { - if (!a->isDisruptive() - && !(disruptiveAlreadyExecuted - && dynamic_cast(a))) { - executeAction(trans, containsBlock, ruleMessage, a, false); - } - } - if (!disruptiveAlreadyExecuted && m_disruptiveAction != nullptr) { - executeAction(trans, containsBlock, ruleMessage, - m_disruptiveAction, false); - } -} bool RuleWithActions::containsTag(const std::string& name, Transaction *t) { for (auto &tag : m_actionsTag) { @@ -381,6 +437,44 @@ bool RuleWithActions::containsMsg(const std::string& name, Transaction *t) { return m_msg && m_msg->data(t) == name; } + +std::vector RuleWithActions::getActionsByName(const std::string& name, + Transaction *trans) { + std::vector ret; + for (auto &z : m_actionsRuntimePos) { + if (*z->m_name.get() == name) { + ret.push_back(z); + } + } + for (auto &z : m_transformations) { + if (*z->m_name.get() == name) { + ret.push_back(z); + } + } + for (auto &b : + trans->m_rules->m_exceptions.m_action_pre_update_target_by_id) { + if (m_ruleId != b.first) { + continue; + } + actions::Action *z = dynamic_cast(b.second.get()); + if (*z->m_name.get() == name) { + ret.push_back(z); + } + } + for (auto &b : + trans->m_rules->m_exceptions.m_action_pos_update_target_by_id) { + if (m_ruleId != b.first) { + continue; + } + actions::Action *z = dynamic_cast(b.second.get()); + if (*z->m_name.get() == name) { + ret.push_back(z); + } + } + return ret; +} + + std::string RuleWithActions::logData(Transaction *t) { return m_logData->data(t); } std::string RuleWithActions::msg(Transaction *t) { return m_msg->data(t); } int RuleWithActions::severity() const { return m_severity->m_severity; } diff --git a/src/rule_with_operator.cc b/src/rule_with_operator.cc index e70d224c..2dd590c8 100644 --- a/src/rule_with_operator.cc +++ b/src/rule_with_operator.cc @@ -58,12 +58,8 @@ RuleWithOperator::RuleWithOperator(Operator *op, std::unique_ptr fileName, int lineNumber) : RuleWithActions(actions, transformations, std::move(fileName), lineNumber), - m_chainedRuleChild(nullptr), - m_chainedRuleParent(NULL), - m_operator(op), - m_variables(_variables), - m_unconditional(false) { /* */ } + m_variables(_variables) { /* */ } RuleWithOperator::~RuleWithOperator() { @@ -118,6 +114,7 @@ bool RuleWithOperator::executeOperatorAt(Transaction *trans, const std::string & + "\" (Variable: " + key + ")"); ret = this->m_operator->evaluateInternal(trans, this, value, ruleMessage); + if (ret == false) { return false; } @@ -216,35 +213,6 @@ inline void RuleWithOperator::getFinalVars(variables::Variables *vars, } - -void RuleWithActions::executeAction(Transaction *trans, - bool containsBlock, std::shared_ptr ruleMessage, - Action *a, bool defaultContext) { - if (a->isDisruptive() == false && *a->m_name.get() != "block") { - ms_dbg_a(trans, 9, "Running " \ - "action: " + *a->m_name.get()); - a->evaluate(this, trans, ruleMessage); - return; - } - - if (defaultContext && !containsBlock) { - ms_dbg_a(trans, 4, "Ignoring action: " + *a->m_name.get() + \ - " (rule does not cotains block)"); - return; - } - - if (trans->getRuleEngineState() == RulesSet::EnabledRuleEngine) { - ms_dbg_a(trans, 4, "Running (disruptive) action: " + *a->m_name.get() + \ - "."); - a->evaluate(this, trans, ruleMessage); - return; - } - - ms_dbg_a(trans, 4, "Not running any disruptive action (or block): " \ - + *a->m_name.get() + ". SecRuleEngine is not On."); -} - - bool RuleWithOperator::evaluate(Transaction *trans, std::shared_ptr ruleMessage) { bool globalRet = false; @@ -256,25 +224,10 @@ bool RuleWithOperator::evaluate(Transaction *trans, vars.reserve(4); variables::Variables exclusion; - if (ruleMessage == NULL) { - ruleMessage = std::shared_ptr( - new RuleMessage(this, trans)); - } + RuleWithActions::evaluate(trans, ruleMessage); - trans->m_matched.clear(); - - if (isMarker() == true) { - return true; - } - - if (isUnconditional() == true) { - ms_dbg_a(trans, 4, "(Rule: " + std::to_string(m_ruleId) \ - + ") Executing unconditional rule..."); - executeActionsIndependentOfChainedRuleResult(trans, - &containsBlock, ruleMessage); - goto end_exec; - } + // FIXME: Make a class runTimeException to handle this cases. for (auto &i : trans->m_ruleRemoveById) { if (m_ruleId != i) { continue; @@ -314,6 +267,7 @@ bool RuleWithOperator::evaluate(Transaction *trans, + variables + "."); } + getFinalVars(&vars, &exclusion, trans); for (auto &var : vars) { @@ -442,43 +396,6 @@ end_exec: } -std::vector RuleWithActions::getActionsByName(const std::string& name, - Transaction *trans) { - std::vector ret; - for (auto &z : m_actionsRuntimePos) { - if (*z->m_name.get() == name) { - ret.push_back(z); - } - } - for (auto &z : m_transformations) { - if (*z->m_name.get() == name) { - ret.push_back(z); - } - } - for (auto &b : - trans->m_rules->m_exceptions.m_action_pre_update_target_by_id) { - if (m_ruleId != b.first) { - continue; - } - actions::Action *z = dynamic_cast(b.second.get()); - if (*z->m_name.get() == name) { - ret.push_back(z); - } - } - for (auto &b : - trans->m_rules->m_exceptions.m_action_pos_update_target_by_id) { - if (m_ruleId != b.first) { - continue; - } - actions::Action *z = dynamic_cast(b.second.get()); - if (*z->m_name.get() == name) { - ret.push_back(z); - } - } - return ret; -} - - std::string RuleWithOperator::getOperatorName() const { return m_operator->m_op; } diff --git a/src/rules_set.cc b/src/rules_set.cc index a658764d..89b2745b 100644 --- a/src/rules_set.cc +++ b/src/rules_set.cc @@ -135,13 +135,13 @@ int RulesSet::evaluate(int phase, Transaction *t) { for (int i = 0; i < rules->size(); i++) { // FIXME: This is not meant to be here. At the end of this refactoring, // the shared pointer won't be used. - std::shared_ptr rule = rules->at(i); + auto rule = rules->at(i); if (t->isInsideAMarker() && !rule->isMarker()) { ms_dbg_a(t, 9, "Skipped rule id '" + rule->getReference() \ + "' due to a SecMarker: " + *t->getCurrentMarker()); } else if (rule->isMarker()) { - rule->evaluate(t, NULL); + rule->evaluate(t); } else if (t->m_skip_next > 0) { t->m_skip_next--; ms_dbg_a(t, 9, "Skipped rule id '" + rule->getReference() \ @@ -153,18 +153,19 @@ int RulesSet::evaluate(int phase, Transaction *t) { + "' as request trough the utilization of an `allow' action."); } else { Rule *base = rule.get(); - RuleWithOperator *ruleWithOperator = dynamic_cast(base); - if (m_exceptions.contains(ruleWithOperator->m_ruleId)) { + RuleWithActions *ruleWithActions = dynamic_cast(base); + // FIXME: Those should be treated inside the rule itself + if (ruleWithActions && m_exceptions.contains(ruleWithActions->m_ruleId)) { ms_dbg_a(t, 9, "Skipped rule id '" + rule->getReference() \ + "'. Removed by an SecRuleRemove directive."); continue; } bool remove_rule = false; - if (m_exceptions.m_remove_rule_by_msg.empty() == false) { + if (ruleWithActions && m_exceptions.m_remove_rule_by_msg.empty() == false) { for (auto &z : m_exceptions.m_remove_rule_by_msg) { - if (ruleWithOperator->containsMsg(z, t) == true) { + if (ruleWithActions->containsMsg(z, t) == true) { ms_dbg_a(t, 9, "Skipped rule id '" \ - + ruleWithOperator->getReference() \ + + ruleWithActions->getReference() \ + "'. Removed by a SecRuleRemoveByMsg directive."); remove_rule = true; break; @@ -175,11 +176,11 @@ int RulesSet::evaluate(int phase, Transaction *t) { } } - if (m_exceptions.m_remove_rule_by_tag.empty() == false) { + if (ruleWithActions && m_exceptions.m_remove_rule_by_tag.empty() == false) { for (auto &z : m_exceptions.m_remove_rule_by_tag) { - if (ruleWithOperator->containsTag(z, t) == true) { + if (ruleWithActions->containsTag(z, t) == true) { ms_dbg_a(t, 9, "Skipped rule id '" \ - + ruleWithOperator->getReference() \ + + ruleWithActions->getReference() \ + "'. Removed by a SecRuleRemoveByTag directive."); remove_rule = true; break; @@ -190,11 +191,12 @@ int RulesSet::evaluate(int phase, Transaction *t) { } } - if (t->m_ruleRemoveByTag.empty() == false) { + + if (ruleWithActions) { for (auto &z : t->m_ruleRemoveByTag) { - if (ruleWithOperator->containsTag(z, t) == true) { + if (ruleWithActions->containsTag(z, t) == true) { ms_dbg_a(t, 9, "Skipped rule id '" \ - + ruleWithOperator->getReference() \ + + ruleWithActions->getReference() \ + "'. Skipped due to a ruleRemoveByTag action."); remove_rule = true; break; @@ -205,8 +207,9 @@ int RulesSet::evaluate(int phase, Transaction *t) { } } - rule->evaluate(t, NULL); + rule->evaluate(t); if (t->m_it.disruptive > 0) { + ms_dbg_a(t, 8, "Skipping this phase as this " \ "request was already intercepted."); break; diff --git a/src/variables/duration.cc b/src/variables/duration.cc index 9df7e2cb..b60db675 100644 --- a/src/variables/duration.cc +++ b/src/variables/duration.cc @@ -28,7 +28,7 @@ namespace modsecurity { namespace variables { void Duration::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { double e = utils::cpu_seconds() - transaction->m_creationTimeStamp; diff --git a/src/variables/duration.h b/src/variables/duration.h index 4d4e7fbf..ec35b73f 100644 --- a/src/variables/duration.h +++ b/src/variables/duration.h @@ -35,7 +35,7 @@ class Duration : public Variable { m_retName("DURATION") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/env.cc b/src/variables/env.cc index 6e1e2c06..9566b752 100644 --- a/src/variables/env.cc +++ b/src/variables/env.cc @@ -33,7 +33,7 @@ namespace modsecurity { namespace variables { void Env::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { for (char **current = environ; *current; current++) { std::string env = std::string(*current); diff --git a/src/variables/env.h b/src/variables/env.h index 87d7a9a0..505c91e0 100644 --- a/src/variables/env.h +++ b/src/variables/env.h @@ -34,7 +34,7 @@ class Env : public Variable { : Variable(_name) { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; }; diff --git a/src/variables/global.h b/src/variables/global.h index cd7e3acb..4fdf906c 100644 --- a/src/variables/global.h +++ b/src/variables/global.h @@ -39,7 +39,7 @@ class Global_DictElement : public Variable { m_dictElement("GLOBAL:" + dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_global_collection->resolveMultiMatches( m_name, t->m_collections.m_global_collection_key, @@ -56,7 +56,7 @@ class Global_NoDictElement : public Variable { : Variable("GLOBAL") { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_global_collection->resolveMultiMatches("", t->m_collections.m_global_collection_key, @@ -72,7 +72,7 @@ class Global_DictElementRegexp : public VariableRegex { m_dictElement(dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_global_collection->resolveRegularExpression( m_dictElement, @@ -91,7 +91,7 @@ class Global_DynamicElement : public Variable { m_string(std::move(dictElement)) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { std::string string = m_string->evaluate(t); t->m_collections.m_global_collection->resolveMultiMatches( diff --git a/src/variables/highest_severity.cc b/src/variables/highest_severity.cc index e3e6d75b..7059bc11 100644 --- a/src/variables/highest_severity.cc +++ b/src/variables/highest_severity.cc @@ -27,7 +27,7 @@ namespace modsecurity { namespace variables { void HighestSeverity::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { transaction->m_variableHighestSeverityAction.assign( std::to_string(transaction->m_highestSeverityAction)); diff --git a/src/variables/highest_severity.h b/src/variables/highest_severity.h index 1af19169..ecc6cc1e 100644 --- a/src/variables/highest_severity.h +++ b/src/variables/highest_severity.h @@ -35,7 +35,7 @@ class HighestSeverity : public Variable { { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; }; diff --git a/src/variables/ip.h b/src/variables/ip.h index bd24e987..6f3efa94 100644 --- a/src/variables/ip.h +++ b/src/variables/ip.h @@ -39,7 +39,7 @@ class Ip_DictElement : public Variable { m_dictElement("IP:" + dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_ip_collection->resolveMultiMatches( m_name, t->m_collections.m_ip_collection_key, @@ -56,7 +56,7 @@ class Ip_NoDictElement : public Variable { : Variable("IP") { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_ip_collection->resolveMultiMatches("", t->m_collections.m_ip_collection_key, @@ -72,7 +72,7 @@ class Ip_DictElementRegexp : public VariableRegex { m_dictElement(dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_ip_collection->resolveRegularExpression( m_dictElement, t->m_collections.m_ip_collection_key, @@ -90,7 +90,7 @@ class Ip_DynamicElement : public Variable { m_string(std::move(dictElement)) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { std::string string = m_string->evaluate(t); t->m_collections.m_ip_collection->resolveMultiMatches( diff --git a/src/variables/modsec_build.cc b/src/variables/modsec_build.cc index 2e850458..594b3bf5 100644 --- a/src/variables/modsec_build.cc +++ b/src/variables/modsec_build.cc @@ -25,7 +25,7 @@ namespace modsecurity { namespace variables { void ModsecBuild::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { l->push_back(new VariableValue(&m_retName, &m_build)); diff --git a/src/variables/modsec_build.h b/src/variables/modsec_build.h index 0e584f6a..318f7ef8 100644 --- a/src/variables/modsec_build.h +++ b/src/variables/modsec_build.h @@ -44,7 +44,7 @@ class ModsecBuild : public Variable { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_build; diff --git a/src/variables/remote_user.cc b/src/variables/remote_user.cc index bfe82894..aa751a38 100644 --- a/src/variables/remote_user.cc +++ b/src/variables/remote_user.cc @@ -37,7 +37,7 @@ namespace variables { void RemoteUser::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { size_t pos; std::string base64; diff --git a/src/variables/remote_user.h b/src/variables/remote_user.h index 5a4bef6a..3b099a79 100644 --- a/src/variables/remote_user.h +++ b/src/variables/remote_user.h @@ -37,7 +37,7 @@ class RemoteUser : public Variable { m_retName("REMOTE_USER") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/resource.h b/src/variables/resource.h index 9977be42..aa352ba1 100644 --- a/src/variables/resource.h +++ b/src/variables/resource.h @@ -39,7 +39,7 @@ class Resource_DictElement : public Variable { m_dictElement("RESOURCE:" + dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_resource_collection->resolveMultiMatches( m_name, t->m_collections.m_resource_collection_key, @@ -56,7 +56,7 @@ class Resource_NoDictElement : public Variable { : Variable("RESOURCE") { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_resource_collection->resolveMultiMatches(m_name, t->m_collections.m_resource_collection_key, @@ -72,7 +72,7 @@ class Resource_DictElementRegexp : public VariableRegex { m_dictElement(dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_resource_collection->resolveRegularExpression( m_dictElement, t->m_collections.m_resource_collection_key, @@ -90,7 +90,7 @@ class Resource_DynamicElement : public Variable { m_string(std::move(dictElement)) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { std::string string = m_string->evaluate(t); t->m_collections.m_resource_collection->resolveMultiMatches( diff --git a/src/variables/rule.h b/src/variables/rule.h index 58701277..969fd030 100644 --- a/src/variables/rule.h +++ b/src/variables/rule.h @@ -38,9 +38,9 @@ class Rule_DictElement : public VariableDictElement { \ : VariableDictElement(std::string("RULE"), dictElement) { } static void id(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { - RuleWithOperator *r = rule; + RuleWithActions *r = rule; while (r && r->m_ruleId == 0) { r = r->m_chainedRuleParent; @@ -63,9 +63,9 @@ class Rule_DictElement : public VariableDictElement { \ static void rev(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { - RuleWithOperator *r = rule; + RuleWithActions *r = rule; while (r && r->m_rev.empty()) { r = r->m_chainedRuleParent; @@ -89,9 +89,9 @@ class Rule_DictElement : public VariableDictElement { \ static void severity(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { - RuleWithOperator *r = rule; + RuleWithActions *r = rule; while (r && !r->hasSeverity()) { r = r->m_chainedRuleParent; @@ -113,9 +113,9 @@ class Rule_DictElement : public VariableDictElement { \ static void logData(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { - RuleWithOperator *r = rule; + RuleWithActions *r = rule; while (r && !r->hasLogData()) { r = r->m_chainedRuleParent; @@ -136,9 +136,9 @@ class Rule_DictElement : public VariableDictElement { \ } static void msg(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { - RuleWithOperator *r = rule; + RuleWithActions *r = rule; while (r && !r->hasMsg()) { r = r->m_chainedRuleParent; @@ -159,7 +159,7 @@ class Rule_DictElement : public VariableDictElement { \ } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { if (m_dictElement == "id") { id(t, rule, l); @@ -198,7 +198,7 @@ class Rule_DictElementRegexp : public VariableRegex { : VariableRegex("RULE", regex) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { if (Utils::regex_search("id", m_r) > 0) { Rule_DictElement::id(t, rule, l); @@ -230,7 +230,7 @@ class Rule_NoDictElement : public Variable { : Variable("RULE") { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { Rule_DictElement::id(t, rule, l); Rule_DictElement::rev(t, rule, l); diff --git a/src/variables/session.h b/src/variables/session.h index 98d8605c..bc831e31 100644 --- a/src/variables/session.h +++ b/src/variables/session.h @@ -39,7 +39,7 @@ class Session_DictElement : public Variable { m_dictElement("SESSION:" + dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_session_collection->resolveMultiMatches( m_name, t->m_collections.m_session_collection_key, @@ -56,7 +56,7 @@ class Session_NoDictElement : public Variable { : Variable("SESSION") { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_session_collection->resolveMultiMatches("", t->m_collections.m_session_collection_key, @@ -72,7 +72,7 @@ class Session_DictElementRegexp : public VariableRegex { m_dictElement(dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_session_collection->resolveRegularExpression( m_dictElement, t->m_collections.m_session_collection_key, @@ -90,7 +90,7 @@ class Session_DynamicElement : public Variable { m_string(std::move(dictElement)) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { std::string string = m_string->evaluate(t); t->m_collections.m_session_collection->resolveMultiMatches( diff --git a/src/variables/time.cc b/src/variables/time.cc index a7f0eb64..b14e9610 100644 --- a/src/variables/time.cc +++ b/src/variables/time.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void Time::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; diff --git a/src/variables/time.h b/src/variables/time.h index b0ea5493..4f3dec89 100644 --- a/src/variables/time.h +++ b/src/variables/time.h @@ -36,7 +36,7 @@ class Time : public Variable { m_retName("TIME") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_day.cc b/src/variables/time_day.cc index 473cffbd..f16500e9 100644 --- a/src/variables/time_day.cc +++ b/src/variables/time_day.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeDay::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; struct tm timeinfo; diff --git a/src/variables/time_day.h b/src/variables/time_day.h index 0b2ac056..946ba3aa 100644 --- a/src/variables/time_day.h +++ b/src/variables/time_day.h @@ -35,7 +35,7 @@ class TimeDay : public Variable { m_retName("TIME_DAY") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_epoch.cc b/src/variables/time_epoch.cc index 38029a3c..f7ee0f52 100644 --- a/src/variables/time_epoch.cc +++ b/src/variables/time_epoch.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeEpoch::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { transaction->m_variableTimeEpoch.assign( std::to_string(std::time(nullptr))); diff --git a/src/variables/time_epoch.h b/src/variables/time_epoch.h index 3d009595..a259e863 100644 --- a/src/variables/time_epoch.h +++ b/src/variables/time_epoch.h @@ -35,7 +35,7 @@ class TimeEpoch : public Variable { m_retName("TIME_EPOCH") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_hour.cc b/src/variables/time_hour.cc index 05f3ec98..380f471a 100644 --- a/src/variables/time_hour.cc +++ b/src/variables/time_hour.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeHour::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; struct tm timeinfo; diff --git a/src/variables/time_hour.h b/src/variables/time_hour.h index 862d0819..aad53515 100644 --- a/src/variables/time_hour.h +++ b/src/variables/time_hour.h @@ -35,7 +35,7 @@ class TimeHour : public Variable { m_retName("TIME_HOUR") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_min.cc b/src/variables/time_min.cc index c8ec9cf8..099e6685 100644 --- a/src/variables/time_min.cc +++ b/src/variables/time_min.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeMin::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; struct tm timeinfo; diff --git a/src/variables/time_min.h b/src/variables/time_min.h index 92f662a9..fd26eb26 100644 --- a/src/variables/time_min.h +++ b/src/variables/time_min.h @@ -35,7 +35,7 @@ class TimeMin : public Variable { m_retName("TIME_MIN") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_mon.cc b/src/variables/time_mon.cc index 93f90f8a..c1ff8175 100644 --- a/src/variables/time_mon.cc +++ b/src/variables/time_mon.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeMon::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; struct tm timeinfo; diff --git a/src/variables/time_mon.h b/src/variables/time_mon.h index fe67a303..e54866a3 100644 --- a/src/variables/time_mon.h +++ b/src/variables/time_mon.h @@ -35,7 +35,7 @@ class TimeMon : public Variable { m_retName("TIME_MON") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_sec.cc b/src/variables/time_sec.cc index 4de09448..9e7a76cd 100644 --- a/src/variables/time_sec.cc +++ b/src/variables/time_sec.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeSec::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; struct tm timeinfo; diff --git a/src/variables/time_sec.h b/src/variables/time_sec.h index 9cee914e..2c9b431a 100644 --- a/src/variables/time_sec.h +++ b/src/variables/time_sec.h @@ -35,7 +35,7 @@ class TimeSec : public Variable { m_retName("TIME_SEC") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_wday.cc b/src/variables/time_wday.cc index 4036042a..daf29a7d 100644 --- a/src/variables/time_wday.cc +++ b/src/variables/time_wday.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeWDay::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; struct tm timeinfo; diff --git a/src/variables/time_wday.h b/src/variables/time_wday.h index 30ef068c..3969e74b 100644 --- a/src/variables/time_wday.h +++ b/src/variables/time_wday.h @@ -35,7 +35,7 @@ class TimeWDay : public Variable { m_retName("TIME_WDAY") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/time_year.cc b/src/variables/time_year.cc index 2a96221b..dbec656c 100644 --- a/src/variables/time_year.cc +++ b/src/variables/time_year.cc @@ -34,7 +34,7 @@ namespace modsecurity { namespace variables { void TimeYear::evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { char tstr[200]; struct tm timeinfo; diff --git a/src/variables/time_year.h b/src/variables/time_year.h index 06f5ee14..52099a83 100644 --- a/src/variables/time_year.h +++ b/src/variables/time_year.h @@ -35,7 +35,7 @@ class TimeYear : public Variable { m_retName("TIME_YEAR") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; std::string m_retName; }; diff --git a/src/variables/tx.h b/src/variables/tx.h index 1e5f68d2..c665433d 100644 --- a/src/variables/tx.h +++ b/src/variables/tx.h @@ -39,7 +39,7 @@ class Tx_DictElement : public Variable { m_dictElement("TX:" + dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_tx_collection->resolveMultiMatches( m_name, l, m_keyExclusion); @@ -55,7 +55,7 @@ class Tx_NoDictElement : public Variable { : Variable("TX") { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_tx_collection->resolveMultiMatches("", l, m_keyExclusion); @@ -70,7 +70,7 @@ class Tx_DictElementRegexp : public VariableRegex { m_dictElement(dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_tx_collection->resolveRegularExpression( m_dictElement, l, m_keyExclusion); @@ -87,7 +87,7 @@ class Tx_DynamicElement : public Variable { m_string(std::move(dictElement)) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { std::string string = m_string->evaluate(t); t->m_collections.m_tx_collection->resolveMultiMatches(string, l, diff --git a/src/variables/user.h b/src/variables/user.h index c9ba87c0..88600198 100644 --- a/src/variables/user.h +++ b/src/variables/user.h @@ -39,7 +39,7 @@ class User_DictElement : public Variable { m_dictElement("USER:" + dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_user_collection->resolveMultiMatches( m_name, t->m_collections.m_user_collection_key, @@ -56,7 +56,7 @@ class User_NoDictElement : public Variable { : Variable("USER") { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_user_collection->resolveMultiMatches(m_name, t->m_collections.m_user_collection_key, @@ -72,7 +72,7 @@ class User_DictElementRegexp : public VariableRegex { m_dictElement(dictElement) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { t->m_collections.m_user_collection->resolveRegularExpression( m_dictElement, t->m_collections.m_user_collection_key, @@ -90,7 +90,7 @@ class User_DynamicElement : public Variable { m_string(std::move(dictElement)) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { std::string string = m_string->evaluate(t); t->m_collections.m_user_collection->resolveMultiMatches( diff --git a/src/variables/variable.h b/src/variables/variable.h index d7189111..09dff6b8 100644 --- a/src/variables/variable.h +++ b/src/variables/variable.h @@ -49,7 +49,7 @@ class n ## _DictElementRegexp : public VariableRegex { \ : VariableRegex(#N, regex) { } \ \ void evaluate(Transaction *transaction, \ - RuleWithOperator *rule, \ + RuleWithActions *rule, \ std::vector *l) override { \ transaction-> e .resolveRegularExpression(&m_r, l, \ m_keyExclusion); \ @@ -64,7 +64,7 @@ class n ## _DictElement : public VariableDictElement { \ : VariableDictElement(#N, dictElement) { } \ \ void evaluate(Transaction *transaction, \ - RuleWithOperator *rule, \ + RuleWithActions *rule, \ std::vector *l) override { \ transaction-> e .resolve(m_dictElement, l); \ } \ @@ -78,7 +78,7 @@ class n ## _NoDictElement : public Variable { \ : Variable(#N) { } \ \ void evaluate(Transaction *transaction, \ - RuleWithOperator *rule, \ + RuleWithActions *rule, \ std::vector *l) override { \ transaction-> e .resolve(l, m_keyExclusion); \ } \ @@ -92,7 +92,7 @@ class n : public Variable { \ : Variable(#N) { } \ \ void evaluate(Transaction *transaction, \ - RuleWithOperator *rule, \ + RuleWithActions *rule, \ std::vector *l) override { \ transaction-> e .evaluate(l); \ } \ @@ -550,7 +550,7 @@ class Variable : public VariableMonkeyResolution { virtual void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) = 0; @@ -630,7 +630,7 @@ class VariableModificatorExclusion : public Variable { m_base(std::move(var)) { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { m_base->evaluate(t, rule, l); } @@ -648,7 +648,7 @@ class VariableModificatorCount : public Variable { } void evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { std::vector reslIn; VariableValue *val = NULL; diff --git a/src/variables/web_app_id.h b/src/variables/web_app_id.h index 63947a30..d5f1aa54 100644 --- a/src/variables/web_app_id.h +++ b/src/variables/web_app_id.h @@ -36,7 +36,7 @@ class WebAppId : public Variable { : Variable("WEBAPPID") { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { const std::string name("WEBAPPID"); const std::string rname = transaction->m_rules->m_secWebAppId.m_value; diff --git a/src/variables/xml.cc b/src/variables/xml.cc index 137e0c78..7cb14a5f 100644 --- a/src/variables/xml.cc +++ b/src/variables/xml.cc @@ -48,12 +48,12 @@ namespace variables { #ifndef WITH_LIBXML2 void XML::evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { } #else void XML::evaluate(Transaction *t, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) { xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; diff --git a/src/variables/xml.h b/src/variables/xml.h index 833cdd25..7b0181fe 100644 --- a/src/variables/xml.h +++ b/src/variables/xml.h @@ -43,7 +43,7 @@ class XML_NoDictElement : public Variable { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override { l->push_back(new VariableValue(&m_var)); } @@ -59,7 +59,7 @@ class XML : public Variable { : Variable(_name) { } void evaluate(Transaction *transaction, - RuleWithOperator *rule, + RuleWithActions *rule, std::vector *l) override; }; diff --git a/test/test-cases/regression/action-allow.json b/test/test-cases/regression/action-allow.json index d4e3cdf1..357d451b 100644 --- a/test/test-cases/regression/action-allow.json +++ b/test/test-cases/regression/action-allow.json @@ -4,7 +4,7 @@ "version_min":300000, "title":"Testing allow action (1/3)", "expected":{ - "debug_log": "Skipped rule id '500066' as request trough the utilization of an `allow' action", + "debug_log": "Skipped rule id 'action-allow.json:3' as request trough the utilization of an `allow' action", "http_code": 200 }, "client":{