diff --git a/src/operators/within.cc b/src/operators/within.cc index b6084239..943f1416 100644 --- a/src/operators/within.cc +++ b/src/operators/within.cc @@ -18,24 +18,30 @@ #include #include "operators/operator.h" +#include "src/macro_expansion.h" namespace ModSecurity { namespace operators { -bool Within::evaluate(Assay *assay) { - /** - * @todo Implement the operator Within. - * Reference: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#within - */ - return true; -} + +bool Within::evaluate(Assay *assay, const std::string &str) { + bool res = false; + std::string paramTarget = MacroExpansion::expand(param, assay); + + if (str.empty()) { + return true; + } + + res = paramTarget.find(str) != std::string::npos; -Within::Within(std::string op, std::string param, bool negation) - : Operator() { - this->op = op; - this->param = param; + if (negation) { + return !res; + } + + return res; } + } // namespace operators } // namespace ModSecurity diff --git a/src/operators/within.h b/src/operators/within.h index 4aabfc2a..a76f438e 100644 --- a/src/operators/within.h +++ b/src/operators/within.h @@ -27,8 +27,10 @@ namespace operators { class Within : public Operator { public: /** @ingroup ModSecurity_Operator */ - Within(std::string o, std::string p, bool i); - bool evaluate(Assay *assay); + Within(std::string op, std::string param, bool negation) + : Operator(op, param, negation) { } + + bool evaluate(Assay *assay, const std::string &str); }; } // namespace operators