2828#include " src/actions/transformations/transformation.h"
2929#include " modsecurity/transaction.h"
3030#include " modsecurity/actions/action.h"
31+ #include " src/actions/capture.h"
32+ #include " src/operators/libinjection_adapter.h"
3133
3234
3335#include " test/common/modsecurity_test.h"
@@ -57,6 +59,34 @@ void print_help() {
5759}
5860
5961
62+ namespace {
63+ injection_result_t sqli_force_error (const char *, size_t , char *) {
64+ return LIBINJECTION_RESULT_ERROR;
65+ }
66+
67+ injection_result_t xss_force_error (const char *, size_t ) {
68+ return LIBINJECTION_RESULT_ERROR;
69+ }
70+
71+ void configure_libinjection_override (const UnitTest &t) {
72+ modsecurity::operators::clearLibinjectionOverridesForTesting ();
73+
74+ if (t.libinjection_override != " error" ) {
75+ return ;
76+ }
77+
78+ const std::string operator_name = modsecurity::utils::string::tolower (t.name );
79+
80+ if (operator_name == " detectsqli" ) {
81+ modsecurity::operators::setLibinjectionSQLiOverrideForTesting (
82+ sqli_force_error);
83+ } else if (operator_name == " detectxss" ) {
84+ modsecurity::operators::setLibinjectionXSSOverrideForTesting (
85+ xss_force_error);
86+ }
87+ }
88+ } // namespace
89+
6090struct OperatorTest {
6191 using ItemType = Operator;
6292
@@ -71,13 +101,42 @@ struct OperatorTest {
71101 }
72102
73103 static UnitTestResult eval (ItemType &op, const UnitTest &t, modsecurity::Transaction &transaction) {
74- modsecurity::RuleWithActions rule{nullptr , nullptr , " dummy.conf" , -1 };
104+ configure_libinjection_override (t);
105+
106+ std::unique_ptr<modsecurity::Actions> actions;
107+ if (t.capture ) {
108+ actions = std::make_unique<modsecurity::Actions>();
109+ actions->push_back (new modsecurity::actions::Capture (" capture" ));
110+ }
111+
112+ modsecurity::RuleWithActions rule{actions.release (), nullptr , " dummy.conf" , -1 };
75113 modsecurity::RuleMessage ruleMessage{rule, transaction};
76- return {op.evaluate (&transaction, &rule, t.input , ruleMessage), {}};
114+
115+ const bool matched = op.evaluate (&transaction, &rule, t.input , ruleMessage);
116+
117+ UnitTestResult result;
118+ result.ret = matched;
119+ if (t.capture ) {
120+ auto tx0 = transaction.m_collections .m_tx_collection ->resolveFirst (" 0" );
121+ if (tx0 != nullptr ) {
122+ result.output = *tx0;
123+ }
124+ }
125+
126+ modsecurity::operators::clearLibinjectionOverridesForTesting ();
127+ return result;
77128 }
78129
79130 static bool check (const UnitTestResult &result, const UnitTest &t) {
80- return result.ret != t.ret ;
131+ if (result.ret != t.ret ) {
132+ return true ;
133+ }
134+
135+ if (t.capture || t.output .empty () == false ) {
136+ return result.output != t.output ;
137+ }
138+
139+ return false ;
81140 }
82141};
83142
0 commit comments