From b4b6726ccf0b1d69bd4cbc83a9bbe2b3bc7d8a9b Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Thu, 11 Nov 2021 15:14:54 +0100 Subject: [PATCH] Fix too extensive host notification recipients Previously, host notification recipients also included notification recipients from their services. --- .../Icingadb/Widget/Detail/ObjectDetail.php | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/library/Icingadb/Widget/Detail/ObjectDetail.php b/library/Icingadb/Widget/Detail/ObjectDetail.php index 6a1c2372..d47c3f05 100644 --- a/library/Icingadb/Widget/Detail/ObjectDetail.php +++ b/library/Icingadb/Widget/Detail/ObjectDetail.php @@ -477,16 +477,30 @@ class ObjectDetail extends BaseHtmlElement { $users = []; $usergroups = []; + $groupBy = false; - $objectFilter = Filter::equal( - 'notification.' . ($this->objectType === 'host' ? 'host_id' : 'service_id'), - $this->object->id - ); + if ($this->objectType === 'host') { + $objectFilter = Filter::all( + Filter::equal('notification.host_id', $this->object->id), + Filter::unequal('notification.service_id', '*') + ); + $objectFilter->metaData()->set('forceOptimization', false); + $groupBy = true; + } else { + $objectFilter = Filter::equal( + 'notification.service_id', + $this->object->id + ); + } if ($this->isPermittedRoute('users')) { $userQuery = User::on($this->getDb()); $userQuery->filter($objectFilter); $this->applyRestrictions($userQuery); + if ($groupBy) { + $userQuery->getSelectBase()->groupBy(['user.id']); + } + foreach ($userQuery as $user) { $users[$user->name] = $user; } @@ -496,6 +510,10 @@ class ObjectDetail extends BaseHtmlElement $usergroupQuery = Usergroup::on($this->getDb()); $usergroupQuery->filter($objectFilter); $this->applyRestrictions($usergroupQuery); + if ($groupBy) { + $userQuery->getSelectBase()->groupBy(['usergroup.id']); + } + foreach ($usergroupQuery as $usergroup) { $usergroups[$usergroup->name] = $usergroup; }