Skip to content

Commit

Permalink
Reduce set of negated matchers
Browse files Browse the repository at this point in the history
  • Loading branch information
Anilm3 committed Sep 11, 2024
1 parent 1d30f50 commit 3863d0b
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 11 deletions.
29 changes: 20 additions & 9 deletions src/parser/expression_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
#include "exception.hpp"
#include "expression.hpp"
#include "log.hpp"
#include "matcher/equals.hpp"
#include "matcher/exact_match.hpp"
#include "matcher/ip_match.hpp"
#include "matcher/phrase_match.hpp"
#include "matcher/regex_match.hpp"
#include "parameter.hpp"
#include "parser/common.hpp"
#include "parser/matcher_parser.hpp"
Expand Down Expand Up @@ -144,22 +149,28 @@ std::shared_ptr<expression> parse_expression(const parameter::vector &conditions
} else {
auto raw_operator_name = operator_name;
auto negated = operator_name.starts_with('!');
if (negated) {
operator_name = operator_name.substr(1);
}

auto [data_id, matcher] = parse_all_matchers(operator_name, params);
if (!negated) {
auto [data_id, matcher] = parse_any_matcher(operator_name, params);

if (!matcher && !data_id.empty()) {
data_ids_to_type.emplace(data_id, operator_name);
}
if (!matcher && !data_id.empty()) {
data_ids_to_type.emplace(data_id, operator_name);
}

if (!negated) {
auto arguments = parse_arguments<scalar_condition>(
params, source, transformers, addresses, limits);
conditions.emplace_back(std::make_unique<scalar_condition>(
std::move(matcher), data_id, std::move(arguments), limits));

} else {
operator_name = operator_name.substr(1);
auto [data_id, matcher] =
parse_matcher<matcher::ip_match, matcher::exact_match, matcher::regex_match,
matcher::phrase_match, matcher::equals<>>(operator_name, params);

if (!matcher && !data_id.empty()) {
data_ids_to_type.emplace(data_id, operator_name);
}

auto arguments = parse_arguments<scalar_negated_condition>(
params, source, transformers, addresses, limits);
conditions.emplace_back(
Expand Down
2 changes: 1 addition & 1 deletion src/parser/matcher_parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ std::pair<std::string, std::unique_ptr<matcher::base>> parse_matcher(
}
}

inline std::pair<std::string, std::unique_ptr<matcher::base>> parse_all_matchers(
inline std::pair<std::string, std::unique_ptr<matcher::base>> parse_any_matcher(
std::string_view name, const parameter::map &params)
{
return parse_matcher<
Expand Down
2 changes: 1 addition & 1 deletion src/parser/scanner_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ std::unique_ptr<matcher::base> parse_scanner_matcher(const parameter::map &root)
auto matcher_name = at<std::string_view>(root, "operator");
auto matcher_params = at<parameter::map>(root, "parameters");

auto [rule_data_id, matcher] = parse_all_matchers(matcher_name, matcher_params);
auto [rule_data_id, matcher] = parse_any_matcher(matcher_name, matcher_params);
if (!rule_data_id.empty()) {
throw ddwaf::parsing_error("dynamic data on scanner condition");
}
Expand Down

0 comments on commit 3863d0b

Please sign in to comment.