]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Warn about event filter type mismatches between integer fields and wildcard...
authorKarl Fleischmann <karl.fleischmann@open-xchange.com>
Wed, 21 Dec 2022 13:23:10 +0000 (14:23 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 9 Jan 2023 09:48:38 +0000 (09:48 +0000)
src/lib/event-filter.c
src/lib/test-event-filter.c

index b4884a911db344700071e2059bc398edebb8504d..c619828ac6d6f3f279240ba4aa3675917d3b5d87 100644 (file)
@@ -654,7 +654,23 @@ event_match_field(struct event *event, struct event_filter_node *node,
                        }
                        return FALSE;
                } else if (node->op != EVENT_FILTER_OP_CMP_EQ) {
-                       /* we only support string equality comparisons */
+                       /* In this branch a numeric value is matched against a
+                          wildcard, which requires an equality operation. */
+                       if (!node->warned_type_mismatch) {
+                               const char *name = event->sending_name;
+                               /* Use i_warning to prevent event filter recursions. */
+                               i_warning("Event filter matches integer field "
+                                         "'%s' against wildcard value '%s' "
+                                         "with an incompatible operation '%s', "
+                                         "please use '='. (event=%s, "
+                                         "source=%s:%u)",
+                                         wanted_field->key,
+                                         wanted_field->value.str,
+                                         event_filter_export_query_expr_op(node->op),
+                                         name != NULL ? name : "",
+                                         source_filename, source_linenum);
+                               node->warned_type_mismatch = TRUE;
+                       }
                        return FALSE;
                } else {
                        char tmp[MAX_INT_STRLEN];
index 25d3359864eb0655d1a9b82068dcde8933c53924..4f37a1c17e3a4abcf2461b93107f58898fab7bae 100644 (file)
@@ -638,11 +638,6 @@ static void test_event_filter_numbers(void)
 
        event_add_int(e, "number", 0);
 
-       filter = event_filter_create();
-       test_assert(event_filter_parse("number > *", filter, &error) == 0);
-       test_assert(!event_filter_match(filter, e, &failure_ctx));
-       event_filter_unref(&filter);
-
        filter = event_filter_create();
        test_assert(event_filter_parse("number=0", filter, &error) == 0);
        test_assert(event_filter_match(filter, e, &failure_ctx));
@@ -669,6 +664,23 @@ static void test_event_filter_numbers(void)
        test_expect_no_more_errors();
        event_filter_unref(&filter);
 
+       event_add_int(e, "status_code", 204);
+
+       filter = event_filter_create();
+       test_assert(event_filter_parse("status_code > 2*", filter, &error) == 0);
+       test_expect_error_string("Event filter matches integer field "
+                                "'status_code' against wildcard value '2*' "
+                                "with an incompatible operation '>', please "
+                                "use '='.");
+       test_assert(!event_filter_match(filter, e, &failure_ctx));
+       test_expect_no_more_errors();
+       event_filter_unref(&filter);
+
+       filter = event_filter_create();
+       test_assert(event_filter_parse("status_code = 2*", filter, &error) == 0);
+       test_assert(event_filter_match(filter, e, &failure_ctx));
+       event_filter_unref(&filter);
+
        event_unref(&e);
        test_end();
 }