#include "rule.hpp"
#include "clock.hpp"
#include "exclusion/common.hpp"
#include "expression.hpp"
#include "matcher/base.hpp"
#include "object_store.hpp"
#include <optional>
#include <utility>
#include <vector>
namespace ddwaf {
namespace {
std::vector<rule_attribute> empty_attributes{};
}
std::pair<rule_verdict, std::optional<rule_result>> core_rule::match(const object_store &store,
cache_type &cache, const object_set_ref &objects_excluded,
const matcher_mapper &dynamic_matchers, timer &deadline) const
{
if (expression::get_result(cache)) {
return {verdict_type::none, std::nullopt};
}
if (!expr_->eval(cache, store, objects_excluded, dynamic_matchers, deadline)) {
return {verdict_type::none, std::nullopt};
}
rule_result result{.keep = contains(flags_, rule_flags::keep_outcome),
.action_override = {},
.actions = actions_,
.attributes = attributes_};
if (contains(flags_, rule_flags::generate_event)) {
result.event = {rule_event{
.rule{
.id = id_,
.name = name_,
.tags = tags_,
},
.matches = expression::get_matches(cache),
}};
}
return {verdict_, result};
}
}