mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-11-16 09:31:53 +03:00
Refactoring: Makes transformations to work with new execute signature
This commit is contained in:
@@ -39,6 +39,7 @@ namespace actions {
|
||||
|
||||
class Action {
|
||||
public:
|
||||
|
||||
explicit Action(const std::string& _action)
|
||||
: m_isNone(false),
|
||||
temporaryAction(false),
|
||||
@@ -81,6 +82,17 @@ class Action {
|
||||
RuleMessage &ruleMessage) {
|
||||
return execute(rule, transaction);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is meant to be used by transformations — a particular
|
||||
* type of action.
|
||||
*
|
||||
*/
|
||||
virtual void execute(Transaction *t,
|
||||
ModSecStackString &in,
|
||||
ModSecStackString &out) {
|
||||
};
|
||||
|
||||
virtual bool init(std::string *error) { return true; }
|
||||
virtual bool isDisruptive() { return false; }
|
||||
|
||||
|
||||
@@ -26,14 +26,15 @@
|
||||
|
||||
#include "modsecurity/transaction.h"
|
||||
#include "modsecurity/rule.h"
|
||||
#include "modsecurity/rule_with_operator.h"
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
namespace modsecurity {
|
||||
|
||||
|
||||
namespace actions {
|
||||
class Tag;
|
||||
};
|
||||
class RuleWithActions;
|
||||
|
||||
class RuleMessage {
|
||||
public:
|
||||
@@ -112,108 +113,22 @@ class RuleMessage {
|
||||
static std::string _details(const RuleMessage *rm);
|
||||
static std::string _errorLogTail(const RuleMessage *rm);
|
||||
|
||||
RuleWithActions *getRule() const {
|
||||
return m_rule;
|
||||
}
|
||||
|
||||
void setRule(RuleWithActions *rule) {
|
||||
m_rule = rule;
|
||||
}
|
||||
|
||||
bool isSettle() const {
|
||||
return m_rule != nullptr;
|
||||
}
|
||||
|
||||
int getRuleId() const {
|
||||
if (m_rule) {
|
||||
return m_rule->getId();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int getPhase() const {
|
||||
if (m_rule) {
|
||||
return m_rule->getPhase();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string getFileName() const {
|
||||
if (m_rule) {
|
||||
return *m_rule->getFileName().get();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
int getLineNumber() const {
|
||||
if (m_rule) {
|
||||
return m_rule->getLineNumber();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string getRev() const {
|
||||
if (m_rule) {
|
||||
return m_rule->getRevision();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string getVer() const {
|
||||
if (m_rule) {
|
||||
return m_rule->getVersion();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
int getMaturity() const {
|
||||
if (m_rule) {
|
||||
return m_rule->getMaturity();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int getAccuracy() const {
|
||||
if (m_rule) {
|
||||
return m_rule->getAccuracy();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string getClientIpAddress() const {
|
||||
if (m_transaction) {
|
||||
return *m_transaction->m_clientIpAddress.get();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string getServerIpAddress() const {
|
||||
if (m_transaction) {
|
||||
return *m_transaction->m_serverIpAddress.get();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string getRequestId() const {
|
||||
if (m_transaction) {
|
||||
return *m_transaction->m_id.get();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string getUri() const {
|
||||
if (m_transaction) {
|
||||
return *m_transaction->m_uri_no_query_string_decoded.get();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
bool isDisruptive() const {
|
||||
if (m_rule) {
|
||||
return m_rule->hasDisruptiveAction();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
RuleWithActions *getRule() const;
|
||||
void setRule(RuleWithActions *rule);
|
||||
bool isSettle() const;
|
||||
int getRuleId() const;
|
||||
int getPhase() const;
|
||||
std::string getFileName() const;
|
||||
int getLineNumber() const;
|
||||
std::string getRev() const;
|
||||
std::string getVer() const;
|
||||
int getMaturity() const;
|
||||
int getAccuracy() const;
|
||||
std::string getClientIpAddress() const;
|
||||
std::string getServerIpAddress() const;
|
||||
std::string getRequestId() const;
|
||||
std::string getUri() const;
|
||||
bool isDisruptive() const;
|
||||
|
||||
int m_severity;
|
||||
std::list<std::string> m_tags;
|
||||
|
||||
@@ -49,9 +49,6 @@ class Transformation;
|
||||
}
|
||||
}
|
||||
|
||||
using TransformationResult = std::pair<std::shared_ptr<std::string>,
|
||||
std::shared_ptr<std::string>>;
|
||||
using TransformationResults = std::list<TransformationResult>;
|
||||
using Transformation = actions::transformations::Transformation;
|
||||
using Transformations = std::vector<std::shared_ptr<Transformation> >;
|
||||
using TransformationsPtr = std::vector<Transformation *>;
|
||||
@@ -67,6 +64,43 @@ using MatchActionsPtr = std::vector<actions::Action *>;
|
||||
using XmlNSs = std::vector<std::shared_ptr<actions::XmlNS> >;
|
||||
using XmlNSsPtr = std::vector<actions::XmlNS *>;
|
||||
|
||||
using ModSecStackString = std::basic_string<char, std::char_traits<char>, std::allocator<char> >;
|
||||
|
||||
class TransformationResult {
|
||||
public:
|
||||
TransformationResult(
|
||||
ModSecStackString *after,
|
||||
std::string *transformation)
|
||||
: m_after(*after),
|
||||
m_transformation(transformation) { };
|
||||
|
||||
explicit TransformationResult(
|
||||
ModSecStackString *after)
|
||||
: m_after(*after),
|
||||
m_transformation(nullptr) { };
|
||||
|
||||
TransformationResult(const TransformationResult &t2)
|
||||
: m_after(t2.m_after),
|
||||
m_transformation(t2.m_transformation) { };
|
||||
|
||||
|
||||
ModSecStackString *getAfter() {
|
||||
return &m_after;
|
||||
}
|
||||
|
||||
|
||||
std::string *getTransformationName() {
|
||||
return m_transformation;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
ModSecStackString m_after;
|
||||
std::string *m_transformation;
|
||||
};
|
||||
|
||||
using TransformationsResults = std::list<TransformationResult>;
|
||||
|
||||
|
||||
class RuleWithActions : public Rule {
|
||||
public:
|
||||
@@ -183,18 +217,21 @@ class RuleWithActions : public Rule {
|
||||
bool context);
|
||||
|
||||
|
||||
static void executeTransformation(
|
||||
Transaction *transaction,
|
||||
TransformationsResults *ret,
|
||||
Transformation *transformation);
|
||||
|
||||
static void executeTransformation(
|
||||
Transaction *transaction,
|
||||
ModSecStackString in,
|
||||
TransformationsResults *ret,
|
||||
Transformation *transformation);
|
||||
|
||||
void executeTransformations(
|
||||
Transaction *transaction,
|
||||
const std::string &value,
|
||||
TransformationResults &ret);
|
||||
|
||||
inline void executeTransformation(
|
||||
actions::transformations::Transformation *a,
|
||||
std::shared_ptr<std::string> *value,
|
||||
Transaction *trans,
|
||||
TransformationResults *ret,
|
||||
std::string *path) const;
|
||||
|
||||
TransformationsResults &results);
|
||||
|
||||
void addAction(actions::Action *a);
|
||||
void addTransformation(std::shared_ptr<actions::transformations::Transformation> t) {
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
namespace modsecurity {
|
||||
|
||||
using TransformationsResults = std::list<TransformationResult>;
|
||||
|
||||
class RuleWithOperator : public RuleWithActions {
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user