From 7326d8825e8bc77a77ce59162c88c18f943af433 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Thu, 2 Oct 2025 11:15:35 +0530 Subject: [PATCH 1/4] fix: use correct attendee name in invitation acceptance notifications Previously, the system always displayed the name of the last attendee in the database query result instead of the person who actually accepted the invitation. This was caused by the logic overwriting the attendee name variable in each iteration of the loop. The fix groups attendee properties by objectid and matches the attendee's email address with the sender's email to identify the correct person who responded to the invitation. Fixes issue where notification message '%s has accepted your invitation to %s on %s' would show the wrong attendee name. --- lib/Middleware/InvitationMiddleware.php | 32 ++++++++++++++++++++----- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/Middleware/InvitationMiddleware.php b/lib/Middleware/InvitationMiddleware.php index 3be99651f..b45f13e39 100644 --- a/lib/Middleware/InvitationMiddleware.php +++ b/lib/Middleware/InvitationMiddleware.php @@ -104,19 +104,39 @@ class InvitationMiddleware extends Middleware { ); $stmt3 = $query3->execute(); $row3 = $stmt3->fetchAll(\PDO::FETCH_ASSOC); + + $attendeename = ''; + $organizername = ''; + + // Group attendee properties by their objectid + $attendeeGroups = []; foreach ($row3 as $calendarobj1) { - if ( - $calendarobj1['parameter'] == 'CN' && - $calendarobj1['name'] == 'ATTENDEE' - ) { - $attendeename = $calendarobj1['value']; - } + // Get organizer name if ( $calendarobj1['parameter'] == 'CN' && $calendarobj1['name'] == 'ORGANIZER' ) { $organizername = $calendarobj1['value']; } + + // Group attendee properties by their objectid + if ($calendarobj1['name'] == 'ATTENDEE') { + $objectid = $calendarobj1['objectid']; + if (!isset($attendeeGroups[$objectid])) { + $attendeeGroups[$objectid] = []; + } + $attendeeGroups[$objectid][$calendarobj1['parameter']] = $calendarobj1['value']; + } + } + + // Find the attendee group that matches the sender email + foreach ($attendeeGroups as $group) { + // The attendee's email is stored with an empty parameter + if (isset($group['']) && $group[''] === 'mailto:' . $sender) { + // Use the CN parameter (display name) for this attendee + $attendeename = $group['CN'] ?? ''; + break; + } } $vObject = Reader::read($row2['calendardata']); -- GitLab From 62d28ee5694f9d49c260cfc7ccd8226f4c32ccfe Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Wed, 8 Oct 2025 18:44:30 +0530 Subject: [PATCH 2/4] Used vObject --- lib/Middleware/InvitationMiddleware.php | 46 ++++++++++++------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/Middleware/InvitationMiddleware.php b/lib/Middleware/InvitationMiddleware.php index b45f13e39..1f715118d 100644 --- a/lib/Middleware/InvitationMiddleware.php +++ b/lib/Middleware/InvitationMiddleware.php @@ -107,39 +107,32 @@ class InvitationMiddleware extends Middleware { $attendeename = ''; $organizername = ''; + $targetAttendeeEmail = 'mailto:' . $sender; - // Group attendee properties by their objectid - $attendeeGroups = []; + // Get organizer name foreach ($row3 as $calendarobj1) { - // Get organizer name if ( $calendarobj1['parameter'] == 'CN' && $calendarobj1['name'] == 'ORGANIZER' ) { $organizername = $calendarobj1['value']; - } - - // Group attendee properties by their objectid - if ($calendarobj1['name'] == 'ATTENDEE') { - $objectid = $calendarobj1['objectid']; - if (!isset($attendeeGroups[$objectid])) { - $attendeeGroups[$objectid] = []; - } - $attendeeGroups[$objectid][$calendarobj1['parameter']] = $calendarobj1['value']; + break; } } - // Find the attendee group that matches the sender email - foreach ($attendeeGroups as $group) { - // The attendee's email is stored with an empty parameter - if (isset($group['']) && $group[''] === 'mailto:' . $sender) { - // Use the CN parameter (display name) for this attendee - $attendeename = $group['CN'] ?? ''; - break; + // Parse calendar data to get attendee info reliably + // The VObject maintains the proper relationship between email and CN + $vObject = Reader::read($row2['calendardata']); + + // Find the attendee who responded + if (isset($vObject->VEVENT->ATTENDEE)) { + foreach ($vObject->VEVENT->ATTENDEE as $attendee) { + if ((string)$attendee === $targetAttendeeEmail) { + $attendeename = isset($attendee['CN']) ? (string)$attendee['CN'] : ''; + break; + } } } - - $vObject = Reader::read($row2['calendardata']); $SUMMARY = $vObject->VEVENT->SUMMARY; $datestart = (string)$vObject->VEVENT->DTSTART; if (str_contains($datestart, 'T')) { @@ -157,8 +150,15 @@ class InvitationMiddleware extends Middleware { } $userdata = $this->iusermanager->getByEmail($recipient); - $username = $userdata[0]->getUID(); - $userlang = $this->languageFactory->getUserLanguage($userdata[0]); + if (empty($userdata) || !isset($userdata[0])) { + // Log the error and continue with default language + $this->logger->warning('User not found for email: ' . $recipient); + $username = $recipient; // Fallback to email as username + $userlang = $this->l10n->getLanguageCode(); // Use default language + } else { + $username = $userdata[0]->getUID(); + $userlang = $this->languageFactory->getUserLanguage($userdata[0]); + } if ($methodName === 'tentative') { $meetingTitle = $this->l10n->t('Invitation Tentatively Accepted: %s', [$SUMMARY]); -- GitLab From fc98da115a2e508ac6f98493eb9f00ef98d22f58 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Thu, 9 Oct 2025 21:32:54 +0530 Subject: [PATCH 3/4] removed unused username --- lib/Middleware/InvitationMiddleware.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lib/Middleware/InvitationMiddleware.php b/lib/Middleware/InvitationMiddleware.php index 1f715118d..b3f465df8 100644 --- a/lib/Middleware/InvitationMiddleware.php +++ b/lib/Middleware/InvitationMiddleware.php @@ -149,17 +149,6 @@ class InvitationMiddleware extends Middleware { $organizername = $recipient; } - $userdata = $this->iusermanager->getByEmail($recipient); - if (empty($userdata) || !isset($userdata[0])) { - // Log the error and continue with default language - $this->logger->warning('User not found for email: ' . $recipient); - $username = $recipient; // Fallback to email as username - $userlang = $this->l10n->getLanguageCode(); // Use default language - } else { - $username = $userdata[0]->getUID(); - $userlang = $this->languageFactory->getUserLanguage($userdata[0]); - } - if ($methodName === 'tentative') { $meetingTitle = $this->l10n->t('Invitation Tentatively Accepted: %s', [$SUMMARY]); -- GitLab From 0e27fd1b9226d6b1c3764732ad69a4aff8ed98f5 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Thu, 9 Oct 2025 22:08:57 +0530 Subject: [PATCH 4/4] removed isset check --- lib/Middleware/InvitationMiddleware.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Middleware/InvitationMiddleware.php b/lib/Middleware/InvitationMiddleware.php index b3f465df8..0e8b300f2 100644 --- a/lib/Middleware/InvitationMiddleware.php +++ b/lib/Middleware/InvitationMiddleware.php @@ -128,7 +128,8 @@ class InvitationMiddleware extends Middleware { if (isset($vObject->VEVENT->ATTENDEE)) { foreach ($vObject->VEVENT->ATTENDEE as $attendee) { if ((string)$attendee === $targetAttendeeEmail) { - $attendeename = isset($attendee['CN']) ? (string)$attendee['CN'] : ''; + // CN is always set, so assign directly + $attendeename = (string)$attendee['CN']; break; } } -- GitLab