Variables resolution results now stored into a std::vector instead of std::list

This commit is contained in:
Felipe Zimmerle
2015-11-04 15:51:22 -03:00
parent 2ee5d4ca8f
commit 5bef19aa4d
40 changed files with 143 additions and 275 deletions

View File

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

View File

@@ -33,8 +33,8 @@ class Duration : public Variable {
explicit Duration(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};

View File

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

View File

@@ -33,8 +33,8 @@ class Env : public Variable {
explicit Env(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};

View File

@@ -26,15 +26,10 @@
namespace ModSecurity {
namespace Variables {
std::list<transaction::Variable *> *
HighestSeverity::evaluate(Assay *assay) {
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
resl->push_back(new transaction::Variable("HIGHEST_SEVERITY",
void HighestSeverity::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
l->push_back(new transaction::Variable("HIGHEST_SEVERITY",
std::to_string(assay->highest_severity)));
return resl;
}

View File

@@ -33,8 +33,8 @@ class HighestSeverity : public Variable {
explicit HighestSeverity(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};

View File

@@ -27,20 +27,15 @@
namespace ModSecurity {
namespace Variables {
std::list<transaction::Variable *> *
ModsecBuild::evaluate(Assay *assay) {
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
void ModsecBuild::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
std::ostringstream ss;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_MAJOR;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_MINOR;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_PATCHLEVEL;
ss << std::setw(2) << std::setfill('0') << MODSECURITY_TAG_NUM;
resl->push_back(new transaction::Variable("MODSEC_BUILD", ss.str()));
return resl;
l->push_back(new transaction::Variable("MODSEC_BUILD", ss.str()));
}

View File

@@ -33,8 +33,8 @@ class ModsecBuild : public Variable {
explicit ModsecBuild(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};

View File

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

View File

@@ -34,8 +34,8 @@ class Time : public Variable {
explicit Time(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

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

View File

@@ -33,8 +33,8 @@ class TimeDay : public Variable {
explicit TimeDay(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

@@ -33,15 +33,10 @@
namespace ModSecurity {
namespace Variables {
std::list<transaction::Variable *> *
TimeEpoch::evaluate(Assay *assay) {
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
resl->push_back(new transaction::Variable("TIME_EPOCH",
void TimeEpoch::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
l->push_back(new transaction::Variable("TIME_EPOCH",
std::to_string(std::time(nullptr))));
return resl;
}

View File

@@ -33,8 +33,8 @@ class TimeEpoch : public Variable {
explicit TimeEpoch(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

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

View File

@@ -33,8 +33,8 @@ class TimeHour : public Variable {
explicit TimeHour(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

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

View File

@@ -33,8 +33,8 @@ class TimeMin : public Variable {
explicit TimeMin(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

@@ -33,11 +33,8 @@
namespace ModSecurity {
namespace Variables {
std::list<transaction::Variable *> *
TimeMon::evaluate(Assay *assay) {
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
void TimeMon::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -50,9 +47,7 @@ std::list<transaction::Variable *> *
int a = atoi(tstr);
a--;
resl->push_back(new transaction::Variable("TIME_MON", std::to_string(a)));
return resl;
l->push_back(new transaction::Variable("TIME_MON", std::to_string(a)));
}

View File

@@ -33,8 +33,8 @@ class TimeMon : public Variable {
explicit TimeMon(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

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

View File

@@ -33,8 +33,8 @@ class TimeSec : public Variable {
explicit TimeSec(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

@@ -33,11 +33,8 @@
namespace ModSecurity {
namespace Variables {
std::list<transaction::Variable *> *
TimeWDay::evaluate(Assay *assay) {
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
void TimeWDay::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
@@ -50,9 +47,7 @@ std::list<transaction::Variable *> *
int a = atoi(tstr);
a--;
resl->push_back(new transaction::Variable("TIME_WDAY", std::to_string(a)));
return resl;
l->push_back(new transaction::Variable("TIME_WDAY", std::to_string(a)));
}

View File

@@ -33,8 +33,8 @@ class TimeWDay : public Variable {
explicit TimeWDay(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

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

View File

@@ -33,8 +33,8 @@ class TimeYear : public Variable {
explicit TimeYear(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

@@ -33,20 +33,16 @@
namespace ModSecurity {
namespace Variables {
std::list<transaction::Variable *> *
Tx::evaluate(Assay *assay) {
std::list<transaction::Variable *> *resl =
new std::list<transaction::Variable *>();
void Tx::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
if (m_type == SingleMatch) {
assay->m_collections.resolveSingleMatch(m_name, "TX", resl);
assay->m_collections.resolveSingleMatch(m_name, "TX", l);
} else if (m_type == MultipleMatches) {
assay->m_collections.resolveMultiMatches(m_name, "TX", resl);
assay->m_collections.resolveMultiMatches(m_name, "TX", l);
} else if (m_type == RegularExpression) {
assay->m_collections.resolveRegularExpression(m_name, "TX", resl);
assay->m_collections.resolveRegularExpression(m_name, "TX", l);
}
return resl;
}

View File

@@ -34,8 +34,8 @@ class Tx : public Variable {
explicit Tx(std::string _name)
: Variable(_name) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
};
} // namespace Variables

View File

@@ -73,11 +73,15 @@ Variable::Variable(std::string name, VariableKind kind)
}
std::list<transaction::Variable *> *
std::vector<const transaction::Variable *> *
Variable::evaluate(Assay *assay) {
std::list<transaction::Variable *> *l =
new std::list<transaction::Variable *>();
std::vector<const transaction::Variable *> *l = new std::vector<const transaction::Variable *>();
evaluate(assay, l);
return l;
}
void Variable::evaluateInternal(Assay *assay, std::vector<const transaction::Variable *> *l) {
if (m_collectionName.empty() == false) {
if (m_kind == CollectionVarible && m_type == MultipleMatches) {
assay->m_collections.resolveMultiMatches(m_name, m_collectionName, l);
@@ -95,8 +99,11 @@ std::list<transaction::Variable *> *
assay->m_collections.resolveSingleMatch(m_name, l);
}
}
}
return l;
void Variable::evaluate(Assay *assay, std::vector<const transaction::Variable *> *l) {
evaluateInternal(assay, l);
}

View File

@@ -66,8 +66,10 @@ class Variable {
static std::string to_s(std::vector<Variable *> *variables);
virtual std::list<transaction::Variable *> *evaluate(Assay *assay);
//virtual std::list<transaction::Variable *> *eval_int(Assay *assay);
virtual std::vector<const transaction::Variable *> *evaluate(Assay *assay);
virtual void evaluate(Assay *assay, std::vector<const transaction::Variable *> *l);
virtual void evaluateInternal(Assay *assay, std::vector<const transaction::Variable *> *l);
std::string m_name;
std::string m_collectionName;

View File

@@ -28,11 +28,9 @@ namespace ModSecurity {
namespace Variables {
namespace Variations {
std::list<transaction::Variable *> *
Count::evaluate(Assay *assay) {
std::list<transaction::Variable *> *reslIn;
std::list<transaction::Variable *> *reslOut =
new std::list<transaction::Variable *>();
void Count::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
std::vector<const transaction::Variable *> *reslIn;
int count = 0;
reslIn = var->evaluate(assay);
@@ -42,17 +40,15 @@ std::list<transaction::Variable *> *
}
while (reslIn->empty() == false) {
delete reslIn->front();
reslIn->pop_front();
delete reslIn->back();
reslIn->pop_back();
}
delete reslIn;
std::string res = std::to_string(count);
reslOut->push_back(new transaction::Variable(std::string(var->m_name),
l->push_back(new transaction::Variable(std::string(var->m_name),
std::string(res)));
return reslOut;
}

View File

@@ -35,8 +35,8 @@ class Count : public Variable {
: Variable("count(" + v->m_name + ")"),
var(v) { }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
Variable *var;
};

View File

@@ -29,12 +29,9 @@ namespace Variables {
namespace Variations {
std::list<transaction::Variable *> *
Exclusion::evaluate(Assay *assay) {
std::list<transaction::Variable *> *l =
new std::list<transaction::Variable *>();
assay->m_collections.resolve(this->m_name, l);
return l;
void Exclusion::evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) {
assay->m_collections.resolveMultiMatches(m_name, l);
}

View File

@@ -37,8 +37,8 @@ class Exclusion : public Variable {
var(v)
{ m_isExclusion = true; }
std::list<transaction::Variable *> *
evaluate(Assay *assay) override;
void evaluateInternal(Assay *assay,
std::vector<const transaction::Variable *> *l) override;
Variable *var;
};