From 537fbd043bc0600cca1b2d8db65a86236a10c873 Mon Sep 17 00:00:00 2001 From: Yonas Habteab Date: Fri, 8 Nov 2024 15:37:18 +0100 Subject: [PATCH] Notification: Fix incorrectly dropped recovery & ACK notifications Previously, recovery and ACK notifications were not delivered to users who weren't notified about the problem state while having a configured `Problem` type filter. However, since the type filter can also be configured on the `Notification` object level, this resulted to an incorrect behaviour. This PR changes the existing logic so that the recovery and ACK notifications gets dropped only if the `Problem` filter is configured on both the `User` and `Notification` object levels. --- lib/icinga/notification.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 81a48bada8..59d63d4d5e 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -428,9 +428,16 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe continue; } + // Verify if the 'Problem' filter is configured at both the User and Notification object levels. + bool foundProblemFilter = NotificationProblem & user->GetTypeFilter() & GetTypeFilter(); + /* on recovery, check if user was notified before */ if (type == NotificationRecovery) { - if (!notifiedProblemUsers->Contains(userName) && (NotificationProblem & user->GetTypeFilter())) { + // Do not notify the user about the recovery of a problem that they have not been notified about, + // unless they are explicitly configured to receive recovery notifications but no problem ones, or + // this Notification instance isn't allowed to send problem notifications (doesn't contain the + // 'Problem' type filter). + if (!notifiedProblemUsers->Contains(userName) && foundProblemFilter) { Log(LogNotice, "Notification") << "Notification object '" << notificationName << "': We did not notify user '" << userName << "' (Problem types enabled) for a problem before. Not sending Recovery notification."; @@ -440,7 +447,10 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe /* on acknowledgement, check if user was notified before */ if (type == NotificationAcknowledgement) { - if (!notifiedProblemUsers->Contains(userName) && (NotificationProblem & user->GetTypeFilter())) { + // Do not notify the user about the ACK of a problem state that they have not been notified about, unless + // they are explicitly configured to receive ACK notifications but no problem ones, or this Notification + // instance isn't allowed to send problem notifications (doesn't contain the 'Problem' type filter). + if (!notifiedProblemUsers->Contains(userName) && foundProblemFilter) { Log(LogNotice, "Notification") << "Notification object '" << notificationName << "': We did not notify user '" << userName << "' (Problem types enabled) for a problem before. Not sending acknowledgement notification.";