]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add event_filter_has_field_prefix()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 22 Oct 2024 12:37:30 +0000 (15:37 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:13 +0000 (12:34 +0200)
src/lib/event-filter.c
src/lib/event-filter.h

index 56052a1d7ec23b788b4dc504ce8f5b0e130f52dc..a684353e1876f4d746a1034da83d02eb50dda925 100644 (file)
@@ -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)
 {
index f8f9608dab7ad7f693a6e0b54e0941f87519c997..b00c4a5ca3433b885e512f546fb9a18dbfe7f74a 100644 (file)
@@ -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,