From 7ce9324f1df90d2350d0aa02a2b8324d1b312985 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rajmund=20Hru=C5=A1ka?= <rajmund.hruska@cesnet.cz>
Date: Fri, 4 Mar 2022 22:10:04 +0100
Subject: [PATCH] Fix: Discard event if any filtering rule is matched. (Redmine
 issue: #6227)

---
 lib/mentat/reports/event.py      | 12 +++++++++---
 lib/mentat/reports/test_event.py |  9 ++++++---
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/lib/mentat/reports/event.py b/lib/mentat/reports/event.py
index b57751500..3cf9f78d9 100644
--- a/lib/mentat/reports/event.py
+++ b/lib/mentat/reports/event.py
@@ -488,7 +488,7 @@ class EventReporter(BaseReporter):
             filter_list = self.settings_dict[group].setup_filters(self.filter_parser, self.filter_compiler)
             match = self.filter_event(filter_list, event)
             if match:
-                self.logger.debug("Event matched filtering rule '%s' of group %s", match, group)
+                self.logger.debug("Event matched filtering rule '%s' of group %s.", match, group)
                 fltlog[match] = fltlog.get(match, 0) + 1
             else:
                 filtered_groups.append(group)
@@ -527,9 +527,15 @@ class EventReporter(BaseReporter):
         if main_group not in groups:
             return [], [], fltlog
 
-        groups, fltlog = self._filter_groups(groups, event, fltlog)
+        filtered_groups, fltlog = self._filter_groups(groups, event, fltlog)
+
+        # If any filtering rule of at least one of the groups was matched then this event shall not be reported to anyone.
+        if filtered_groups != groups:
+            self.logger.debug("Discarding event with ID '%s' from reports.", event['ID'])
+            return [], [], fltlog
+
         fallback_groups, fltlog = self._filter_groups(fallback_groups, event, fltlog)
-        return groups, fallback_groups, fltlog
+        return filtered_groups, fallback_groups, fltlog
 
     def filter_events(self, main_group, events):
         """
diff --git a/lib/mentat/reports/test_event.py b/lib/mentat/reports/test_event.py
index 5980410e4..2e71b35b5 100644
--- a/lib/mentat/reports/test_event.py
+++ b/lib/mentat/reports/test_event.py
@@ -308,10 +308,13 @@ class TestMentatReportsEvent(unittest.TestCase):
         for events in aggr.values():
             self.assertEqual(len(events), 2)
         self.reporter.logger.assert_has_calls([
-            call.debug("Event matched filtering rule '%s' of group %s", 'FLT1', 'abuse@cesnet.cz'),
+            call.debug("Event matched filtering rule '%s' of group %s.", 'FLT1', 'abuse@cesnet.cz'),
+            call.debug("Discarding event with ID '%s' from reports.", 'msg01'),
             call.debug('Event matched filtering rules, all sources filtered'),
-            call.debug("Event matched filtering rule '%s' of group %s", 'FLT3', 'abuse@cesnet.cz'),
-            call.debug("Event matched filtering rule '%s' of group %s", 'FLT2', 'abuse@cesnet.cz')
+            call.debug("Event matched filtering rule '%s' of group %s.", 'FLT3', 'abuse@cesnet.cz'),
+            call.debug("Discarding event with ID '%s' from reports.", 'msg02'),
+            call.debug("Event matched filtering rule '%s' of group %s.", 'FLT2', 'abuse@cesnet.cz'),
+            call.debug("Discarding event with ID '%s' from reports.", 'msg02')
         ])
         self.sqlstorage.session.commit()
 
-- 
GitLab