From fda03c0016b6c2d97b0249a223b5ac8f877604ee Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Sat, 16 Feb 2019 22:55:25 -0300 Subject: [PATCH] Yet another refactoring in Rule --- headers/modsecurity/rule.h | 86 +- headers/modsecurity/rule_message.h | 2 +- headers/modsecurity/rules_set_phases.h | 9 +- src/actions/block.cc | 2 +- src/actions/chain.cc | 2 +- src/actions/phase.cc | 2 +- src/operators/detect_sqli.cc | 2 +- src/operators/detect_xss.cc | 2 +- src/operators/pm.cc | 14 +- src/operators/rbl.cc | 2 +- src/operators/rx.cc | 2 +- src/operators/verify_cc.cc | 2 +- src/operators/verify_cpf.cc | 2 +- src/operators/verify_ssn.cc | 2 +- src/operators/verify_svnr.cc | 2 +- src/parser/driver.cc | 18 +- src/parser/seclang-parser.cc | 1549 ++++++++++++------------ src/parser/seclang-parser.hh | 6 +- src/parser/seclang-parser.yy | 33 +- src/rule.cc | 151 +-- src/rule_message.cc | 2 +- src/rule_script.h | 3 +- src/rules_set.cc | 2 +- src/rules_set_phases.cc | 25 +- src/variables/rule.h | 18 +- test/optimization/optimization.cc | 9 +- 26 files changed, 1018 insertions(+), 931 deletions(-) diff --git a/headers/modsecurity/rule.h b/headers/modsecurity/rule.h index 7543e46f..afe3a3fb 100644 --- a/headers/modsecurity/rule.h +++ b/headers/modsecurity/rule.h @@ -56,11 +56,19 @@ using TransformationResult = std::pair, std::shared_ptr>; using TransformationResults = std::list; +using Transformation = actions::transformations::Transformation; +using Transformations = std::vector; + +using Tags = std::vector; +using SetVars = std::vector; +using MatchActions = std::vector; + class Rule { public: - Rule(operators::Operator *_op, - variables::Variables *_variables, - std::vector *_actions, + Rule(operators::Operator *op, + variables::Variables *variables, + std::vector *actions, + Transformations *transformations, std::unique_ptr fileName, int lineNumber); explicit Rule(const std::string &marker); @@ -108,37 +116,67 @@ class Rule { int *nth) const; - actions::Action *m_theDisruptiveAction; - actions::LogData *m_logData; - actions::Msg *m_msg; - actions::Severity *m_severity; - bool m_chained; - bool m_containsCaptureAction; - bool m_containsMultiMatchAction; - bool m_containsStaticBlockAction; - bool m_secMarker; + + inline bool isUnconditional() const { return m_operator == NULL; } + + virtual bool isMarker() { return m_isSecMarker; } + + inline bool isChained() const { return m_isChained == true; } + inline bool hasCaptureAction() const { return m_containsCaptureAction == true; } + inline void setChained(bool b) { m_isChained = b; } + inline bool hasDisruptiveAction() const { return m_disruptiveAction != NULL; } + + + inline bool hasLogData() const { return m_logData != NULL; } + std::string logData(Transaction *t); + inline bool hasMsg() const { return m_msg != NULL; } + std::string msg(Transaction *t); + inline bool hasSeverity() const { return m_severity != NULL; } + int severity() const; + int getPhase() const { return m_phase; } + void setPhase(int phase) { m_phase = phase; } + + std::string getOperatorName() const; + int64_t m_ruleId; - int m_accuracy; - int m_lineNumber; - int m_maturity; - int m_phase; - modsecurity::variables::Variables *m_variables; - operators::Operator *m_op; std::unique_ptr m_chainedRuleChild; Rule *m_chainedRuleParent; + std::shared_ptr m_fileName; + std::string m_marker; std::string m_rev; std::string m_ver; - std::vector m_actionsRuntimePos; - std::vector m_actionsRuntimePre; - std::vector m_actionsSetVar; - std::vector m_actionsTag; + int m_accuracy; + int m_maturity; + int m_lineNumber; private: - bool m_unconditional; -}; + modsecurity::variables::Variables *m_variables; + operators::Operator *m_operator; + /* actions */ + actions::Action *m_disruptiveAction; + actions::LogData *m_logData; + actions::Msg *m_msg; + actions::Severity *m_severity; + MatchActions m_actionsRuntimePos; + SetVars m_actionsSetVar; + Tags m_actionsTag; + + /* actions > transformations */ + Transformations m_transformations; + + bool m_containsCaptureAction:1; + bool m_containsMultiMatchAction:1; + bool m_containsStaticBlockAction:1; + bool m_isChained:1; + bool m_isSecMarker:1; + bool m_unconditional:1; + + int m_phase; + +}; } // namespace modsecurity #endif diff --git a/headers/modsecurity/rule_message.h b/headers/modsecurity/rule_message.h index 7a25e38a..c434c0cf 100644 --- a/headers/modsecurity/rule_message.h +++ b/headers/modsecurity/rule_message.h @@ -51,7 +51,7 @@ class RuleMessage { m_maturity(rule->m_maturity), m_message(""), m_noAuditLog(false), - m_phase(rule->m_phase - 1), + m_phase(rule->getPhase() - 1), m_reference(""), m_rev(rule->m_rev), m_rule(rule), diff --git a/headers/modsecurity/rules_set_phases.h b/headers/modsecurity/rules_set_phases.h index ea55f9e7..6c718392 100644 --- a/headers/modsecurity/rules_set_phases.h +++ b/headers/modsecurity/rules_set_phases.h @@ -39,17 +39,18 @@ class Rule; /** @ingroup ModSecurity_CPP_API */ class RulesSetPhases { public: - ~RulesSetPhases(); bool insert(std::shared_ptr rule); int append(RulesSetPhases *from, std::ostringstream *err); void dump() const; - Rules *operator[](int index) { return &m_rules[index]; } - Rules *at(int index) { return &m_rules[index]; } + Rules *operator[](int index) { return &m_rulesAtPhase[index]; } + Rules *at(int index) { return &m_rulesAtPhase[index]; } + + private: + Rules m_rulesAtPhase[8]; - Rules m_rules[8]; }; diff --git a/src/actions/block.cc b/src/actions/block.cc index d041eb16..a32b03b2 100644 --- a/src/actions/block.cc +++ b/src/actions/block.cc @@ -33,7 +33,7 @@ bool Block::evaluate(Rule *rule, Transaction *transaction, std::shared_ptr rm) { ms_dbg_a(transaction, 8, "Marking request as disruptive."); - for (auto &a : transaction->m_rules->m_defaultActions[rule->m_phase]) { + for (auto &a : transaction->m_rules->m_defaultActions[rule->getPhase()]) { if (a->isDisruptive() == false) { continue; } diff --git a/src/actions/chain.cc b/src/actions/chain.cc index a51a3fcc..73b54c85 100644 --- a/src/actions/chain.cc +++ b/src/actions/chain.cc @@ -26,7 +26,7 @@ namespace actions { bool Chain::evaluate(Rule *rule, Transaction *transaction) { - rule->m_chained = true; + rule->setChained(true); return true; } diff --git a/src/actions/phase.cc b/src/actions/phase.cc index 26f9685c..2633f82d 100644 --- a/src/actions/phase.cc +++ b/src/actions/phase.cc @@ -73,7 +73,7 @@ bool Phase::init(std::string *error) { bool Phase::evaluate(Rule *rule, Transaction *transaction) { - rule->m_phase = m_phase; + rule->setPhase(m_phase); return true; } diff --git a/src/operators/detect_sqli.cc b/src/operators/detect_sqli.cc index a658528f..22af2509 100644 --- a/src/operators/detect_sqli.cc +++ b/src/operators/detect_sqli.cc @@ -38,7 +38,7 @@ bool DetectSQLi::evaluate(Transaction *t, Rule *rule, ms_dbg_a(t, 4, "detected SQLi using libinjection with " \ "fingerprint '" + std::string(fingerprint) + "' at: '" + input + "'"); - if (rule && t && rule->m_containsCaptureAction) { + if (rule && t && rule->hasCaptureAction()) { t->m_collections.m_tx_collection->storeOrUpdateFirst( "0", std::string(fingerprint)); ms_dbg_a(t, 7, "Added DetectSQLi match TX.0: " + \ diff --git a/src/operators/detect_xss.cc b/src/operators/detect_xss.cc index 2e3dde74..9661c455 100644 --- a/src/operators/detect_xss.cc +++ b/src/operators/detect_xss.cc @@ -34,7 +34,7 @@ bool DetectXSS::evaluate(Transaction *t, Rule *rule, if (t) { if (is_xss) { ms_dbg_a(t, 5, "detected XSS using libinjection."); - if (rule && t && rule->m_containsCaptureAction) { + if (rule && t && rule->hasCaptureAction()) { t->m_collections.m_tx_collection->storeOrUpdateFirst( "0", std::string(input)); ms_dbg_a(t, 7, "Added DetectXSS match TX.0: " + \ diff --git a/src/operators/pm.cc b/src/operators/pm.cc index db252711..432dad78 100644 --- a/src/operators/pm.cc +++ b/src/operators/pm.cc @@ -97,16 +97,16 @@ bool Pm::evaluate(Transaction *transaction, Rule *rule, #endif if (rc >= 0 && transaction) { - std::string match_(match); + std::string match_(match?match:""); logOffset(ruleMessage, rc - match_.size() + 1, match_.size()); transaction->m_matched.push_back(match_); - } - if (rule && rule->m_containsCaptureAction && transaction && rc >= 0) { - transaction->m_collections.m_tx_collection->storeOrUpdateFirst("0", - std::string(match)); - ms_dbg_a(transaction, 7, "Added pm match TX.0: " + \ - std::string(match)); + if (rule && rule->hasCaptureAction()) { + transaction->m_collections.m_tx_collection->storeOrUpdateFirst("0", + match_); + ms_dbg_a(transaction, 7, "Added pm match TX.0: " + \ + match_); + } } return rc >= 0; diff --git a/src/operators/rbl.cc b/src/operators/rbl.cc index 7bcfefec..d5de12ce 100644 --- a/src/operators/rbl.cc +++ b/src/operators/rbl.cc @@ -226,7 +226,7 @@ bool Rbl::evaluate(Transaction *t, Rule *rule, furtherInfo(sin, ipStr, t, m_provider); freeaddrinfo(info); - if (rule && t && rule->m_containsCaptureAction) { + if (rule && t && rule->hasCaptureAction()) { t->m_collections.m_tx_collection->storeOrUpdateFirst( "0", std::string(ipStr)); ms_dbg_a(t, 7, "Added RXL match TX.0: " + \ diff --git a/src/operators/rx.cc b/src/operators/rx.cc index 428923f5..2010d80c 100644 --- a/src/operators/rx.cc +++ b/src/operators/rx.cc @@ -53,7 +53,7 @@ bool Rx::evaluate(Transaction *transaction, Rule *rule, } matches = re->searchAll(input); - if (rule && rule->m_containsCaptureAction && transaction) { + if (rule && rule->hasCaptureAction() && transaction) { int i = 0; matches.reverse(); for (const SMatch& a : matches) { diff --git a/src/operators/verify_cc.cc b/src/operators/verify_cc.cc index 0b0c3ce8..81af9fb2 100644 --- a/src/operators/verify_cc.cc +++ b/src/operators/verify_cc.cc @@ -141,7 +141,7 @@ bool VerifyCC::evaluate(Transaction *t, Rule *rule, int is_cc = luhnVerify(match.c_str(), match.size()); if (is_cc) { if (t) { - if (rule && t && rule->m_containsCaptureAction) { + if (rule && t && rule->hasCaptureAction()) { t->m_collections.m_tx_collection->storeOrUpdateFirst( "0", std::string(match)); ms_dbg_a(t, 7, "Added VerifyCC match TX.0: " + \ diff --git a/src/operators/verify_cpf.cc b/src/operators/verify_cpf.cc index 1928b797..b1ea5f17 100644 --- a/src/operators/verify_cpf.cc +++ b/src/operators/verify_cpf.cc @@ -124,7 +124,7 @@ bool VerifyCPF::evaluate(Transaction *t, Rule *rule, is_cpf = verify(m.str().c_str(), m.str().size()); if (is_cpf) { logOffset(ruleMessage, m.offset(), m.str().size()); - if (rule && t && rule->m_containsCaptureAction) { + if (rule && t && rule->hasCaptureAction()) { t->m_collections.m_tx_collection->storeOrUpdateFirst( "0", m.str()); ms_dbg_a(t, 7, "Added VerifyCPF match TX.0: " + \ diff --git a/src/operators/verify_ssn.cc b/src/operators/verify_ssn.cc index b951ae53..c945e06d 100644 --- a/src/operators/verify_ssn.cc +++ b/src/operators/verify_ssn.cc @@ -126,7 +126,7 @@ bool VerifySSN::evaluate(Transaction *t, Rule *rule, is_ssn = verify(j.str().c_str(), j.str().size()); if (is_ssn) { logOffset(ruleMessage, j.offset(), j.str().size()); - if (rule && t && rule->m_containsCaptureAction) { + if (rule && t && rule->hasCaptureAction()) { t->m_collections.m_tx_collection->storeOrUpdateFirst( "0", j.str()); ms_dbg_a(t, 7, "Added VerifySSN match TX.0: " + \ diff --git a/src/operators/verify_svnr.cc b/src/operators/verify_svnr.cc index 669c7be2..30a7d565 100644 --- a/src/operators/verify_svnr.cc +++ b/src/operators/verify_svnr.cc @@ -94,7 +94,7 @@ bool VerifySVNR::evaluate(Transaction *t, Rule *rule, is_svnr = verify(j.str().c_str(), j.str().size()); if (is_svnr) { logOffset(ruleMessage, j.offset(), j.str().size()); - if (rule && t && rule->m_containsCaptureAction) { + if (rule && t && rule->hasCaptureAction()) { t->m_collections.m_tx_collection->storeOrUpdateFirst( "0", j.str()); ms_dbg_a(t, 7, "Added VerifySVNR match TX.0: " + \ diff --git a/src/parser/driver.cc b/src/parser/driver.cc index e82d4ec1..d4374c6a 100644 --- a/src/parser/driver.cc +++ b/src/parser/driver.cc @@ -44,7 +44,7 @@ Driver::~Driver() { int Driver::addSecMarker(std::string marker) { for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { std::unique_ptr rule(new Rule(marker)); - rule->m_phase = i; + rule->setPhase(i); m_rulesSetPhases.insert(std::move(rule)); } return 0; @@ -52,8 +52,8 @@ int Driver::addSecMarker(std::string marker) { int Driver::addSecAction(std::unique_ptr rule) { - if (rule->m_phase >= modsecurity::Phases::NUMBER_OF_PHASES) { - m_parserError << "Unknown phase: " << std::to_string(rule->m_phase); + if (rule->getPhase() >= modsecurity::Phases::NUMBER_OF_PHASES) { + m_parserError << "Unknown phase: " << std::to_string(rule->getPhase()); m_parserError << std::endl; return false; } @@ -72,16 +72,16 @@ int Driver::addSecRuleScript(std::unique_ptr rule) { int Driver::addSecRule(std::unique_ptr r) { - if (r->m_phase >= modsecurity::Phases::NUMBER_OF_PHASES) { - m_parserError << "Unknown phase: " << std::to_string(r->m_phase); + if (r->getPhase() >= modsecurity::Phases::NUMBER_OF_PHASES) { + m_parserError << "Unknown phase: " << std::to_string(r->getPhase()); m_parserError << std::endl; return false; } /* is it a chained rule? */ - if (m_lastRule != nullptr && m_lastRule->m_chained) { - r->m_phase = m_lastRule->m_phase; - if (r->m_theDisruptiveAction) { + if (m_lastRule != nullptr && m_lastRule->isChained()) { + r->setPhase(m_lastRule->getPhase()); + if (r->hasDisruptiveAction()) { m_parserError << "Disruptive actions can only be specified by"; m_parserError << " chain starter rules."; return false; @@ -148,7 +148,7 @@ int Driver::parse(const std::string &f, const std::string &ref) { * */ /* - if (m_lastRule != nullptr && m_lastRule->m_chained) { + if (m_lastRule != nullptr && m_lastRule->isChained()) { m_parserError << "Last rule is marked as chained but there " \ "isn't a subsequent rule." << std::endl; return false; diff --git a/src/parser/seclang-parser.cc b/src/parser/seclang-parser.cc index e9580c76..34115ee5 100644 --- a/src/parser/seclang-parser.cc +++ b/src/parser/seclang-parser.cc @@ -2305,8 +2305,13 @@ namespace yy { #line 1068 "seclang-parser.yy" { std::vector *a = new std::vector(); + std::vector *t = new std::vector(); for (auto &i : *yystack_[0].value.as < std::unique_ptr > > > ().get()) { - a->push_back(i.release()); + if (dynamic_cast(i.get())) { + t->push_back(dynamic_cast(i.release())); + } else { + a->push_back(i.release()); + } } variables::Variables *v = new variables::Variables(); for (auto &i : *yystack_[2].value.as < std::unique_ptr > > > ().get()) { @@ -2318,6 +2323,7 @@ namespace yy { /* op */ op, /* variables */ v, /* actions */ a, + /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*yystack_[3].location.end.filename)), /* line number */ yystack_[3].location.end.line )); @@ -2326,11 +2332,11 @@ namespace yy { YYERROR; } } -#line 2330 "seclang-parser.cc" +#line 2336 "seclang-parser.cc" break; case 75: -#line 1092 "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()) { @@ -2341,6 +2347,7 @@ namespace yy { /* op */ yystack_[0].value.as < std::unique_ptr > ().release(), /* variables */ v, /* actions */ NULL, + /* transformations */ NULL, /* file name */ std::unique_ptr(new std::string(*yystack_[2].location.end.filename)), /* line number */ yystack_[2].location.end.line )); @@ -2348,39 +2355,51 @@ namespace yy { YYERROR; } } -#line 2352 "seclang-parser.cc" +#line 2359 "seclang-parser.cc" break; case 76: -#line 1110 "seclang-parser.yy" +#line 1117 "seclang-parser.yy" { std::vector *a = new std::vector(); + std::vector *t = new std::vector(); for (auto &i : *yystack_[0].value.as < std::unique_ptr > > > ().get()) { - a->push_back(i.release()); + if (dynamic_cast(i.get())) { + t->push_back(dynamic_cast(i.release())); + } else { + a->push_back(i.release()); + } } std::unique_ptr rule(new Rule( /* op */ NULL, /* variables */ NULL, /* actions */ a, + /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*yystack_[1].location.end.filename)), /* line number */ yystack_[1].location.end.line )); driver.addSecAction(std::move(rule)); } -#line 2371 "seclang-parser.cc" +#line 2384 "seclang-parser.cc" break; case 77: -#line 1125 "seclang-parser.yy" +#line 1138 "seclang-parser.yy" { std::string err; std::vector *a = new std::vector(); + std::vector *t = new std::vector(); for (auto &i : *yystack_[0].value.as < std::unique_ptr > > > ().get()) { - a->push_back(i.release()); + if (dynamic_cast(i.get())) { + t->push_back(dynamic_cast(i.release())); + } else { + a->push_back(i.release()); + } } std::unique_ptr r(new RuleScript( /* path to script */ yystack_[1].value.as < std::string > (), /* actions */ a, + /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*yystack_[1].location.end.filename)), /* line number */ yystack_[1].location.end.line )); @@ -2393,11 +2412,11 @@ namespace yy { YYERROR; } } -#line 2397 "seclang-parser.cc" +#line 2416 "seclang-parser.cc" break; case 78: -#line 1147 "seclang-parser.yy" +#line 1166 "seclang-parser.yy" { bool hasDisruptive = false; std::vector *actions = new std::vector(); @@ -2418,7 +2437,7 @@ namespace yy { delete phase; } else if (a->action_kind == actions::Action::RunTimeOnlyIfMatchKind || a->action_kind == actions::Action::RunTimeBeforeMatchAttemptKind) { - actions::transformations::None *none = dynamic_cast(a); + actions::transformations::None *none = dynamic_cast(a); if (none != NULL) { driver.error(yystack_[2].location, "The transformation none is not suitable to be part of the SecDefaultActions"); YYERROR; @@ -2454,75 +2473,75 @@ namespace yy { delete actions; } -#line 2458 "seclang-parser.cc" +#line 2477 "seclang-parser.cc" break; case 79: -#line 1204 "seclang-parser.yy" +#line 1223 "seclang-parser.yy" { driver.addSecMarker(modsecurity::utils::string::removeBracketsIfNeeded(yystack_[0].value.as < std::string > ())); } -#line 2466 "seclang-parser.cc" +#line 2485 "seclang-parser.cc" break; case 80: -#line 1208 "seclang-parser.yy" +#line 1227 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DisabledRuleEngine; } -#line 2474 "seclang-parser.cc" +#line 2493 "seclang-parser.cc" break; case 81: -#line 1212 "seclang-parser.yy" +#line 1231 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::EnabledRuleEngine; } -#line 2482 "seclang-parser.cc" +#line 2501 "seclang-parser.cc" break; case 82: -#line 1216 "seclang-parser.yy" +#line 1235 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DetectionOnlyRuleEngine; } -#line 2490 "seclang-parser.cc" +#line 2509 "seclang-parser.cc" break; case 83: -#line 1220 "seclang-parser.yy" +#line 1239 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 2498 "seclang-parser.cc" +#line 2517 "seclang-parser.cc" break; case 84: -#line 1224 "seclang-parser.yy" +#line 1243 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 2506 "seclang-parser.cc" +#line 2525 "seclang-parser.cc" break; case 85: -#line 1228 "seclang-parser.yy" +#line 1247 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 2514 "seclang-parser.cc" +#line 2533 "seclang-parser.cc" break; case 86: -#line 1232 "seclang-parser.yy" +#line 1251 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 2522 "seclang-parser.cc" +#line 2541 "seclang-parser.cc" break; case 87: -#line 1236 "seclang-parser.yy" +#line 1255 "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."); @@ -2531,259 +2550,259 @@ namespace yy { driver.m_secArgumentSeparator.m_value = yystack_[0].value.as < std::string > (); driver.m_secArgumentSeparator.m_set = true; } -#line 2535 "seclang-parser.cc" +#line 2554 "seclang-parser.cc" break; case 88: -#line 1245 "seclang-parser.yy" +#line 1264 "seclang-parser.yy" { driver.m_components.push_back(yystack_[0].value.as < std::string > ()); } -#line 2543 "seclang-parser.cc" +#line 2562 "seclang-parser.cc" break; case 89: -#line 1249 "seclang-parser.yy" +#line 1268 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecConnEngine is not yet supported."); YYERROR; } -#line 2552 "seclang-parser.cc" +#line 2571 "seclang-parser.cc" break; case 90: -#line 1254 "seclang-parser.yy" +#line 1273 "seclang-parser.yy" { } -#line 2559 "seclang-parser.cc" +#line 2578 "seclang-parser.cc" break; case 91: -#line 1257 "seclang-parser.yy" +#line 1276 "seclang-parser.yy" { driver.m_secWebAppId.m_value = yystack_[0].value.as < std::string > (); driver.m_secWebAppId.m_set = true; } -#line 2568 "seclang-parser.cc" +#line 2587 "seclang-parser.cc" break; case 92: -#line 1262 "seclang-parser.yy" +#line 1281 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecServerSignature is not supported."); YYERROR; } -#line 2577 "seclang-parser.cc" +#line 2596 "seclang-parser.cc" break; case 93: -#line 1267 "seclang-parser.yy" +#line 1286 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCacheTransformations is not supported."); YYERROR; } -#line 2586 "seclang-parser.cc" +#line 2605 "seclang-parser.cc" break; case 94: -#line 1272 "seclang-parser.yy" +#line 1291 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecDisableBackendCompression is not supported."); YYERROR; } -#line 2595 "seclang-parser.cc" +#line 2614 "seclang-parser.cc" break; case 95: -#line 1277 "seclang-parser.yy" +#line 1296 "seclang-parser.yy" { } -#line 2602 "seclang-parser.cc" +#line 2621 "seclang-parser.cc" break; case 96: -#line 1280 "seclang-parser.yy" +#line 1299 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecContentInjection is not yet supported."); YYERROR; } -#line 2611 "seclang-parser.cc" +#line 2630 "seclang-parser.cc" break; case 97: -#line 1285 "seclang-parser.yy" +#line 1304 "seclang-parser.yy" { } -#line 2618 "seclang-parser.cc" +#line 2637 "seclang-parser.cc" break; case 98: -#line 1288 "seclang-parser.yy" +#line 1307 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecChrootDir is not supported."); YYERROR; } -#line 2627 "seclang-parser.cc" +#line 2646 "seclang-parser.cc" break; case 99: -#line 1293 "seclang-parser.yy" +#line 1312 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecHashEngine is not yet supported."); YYERROR; } -#line 2636 "seclang-parser.cc" +#line 2655 "seclang-parser.cc" break; case 100: -#line 1298 "seclang-parser.yy" +#line 1317 "seclang-parser.yy" { } -#line 2643 "seclang-parser.cc" +#line 2662 "seclang-parser.cc" break; case 101: -#line 1301 "seclang-parser.yy" +#line 1320 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashKey is not yet supported."); YYERROR; } -#line 2652 "seclang-parser.cc" +#line 2671 "seclang-parser.cc" break; case 102: -#line 1306 "seclang-parser.yy" +#line 1325 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashParam is not yet supported."); YYERROR; } -#line 2661 "seclang-parser.cc" +#line 2680 "seclang-parser.cc" break; case 103: -#line 1311 "seclang-parser.yy" +#line 1330 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodRx is not yet supported."); YYERROR; } -#line 2670 "seclang-parser.cc" +#line 2689 "seclang-parser.cc" break; case 104: -#line 1316 "seclang-parser.yy" +#line 1335 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodPm is not yet supported."); YYERROR; } -#line 2679 "seclang-parser.cc" +#line 2698 "seclang-parser.cc" break; case 105: -#line 1321 "seclang-parser.yy" +#line 1340 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGsbLookupDb is not supported."); YYERROR; } -#line 2688 "seclang-parser.cc" +#line 2707 "seclang-parser.cc" break; case 106: -#line 1326 "seclang-parser.yy" +#line 1345 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGuardianLog is not supported."); YYERROR; } -#line 2697 "seclang-parser.cc" +#line 2716 "seclang-parser.cc" break; case 107: -#line 1331 "seclang-parser.yy" +#line 1350 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecInterceptOnError is not yet supported."); YYERROR; } -#line 2706 "seclang-parser.cc" +#line 2725 "seclang-parser.cc" break; case 108: -#line 1336 "seclang-parser.yy" +#line 1355 "seclang-parser.yy" { } -#line 2713 "seclang-parser.cc" +#line 2732 "seclang-parser.cc" break; case 109: -#line 1339 "seclang-parser.yy" +#line 1358 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnReadStateLimit is not yet supported."); YYERROR; } -#line 2722 "seclang-parser.cc" +#line 2741 "seclang-parser.cc" break; case 110: -#line 1344 "seclang-parser.yy" +#line 1363 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnWriteStateLimit is not yet supported."); YYERROR; } -#line 2731 "seclang-parser.cc" +#line 2750 "seclang-parser.cc" break; case 111: -#line 1349 "seclang-parser.yy" +#line 1368 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecSensorId is not yet supported."); YYERROR; } -#line 2740 "seclang-parser.cc" +#line 2759 "seclang-parser.cc" break; case 112: -#line 1354 "seclang-parser.yy" +#line 1373 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecRuleInheritance is not yet supported."); YYERROR; } -#line 2749 "seclang-parser.cc" +#line 2768 "seclang-parser.cc" break; case 113: -#line 1359 "seclang-parser.yy" +#line 1378 "seclang-parser.yy" { } -#line 2756 "seclang-parser.cc" +#line 2775 "seclang-parser.cc" break; case 114: -#line 1362 "seclang-parser.yy" +#line 1381 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecRulePerfTime is not yet supported."); YYERROR; } -#line 2765 "seclang-parser.cc" +#line 2784 "seclang-parser.cc" break; case 115: -#line 1367 "seclang-parser.yy" +#line 1386 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamInBodyInspection is not supported."); YYERROR; } -#line 2774 "seclang-parser.cc" +#line 2793 "seclang-parser.cc" break; case 116: -#line 1372 "seclang-parser.yy" +#line 1391 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamOutBodyInspection is not supported."); YYERROR; } -#line 2783 "seclang-parser.cc" +#line 2802 "seclang-parser.cc" break; case 117: -#line 1377 "seclang-parser.yy" +#line 1396 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.load(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2796,11 +2815,11 @@ namespace yy { YYERROR; } } -#line 2800 "seclang-parser.cc" +#line 2819 "seclang-parser.cc" break; case 118: -#line 1390 "seclang-parser.yy" +#line 1409 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByTag(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2813,11 +2832,11 @@ namespace yy { YYERROR; } } -#line 2817 "seclang-parser.cc" +#line 2836 "seclang-parser.cc" break; case 119: -#line 1403 "seclang-parser.yy" +#line 1422 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByMsg(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2830,11 +2849,11 @@ namespace yy { YYERROR; } } -#line 2834 "seclang-parser.cc" +#line 2853 "seclang-parser.cc" break; case 120: -#line 1416 "seclang-parser.yy" +#line 1435 "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) { @@ -2847,11 +2866,11 @@ namespace yy { YYERROR; } } -#line 2851 "seclang-parser.cc" +#line 2870 "seclang-parser.cc" break; case 121: -#line 1429 "seclang-parser.yy" +#line 1448 "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) { @@ -2864,11 +2883,11 @@ namespace yy { YYERROR; } } -#line 2868 "seclang-parser.cc" +#line 2887 "seclang-parser.cc" break; case 122: -#line 1442 "seclang-parser.yy" +#line 1461 "seclang-parser.yy" { std::string error; double ruleId; @@ -2894,11 +2913,11 @@ namespace yy { YYERROR; } } -#line 2898 "seclang-parser.cc" +#line 2917 "seclang-parser.cc" break; case 123: -#line 1468 "seclang-parser.yy" +#line 1487 "seclang-parser.yy" { std::string error; double ruleId; @@ -2925,11 +2944,11 @@ namespace yy { YYERROR; } } -#line 2929 "seclang-parser.cc" +#line 2948 "seclang-parser.cc" break; case 124: -#line 1496 "seclang-parser.yy" +#line 1515 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { driver.m_debugLog->setDebugLogLevel(atoi(yystack_[0].value.as < std::string > ().c_str())); @@ -2941,11 +2960,11 @@ namespace yy { YYERROR; } } -#line 2945 "seclang-parser.cc" +#line 2964 "seclang-parser.cc" break; case 125: -#line 1508 "seclang-parser.yy" +#line 1527 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { std::string error; @@ -2964,11 +2983,11 @@ namespace yy { YYERROR; } } -#line 2968 "seclang-parser.cc" +#line 2987 "seclang-parser.cc" break; case 126: -#line 1528 "seclang-parser.yy" +#line 1547 "seclang-parser.yy" { #if defined(WITH_GEOIP) or defined(WITH_MAXMIND) std::string err; @@ -2995,38 +3014,38 @@ namespace yy { YYERROR; #endif // WITH_GEOIP } -#line 2999 "seclang-parser.cc" +#line 3018 "seclang-parser.cc" break; case 127: -#line 1555 "seclang-parser.yy" +#line 1574 "seclang-parser.yy" { driver.m_argumentsLimit.m_set = true; driver.m_argumentsLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3008 "seclang-parser.cc" +#line 3027 "seclang-parser.cc" break; case 128: -#line 1561 "seclang-parser.yy" +#line 1580 "seclang-parser.yy" { driver.m_requestBodyLimit.m_set = true; driver.m_requestBodyLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3017 "seclang-parser.cc" +#line 3036 "seclang-parser.cc" break; case 129: -#line 1566 "seclang-parser.yy" +#line 1585 "seclang-parser.yy" { driver.m_requestBodyNoFilesLimit.m_set = true; driver.m_requestBodyNoFilesLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3026 "seclang-parser.cc" +#line 3045 "seclang-parser.cc" break; case 130: -#line 1571 "seclang-parser.yy" +#line 1590 "seclang-parser.yy" { std::stringstream ss; ss << "As of ModSecurity version 3.0, SecRequestBodyInMemoryLimit is no longer "; @@ -3035,68 +3054,68 @@ namespace yy { driver.error(yystack_[1].location, ss.str()); YYERROR; } -#line 3039 "seclang-parser.cc" +#line 3058 "seclang-parser.cc" break; case 131: -#line 1580 "seclang-parser.yy" +#line 1599 "seclang-parser.yy" { driver.m_responseBodyLimit.m_set = true; driver.m_responseBodyLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3048 "seclang-parser.cc" +#line 3067 "seclang-parser.cc" break; case 132: -#line 1585 "seclang-parser.yy" +#line 1604 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3056 "seclang-parser.cc" +#line 3075 "seclang-parser.cc" break; case 133: -#line 1589 "seclang-parser.yy" +#line 1608 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3064 "seclang-parser.cc" +#line 3083 "seclang-parser.cc" break; case 134: -#line 1593 "seclang-parser.yy" +#line 1612 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3072 "seclang-parser.cc" +#line 3091 "seclang-parser.cc" break; case 135: -#line 1597 "seclang-parser.yy" +#line 1616 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3080 "seclang-parser.cc" +#line 3099 "seclang-parser.cc" break; case 136: -#line 1601 "seclang-parser.yy" +#line 1620 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::AbortOnFailedRemoteRulesAction; } -#line 3088 "seclang-parser.cc" +#line 3107 "seclang-parser.cc" break; case 137: -#line 1605 "seclang-parser.yy" +#line 1624 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::WarnOnFailedRemoteRulesAction; } -#line 3096 "seclang-parser.cc" +#line 3115 "seclang-parser.cc" break; case 140: -#line 1619 "seclang-parser.yy" +#line 1638 "seclang-parser.yy" { std::istringstream buf(yystack_[0].value.as < std::string > ()); std::istream_iterator beg(buf), end; @@ -3108,37 +3127,37 @@ namespace yy { driver.m_responseBodyTypeToBeInspected.m_value.insert(*it); } } -#line 3112 "seclang-parser.cc" +#line 3131 "seclang-parser.cc" break; case 141: -#line 1631 "seclang-parser.yy" +#line 1650 "seclang-parser.yy" { driver.m_responseBodyTypeToBeInspected.m_set = true; driver.m_responseBodyTypeToBeInspected.m_clear = true; driver.m_responseBodyTypeToBeInspected.m_value.clear(); } -#line 3122 "seclang-parser.cc" +#line 3141 "seclang-parser.cc" break; case 142: -#line 1637 "seclang-parser.yy" +#line 1656 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 3130 "seclang-parser.cc" +#line 3149 "seclang-parser.cc" break; case 143: -#line 1641 "seclang-parser.yy" +#line 1660 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 3138 "seclang-parser.cc" +#line 3157 "seclang-parser.cc" break; case 144: -#line 1645 "seclang-parser.yy" +#line 1664 "seclang-parser.yy" { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended std::stringstream ss; @@ -3149,31 +3168,31 @@ namespace yy { YYERROR; */ } -#line 3153 "seclang-parser.cc" +#line 3172 "seclang-parser.cc" break; case 147: -#line 1666 "seclang-parser.yy" +#line 1685 "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 3164 "seclang-parser.cc" +#line 3183 "seclang-parser.cc" break; case 148: -#line 1673 "seclang-parser.yy" +#line 1692 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCookieV0Separator is not yet supported."); YYERROR; } -#line 3173 "seclang-parser.cc" +#line 3192 "seclang-parser.cc" break; case 150: -#line 1683 "seclang-parser.yy" +#line 1702 "seclang-parser.yy" { std::string error; std::vector param; @@ -3227,31 +3246,31 @@ namespace yy { } } -#line 3231 "seclang-parser.cc" +#line 3250 "seclang-parser.cc" break; case 151: -#line 1737 "seclang-parser.yy" +#line 1756 "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 3242 "seclang-parser.cc" +#line 3261 "seclang-parser.cc" break; case 152: -#line 1744 "seclang-parser.yy" +#line 1763 "seclang-parser.yy" { driver.m_httpblKey.m_set = true; driver.m_httpblKey.m_value = yystack_[0].value.as < std::string > (); } -#line 3251 "seclang-parser.cc" +#line 3270 "seclang-parser.cc" break; case 153: -#line 1752 "seclang-parser.yy" +#line 1771 "seclang-parser.yy" { std::unique_ptr > > originalList = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); std::unique_ptr>> newList(new std::vector>()); @@ -3285,2363 +3304,2363 @@ namespace yy { } yylhs.value.as < std::unique_ptr > > > () = std::move(newNewList); } -#line 3289 "seclang-parser.cc" +#line 3308 "seclang-parser.cc" break; case 154: -#line 1789 "seclang-parser.yy" +#line 1808 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); } -#line 3297 "seclang-parser.cc" +#line 3316 "seclang-parser.cc" break; case 155: -#line 1793 "seclang-parser.yy" +#line 1812 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[1].value.as < std::unique_ptr > > > ()); } -#line 3305 "seclang-parser.cc" +#line 3324 "seclang-parser.cc" break; case 156: -#line 1800 "seclang-parser.yy" +#line 1819 "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 3314 "seclang-parser.cc" +#line 3333 "seclang-parser.cc" break; case 157: -#line 1805 "seclang-parser.yy" +#line 1824 "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 3324 "seclang-parser.cc" +#line 3343 "seclang-parser.cc" break; case 158: -#line 1811 "seclang-parser.yy" +#line 1830 "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 3334 "seclang-parser.cc" +#line 3353 "seclang-parser.cc" break; case 159: -#line 1817 "seclang-parser.yy" +#line 1836 "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 3344 "seclang-parser.cc" +#line 3363 "seclang-parser.cc" break; case 160: -#line 1823 "seclang-parser.yy" +#line 1842 "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 3355 "seclang-parser.cc" +#line 3374 "seclang-parser.cc" break; case 161: -#line 1830 "seclang-parser.yy" +#line 1849 "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 3366 "seclang-parser.cc" +#line 3385 "seclang-parser.cc" break; case 162: -#line 1840 "seclang-parser.yy" +#line 1859 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3374 "seclang-parser.cc" +#line 3393 "seclang-parser.cc" break; case 163: -#line 1844 "seclang-parser.yy" +#line 1863 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3382 "seclang-parser.cc" +#line 3401 "seclang-parser.cc" break; case 164: -#line 1848 "seclang-parser.yy" +#line 1867 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_NoDictElement()); } -#line 3390 "seclang-parser.cc" +#line 3409 "seclang-parser.cc" break; case 165: -#line 1852 "seclang-parser.yy" +#line 1871 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3398 "seclang-parser.cc" +#line 3417 "seclang-parser.cc" break; case 166: -#line 1856 "seclang-parser.yy" +#line 1875 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3406 "seclang-parser.cc" +#line 3425 "seclang-parser.cc" break; case 167: -#line 1860 "seclang-parser.yy" +#line 1879 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_NoDictElement()); } -#line 3414 "seclang-parser.cc" +#line 3433 "seclang-parser.cc" break; case 168: -#line 1864 "seclang-parser.yy" +#line 1883 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3422 "seclang-parser.cc" +#line 3441 "seclang-parser.cc" break; case 169: -#line 1868 "seclang-parser.yy" +#line 1887 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3430 "seclang-parser.cc" +#line 3449 "seclang-parser.cc" break; case 170: -#line 1872 "seclang-parser.yy" +#line 1891 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_NoDictElement()); } -#line 3438 "seclang-parser.cc" +#line 3457 "seclang-parser.cc" break; case 171: -#line 1876 "seclang-parser.yy" +#line 1895 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3446 "seclang-parser.cc" +#line 3465 "seclang-parser.cc" break; case 172: -#line 1880 "seclang-parser.yy" +#line 1899 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3454 "seclang-parser.cc" +#line 3473 "seclang-parser.cc" break; case 173: -#line 1884 "seclang-parser.yy" +#line 1903 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_NoDictElement()); } -#line 3462 "seclang-parser.cc" +#line 3481 "seclang-parser.cc" break; case 174: -#line 1888 "seclang-parser.yy" +#line 1907 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3470 "seclang-parser.cc" +#line 3489 "seclang-parser.cc" break; case 175: -#line 1892 "seclang-parser.yy" +#line 1911 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3478 "seclang-parser.cc" +#line 3497 "seclang-parser.cc" break; case 176: -#line 1896 "seclang-parser.yy" +#line 1915 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_NoDictElement()); } -#line 3486 "seclang-parser.cc" +#line 3505 "seclang-parser.cc" break; case 177: -#line 1900 "seclang-parser.yy" +#line 1919 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3494 "seclang-parser.cc" +#line 3513 "seclang-parser.cc" break; case 178: -#line 1904 "seclang-parser.yy" +#line 1923 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3502 "seclang-parser.cc" +#line 3521 "seclang-parser.cc" break; case 179: -#line 1908 "seclang-parser.yy" +#line 1927 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_NoDictElement()); } -#line 3510 "seclang-parser.cc" +#line 3529 "seclang-parser.cc" break; case 180: -#line 1912 "seclang-parser.yy" +#line 1931 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3518 "seclang-parser.cc" +#line 3537 "seclang-parser.cc" break; case 181: -#line 1916 "seclang-parser.yy" +#line 1935 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3526 "seclang-parser.cc" +#line 3545 "seclang-parser.cc" break; case 182: -#line 1920 "seclang-parser.yy" +#line 1939 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_NoDictElement()); } -#line 3534 "seclang-parser.cc" +#line 3553 "seclang-parser.cc" break; case 183: -#line 1924 "seclang-parser.yy" +#line 1943 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3542 "seclang-parser.cc" +#line 3561 "seclang-parser.cc" break; case 184: -#line 1928 "seclang-parser.yy" +#line 1947 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3550 "seclang-parser.cc" +#line 3569 "seclang-parser.cc" break; case 185: -#line 1932 "seclang-parser.yy" +#line 1951 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_NoDictElement()); } -#line 3558 "seclang-parser.cc" +#line 3577 "seclang-parser.cc" break; case 186: -#line 1936 "seclang-parser.yy" +#line 1955 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3566 "seclang-parser.cc" +#line 3585 "seclang-parser.cc" break; case 187: -#line 1940 "seclang-parser.yy" +#line 1959 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3574 "seclang-parser.cc" +#line 3593 "seclang-parser.cc" break; case 188: -#line 1944 "seclang-parser.yy" +#line 1963 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_NoDictElement()); } -#line 3582 "seclang-parser.cc" +#line 3601 "seclang-parser.cc" break; case 189: -#line 1948 "seclang-parser.yy" +#line 1967 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3590 "seclang-parser.cc" +#line 3609 "seclang-parser.cc" break; case 190: -#line 1952 "seclang-parser.yy" +#line 1971 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3598 "seclang-parser.cc" +#line 3617 "seclang-parser.cc" break; case 191: -#line 1956 "seclang-parser.yy" +#line 1975 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_NoDictElement()); } -#line 3606 "seclang-parser.cc" +#line 3625 "seclang-parser.cc" break; case 192: -#line 1960 "seclang-parser.yy" +#line 1979 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3614 "seclang-parser.cc" +#line 3633 "seclang-parser.cc" break; case 193: -#line 1964 "seclang-parser.yy" +#line 1983 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3622 "seclang-parser.cc" +#line 3641 "seclang-parser.cc" break; case 194: -#line 1968 "seclang-parser.yy" +#line 1987 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_NoDictElement()); } -#line 3630 "seclang-parser.cc" +#line 3649 "seclang-parser.cc" break; case 195: -#line 1972 "seclang-parser.yy" +#line 1991 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3638 "seclang-parser.cc" +#line 3657 "seclang-parser.cc" break; case 196: -#line 1976 "seclang-parser.yy" +#line 1995 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3646 "seclang-parser.cc" +#line 3665 "seclang-parser.cc" break; case 197: -#line 1980 "seclang-parser.yy" +#line 1999 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_NoDictElement()); } -#line 3654 "seclang-parser.cc" +#line 3673 "seclang-parser.cc" break; case 198: -#line 1984 "seclang-parser.yy" +#line 2003 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3662 "seclang-parser.cc" +#line 3681 "seclang-parser.cc" break; case 199: -#line 1988 "seclang-parser.yy" +#line 2007 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3670 "seclang-parser.cc" +#line 3689 "seclang-parser.cc" break; case 200: -#line 1992 "seclang-parser.yy" +#line 2011 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_NoDictElement()); } -#line 3678 "seclang-parser.cc" +#line 3697 "seclang-parser.cc" break; case 201: -#line 1996 "seclang-parser.yy" +#line 2015 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3686 "seclang-parser.cc" +#line 3705 "seclang-parser.cc" break; case 202: -#line 2000 "seclang-parser.yy" +#line 2019 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3694 "seclang-parser.cc" +#line 3713 "seclang-parser.cc" break; case 203: -#line 2004 "seclang-parser.yy" +#line 2023 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_NoDictElement()); } -#line 3702 "seclang-parser.cc" +#line 3721 "seclang-parser.cc" break; case 204: -#line 2008 "seclang-parser.yy" +#line 2027 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3710 "seclang-parser.cc" +#line 3729 "seclang-parser.cc" break; case 205: -#line 2012 "seclang-parser.yy" +#line 2031 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3718 "seclang-parser.cc" +#line 3737 "seclang-parser.cc" break; case 206: -#line 2016 "seclang-parser.yy" +#line 2035 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_NoDictElement()); } -#line 3726 "seclang-parser.cc" +#line 3745 "seclang-parser.cc" break; case 207: -#line 2020 "seclang-parser.yy" +#line 2039 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3734 "seclang-parser.cc" +#line 3753 "seclang-parser.cc" break; case 208: -#line 2024 "seclang-parser.yy" +#line 2043 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3742 "seclang-parser.cc" +#line 3761 "seclang-parser.cc" break; case 209: -#line 2028 "seclang-parser.yy" +#line 2047 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_NoDictElement()); } -#line 3750 "seclang-parser.cc" +#line 3769 "seclang-parser.cc" break; case 210: -#line 2032 "seclang-parser.yy" +#line 2051 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3758 "seclang-parser.cc" +#line 3777 "seclang-parser.cc" break; case 211: -#line 2036 "seclang-parser.yy" +#line 2055 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3766 "seclang-parser.cc" +#line 3785 "seclang-parser.cc" break; case 212: -#line 2040 "seclang-parser.yy" +#line 2059 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_NoDictElement()); } -#line 3774 "seclang-parser.cc" +#line 3793 "seclang-parser.cc" break; case 213: -#line 2044 "seclang-parser.yy" +#line 2063 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3782 "seclang-parser.cc" +#line 3801 "seclang-parser.cc" break; case 214: -#line 2048 "seclang-parser.yy" +#line 2067 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3790 "seclang-parser.cc" +#line 3809 "seclang-parser.cc" break; case 215: -#line 2052 "seclang-parser.yy" +#line 2071 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV")); } -#line 3798 "seclang-parser.cc" +#line 3817 "seclang-parser.cc" break; case 216: -#line 2056 "seclang-parser.yy" +#line 2075 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML("XML:" + yystack_[0].value.as < std::string > ())); } -#line 3806 "seclang-parser.cc" +#line 3825 "seclang-parser.cc" break; case 217: -#line 2060 "seclang-parser.yy" +#line 2079 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML("XML:" + yystack_[0].value.as < std::string > ())); } -#line 3814 "seclang-parser.cc" +#line 3833 "seclang-parser.cc" break; case 218: -#line 2064 "seclang-parser.yy" +#line 2083 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML_NoDictElement()); } -#line 3822 "seclang-parser.cc" +#line 3841 "seclang-parser.cc" break; case 219: -#line 2068 "seclang-parser.yy" +#line 2087 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3830 "seclang-parser.cc" +#line 3849 "seclang-parser.cc" break; case 220: -#line 2072 "seclang-parser.yy" +#line 2091 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3838 "seclang-parser.cc" +#line 3857 "seclang-parser.cc" break; case 221: -#line 2076 "seclang-parser.yy" +#line 2095 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_NoDictElement()); } -#line 3846 "seclang-parser.cc" +#line 3865 "seclang-parser.cc" break; case 222: -#line 2080 "seclang-parser.yy" +#line 2099 "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 3854 "seclang-parser.cc" +#line 3873 "seclang-parser.cc" break; case 223: -#line 2084 "seclang-parser.yy" +#line 2103 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3862 "seclang-parser.cc" +#line 3881 "seclang-parser.cc" break; case 224: -#line 2088 "seclang-parser.yy" +#line 2107 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3870 "seclang-parser.cc" +#line 3889 "seclang-parser.cc" break; case 225: -#line 2092 "seclang-parser.yy" +#line 2111 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_NoDictElement()); } -#line 3878 "seclang-parser.cc" +#line 3897 "seclang-parser.cc" break; case 226: -#line 2096 "seclang-parser.yy" +#line 2115 "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 3886 "seclang-parser.cc" +#line 3905 "seclang-parser.cc" break; case 227: -#line 2100 "seclang-parser.yy" +#line 2119 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3894 "seclang-parser.cc" +#line 3913 "seclang-parser.cc" break; case 228: -#line 2104 "seclang-parser.yy" +#line 2123 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3902 "seclang-parser.cc" +#line 3921 "seclang-parser.cc" break; case 229: -#line 2108 "seclang-parser.yy" +#line 2127 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_NoDictElement()); } -#line 3910 "seclang-parser.cc" +#line 3929 "seclang-parser.cc" break; case 230: -#line 2112 "seclang-parser.yy" +#line 2131 "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 3918 "seclang-parser.cc" +#line 3937 "seclang-parser.cc" break; case 231: -#line 2116 "seclang-parser.yy" +#line 2135 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3926 "seclang-parser.cc" +#line 3945 "seclang-parser.cc" break; case 232: -#line 2120 "seclang-parser.yy" +#line 2139 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3934 "seclang-parser.cc" +#line 3953 "seclang-parser.cc" break; case 233: -#line 2124 "seclang-parser.yy" +#line 2143 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_NoDictElement()); } -#line 3942 "seclang-parser.cc" +#line 3961 "seclang-parser.cc" break; case 234: -#line 2128 "seclang-parser.yy" +#line 2147 "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 3950 "seclang-parser.cc" +#line 3969 "seclang-parser.cc" break; case 235: -#line 2132 "seclang-parser.yy" +#line 2151 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3958 "seclang-parser.cc" +#line 3977 "seclang-parser.cc" break; case 236: -#line 2136 "seclang-parser.yy" +#line 2155 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3966 "seclang-parser.cc" +#line 3985 "seclang-parser.cc" break; case 237: -#line 2140 "seclang-parser.yy" +#line 2159 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_NoDictElement()); } -#line 3974 "seclang-parser.cc" +#line 3993 "seclang-parser.cc" break; case 238: -#line 2144 "seclang-parser.yy" +#line 2163 "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 3982 "seclang-parser.cc" +#line 4001 "seclang-parser.cc" break; case 239: -#line 2148 "seclang-parser.yy" +#line 2167 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3990 "seclang-parser.cc" +#line 4009 "seclang-parser.cc" break; case 240: -#line 2152 "seclang-parser.yy" +#line 2171 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3998 "seclang-parser.cc" +#line 4017 "seclang-parser.cc" break; case 241: -#line 2156 "seclang-parser.yy" +#line 2175 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_NoDictElement()); } -#line 4006 "seclang-parser.cc" +#line 4025 "seclang-parser.cc" break; case 242: -#line 2160 "seclang-parser.yy" +#line 2179 "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 4014 "seclang-parser.cc" +#line 4033 "seclang-parser.cc" break; case 243: -#line 2164 "seclang-parser.yy" +#line 2183 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4022 "seclang-parser.cc" +#line 4041 "seclang-parser.cc" break; case 244: -#line 2168 "seclang-parser.yy" +#line 2187 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4030 "seclang-parser.cc" +#line 4049 "seclang-parser.cc" break; case 245: -#line 2172 "seclang-parser.yy" +#line 2191 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_NoDictElement()); } -#line 4038 "seclang-parser.cc" +#line 4057 "seclang-parser.cc" break; case 246: -#line 2176 "seclang-parser.yy" +#line 2195 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4046 "seclang-parser.cc" +#line 4065 "seclang-parser.cc" break; case 247: -#line 2180 "seclang-parser.yy" +#line 2199 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4054 "seclang-parser.cc" +#line 4073 "seclang-parser.cc" break; case 248: -#line 2184 "seclang-parser.yy" +#line 2203 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_NoDictElement()); } -#line 4062 "seclang-parser.cc" +#line 4081 "seclang-parser.cc" break; case 249: -#line 2188 "seclang-parser.yy" +#line 2207 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4070 "seclang-parser.cc" +#line 4089 "seclang-parser.cc" break; case 250: -#line 2192 "seclang-parser.yy" +#line 2211 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4078 "seclang-parser.cc" +#line 4097 "seclang-parser.cc" break; case 251: -#line 2196 "seclang-parser.yy" +#line 2215 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_NoDictElement()); } -#line 4086 "seclang-parser.cc" +#line 4105 "seclang-parser.cc" break; case 252: -#line 2201 "seclang-parser.yy" +#line 2220 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4094 "seclang-parser.cc" +#line 4113 "seclang-parser.cc" break; case 253: -#line 2205 "seclang-parser.yy" +#line 2224 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4102 "seclang-parser.cc" +#line 4121 "seclang-parser.cc" break; case 254: -#line 2209 "seclang-parser.yy" +#line 2228 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_NoDictElement()); } -#line 4110 "seclang-parser.cc" +#line 4129 "seclang-parser.cc" break; case 255: -#line 2214 "seclang-parser.yy" +#line 2233 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4118 "seclang-parser.cc" +#line 4137 "seclang-parser.cc" break; case 256: -#line 2218 "seclang-parser.yy" +#line 2237 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4126 "seclang-parser.cc" +#line 4145 "seclang-parser.cc" break; case 257: -#line 2222 "seclang-parser.yy" +#line 2241 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_NoDictElement()); } -#line 4134 "seclang-parser.cc" +#line 4153 "seclang-parser.cc" break; case 258: -#line 2227 "seclang-parser.yy" +#line 2246 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentType()); } -#line 4142 "seclang-parser.cc" +#line 4161 "seclang-parser.cc" break; case 259: -#line 2232 "seclang-parser.yy" +#line 2251 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4150 "seclang-parser.cc" +#line 4169 "seclang-parser.cc" break; case 260: -#line 2236 "seclang-parser.yy" +#line 2255 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4158 "seclang-parser.cc" +#line 4177 "seclang-parser.cc" break; case 261: -#line 2240 "seclang-parser.yy" +#line 2259 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_NoDictElement()); } -#line 4166 "seclang-parser.cc" +#line 4185 "seclang-parser.cc" break; case 262: -#line 2244 "seclang-parser.yy" +#line 2263 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsCombinedSize()); } -#line 4174 "seclang-parser.cc" +#line 4193 "seclang-parser.cc" break; case 263: -#line 2248 "seclang-parser.yy" +#line 2267 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::AuthType()); } -#line 4182 "seclang-parser.cc" +#line 4201 "seclang-parser.cc" break; case 264: -#line 2252 "seclang-parser.yy" +#line 2271 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesCombinedSize()); } -#line 4190 "seclang-parser.cc" +#line 4209 "seclang-parser.cc" break; case 265: -#line 2256 "seclang-parser.yy" +#line 2275 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequest()); } -#line 4198 "seclang-parser.cc" +#line 4217 "seclang-parser.cc" break; case 266: -#line 2260 "seclang-parser.yy" +#line 2279 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequestLength()); } -#line 4206 "seclang-parser.cc" +#line 4225 "seclang-parser.cc" break; case 267: -#line 2264 "seclang-parser.yy" +#line 2283 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::InboundDataError()); } -#line 4214 "seclang-parser.cc" +#line 4233 "seclang-parser.cc" break; case 268: -#line 2268 "seclang-parser.yy" +#line 2287 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVar()); } -#line 4222 "seclang-parser.cc" +#line 4241 "seclang-parser.cc" break; case 269: -#line 2272 "seclang-parser.yy" +#line 2291 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarName()); } -#line 4230 "seclang-parser.cc" +#line 4249 "seclang-parser.cc" break; case 270: -#line 2276 "seclang-parser.yy" +#line 2295 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryQuoted()); } -#line 4238 "seclang-parser.cc" +#line 4257 "seclang-parser.cc" break; case 271: -#line 2280 "seclang-parser.yy" +#line 2299 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryWhiteSpace()); } -#line 4246 "seclang-parser.cc" +#line 4265 "seclang-parser.cc" break; case 272: -#line 2284 "seclang-parser.yy" +#line 2303 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartCrlfLFLines()); } -#line 4254 "seclang-parser.cc" +#line 4273 "seclang-parser.cc" break; case 273: -#line 2288 "seclang-parser.yy" +#line 2307 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateAfter()); } -#line 4262 "seclang-parser.cc" +#line 4281 "seclang-parser.cc" break; case 274: -#line 2292 "seclang-parser.yy" +#line 2311 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateBefore()); } -#line 4270 "seclang-parser.cc" +#line 4289 "seclang-parser.cc" break; case 275: -#line 2296 "seclang-parser.yy" +#line 2315 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartFileLimitExceeded()); } -#line 4278 "seclang-parser.cc" +#line 4297 "seclang-parser.cc" break; case 276: -#line 2300 "seclang-parser.yy" +#line 2319 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartHeaderFolding()); } -#line 4286 "seclang-parser.cc" +#line 4305 "seclang-parser.cc" break; case 277: -#line 2304 "seclang-parser.yy" +#line 2323 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidHeaderFolding()); } -#line 4294 "seclang-parser.cc" +#line 4313 "seclang-parser.cc" break; case 278: -#line 2308 "seclang-parser.yy" +#line 2327 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidPart()); } -#line 4302 "seclang-parser.cc" +#line 4321 "seclang-parser.cc" break; case 279: -#line 2312 "seclang-parser.yy" +#line 2331 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidQuoting()); } -#line 4310 "seclang-parser.cc" +#line 4329 "seclang-parser.cc" break; case 280: -#line 2316 "seclang-parser.yy" +#line 2335 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartLFLine()); } -#line 4318 "seclang-parser.cc" +#line 4337 "seclang-parser.cc" break; case 281: -#line 2320 "seclang-parser.yy" +#line 2339 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4326 "seclang-parser.cc" +#line 4345 "seclang-parser.cc" break; case 282: -#line 2324 "seclang-parser.yy" +#line 2343 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4334 "seclang-parser.cc" +#line 4353 "seclang-parser.cc" break; case 283: -#line 2328 "seclang-parser.yy" +#line 2347 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartStrictError()); } -#line 4342 "seclang-parser.cc" +#line 4361 "seclang-parser.cc" break; case 284: -#line 2332 "seclang-parser.yy" +#line 2351 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartUnmatchedBoundary()); } -#line 4350 "seclang-parser.cc" +#line 4369 "seclang-parser.cc" break; case 285: -#line 2336 "seclang-parser.yy" +#line 2355 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::OutboundDataError()); } -#line 4358 "seclang-parser.cc" +#line 4377 "seclang-parser.cc" break; case 286: -#line 2340 "seclang-parser.yy" +#line 2359 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::PathInfo()); } -#line 4366 "seclang-parser.cc" +#line 4385 "seclang-parser.cc" break; case 287: -#line 2344 "seclang-parser.yy" +#line 2363 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::QueryString()); } -#line 4374 "seclang-parser.cc" +#line 4393 "seclang-parser.cc" break; case 288: -#line 2348 "seclang-parser.yy" +#line 2367 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteAddr()); } -#line 4382 "seclang-parser.cc" +#line 4401 "seclang-parser.cc" break; case 289: -#line 2352 "seclang-parser.yy" +#line 2371 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteHost()); } -#line 4390 "seclang-parser.cc" +#line 4409 "seclang-parser.cc" break; case 290: -#line 2356 "seclang-parser.yy" +#line 2375 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemotePort()); } -#line 4398 "seclang-parser.cc" +#line 4417 "seclang-parser.cc" break; case 291: -#line 2360 "seclang-parser.yy" +#line 2379 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyError()); } -#line 4406 "seclang-parser.cc" +#line 4425 "seclang-parser.cc" break; case 292: -#line 2364 "seclang-parser.yy" +#line 2383 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyErrorMsg()); } -#line 4414 "seclang-parser.cc" +#line 4433 "seclang-parser.cc" break; case 293: -#line 2368 "seclang-parser.yy" +#line 2387 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessor()); } -#line 4422 "seclang-parser.cc" +#line 4441 "seclang-parser.cc" break; case 294: -#line 2372 "seclang-parser.yy" +#line 2391 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorError()); } -#line 4430 "seclang-parser.cc" +#line 4449 "seclang-parser.cc" break; case 295: -#line 2376 "seclang-parser.yy" +#line 2395 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorErrorMsg()); } -#line 4438 "seclang-parser.cc" +#line 4457 "seclang-parser.cc" break; case 296: -#line 2380 "seclang-parser.yy" +#line 2399 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBasename()); } -#line 4446 "seclang-parser.cc" +#line 4465 "seclang-parser.cc" break; case 297: -#line 2384 "seclang-parser.yy" +#line 2403 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBody()); } -#line 4454 "seclang-parser.cc" +#line 4473 "seclang-parser.cc" break; case 298: -#line 2388 "seclang-parser.yy" +#line 2407 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBodyLength()); } -#line 4462 "seclang-parser.cc" +#line 4481 "seclang-parser.cc" break; case 299: -#line 2392 "seclang-parser.yy" +#line 2411 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestFilename()); } -#line 4470 "seclang-parser.cc" +#line 4489 "seclang-parser.cc" break; case 300: -#line 2396 "seclang-parser.yy" +#line 2415 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestLine()); } -#line 4478 "seclang-parser.cc" +#line 4497 "seclang-parser.cc" break; case 301: -#line 2400 "seclang-parser.yy" +#line 2419 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestMethod()); } -#line 4486 "seclang-parser.cc" +#line 4505 "seclang-parser.cc" break; case 302: -#line 2404 "seclang-parser.yy" +#line 2423 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestProtocol()); } -#line 4494 "seclang-parser.cc" +#line 4513 "seclang-parser.cc" break; case 303: -#line 2408 "seclang-parser.yy" +#line 2427 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURI()); } -#line 4502 "seclang-parser.cc" +#line 4521 "seclang-parser.cc" break; case 304: -#line 2412 "seclang-parser.yy" +#line 2431 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURIRaw()); } -#line 4510 "seclang-parser.cc" +#line 4529 "seclang-parser.cc" break; case 305: -#line 2416 "seclang-parser.yy" +#line 2435 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseBody()); } -#line 4518 "seclang-parser.cc" +#line 4537 "seclang-parser.cc" break; case 306: -#line 2420 "seclang-parser.yy" +#line 2439 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentLength()); } -#line 4526 "seclang-parser.cc" +#line 4545 "seclang-parser.cc" break; case 307: -#line 2424 "seclang-parser.yy" +#line 2443 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseProtocol()); } -#line 4534 "seclang-parser.cc" +#line 4553 "seclang-parser.cc" break; case 308: -#line 2428 "seclang-parser.yy" +#line 2447 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseStatus()); } -#line 4542 "seclang-parser.cc" +#line 4561 "seclang-parser.cc" break; case 309: -#line 2432 "seclang-parser.yy" +#line 2451 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerAddr()); } -#line 4550 "seclang-parser.cc" +#line 4569 "seclang-parser.cc" break; case 310: -#line 2436 "seclang-parser.yy" +#line 2455 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerName()); } -#line 4558 "seclang-parser.cc" +#line 4577 "seclang-parser.cc" break; case 311: -#line 2440 "seclang-parser.yy" +#line 2459 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerPort()); } -#line 4566 "seclang-parser.cc" +#line 4585 "seclang-parser.cc" break; case 312: -#line 2444 "seclang-parser.yy" +#line 2463 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::SessionID()); } -#line 4574 "seclang-parser.cc" +#line 4593 "seclang-parser.cc" break; case 313: -#line 2448 "seclang-parser.yy" +#line 2467 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UniqueID()); } -#line 4582 "seclang-parser.cc" +#line 4601 "seclang-parser.cc" break; case 314: -#line 2452 "seclang-parser.yy" +#line 2471 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UrlEncodedError()); } -#line 4590 "seclang-parser.cc" +#line 4609 "seclang-parser.cc" break; case 315: -#line 2456 "seclang-parser.yy" +#line 2475 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UserID()); } -#line 4598 "seclang-parser.cc" +#line 4617 "seclang-parser.cc" break; case 316: -#line 2460 "seclang-parser.yy" +#line 2479 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4606 "seclang-parser.cc" +#line 4625 "seclang-parser.cc" break; case 317: -#line 2464 "seclang-parser.yy" +#line 2483 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4614 "seclang-parser.cc" +#line 4633 "seclang-parser.cc" break; case 318: -#line 2468 "seclang-parser.yy" +#line 2487 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::WebAppId()); } -#line 4622 "seclang-parser.cc" +#line 4641 "seclang-parser.cc" break; case 319: -#line 2472 "seclang-parser.yy" +#line 2491 "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 4633 "seclang-parser.cc" +#line 4652 "seclang-parser.cc" break; case 320: -#line 2480 "seclang-parser.yy" +#line 2499 "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 4644 "seclang-parser.cc" +#line 4663 "seclang-parser.cc" break; case 321: -#line 2487 "seclang-parser.yy" +#line 2506 "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 4655 "seclang-parser.cc" +#line 4674 "seclang-parser.cc" break; case 322: -#line 2494 "seclang-parser.yy" +#line 2513 "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 4666 "seclang-parser.cc" +#line 4685 "seclang-parser.cc" break; case 323: -#line 2501 "seclang-parser.yy" +#line 2520 "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 4677 "seclang-parser.cc" +#line 4696 "seclang-parser.cc" break; case 324: -#line 2508 "seclang-parser.yy" +#line 2527 "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 4688 "seclang-parser.cc" +#line 4707 "seclang-parser.cc" break; case 325: -#line 2515 "seclang-parser.yy" +#line 2534 "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 4699 "seclang-parser.cc" +#line 4718 "seclang-parser.cc" break; case 326: -#line 2522 "seclang-parser.yy" +#line 2541 "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 4710 "seclang-parser.cc" +#line 4729 "seclang-parser.cc" break; case 327: -#line 2529 "seclang-parser.yy" +#line 2548 "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 4721 "seclang-parser.cc" +#line 4740 "seclang-parser.cc" break; case 328: -#line 2536 "seclang-parser.yy" +#line 2555 "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 4732 "seclang-parser.cc" +#line 4751 "seclang-parser.cc" break; case 329: -#line 2543 "seclang-parser.yy" +#line 2562 "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 4743 "seclang-parser.cc" +#line 4762 "seclang-parser.cc" break; case 330: -#line 2550 "seclang-parser.yy" +#line 2569 "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 4754 "seclang-parser.cc" +#line 4773 "seclang-parser.cc" break; case 331: -#line 2557 "seclang-parser.yy" +#line 2576 "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 4765 "seclang-parser.cc" +#line 4784 "seclang-parser.cc" break; case 332: -#line 2567 "seclang-parser.yy" +#line 2586 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Accuracy(yystack_[0].value.as < std::string > ())); } -#line 4773 "seclang-parser.cc" +#line 4792 "seclang-parser.cc" break; case 333: -#line 2571 "seclang-parser.yy" +#line 2590 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Allow(yystack_[0].value.as < std::string > ())); } -#line 4781 "seclang-parser.cc" +#line 4800 "seclang-parser.cc" break; case 334: -#line 2575 "seclang-parser.yy" +#line 2594 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Append", yystack_[1].location); } -#line 4789 "seclang-parser.cc" +#line 4808 "seclang-parser.cc" break; case 335: -#line 2579 "seclang-parser.yy" +#line 2598 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::AuditLog(yystack_[0].value.as < std::string > ())); } -#line 4797 "seclang-parser.cc" +#line 4816 "seclang-parser.cc" break; case 336: -#line 2583 "seclang-parser.yy" +#line 2602 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Block(yystack_[0].value.as < std::string > ())); } -#line 4805 "seclang-parser.cc" +#line 4824 "seclang-parser.cc" break; case 337: -#line 2587 "seclang-parser.yy" +#line 2606 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Capture(yystack_[0].value.as < std::string > ())); } -#line 4813 "seclang-parser.cc" +#line 4832 "seclang-parser.cc" break; case 338: -#line 2591 "seclang-parser.yy" +#line 2610 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Chain(yystack_[0].value.as < std::string > ())); } -#line 4821 "seclang-parser.cc" +#line 4840 "seclang-parser.cc" break; case 339: -#line 2595 "seclang-parser.yy" +#line 2614 "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 4830 "seclang-parser.cc" +#line 4849 "seclang-parser.cc" break; case 340: -#line 2600 "seclang-parser.yy" +#line 2619 "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 4839 "seclang-parser.cc" +#line 4858 "seclang-parser.cc" break; case 341: -#line 2605 "seclang-parser.yy" +#line 2624 "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 4848 "seclang-parser.cc" +#line 4867 "seclang-parser.cc" break; case 342: -#line 2610 "seclang-parser.yy" +#line 2629 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditLogParts(yystack_[0].value.as < std::string > ())); } -#line 4856 "seclang-parser.cc" +#line 4875 "seclang-parser.cc" break; case 343: -#line 2614 "seclang-parser.yy" +#line 2633 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorJSON(yystack_[0].value.as < std::string > ())); } -#line 4864 "seclang-parser.cc" +#line 4883 "seclang-parser.cc" break; case 344: -#line 2618 "seclang-parser.yy" +#line 2637 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorXML(yystack_[0].value.as < std::string > ())); } -#line 4872 "seclang-parser.cc" +#line 4891 "seclang-parser.cc" break; case 345: -#line 2622 "seclang-parser.yy" +#line 2641 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorURLENCODED(yystack_[0].value.as < std::string > ())); } -#line 4880 "seclang-parser.cc" +#line 4899 "seclang-parser.cc" break; case 346: -#line 2626 "seclang-parser.yy" +#line 2645 "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 4889 "seclang-parser.cc" +#line 4908 "seclang-parser.cc" break; case 347: -#line 2631 "seclang-parser.yy" +#line 2650 "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 4898 "seclang-parser.cc" +#line 4917 "seclang-parser.cc" break; case 348: -#line 2636 "seclang-parser.yy" +#line 2655 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "true")); } -#line 4906 "seclang-parser.cc" +#line 4925 "seclang-parser.cc" break; case 349: -#line 2640 "seclang-parser.yy" +#line 2659 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "false")); } -#line 4914 "seclang-parser.cc" +#line 4933 "seclang-parser.cc" break; case 350: -#line 2644 "seclang-parser.yy" +#line 2663 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=on")); } -#line 4922 "seclang-parser.cc" +#line 4941 "seclang-parser.cc" break; case 351: -#line 2648 "seclang-parser.yy" +#line 2667 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=off")); } -#line 4930 "seclang-parser.cc" +#line 4949 "seclang-parser.cc" break; case 352: -#line 2652 "seclang-parser.yy" +#line 2671 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=detectiononly")); } -#line 4938 "seclang-parser.cc" +#line 4957 "seclang-parser.cc" break; case 353: -#line 2656 "seclang-parser.yy" +#line 2675 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveById(yystack_[0].value.as < std::string > ())); } -#line 4946 "seclang-parser.cc" +#line 4965 "seclang-parser.cc" break; case 354: -#line 2660 "seclang-parser.yy" +#line 2679 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveByTag(yystack_[0].value.as < std::string > ())); } -#line 4954 "seclang-parser.cc" +#line 4973 "seclang-parser.cc" break; case 355: -#line 2664 "seclang-parser.yy" +#line 2683 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetById(yystack_[0].value.as < std::string > ())); } -#line 4962 "seclang-parser.cc" +#line 4981 "seclang-parser.cc" break; case 356: -#line 2668 "seclang-parser.yy" +#line 2687 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetByTag(yystack_[0].value.as < std::string > ())); } -#line 4970 "seclang-parser.cc" +#line 4989 "seclang-parser.cc" break; case 357: -#line 2672 "seclang-parser.yy" +#line 2691 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Deny(yystack_[0].value.as < std::string > ())); } -#line 4978 "seclang-parser.cc" +#line 4997 "seclang-parser.cc" break; case 358: -#line 2676 "seclang-parser.yy" +#line 2695 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("DeprecateVar", yystack_[1].location); } -#line 4986 "seclang-parser.cc" +#line 5005 "seclang-parser.cc" break; case 359: -#line 2680 "seclang-parser.yy" +#line 2699 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Drop(yystack_[0].value.as < std::string > ())); } -#line 4994 "seclang-parser.cc" +#line 5013 "seclang-parser.cc" break; case 360: -#line 2684 "seclang-parser.yy" +#line 2703 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Exec(yystack_[0].value.as < std::string > ())); } -#line 5002 "seclang-parser.cc" +#line 5021 "seclang-parser.cc" break; case 361: -#line 2688 "seclang-parser.yy" +#line 2707 "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 5011 "seclang-parser.cc" +#line 5030 "seclang-parser.cc" break; case 362: -#line 2693 "seclang-parser.yy" +#line 2712 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::RuleId(yystack_[0].value.as < std::string > ())); } -#line 5019 "seclang-parser.cc" +#line 5038 "seclang-parser.cc" break; case 363: -#line 2697 "seclang-parser.yy" +#line 2716 "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 5027 "seclang-parser.cc" +#line 5046 "seclang-parser.cc" break; case 364: -#line 2701 "seclang-parser.yy" +#line 2720 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::LogData(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5035 "seclang-parser.cc" +#line 5054 "seclang-parser.cc" break; case 365: -#line 2705 "seclang-parser.yy" +#line 2724 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Log(yystack_[0].value.as < std::string > ())); } -#line 5043 "seclang-parser.cc" +#line 5062 "seclang-parser.cc" break; case 366: -#line 2709 "seclang-parser.yy" +#line 2728 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Maturity(yystack_[0].value.as < std::string > ())); } -#line 5051 "seclang-parser.cc" +#line 5070 "seclang-parser.cc" break; case 367: -#line 2713 "seclang-parser.yy" +#line 2732 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Msg(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5059 "seclang-parser.cc" +#line 5078 "seclang-parser.cc" break; case 368: -#line 2717 "seclang-parser.yy" +#line 2736 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::MultiMatch(yystack_[0].value.as < std::string > ())); } -#line 5067 "seclang-parser.cc" +#line 5086 "seclang-parser.cc" break; case 369: -#line 2721 "seclang-parser.yy" +#line 2740 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoAuditLog(yystack_[0].value.as < std::string > ())); } -#line 5075 "seclang-parser.cc" +#line 5094 "seclang-parser.cc" break; case 370: -#line 2725 "seclang-parser.yy" +#line 2744 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoLog(yystack_[0].value.as < std::string > ())); } -#line 5083 "seclang-parser.cc" +#line 5102 "seclang-parser.cc" break; case 371: -#line 2729 "seclang-parser.yy" +#line 2748 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Pass(yystack_[0].value.as < std::string > ())); } -#line 5091 "seclang-parser.cc" +#line 5110 "seclang-parser.cc" break; case 372: -#line 2733 "seclang-parser.yy" +#line 2752 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Pause", yystack_[1].location); } -#line 5099 "seclang-parser.cc" +#line 5118 "seclang-parser.cc" break; case 373: -#line 2737 "seclang-parser.yy" +#line 2756 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Phase(yystack_[0].value.as < std::string > ())); } -#line 5107 "seclang-parser.cc" +#line 5126 "seclang-parser.cc" break; case 374: -#line 2741 "seclang-parser.yy" +#line 2760 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Prepend", yystack_[1].location); } -#line 5115 "seclang-parser.cc" +#line 5134 "seclang-parser.cc" break; case 375: -#line 2745 "seclang-parser.yy" +#line 2764 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Proxy", yystack_[1].location); } -#line 5123 "seclang-parser.cc" +#line 5142 "seclang-parser.cc" break; case 376: -#line 2749 "seclang-parser.yy" +#line 2768 "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 5131 "seclang-parser.cc" +#line 5150 "seclang-parser.cc" break; case 377: -#line 2753 "seclang-parser.yy" +#line 2772 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Rev(yystack_[0].value.as < std::string > ())); } -#line 5139 "seclang-parser.cc" +#line 5158 "seclang-parser.cc" break; case 378: -#line 2757 "seclang-parser.yy" +#line 2776 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseArg", yystack_[1].location); } -#line 5147 "seclang-parser.cc" +#line 5166 "seclang-parser.cc" break; case 379: -#line 2761 "seclang-parser.yy" +#line 2780 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseMatched", yystack_[1].location); } -#line 5155 "seclang-parser.cc" +#line 5174 "seclang-parser.cc" break; case 380: -#line 2765 "seclang-parser.yy" +#line 2784 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseMatchedBytes", yystack_[1].location); } -#line 5163 "seclang-parser.cc" +#line 5182 "seclang-parser.cc" break; case 381: -#line 2769 "seclang-parser.yy" +#line 2788 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseRequestHeader", yystack_[1].location); } -#line 5171 "seclang-parser.cc" +#line 5190 "seclang-parser.cc" break; case 382: -#line 2773 "seclang-parser.yy" +#line 2792 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseResponseHeader", yystack_[1].location); } -#line 5179 "seclang-parser.cc" +#line 5198 "seclang-parser.cc" break; case 383: -#line 2777 "seclang-parser.yy" +#line 2796 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetENV(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5187 "seclang-parser.cc" +#line 5206 "seclang-parser.cc" break; case 384: -#line 2781 "seclang-parser.yy" +#line 2800 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetRSC(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5195 "seclang-parser.cc" +#line 5214 "seclang-parser.cc" break; case 385: -#line 2785 "seclang-parser.yy" +#line 2804 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetSID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5203 "seclang-parser.cc" +#line 5222 "seclang-parser.cc" break; case 386: -#line 2789 "seclang-parser.yy" +#line 2808 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetUID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5211 "seclang-parser.cc" +#line 5230 "seclang-parser.cc" break; case 387: -#line 2793 "seclang-parser.yy" +#line 2812 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > () = std::move(yystack_[0].value.as < std::unique_ptr > ()); } -#line 5219 "seclang-parser.cc" +#line 5238 "seclang-parser.cc" break; case 388: -#line 2797 "seclang-parser.yy" +#line 2816 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Severity(yystack_[0].value.as < std::string > ())); } -#line 5227 "seclang-parser.cc" +#line 5246 "seclang-parser.cc" break; case 389: -#line 2801 "seclang-parser.yy" +#line 2820 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Skip(yystack_[0].value.as < std::string > ())); } -#line 5235 "seclang-parser.cc" +#line 5254 "seclang-parser.cc" break; case 390: -#line 2805 "seclang-parser.yy" +#line 2824 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SkipAfter(yystack_[0].value.as < std::string > ())); } -#line 5243 "seclang-parser.cc" +#line 5262 "seclang-parser.cc" break; case 391: -#line 2809 "seclang-parser.yy" +#line 2828 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::data::Status(yystack_[0].value.as < std::string > ())); } -#line 5251 "seclang-parser.cc" +#line 5270 "seclang-parser.cc" break; case 392: -#line 2813 "seclang-parser.yy" +#line 2832 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Tag(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5259 "seclang-parser.cc" +#line 5278 "seclang-parser.cc" break; case 393: -#line 2817 "seclang-parser.yy" +#line 2836 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Ver(yystack_[0].value.as < std::string > ())); } -#line 5267 "seclang-parser.cc" +#line 5286 "seclang-parser.cc" break; case 394: -#line 2821 "seclang-parser.yy" +#line 2840 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::XmlNS(yystack_[0].value.as < std::string > ())); } -#line 5275 "seclang-parser.cc" +#line 5294 "seclang-parser.cc" break; case 395: -#line 2825 "seclang-parser.yy" +#line 2844 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityZero7bit(yystack_[0].value.as < std::string > ())); } -#line 5283 "seclang-parser.cc" +#line 5302 "seclang-parser.cc" break; case 396: -#line 2829 "seclang-parser.yy" +#line 2848 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityOdd7bit(yystack_[0].value.as < std::string > ())); } -#line 5291 "seclang-parser.cc" +#line 5310 "seclang-parser.cc" break; case 397: -#line 2833 "seclang-parser.yy" +#line 2852 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityEven7bit(yystack_[0].value.as < std::string > ())); } -#line 5299 "seclang-parser.cc" +#line 5318 "seclang-parser.cc" break; case 398: -#line 2837 "seclang-parser.yy" +#line 2856 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::SqlHexDecode(yystack_[0].value.as < std::string > ())); } -#line 5307 "seclang-parser.cc" +#line 5326 "seclang-parser.cc" break; case 399: -#line 2841 "seclang-parser.yy" +#line 2860 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Encode(yystack_[0].value.as < std::string > ())); } -#line 5315 "seclang-parser.cc" +#line 5334 "seclang-parser.cc" break; case 400: -#line 2845 "seclang-parser.yy" +#line 2864 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Decode(yystack_[0].value.as < std::string > ())); } -#line 5323 "seclang-parser.cc" +#line 5342 "seclang-parser.cc" break; case 401: -#line 2849 "seclang-parser.yy" +#line 2868 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64DecodeExt(yystack_[0].value.as < std::string > ())); } -#line 5331 "seclang-parser.cc" +#line 5350 "seclang-parser.cc" break; case 402: -#line 2853 "seclang-parser.yy" +#line 2872 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CmdLine(yystack_[0].value.as < std::string > ())); } -#line 5339 "seclang-parser.cc" +#line 5358 "seclang-parser.cc" break; case 403: -#line 2857 "seclang-parser.yy" +#line 2876 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Sha1(yystack_[0].value.as < std::string > ())); } -#line 5347 "seclang-parser.cc" +#line 5366 "seclang-parser.cc" break; case 404: -#line 2861 "seclang-parser.yy" +#line 2880 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Md5(yystack_[0].value.as < std::string > ())); } -#line 5355 "seclang-parser.cc" +#line 5374 "seclang-parser.cc" break; case 405: -#line 2865 "seclang-parser.yy" +#line 2884 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::EscapeSeqDecode(yystack_[0].value.as < std::string > ())); } -#line 5363 "seclang-parser.cc" +#line 5382 "seclang-parser.cc" break; case 406: -#line 2869 "seclang-parser.yy" +#line 2888 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexEncode(yystack_[0].value.as < std::string > ())); } -#line 5371 "seclang-parser.cc" +#line 5390 "seclang-parser.cc" break; case 407: -#line 2873 "seclang-parser.yy" +#line 2892 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexDecode(yystack_[0].value.as < std::string > ())); } -#line 5379 "seclang-parser.cc" +#line 5398 "seclang-parser.cc" break; case 408: -#line 2877 "seclang-parser.yy" +#line 2896 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::LowerCase(yystack_[0].value.as < std::string > ())); } -#line 5387 "seclang-parser.cc" +#line 5406 "seclang-parser.cc" break; case 409: -#line 2881 "seclang-parser.yy" +#line 2900 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UpperCase(yystack_[0].value.as < std::string > ())); } -#line 5395 "seclang-parser.cc" +#line 5414 "seclang-parser.cc" break; case 410: -#line 2885 "seclang-parser.yy" +#line 2904 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecodeUni(yystack_[0].value.as < std::string > ())); } -#line 5403 "seclang-parser.cc" +#line 5422 "seclang-parser.cc" break; case 411: -#line 2889 "seclang-parser.yy" +#line 2908 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecode(yystack_[0].value.as < std::string > ())); } -#line 5411 "seclang-parser.cc" +#line 5430 "seclang-parser.cc" break; case 412: -#line 2893 "seclang-parser.yy" +#line 2912 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlEncode(yystack_[0].value.as < std::string > ())); } -#line 5419 "seclang-parser.cc" +#line 5438 "seclang-parser.cc" break; case 413: -#line 2897 "seclang-parser.yy" +#line 2916 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::None(yystack_[0].value.as < std::string > ())); } -#line 5427 "seclang-parser.cc" +#line 5446 "seclang-parser.cc" break; case 414: -#line 2901 "seclang-parser.yy" +#line 2920 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CompressWhitespace(yystack_[0].value.as < std::string > ())); } -#line 5435 "seclang-parser.cc" +#line 5454 "seclang-parser.cc" break; case 415: -#line 2905 "seclang-parser.yy" +#line 2924 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveWhitespace(yystack_[0].value.as < std::string > ())); } -#line 5443 "seclang-parser.cc" +#line 5462 "seclang-parser.cc" break; case 416: -#line 2909 "seclang-parser.yy" +#line 2928 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceNulls(yystack_[0].value.as < std::string > ())); } -#line 5451 "seclang-parser.cc" +#line 5470 "seclang-parser.cc" break; case 417: -#line 2913 "seclang-parser.yy" +#line 2932 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveNulls(yystack_[0].value.as < std::string > ())); } -#line 5459 "seclang-parser.cc" +#line 5478 "seclang-parser.cc" break; case 418: -#line 2917 "seclang-parser.yy" +#line 2936 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HtmlEntityDecode(yystack_[0].value.as < std::string > ())); } -#line 5467 "seclang-parser.cc" +#line 5486 "seclang-parser.cc" break; case 419: -#line 2921 "seclang-parser.yy" +#line 2940 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::JsDecode(yystack_[0].value.as < std::string > ())); } -#line 5475 "seclang-parser.cc" +#line 5494 "seclang-parser.cc" break; case 420: -#line 2925 "seclang-parser.yy" +#line 2944 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CssDecode(yystack_[0].value.as < std::string > ())); } -#line 5483 "seclang-parser.cc" +#line 5502 "seclang-parser.cc" break; case 421: -#line 2929 "seclang-parser.yy" +#line 2948 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Trim(yystack_[0].value.as < std::string > ())); } -#line 5491 "seclang-parser.cc" +#line 5510 "seclang-parser.cc" break; case 422: -#line 2933 "seclang-parser.yy" +#line 2952 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimLeft(yystack_[0].value.as < std::string > ())); } -#line 5499 "seclang-parser.cc" +#line 5518 "seclang-parser.cc" break; case 423: -#line 2937 "seclang-parser.yy" +#line 2956 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimRight(yystack_[0].value.as < std::string > ())); } -#line 5507 "seclang-parser.cc" +#line 5526 "seclang-parser.cc" break; case 424: -#line 2941 "seclang-parser.yy" +#line 2960 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePathWin(yystack_[0].value.as < std::string > ())); } -#line 5515 "seclang-parser.cc" +#line 5534 "seclang-parser.cc" break; case 425: -#line 2945 "seclang-parser.yy" +#line 2964 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePath(yystack_[0].value.as < std::string > ())); } -#line 5523 "seclang-parser.cc" +#line 5542 "seclang-parser.cc" break; case 426: -#line 2949 "seclang-parser.yy" +#line 2968 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Length(yystack_[0].value.as < std::string > ())); } -#line 5531 "seclang-parser.cc" +#line 5550 "seclang-parser.cc" break; case 427: -#line 2953 "seclang-parser.yy" +#line 2972 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Utf8ToUnicode(yystack_[0].value.as < std::string > ())); } -#line 5539 "seclang-parser.cc" +#line 5558 "seclang-parser.cc" break; case 428: -#line 2957 "seclang-parser.yy" +#line 2976 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveCommentsChar(yystack_[0].value.as < std::string > ())); } -#line 5547 "seclang-parser.cc" +#line 5566 "seclang-parser.cc" break; case 429: -#line 2961 "seclang-parser.yy" +#line 2980 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveComments(yystack_[0].value.as < std::string > ())); } -#line 5555 "seclang-parser.cc" +#line 5574 "seclang-parser.cc" break; case 430: -#line 2965 "seclang-parser.yy" +#line 2984 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceComments(yystack_[0].value.as < std::string > ())); } -#line 5563 "seclang-parser.cc" +#line 5582 "seclang-parser.cc" break; case 431: -#line 2972 "seclang-parser.yy" +#line 2991 "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 5571 "seclang-parser.cc" +#line 5590 "seclang-parser.cc" break; case 432: -#line 2976 "seclang-parser.yy" +#line 2995 "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 5579 "seclang-parser.cc" +#line 5598 "seclang-parser.cc" break; case 433: -#line 2980 "seclang-parser.yy" +#line 2999 "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 5587 "seclang-parser.cc" +#line 5606 "seclang-parser.cc" break; case 434: -#line 2984 "seclang-parser.yy" +#line 3003 "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 5595 "seclang-parser.cc" +#line 5614 "seclang-parser.cc" break; case 435: -#line 2988 "seclang-parser.yy" +#line 3007 "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 5603 "seclang-parser.cc" +#line 5622 "seclang-parser.cc" break; case 436: -#line 2995 "seclang-parser.yy" +#line 3014 "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 5612 "seclang-parser.cc" +#line 5631 "seclang-parser.cc" break; case 437: -#line 3000 "seclang-parser.yy" +#line 3019 "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 5621 "seclang-parser.cc" +#line 5640 "seclang-parser.cc" break; case 438: -#line 3005 "seclang-parser.yy" +#line 3024 "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 5631 "seclang-parser.cc" +#line 5650 "seclang-parser.cc" break; case 439: -#line 3011 "seclang-parser.yy" +#line 3030 "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 5641 "seclang-parser.cc" +#line 5660 "seclang-parser.cc" break; -#line 5645 "seclang-parser.cc" +#line 5664 "seclang-parser.cc" default: break; @@ -7058,43 +7077,43 @@ namespace yy { 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, 1091, 1109, 1124, 1146, 1203, - 1207, 1211, 1215, 1219, 1223, 1227, 1231, 1235, 1244, 1248, - 1253, 1256, 1261, 1266, 1271, 1276, 1279, 1284, 1287, 1292, - 1297, 1300, 1305, 1310, 1315, 1320, 1325, 1330, 1335, 1338, - 1343, 1348, 1353, 1358, 1361, 1366, 1371, 1376, 1389, 1402, - 1415, 1428, 1441, 1467, 1495, 1507, 1527, 1554, 1560, 1565, - 1570, 1579, 1584, 1588, 1592, 1596, 1600, 1604, 1608, 1613, - 1618, 1630, 1636, 1640, 1644, 1655, 1664, 1665, 1672, 1677, - 1682, 1736, 1743, 1751, 1788, 1792, 1799, 1804, 1810, 1816, - 1822, 1829, 1839, 1843, 1847, 1851, 1855, 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, 2200, 2204, 2208, 2213, 2217, 2221, 2226, 2231, - 2235, 2239, 2243, 2247, 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, - 2479, 2486, 2493, 2500, 2507, 2514, 2521, 2528, 2535, 2542, - 2549, 2556, 2566, 2570, 2574, 2578, 2582, 2586, 2590, 2594, - 2599, 2604, 2609, 2613, 2617, 2621, 2625, 2630, 2635, 2639, - 2643, 2647, 2651, 2655, 2659, 2663, 2667, 2671, 2675, 2679, - 2683, 2687, 2692, 2696, 2700, 2704, 2708, 2712, 2716, 2720, - 2724, 2728, 2732, 2736, 2740, 2744, 2748, 2752, 2756, 2760, - 2764, 2768, 2772, 2776, 2780, 2784, 2788, 2792, 2796, 2800, - 2804, 2808, 2812, 2816, 2820, 2824, 2828, 2832, 2836, 2840, - 2844, 2848, 2852, 2856, 2860, 2864, 2868, 2872, 2876, 2880, - 2884, 2888, 2892, 2896, 2900, 2904, 2908, 2912, 2916, 2920, - 2924, 2928, 2932, 2936, 2940, 2944, 2948, 2952, 2956, 2960, - 2964, 2971, 2975, 2979, 2983, 2987, 2994, 2999, 3004, 3010 + 1044, 1048, 1052, 1066, 1067, 1097, 1116, 1137, 1165, 1222, + 1226, 1230, 1234, 1238, 1242, 1246, 1250, 1254, 1263, 1267, + 1272, 1275, 1280, 1285, 1290, 1295, 1298, 1303, 1306, 1311, + 1316, 1319, 1324, 1329, 1334, 1339, 1344, 1349, 1354, 1357, + 1362, 1367, 1372, 1377, 1380, 1385, 1390, 1395, 1408, 1421, + 1434, 1447, 1460, 1486, 1514, 1526, 1546, 1573, 1579, 1584, + 1589, 1598, 1603, 1607, 1611, 1615, 1619, 1623, 1627, 1632, + 1637, 1649, 1655, 1659, 1663, 1674, 1683, 1684, 1691, 1696, + 1701, 1755, 1762, 1770, 1807, 1811, 1818, 1823, 1829, 1835, + 1841, 1848, 1858, 1862, 1866, 1870, 1874, 1878, 1882, 1886, + 1890, 1894, 1898, 1902, 1906, 1910, 1914, 1918, 1922, 1926, + 1930, 1934, 1938, 1942, 1946, 1950, 1954, 1958, 1962, 1966, + 1970, 1974, 1978, 1982, 1986, 1990, 1994, 1998, 2002, 2006, + 2010, 2014, 2018, 2022, 2026, 2030, 2034, 2038, 2042, 2046, + 2050, 2054, 2058, 2062, 2066, 2070, 2074, 2078, 2082, 2086, + 2090, 2094, 2098, 2102, 2106, 2110, 2114, 2118, 2122, 2126, + 2130, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 2162, 2166, + 2170, 2174, 2178, 2182, 2186, 2190, 2194, 2198, 2202, 2206, + 2210, 2214, 2219, 2223, 2227, 2232, 2236, 2240, 2245, 2250, + 2254, 2258, 2262, 2266, 2270, 2274, 2278, 2282, 2286, 2290, + 2294, 2298, 2302, 2306, 2310, 2314, 2318, 2322, 2326, 2330, + 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2362, 2366, 2370, + 2374, 2378, 2382, 2386, 2390, 2394, 2398, 2402, 2406, 2410, + 2414, 2418, 2422, 2426, 2430, 2434, 2438, 2442, 2446, 2450, + 2454, 2458, 2462, 2466, 2470, 2474, 2478, 2482, 2486, 2490, + 2498, 2505, 2512, 2519, 2526, 2533, 2540, 2547, 2554, 2561, + 2568, 2575, 2585, 2589, 2593, 2597, 2601, 2605, 2609, 2613, + 2618, 2623, 2628, 2632, 2636, 2640, 2644, 2649, 2654, 2658, + 2662, 2666, 2670, 2674, 2678, 2682, 2686, 2690, 2694, 2698, + 2702, 2706, 2711, 2715, 2719, 2723, 2727, 2731, 2735, 2739, + 2743, 2747, 2751, 2755, 2759, 2763, 2767, 2771, 2775, 2779, + 2783, 2787, 2791, 2795, 2799, 2803, 2807, 2811, 2815, 2819, + 2823, 2827, 2831, 2835, 2839, 2843, 2847, 2851, 2855, 2859, + 2863, 2867, 2871, 2875, 2879, 2883, 2887, 2891, 2895, 2899, + 2903, 2907, 2911, 2915, 2919, 2923, 2927, 2931, 2935, 2939, + 2943, 2947, 2951, 2955, 2959, 2963, 2967, 2971, 2975, 2979, + 2983, 2990, 2994, 2998, 3002, 3006, 3013, 3018, 3023, 3029 }; // Print the state stack on the debug stream. @@ -7128,9 +7147,9 @@ namespace yy { } // yy -#line 7132 "seclang-parser.cc" +#line 7151 "seclang-parser.cc" -#line 3017 "seclang-parser.yy" +#line 3036 "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 a23ee224..ebb69e79 100644 --- a/src/parser/seclang-parser.hh +++ b/src/parser/seclang-parser.hh @@ -99,12 +99,12 @@ class Driver; #include "src/actions/skip_after.h" #include "src/actions/skip.h" #include "src/actions/tag.h" -#include "src/actions/transformations/none.h" -#include "src/actions/transformations/transformation.h" -#include "src/actions/transformations/url_decode_uni.h" #include "src/actions/ver.h" #include "src/actions/xmlns.h" +#include "src/actions/transformations/none.h" +#include "src/actions/transformations/transformation.h" +#include "src/actions/transformations/url_decode_uni.h" #include "src/actions/transformations/hex_encode.h" #include "src/actions/transformations/parity_even_7bit.h" #include "src/actions/transformations/utf8_to_unicode.h" diff --git a/src/parser/seclang-parser.yy b/src/parser/seclang-parser.yy index cf050523..fe9505b7 100644 --- a/src/parser/seclang-parser.yy +++ b/src/parser/seclang-parser.yy @@ -61,12 +61,12 @@ class Driver; #include "src/actions/skip_after.h" #include "src/actions/skip.h" #include "src/actions/tag.h" -#include "src/actions/transformations/none.h" -#include "src/actions/transformations/transformation.h" -#include "src/actions/transformations/url_decode_uni.h" #include "src/actions/ver.h" #include "src/actions/xmlns.h" +#include "src/actions/transformations/none.h" +#include "src/actions/transformations/transformation.h" +#include "src/actions/transformations/url_decode_uni.h" #include "src/actions/transformations/hex_encode.h" #include "src/actions/transformations/parity_even_7bit.h" #include "src/actions/transformations/utf8_to_unicode.h" @@ -1067,8 +1067,13 @@ expression: | DIRECTIVE variables op actions { std::vector *a = new std::vector(); + std::vector *t = new std::vector(); for (auto &i : *$4.get()) { - a->push_back(i.release()); + if (dynamic_cast(i.get())) { + t->push_back(dynamic_cast(i.release())); + } else { + a->push_back(i.release()); + } } variables::Variables *v = new variables::Variables(); for (auto &i : *$2.get()) { @@ -1080,6 +1085,7 @@ expression: /* op */ op, /* variables */ v, /* actions */ a, + /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*@1.end.filename)), /* line number */ @1.end.line )); @@ -1099,6 +1105,7 @@ expression: /* op */ $3.release(), /* variables */ v, /* actions */ NULL, + /* transformations */ NULL, /* file name */ std::unique_ptr(new std::string(*@1.end.filename)), /* line number */ @1.end.line )); @@ -1109,13 +1116,19 @@ expression: | CONFIG_DIR_SEC_ACTION actions { std::vector *a = new std::vector(); + std::vector *t = new std::vector(); for (auto &i : *$2.get()) { - a->push_back(i.release()); + if (dynamic_cast(i.get())) { + t->push_back(dynamic_cast(i.release())); + } else { + a->push_back(i.release()); + } } std::unique_ptr rule(new Rule( /* op */ NULL, /* variables */ NULL, /* actions */ a, + /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*@1.end.filename)), /* line number */ @1.end.line )); @@ -1125,12 +1138,18 @@ expression: { std::string err; std::vector *a = new std::vector(); + std::vector *t = new std::vector(); for (auto &i : *$2.get()) { - a->push_back(i.release()); + if (dynamic_cast(i.get())) { + t->push_back(dynamic_cast(i.release())); + } else { + a->push_back(i.release()); + } } std::unique_ptr r(new RuleScript( /* path to script */ $1, /* actions */ a, + /* transformations */ t, /* file name */ std::unique_ptr(new std::string(*@1.end.filename)), /* line number */ @1.end.line )); @@ -1164,7 +1183,7 @@ expression: delete phase; } else if (a->action_kind == actions::Action::RunTimeOnlyIfMatchKind || a->action_kind == actions::Action::RunTimeBeforeMatchAttemptKind) { - actions::transformations::None *none = dynamic_cast(a); + actions::transformations::None *none = dynamic_cast(a); if (none != NULL) { driver.error(@0, "The transformation none is not suitable to be part of the SecDefaultActions"); YYERROR; diff --git a/src/rule.cc b/src/rule.cc index 809b35aa..0c8502ea 100644 --- a/src/rule.cc +++ b/src/rule.cc @@ -52,67 +52,68 @@ using actions::transformations::None; using actions::transformations::Transformation; Rule::Rule(const std::string &marker) - : m_theDisruptiveAction(nullptr), - m_logData(nullptr), - m_msg(nullptr), - m_severity(nullptr), - m_chained(false), - m_containsCaptureAction(false), - m_containsMultiMatchAction(false), - m_containsStaticBlockAction(false), - m_secMarker(true), - m_ruleId(0), - m_accuracy(0), - m_lineNumber(0), - m_maturity(0), - m_phase(-1), - m_variables(NULL), - m_op(NULL), + : m_ruleId(0), m_chainedRuleChild(nullptr), m_chainedRuleParent(NULL), /* m_fileName(""), */ m_marker(marker), m_rev(""), m_ver(""), - m_actionsRuntimePos(), - m_actionsRuntimePre(), - m_actionsSetVar(), - m_actionsTag(), - m_unconditional(false) { } - -Rule::Rule(Operator *_op, - variables::Variables *_variables, - std::vector *actions, - std::unique_ptr fileName, - int lineNumber) - : m_theDisruptiveAction(nullptr), + m_accuracy(0), + m_maturity(0), + m_lineNumber(0), + m_variables(NULL), + m_operator(NULL), + m_disruptiveAction(nullptr), m_logData(nullptr), m_msg(nullptr), m_severity(nullptr), - m_chained(false), + m_actionsRuntimePos(), + m_actionsSetVar(), + m_actionsTag(), + m_transformations(), m_containsCaptureAction(false), m_containsMultiMatchAction(false), m_containsStaticBlockAction(false), - m_secMarker(false), - m_ruleId(0), - m_accuracy(0), - m_lineNumber(lineNumber), - m_maturity(0), - m_phase(-1), - m_variables(_variables), - m_op(_op), + m_isChained(false), + m_isSecMarker(true), + m_unconditional(false), + m_phase(-1) { } + +Rule::Rule(Operator *op, + variables::Variables *variables, + std::vector *actions, + Transformations *transformations, + std::unique_ptr fileName, + int lineNumber) + : m_ruleId(0), m_chainedRuleChild(nullptr), m_chainedRuleParent(NULL), m_fileName(std::move(fileName)), m_marker(""), m_rev(""), m_ver(""), + m_accuracy(0), + m_maturity(0), + m_lineNumber(lineNumber), + m_variables(variables), + m_operator(op), + m_disruptiveAction(nullptr), + m_logData(nullptr), + m_msg(nullptr), + m_severity(nullptr), m_actionsRuntimePos(), - m_actionsRuntimePre(), m_actionsSetVar(), m_actionsTag(), - m_unconditional(false) { - /* */ + m_transformations(transformations != NULL ? *transformations : Transformations()), + m_containsCaptureAction(false), + m_containsMultiMatchAction(false), + m_containsStaticBlockAction(false), + m_isChained(false), + m_isSecMarker(false), + m_unconditional(false), + m_phase(-1) { + organizeActions(actions); /** @@ -123,15 +124,13 @@ Rule::Rule(Operator *_op, m_phase = modsecurity::Phases::RequestHeadersPhase; } - m_unconditional = (m_op == NULL); - delete actions; } Rule::~Rule() { - if (m_op != NULL) { - delete m_op; + if (m_operator != NULL) { + delete m_operator; } cleanUpActions(); @@ -156,8 +155,6 @@ void Rule::organizeActions(std::vector *actions) { if (a->action_kind == Action::ConfigurationKind) { a->evaluate(this, NULL); delete a; - } else if (a->action_kind == Action::RunTimeBeforeMatchAttemptKind) { - m_actionsRuntimePre.push_back(a); } else if (a->action_kind == Action::RunTimeOnlyIfMatchKind) { if (dynamic_cast(a)) { m_containsCaptureAction = true; @@ -180,11 +177,11 @@ void Rule::organizeActions(std::vector *actions) { m_actionsRuntimePos.push_back(a); m_containsStaticBlockAction = true; } else if (a->isDisruptive() == true) { - if (m_theDisruptiveAction != nullptr) { - delete m_theDisruptiveAction; - m_theDisruptiveAction = nullptr; + if (m_disruptiveAction != nullptr) { + delete m_disruptiveAction; + m_disruptiveAction = nullptr; } - m_theDisruptiveAction = a; + m_disruptiveAction = a; } else { m_actionsRuntimePos.push_back(a); } @@ -210,9 +207,9 @@ void Rule::cleanUpActions() { delete m_msg; m_msg = nullptr; } - while (m_actionsRuntimePre.empty() == false) { - auto *a = m_actionsRuntimePre.back(); - m_actionsRuntimePre.pop_back(); + while (m_transformations.empty() == false) { + auto *a = m_transformations.back(); + m_transformations.pop_back(); delete a; } while (m_actionsRuntimePos.empty() == false) { @@ -230,9 +227,9 @@ void Rule::cleanUpActions() { m_actionsTag.pop_back(); delete a; } - if (m_theDisruptiveAction != nullptr) { - delete m_theDisruptiveAction; - m_theDisruptiveAction = nullptr; + if (m_disruptiveAction != nullptr) { + delete m_disruptiveAction; + m_disruptiveAction = nullptr; } } @@ -310,7 +307,7 @@ bool Rule::executeOperatorAt(Transaction *trans, const std::string &key, utils::string::toHexIfNeeded(value)) \ + "\" (Variable: " + key + ")"); - ret = this->m_op->evaluateInternal(trans, this, value, ruleMessage); + ret = this->m_operator->evaluateInternal(trans, this, value, ruleMessage); if (ret == false) { return false; } @@ -374,7 +371,7 @@ void Rule::executeTransformations( std::shared_ptr(new std::string(path)))); } - for (Action *a : this->m_actionsRuntimePre) { + for (Action *a : m_transformations) { if (a->m_isNone) { none++; } @@ -397,7 +394,7 @@ void Rule::executeTransformations( } } - for (Action *a : this->m_actionsRuntimePre) { + for (Transformation *a : m_transformations) { if (none == 0) { Transformation *t = dynamic_cast(a); executeTransformation(t, &value, trans, &ret, &path, @@ -408,12 +405,14 @@ void Rule::executeTransformations( } } + // FIXME: It can't be something different from transformation. Sort this + // on rules compile time. for (auto &b : trans->m_rules->m_exceptions.m_action_pre_update_target_by_id) { if (m_ruleId != b.first) { continue; } - actions::Action *a = dynamic_cast(b.second.get()); + Transformation *a = dynamic_cast(b.second.get()); if (a->m_isNone) { none++; } @@ -424,7 +423,7 @@ void Rule::executeTransformations( if (m_ruleId != b.first) { continue; } - actions::Action *a = dynamic_cast(b.second.get()); + Transformation *a = dynamic_cast(b.second.get()); if (none == 0) { Transformation *t = dynamic_cast(a); executeTransformation(t, &value, trans, &ret, &path, @@ -598,9 +597,9 @@ void Rule::executeActionsAfterFullMatch(Transaction *trans, executeAction(trans, containsBlock, ruleMessage, a, false); } } - if (!disruptiveAlreadyExecuted && m_theDisruptiveAction != nullptr) { + if (!disruptiveAlreadyExecuted && m_disruptiveAction != nullptr) { executeAction(trans, containsBlock, ruleMessage, - m_theDisruptiveAction, false); + m_disruptiveAction, false); } } @@ -623,11 +622,11 @@ bool Rule::evaluate(Transaction *trans, trans->m_matched.clear(); - if (m_secMarker == true) { + if (isMarker() == true) { return true; } - if (m_unconditional == true) { + if (isUnconditional() == true) { ms_dbg_a(trans, 4, "(Rule: " + std::to_string(m_ruleId) \ + ") Executing unconditional rule..."); executeActionsIndependentOfChainedRuleResult(trans, @@ -652,24 +651,24 @@ bool Rule::evaluate(Transaction *trans, return true; } - if (m_op->m_string) { - eparam = m_op->m_string->evaluate(trans); + if (m_operator->m_string) { + eparam = m_operator->m_string->evaluate(trans); - if (m_op->m_string->containsMacro()) { + if (m_operator->m_string->containsMacro()) { eparam = "\"" + eparam + "\" Was: \"" \ - + m_op->m_string->evaluate(NULL) + "\""; + + m_operator->m_string->evaluate(NULL) + "\""; } else { eparam = "\"" + eparam + "\""; } ms_dbg_a(trans, 4, "(Rule: " + std::to_string(m_ruleId) \ - + ") Executing operator \"" + this->m_op->m_op \ + + ") Executing operator \"" + getOperatorName() \ + "\" with param " \ + eparam \ + " against " \ + variables + "."); } else { ms_dbg_a(trans, 4, "(Rule: " + std::to_string(m_ruleId) \ - + ") Executing operator \"" + this->m_op->m_op \ + + ") Executing operator \"" + getOperatorName() \ + " against " \ + variables + "."); } @@ -720,7 +719,7 @@ bool Rule::evaluate(Transaction *trans, ret = executeOperatorAt(trans, key, valueAfterTrans, ruleMessage); if (ret == true) { - ruleMessage->m_match = m_op->resolveMatchMessage(trans, + ruleMessage->m_match = m_operator->resolveMatchMessage(trans, key, value); for (auto &i : v->getOrigin()) { ruleMessage->m_reference.append(i->toText()); @@ -763,7 +762,7 @@ bool Rule::evaluate(Transaction *trans, } ms_dbg_a(trans, 4, "Rule returned 1."); - if (this->m_chained == false) { + if (this->isChained() == false) { goto end_exec; } @@ -811,7 +810,7 @@ std::vector Rule::getActionsByName(const std::string& name, ret.push_back(z); } } - for (auto &z : m_actionsRuntimePre) { + for (auto &z : m_transformations) { if (*z->m_name.get() == name) { ret.push_back(z); } @@ -854,5 +853,9 @@ bool Rule::containsMsg(const std::string& name, Transaction *t) { return m_msg && m_msg->data(t) == name; } +std::string Rule::getOperatorName() const { return m_operator->m_op; } +std::string Rule::logData(Transaction *t) { return m_logData->data(t); } +std::string Rule::msg(Transaction *t) { return m_msg->data(t); } +int Rule::severity() const { return m_severity->m_severity; } } // namespace modsecurity diff --git a/src/rule_message.cc b/src/rule_message.cc index 311595c8..7e394c14 100644 --- a/src/rule_message.cc +++ b/src/rule_message.cc @@ -79,7 +79,7 @@ std::string RuleMessage::log(const RuleMessage *rm, int props, int code) { msg.append(std::to_string(code)); } msg.append(" (phase "); - msg.append(std::to_string(rm->m_rule->m_phase - 1) + "). "); + msg.append(std::to_string(rm->m_rule->getPhase() - 1) + "). "); } else { msg.append("ModSecurity: Warning. "); } diff --git a/src/rule_script.h b/src/rule_script.h index 5c95277b..84c5794e 100644 --- a/src/rule_script.h +++ b/src/rule_script.h @@ -46,9 +46,10 @@ class RuleScript : public Rule { public: RuleScript(const std::string &name, std::vector *actions, + Transformations *t, std::unique_ptr fileName, int lineNumber) - : Rule(NULL, NULL, actions, std::move(fileName), lineNumber), + : Rule(NULL, NULL, actions, t, std::move(fileName), lineNumber), m_name(name) { } bool init(std::string *err); diff --git a/src/rules_set.cc b/src/rules_set.cc index 91383d3f..8a46ff26 100644 --- a/src/rules_set.cc +++ b/src/rules_set.cc @@ -142,7 +142,7 @@ int RulesSet::evaluate(int phase, Transaction *t) { #endif ms_dbg_a(t, 9, "Rule: " + rule->m_marker); - if (rule->m_secMarker && rule->m_marker == t->m_marker) { + if (rule->isMarker() && rule->m_marker == t->m_marker) { ms_dbg_a(t, 4, "Out of a SecMarker after skip " \ + std::to_string(m_secmarker_skipped) + " rules."); t->m_marker.clear(); diff --git a/src/rules_set_phases.cc b/src/rules_set_phases.cc index 470dce53..5fd3592b 100644 --- a/src/rules_set_phases.cc +++ b/src/rules_set_phases.cc @@ -28,14 +28,13 @@ namespace modsecurity { -RulesSetPhases::~RulesSetPhases() { -} bool RulesSetPhases::insert(std::shared_ptr rule) { - if (rule->m_phase >= modsecurity::Phases::NUMBER_OF_PHASES) { + if (rule->getPhase() >= modsecurity::Phases::NUMBER_OF_PHASES) { return false; } - m_rules[rule->m_phase].insert(rule); + m_rulesAtPhase[rule->getPhase()].insert(rule); + return true; } @@ -45,10 +44,10 @@ int RulesSetPhases::append(RulesSetPhases *from, std::ostringstream *err) { std::vector v; for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { - v.reserve(m_rules[i].size()); - for (size_t z = 0; z < m_rules[i].size(); z++) { - Rule *rule_ckc = m_rules[i].at(z).get(); - if (rule_ckc->m_secMarker == true) { + v.reserve(m_rulesAtPhase[i].size()); + for (size_t z = 0; z < m_rulesAtPhase[i].size(); z++) { + Rule *rule_ckc = m_rulesAtPhase[i].at(z).get(); + if (rule_ckc->isMarker() == true) { continue; } v.push_back(rule_ckc->m_ruleId); @@ -57,9 +56,11 @@ int RulesSetPhases::append(RulesSetPhases *from, std::ostringstream *err) { std::sort (v.begin(), v.end()); for (int phase = 0; phase < modsecurity::Phases::NUMBER_OF_PHASES; phase++) { - if (m_rules[phase].append(from->at(phase), v, err) < 0) { - return -1; + int res = m_rulesAtPhase[phase].append(from->at(phase), v, err); + if (res < 0) { + return res; } + amount_of_rules = amount_of_rules + res; } return amount_of_rules; @@ -68,9 +69,9 @@ int RulesSetPhases::append(RulesSetPhases *from, std::ostringstream *err) { void RulesSetPhases::dump() const { for (int i = 0; i <= modsecurity::Phases::NUMBER_OF_PHASES; i++) { std::cout << "Phase: " << std::to_string(i); - std::cout << " (" << std::to_string(m_rules[i].size()); + std::cout << " (" << std::to_string(m_rulesAtPhase[i].size()); std::cout << " rules)" << std::endl; - m_rules[i].dump(); + m_rulesAtPhase[i].dump(); } } diff --git a/src/variables/rule.h b/src/variables/rule.h index 178832ec..3562fac3 100644 --- a/src/variables/rule.h +++ b/src/variables/rule.h @@ -93,13 +93,13 @@ class Rule_DictElement : public VariableDictElement { \ std::vector *l) { Rule *r = rule; - while (r && !r->m_severity) { + while (r && !r->hasSeverity()) { r = r->m_chainedRuleParent; } - if (r && r->m_severity) { + if (r && r->hasSeverity()) { std::unique_ptr origin(new VariableOrigin()); - std::string *a = new std::string(std::to_string(r->m_severity->m_severity)); + std::string *a = new std::string(std::to_string(r->severity())); VariableValue *var = new VariableValue(&m_rule, &m_rule_severity, a ); @@ -117,13 +117,13 @@ class Rule_DictElement : public VariableDictElement { \ std::vector *l) { Rule *r = rule; - while (r && !r->m_logData) { + while (r && !r->hasLogData()) { r = r->m_chainedRuleParent; } - if (r && r->m_logData) { + if (r && r->hasLogData()) { std::unique_ptr origin(new VariableOrigin()); - std::string *a = new std::string(r->m_logData->data(t)); + std::string *a = new std::string(r->logData(t)); VariableValue *var = new VariableValue(&m_rule, &m_rule_logdata, a ); @@ -140,13 +140,13 @@ class Rule_DictElement : public VariableDictElement { \ std::vector *l) { Rule *r = rule; - while (r && !r->m_msg) { + while (r && !r->hasMsg()) { r = r->m_chainedRuleParent; } - if (r && r->m_msg) { + if (r && r->hasMsg()) { std::unique_ptr origin(new VariableOrigin()); - std::string *a = new std::string(r->m_msg->data(t)); + std::string *a = new std::string(r->msg(t)); VariableValue *var = new VariableValue(&m_rule, &m_rule_msg, a ); diff --git a/test/optimization/optimization.cc b/test/optimization/optimization.cc index ff3daef1..bec88511 100644 --- a/test/optimization/optimization.cc +++ b/test/optimization/optimization.cc @@ -86,8 +86,8 @@ int main(int argc, char **argv) { if (z == NULL) { continue; } - if (z->m_op != NULL) { - std::string op = z->m_op->m_op; + if (z->isUnconditional() == false) { + std::string op = z->getOperatorName(); if (operators.count(op) > 0) { operators[op] = 1 + operators[op]; } else { @@ -95,6 +95,10 @@ int main(int argc, char **argv) { } key = op; } + + #if 0 + FIXME: This test may not be useful anymore. Disabling it for now. + if (z->m_variables != NULL) { std::string var = std::string("") + z->m_variables; if (variables.count(var) > 0) { @@ -111,6 +115,7 @@ int main(int argc, char **argv) { op2var[key] = 1; } } + #endif } if (operators.empty() && variables.empty() && op2var.empty()) {