From 5d5537bb2325da275ea458cdacfd71f5f7ff7feb Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Tue, 20 Nov 2018 21:29:18 -0300 Subject: [PATCH] Organizes methods for Rules and RulesPhases --- headers/modsecurity/rules.h | 23 ++++++++++++++ headers/modsecurity/rules_set_phases.h | 44 ++++++++++---------------- src/rules_set.cc | 11 +------ 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/headers/modsecurity/rules.h b/headers/modsecurity/rules.h index 531d4b77..af13df92 100644 --- a/headers/modsecurity/rules.h +++ b/headers/modsecurity/rules.h @@ -39,6 +39,29 @@ namespace modsecurity { class Rules : public std::vector { public: + void dump() { + for (int j = 0; j < size(); j++) { + std::cout << " Rule ID: " << std::to_string(at(j)->m_ruleId); + std::cout << "--" << at(j) << std::endl; + } + } + + int append(Rules *from, const std::vector &ids, std::ostringstream *err) { + size_t j = 0; + for (; j < from->size(); j++) { + Rule *rule = from->at(j); + if (std::binary_search(ids.begin(), ids.end(), rule->m_ruleId)) { + if (err != NULL) { + *err << "Rule id: " << std::to_string(rule->m_ruleId) \ + << " is duplicated" << std::endl; + } + return -1; + } + rule->refCountIncrease(); + } + insert(end(), from->begin(), from->end()); + return j; + } }; diff --git a/headers/modsecurity/rules_set_phases.h b/headers/modsecurity/rules_set_phases.h index 96ccab80..f98c8b2a 100644 --- a/headers/modsecurity/rules_set_phases.h +++ b/headers/modsecurity/rules_set_phases.h @@ -35,7 +35,7 @@ class RulesSetPhases { ~RulesSetPhases() { /** Cleanup the rules */ for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { - Rules *rules = &m_rules[i]; + Rules *rules = &m_rulesAtPhase[i]; while (rules->empty() == false) { Rule *rule = rules->back(); rules->pop_back(); @@ -50,7 +50,7 @@ class RulesSetPhases { if (rule->m_phase >= modsecurity::Phases::NUMBER_OF_PHASES) { return false; } - m_rules[rule->m_phase].push_back(rule); + m_rulesAtPhase[rule->m_phase].push_back(rule); return true; } @@ -60,9 +60,9 @@ class RulesSetPhases { 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); + 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); if (rule_ckc->m_secMarker == true) { continue; } @@ -72,41 +72,31 @@ class RulesSetPhases { std::sort (v.begin(), v.end()); for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { - for (size_t j = 0; j < from->at(i)->size(); j++) { - Rule *rule = from->at(i)->at(j); - if (std::binary_search(v.begin(), v.end(), rule->m_ruleId)) { - if (err != NULL) { - *err << "Rule id: " << std::to_string(rule->m_ruleId) \ - << " is duplicated" << std::endl; - } - return -1; - } - amount_of_rules++; - rule->refCountIncrease(); - m_rules[i].push_back(rule); + int res = m_rulesAtPhase[i].append(from->at(i), v, err); + if (res < 0) { + return res; } + amount_of_rules = amount_of_rules + res; } return amount_of_rules; } void dump() { - for (int i = 0; i <= modsecurity::Phases::NUMBER_OF_PHASES; i++) { - std::vector rules = m_rules[i]; + for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { + Rules *rules = &m_rulesAtPhase[i]; std::cout << "Phase: " << std::to_string(i); - std::cout << " (" << std::to_string(rules.size()); + std::cout << " (" << std::to_string(rules->size()); std::cout << " rules)" << std::endl; - for (int j = 0; j < rules.size(); j++) { - std::cout << " Rule ID: " << std::to_string(rules[j]->m_ruleId); - std::cout << "--" << rules[j] << std::endl; - } + rules->dump(); } } - 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]; } - Rules m_rules[8]; + private: + Rules m_rulesAtPhase[8]; }; } // namespace modsecurity diff --git a/src/rules_set.cc b/src/rules_set.cc index 78130980..91df8df7 100644 --- a/src/rules_set.cc +++ b/src/rules_set.cc @@ -298,16 +298,7 @@ void RulesSet::debug(int level, const std::string &id, void RulesSet::dump() { std::cout << "Rules: " << std::endl; - for (int i = 0; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) { - std::vector *rules = m_rulesSetPhases[i]; - std::cout << "Phase: " << std::to_string(i); - std::cout << " (" << std::to_string(rules->size()); - std::cout << " rules)" << std::endl; - for (int j = 0; j < rules->size(); j++) { - std::cout << " Rule ID: " << std::to_string(rules->at(j)->m_ruleId); - std::cout << "--" << rules->at(j) << std::endl; - } - } + m_rulesSetPhases.dump(); }