Refactoring: changes ModSecurityStringVar to transaction::Variable

Having the variables and collection in place before start to implement
persistent storage.
This commit is contained in:
Felipe Zimmerle 2015-10-28 13:53:07 -03:00
parent 7afc07914f
commit 776502e021
38 changed files with 115 additions and 129 deletions

View File

@ -73,38 +73,22 @@ namespace operators {
class Operator;
}
class ModSecurityHeader {
namespace transaction {
class Variable {
public:
ModSecurityHeader(char *key, char *value)
: _key(key),
_value(value)
{ }
char *_key;
char *_value;
};
class ModSecurityCollectionsVariables :
public std::unordered_map<std::string,
std::unordered_map<std::string, std::string>> {
public:
};
class ModSecurityStringVar {
public:
ModSecurityStringVar(const std::string& key, const std::string& value) :
Variable(const std::string& key, const std::string& value) :
m_key(key),
m_value(value) { }
std::string m_key;
std::string m_value;
};
class ModSecurityStringVariables :
class Variables :
public std::unordered_multimap<std::string, std::string> {
public:
ModSecurityStringVariables() {
Variables() {
this->reserve(1000);
}
@ -136,13 +120,13 @@ class ModSecurityStringVariables :
this->erase(key);
}
std::list<ModSecurityStringVar *>
std::list<Variable *>
resolveVariable(const std::string& key,
std::list<ModSecurityStringVar *> *l) {
std::list<Variable *> *l) {
auto range = this->equal_range(key);
for (auto it = range.first; it != range.second; ++it) {
l->push_back(new ModSecurityStringVar(key, it->second));
l->push_back(new transaction::Variable(key, it->second));
}
if (key.find(":") == std::string::npos && l->size() == 0) {
@ -160,7 +144,7 @@ class ModSecurityStringVariables :
// auto range = this->equal_range(x.first);
// for (auto it = range.first; it != range.second; ++it) {
l->push_back(new ModSecurityStringVar(x.first, x.second));
l->push_back(new transaction::Variable(x.first, x.second));
// }
}
}
@ -168,14 +152,17 @@ class ModSecurityStringVariables :
return *l;
}
std::list<ModSecurityStringVar *>
std::list<Variable *>
resolveVariable(const std::string& key) {
std::list<ModSecurityStringVar *> l;
std::list<Variable *> l;
return resolveVariable(key, &l);
}
};
} // name space Transaction
/** @ingroup ModSecurity_CPP_API */
class Assay {
public:
@ -247,11 +234,11 @@ class Assay {
const char *getResponseBody();
int getResponseBodyLenth();
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
resolve_variable(const std::string& var);
void resolve_variable(const std::string& var,
std::list<ModSecurityStringVar *> *);
std::list<transaction::Variable *> *);
std::string* resolve_variable_first(const std::string& key);
std::string* resolve_variable_first(const std::string& collectionName,
@ -261,8 +248,8 @@ class Assay {
bool update_variable_first(std::string var, const std::string &value);
void delete_variable(std::string key);
ModSecurityStringVariables m_variables_strings;
std::unordered_map<std::string, ModSecurityStringVariables *> collections;
transaction::Variables m_variables_strings;
std::unordered_map<std::string, transaction::Variables *> collections;
#ifndef NO_LOGS
void debug(int, std::string);
#endif
@ -317,7 +304,6 @@ class Assay {
std::ostringstream m_requestBody;
std::ostringstream m_responseBody;
ModSecurityCollectionsVariables m_variables_collections;
void *m_logCbData;
};

View File

@ -126,7 +126,7 @@ Assay::Assay(ModSecurity *ms, Rules *rules, void *logCbData)
this->m_responseHeadersNames = resolve_variable_first(
"RESPONSE_HEADERS_NAMES");
collections.emplace("TX", new ModSecurityStringVariables());
collections.emplace("TX", new transaction::Variables());
#ifndef NO_LOGS
this->debug(4, "Initialising transaction");
#endif
@ -664,7 +664,7 @@ int Assay::processRequestBody() {
* computationally intensive.
*/
std::string fullRequest;
std::list<ModSecurityStringVar *> l;
std::list<transaction::Variable *> l;
resolve_variable("REQUEST_HEADERS", &l);
for (auto &a : l) {
fullRequest = fullRequest + \
@ -1480,7 +1480,7 @@ void Assay::delete_variable(std::string key) {
void Assay::resolve_variable(const std::string& var,
std::list<ModSecurityStringVar *> *l) {
std::list<transaction::Variable *> *l) {
m_variables_strings.resolveVariable(var, l);
@ -1490,10 +1490,10 @@ void Assay::resolve_variable(const std::string& var,
}
}
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Assay::resolve_variable(const std::string& var) {
std::list<ModSecurityStringVar *> *l =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *l =
new std::list<transaction::Variable *>();
resolve_variable(var, l);
@ -1543,7 +1543,7 @@ void Assay::setCollection(const std::string& collectionName,
const std::string& targetValue) {
try {
ModSecurityStringVariables *collection;
transaction::Variables *collection;
collection = collections.at(collectionName);
collection->storeOrUpdateVariable(collectionName + ":"
+ variableName, targetValue);

View File

@ -35,7 +35,7 @@ class Multipart {
bool process(std::string data);
void checkForCrlfLf(const std::string &blob);
ModSecurityStringVariables variables;
transaction::Variables variables;
bool crlf;
bool containsDataAfter;

View File

@ -284,7 +284,7 @@ bool Rule::evaluate(Assay *assay) {
Exclusion *exl = dynamic_cast<Exclusion *>(variable);
if (exl != NULL) {
std::list<ModSecurityStringVar *> *z =
std::list<transaction::Variable *> *z =
variable->evaluate(assay);
for (auto &y : *z) {
exclusions.push_back(y->m_key);
@ -301,7 +301,7 @@ bool Rule::evaluate(Assay *assay) {
continue;
}
std::list<ModSecurityStringVar *> *e =
std::list<transaction::Variable *> *e =
variable->evaluate(assay);
for (auto &v : *e) {

View File

@ -27,17 +27,17 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Duration::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
std::string res;
double e = cpu_seconds() - assay->start;
res = std::to_string(e);
resl->push_back(new ModSecurityStringVar("DURATION", std::string(res)));
resl->push_back(new transaction::Variable("DURATION", std::string(res)));
return resl;
}

View File

@ -33,7 +33,7 @@ class Duration : public Variable {
explicit Duration(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@ extern char **environ;
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Env::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
std::map<std::string, std::string> envs;
for (char **current = environ; *current; current++) {
@ -50,7 +50,7 @@ std::list<ModSecurityStringVar *> *
envs.insert(std::pair<std::string, std::string>("ENV:" + key, value));
if ("env:" + key == name) {
resl->push_back(new ModSecurityStringVar(name, value));
resl->push_back(new transaction::Variable(name, value));
return resl;
}
}
@ -60,7 +60,7 @@ std::list<ModSecurityStringVar *> *
&& (x.first != name)) {
continue;
}
resl->push_back(new ModSecurityStringVar(x.first, x.second));
resl->push_back(new transaction::Variable(x.first, x.second));
}
return resl;

View File

@ -33,7 +33,7 @@ class Env : public Variable {
explicit Env(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -26,12 +26,12 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
HighestSeverity::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
resl->push_back(new ModSecurityStringVar("HIGHEST_SEVERITY",
resl->push_back(new transaction::Variable("HIGHEST_SEVERITY",
std::to_string(assay->highest_severity)));
return resl;

View File

@ -33,7 +33,7 @@ class HighestSeverity : public Variable {
explicit HighestSeverity(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -27,10 +27,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
ModsecBuild::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
std::ostringstream ss;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_MAJOR;
@ -38,7 +38,7 @@ std::list<ModSecurityStringVar *> *
ss << std::setw(2) << std::setfill('0') << MODSECURITY_PATCHLEVEL;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_TAG_NUM;
resl->push_back(new ModSecurityStringVar("MODSEC_BUILD", ss.str()));
resl->push_back(new transaction::Variable("MODSEC_BUILD", ss.str()));
return resl;
}

View File

@ -33,7 +33,7 @@ class ModsecBuild : public Variable {
explicit ModsecBuild(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Time::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -48,7 +48,7 @@ std::list<ModSecurityStringVar *> *
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%H:%M:%S", &timeinfo);
resl->push_back(new ModSecurityStringVar("TIME", std::string(tstr)));
resl->push_back(new transaction::Variable("TIME", std::string(tstr)));
return resl;
}

View File

@ -34,7 +34,7 @@ class Time : public Variable {
explicit Time(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeDay::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -48,7 +48,7 @@ std::list<ModSecurityStringVar *> *
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%d", &timeinfo);
resl->push_back(new ModSecurityStringVar("TIME_DAY", std::string(tstr)));
resl->push_back(new transaction::Variable("TIME_DAY", std::string(tstr)));
return resl;
}

View File

@ -33,7 +33,7 @@ class TimeDay : public Variable {
explicit TimeDay(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,12 +33,12 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeEpoch::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
resl->push_back(new ModSecurityStringVar("TIME_EPOCH",
resl->push_back(new transaction::Variable("TIME_EPOCH",
std::to_string(std::time(nullptr))));
return resl;

View File

@ -33,7 +33,7 @@ class TimeEpoch : public Variable {
explicit TimeEpoch(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeHour::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -48,7 +48,7 @@ std::list<ModSecurityStringVar *> *
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%H", &timeinfo);
resl->push_back(new ModSecurityStringVar("TIME_HOUR", std::string(tstr)));
resl->push_back(new transaction::Variable("TIME_HOUR", std::string(tstr)));
return resl;
}

View File

@ -33,7 +33,7 @@ class TimeHour : public Variable {
explicit TimeHour(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeMin::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -48,7 +48,7 @@ std::list<ModSecurityStringVar *> *
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%M", &timeinfo);
resl->push_back(new ModSecurityStringVar("TIME_MIN", std::string(tstr)));
resl->push_back(new transaction::Variable("TIME_MIN", std::string(tstr)));
return resl;
}

View File

@ -33,7 +33,7 @@ class TimeMin : public Variable {
explicit TimeMin(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeMon::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -50,7 +50,7 @@ std::list<ModSecurityStringVar *> *
int a = atoi(tstr);
a--;
resl->push_back(new ModSecurityStringVar("TIME_MON", std::to_string(a)));
resl->push_back(new transaction::Variable("TIME_MON", std::to_string(a)));
return resl;
}

View File

@ -33,7 +33,7 @@ class TimeMon : public Variable {
explicit TimeMon(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeSec::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -48,7 +48,7 @@ std::list<ModSecurityStringVar *> *
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%S", &timeinfo);
resl->push_back(new ModSecurityStringVar("TIME_SEC", std::string(tstr)));
resl->push_back(new transaction::Variable("TIME_SEC", std::string(tstr)));
return resl;
}

View File

@ -33,7 +33,7 @@ class TimeSec : public Variable {
explicit TimeSec(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeWDay::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -50,7 +50,7 @@ std::list<ModSecurityStringVar *> *
int a = atoi(tstr);
a--;
resl->push_back(new ModSecurityStringVar("TIME_WDAY", std::to_string(a)));
resl->push_back(new transaction::Variable("TIME_WDAY", std::to_string(a)));
return resl;
}

View File

@ -33,7 +33,7 @@ class TimeWDay : public Variable {
explicit TimeWDay(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,10 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
TimeYear::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
char tstr[200];
struct tm timeinfo;
@ -48,7 +48,7 @@ std::list<ModSecurityStringVar *> *
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%Y", &timeinfo);
resl->push_back(new ModSecurityStringVar("TIME_YEAR", std::string(tstr)));
resl->push_back(new transaction::Variable("TIME_YEAR", std::string(tstr)));
return resl;
}

View File

@ -33,7 +33,7 @@ class TimeYear : public Variable {
explicit TimeYear(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -33,12 +33,12 @@
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Tx::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *resl =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
resl->push_back(new ModSecurityStringVar("TX:0", "teste"));
resl->push_back(new transaction::Variable("TX:0", "teste"));
return resl;
}

View File

@ -34,7 +34,7 @@ class Tx : public Variable {
explicit Tx(std::string _name)
: Variable(_name) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
};

View File

@ -28,10 +28,10 @@ using ModSecurity::Variables::Variations::Exclusion;
namespace ModSecurity {
namespace Variables {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Variable::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *l =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *l =
new std::list<transaction::Variable *>();
assay->resolve_variable(this->name, l);
return l;
}

View File

@ -33,7 +33,7 @@ class Variable {
: name(_name) { }
static std::string to_s(std::vector<Variable *> *variables);
virtual std::list<ModSecurityStringVar *> *
virtual std::list<transaction::Variable *> *
evaluate(Assay *assay);
std::string name;
};

View File

@ -28,11 +28,11 @@ namespace ModSecurity {
namespace Variables {
namespace Variations {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Count::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *reslIn;
std::list<ModSecurityStringVar *> *reslOut =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *reslIn;
std::list<transaction::Variable *> *reslOut =
new std::list<transaction::Variable *>();
int count = 0;
reslIn = var->evaluate(assay);
@ -43,7 +43,7 @@ std::list<ModSecurityStringVar *> *
std::string res = std::to_string(count);
reslOut->push_back(new ModSecurityStringVar(std::string(var->name),
reslOut->push_back(new transaction::Variable(std::string(var->name),
std::string(res)));
return reslOut;

View File

@ -35,7 +35,7 @@ class Count : public Variable {
: Variable("count(" + v->name + ")"),
var(v) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
Variable *var;

View File

@ -29,10 +29,10 @@ namespace Variables {
namespace Variations {
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
Exclusion::evaluate(Assay *assay) {
std::list<ModSecurityStringVar *> *l =
new std::list<ModSecurityStringVar *>();
std::list<transaction::Variable *> *l =
new std::list<transaction::Variable *>();
assay->resolve_variable(this->name, l);
return l;
}

View File

@ -36,7 +36,7 @@ class Exclusion : public Variable {
: Variable(v->name),
var(v) { }
std::list<ModSecurityStringVar *> *
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
Variable *var;