Improves rules dump for better testing

This commit is contained in:
Felipe Zimmerle 2019-04-11 10:18:03 -03:00
parent 17c4201522
commit 1e9c54860b
8 changed files with 53 additions and 9 deletions

View File

@ -1,6 +1,8 @@
v3.x.y - YYYY-MMM-DD (to be released)
-------------------------------------
- More structured rules dump. Better supporting debugging.
[@zimmerle]
- Added the basics for supporting better error/warning handling while
loading configurations.
[@zimmerle]

View File

@ -46,8 +46,8 @@ class Rule {
Rule(std::unique_ptr<std::string> fileName, int lineNumber)
: m_fileName(std::make_shared<std::string>(*fileName)),
m_lineNumber(lineNumber),
m_phase(modsecurity::Phases::RequestHeadersPhase) {
}
m_phase(modsecurity::Phases::RequestHeadersPhase)
{ }
Rule(const Rule &other) :
m_fileName(other.m_fileName),
@ -82,6 +82,18 @@ class Rule {
return "<<no file>>:" + std::to_string(m_lineNumber);
}
virtual void dump(std::stringstream &out) {
out << getOriginInTextFormat() << std::endl;
}
protected:
std::string getOriginInTextFormat() const {
std::stringstream ss;
ss << "# File name: " << *getFileName() << std::endl;
ss << "# Line number: " << getLineNumber();
return ss.str();
}
private:
std::shared_ptr<std::string> m_fileName;
int m_lineNumber;

View File

@ -61,7 +61,12 @@ class Rules {
std::vector<std::shared_ptr<actions::Action> > m_defaultActions;
std::vector<std::shared_ptr<actions::transformations::Transformation> > m_defaultTransformations;
void dump();
virtual void dump() {
std::stringstream ss;
dump(ss);
std::cout << ss.str();
};
virtual void dump(std::stringstream &out);
inline iterator begin() noexcept { return m_rules.begin(); }
inline const_iterator cbegin() const noexcept { return m_rules.cbegin(); }

View File

@ -47,7 +47,12 @@ class RuleMarker : public Rule {
RuleMarker(const RuleMarker& r) :
Rule(r),
m_name(r.m_name)
{ }
{ };
RuleMarker(RuleMarker &&r) :
Rule(r),
m_name(std::move(r.m_name))
{ };
RuleMarker &operator =(const RuleMarker& r) {
Rule::operator = (r);
@ -72,6 +77,11 @@ class RuleMarker : public Rule {
return m_name;
}
virtual void dump(std::stringstream &out) override {
Rule::dump(out);
out << "SecMarker \"" << *getName() << "\"" << std::endl;
}
private:
std::shared_ptr<std::string> m_name;
};

View File

@ -442,6 +442,11 @@ class RuleWithActions : public Rule {
return dst;
}
virtual void dump(std::stringstream &out) override {
out << "RuleWithActions" << std::endl;
}
private:
RuleId m_ruleId;

View File

@ -30,6 +30,8 @@
#include "modsecurity/variable_value.h"
#include "modsecurity/rule.h"
#include "src/rule_with_actions.h"
#include "src/variables/variable.h"
#include "src/operators/operator.h"
#ifdef __cplusplus
@ -73,6 +75,15 @@ class RuleWithOperator : public RuleWithActions {
return std::to_string(getId());
}
virtual void dump(std::stringstream &out) override {
Rule::dump(out);
out << "# RuleWithOperator" << std::endl;
out << "SecRule ";
out << m_variables->getVariableNames() << " ";
out << "\"" << "@" << m_operator->m_op << " " << m_operator->m_param << "\"";
out << std::endl;
}
private:
std::shared_ptr<modsecurity::variables::Variables> m_variables;
std::shared_ptr<operators::Operator> m_operator;

View File

@ -57,13 +57,11 @@ std::shared_ptr<Rule> Rules::at(int index) const {
}
void Rules::dump() {
for (int j = 0; j < m_rules.size(); j++) {
std::cout << " Rule ID: " << m_rules.at(j)->getReference();
std::cout << "--" << m_rules.at(j) << std::endl;
void Rules::dump(std::stringstream &out) {
for (auto &r : m_rules) {
r->dump(out);
}
}
} // namespace modsecurity

View File

@ -91,6 +91,7 @@ int main(int argc, char **argv) {
if (err.empty() == false) {
std::cerr << " " << err << std::endl;
}
rules->dump();
next:
args++;
}