From: Timo Sirainen Date: Tue, 22 Oct 2024 12:37:30 +0000 (+0300) Subject: lib: Add event_filter_has_field_prefix() X-Git-Tag: 2.4.1~796 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cc89071bffe5b25ae09867d3d1641104c3a1d872;p=thirdparty%2Fdovecot%2Fcore.git lib: Add event_filter_has_field_prefix() --- diff --git a/src/lib/event-filter.c b/src/lib/event-filter.c index 56052a1d7e..a684353e18 100644 --- a/src/lib/event-filter.c +++ b/src/lib/event-filter.c @@ -302,6 +302,46 @@ const char *event_filter_find_field_exact(struct event_filter *filter, return NULL; } +static bool +event_filter_node_has_field_prefix(struct event_filter_node *node, + const char *key, const char *prefix) +{ + switch (node->op) { + case EVENT_FILTER_OP_CMP_EQ: + if (node->type == EVENT_FILTER_NODE_TYPE_EVENT_FIELD_EXACT && + strcmp(node->field.key, key) == 0 && + node->field.value_type == EVENT_FIELD_VALUE_TYPE_STR && + str_begins_with(node->field.value.str, prefix)) + return TRUE; + break; + case EVENT_FILTER_OP_AND: + case EVENT_FILTER_OP_OR: + if (event_filter_node_has_field_prefix( + node->children[0], key, prefix) || + event_filter_node_has_field_prefix( + node->children[1], key, prefix)) + return TRUE; + break; + case EVENT_FILTER_OP_NOT: + return FALSE; + default: + break; + } + return FALSE; +} + +bool event_filter_has_field_prefix(struct event_filter *filter, + const char *key, const char *prefix) +{ + const struct event_filter_query_internal *query; + + array_foreach(&filter->queries, query) { + if (event_filter_node_has_field_prefix(query->expr, key, prefix)) + return TRUE; + } + return FALSE; +} + bool event_filter_category_to_log_type(const char *name, enum event_filter_log_type *log_type_r) { diff --git a/src/lib/event-filter.h b/src/lib/event-filter.h index f8f9608dab..b00c4a5ca3 100644 --- a/src/lib/event-filter.h +++ b/src/lib/event-filter.h @@ -54,6 +54,9 @@ int event_filter_parse_case_sensitive(const char *str, found. This works only for string values. NOT key=value is not returned. */ const char *event_filter_find_field_exact(struct event_filter *filter, const char *key, bool *op_not_r); +/* Returns TRUE if the event filter has key=prefix prefix string. */ +bool event_filter_has_field_prefix(struct event_filter *filter, + const char *key, const char *prefix); /* Returns TRUE if the event matches the event filter. */ bool event_filter_match(struct event_filter *filter, struct event *event,