diff --git a/lib/Middleware/InvitationMiddleware.php b/lib/Middleware/InvitationMiddleware.php index 3730a53071f48dcfda00e6fee760c1a3c78519a9..ed8354292436c43fbe0463bdff7d31db42410ccc 100644 --- a/lib/Middleware/InvitationMiddleware.php +++ b/lib/Middleware/InvitationMiddleware.php @@ -24,6 +24,26 @@ class InvitationMiddleware extends Middleware private $request; /** @var IManager */ private $calendarManager; + private const translations = [ + "tentative" => [ + "meeting_title" => "Invitation Tentatively Accepted: %s", + "meeting_body" => + "%s has tentatively accepted your invitation to %s on %s", + "meeting_head" => "Tentatively Accepted", + ], + "accept" => [ + "meeting_title" => "Invitation Tentatively Accepted: %s", + "meeting_body" => + "%s has tentatively accepted your invitation to %s on %s", + "meeting_head" => "Accepted", + ], + "decline" => [ + "meeting_title" => "Invitation Tentatively Accepted: %s", + "meeting_body" => + "%s has tentatively accepted your invitation to %s on %s", + "meeting_head" => "Declined", + ], + ]; public function __construct( IRequest $request, @@ -48,7 +68,31 @@ class InvitationMiddleware extends Middleware $this->iusermanager = $iusermanager; $this->languageFactory = $languageFactory; } - + private function getMailAttributes( + string $methodName, + array $translationData + ) { + $meetingTitle = $this->l10n->t( + self::translations[$methodName]["meeting_title"], + $translationData["summary"] + ); + $meetingBody = $this->l10n->t( + self::translations[$methodName]["meeting_body"], + [ + $translationData["attendee_name"], + $translationData["summary"], + $translationData["event_date"], + ] + ); + $meetingHead = $this->l10n->t( + self::translations[$methodName]["meeting_head"] + ); + return [ + "meeting_title" => $meetingTitle, + "meeting_body" => $meetingBody, + "meeting_head" => $meetingHead, + ]; + } public function afterController( $controller, $methodName, @@ -63,168 +107,125 @@ class InvitationMiddleware extends Middleware $response->getTemplateName() == "schedule-response-success") ) { $token = $this->request->getParam("token"); - $query = $this->db->getQueryBuilder(); - $query - ->select("*") + $queryCalendarInvitations = $this->db->getQueryBuilder(); + $queryCalendarInvitations + ->select("id", "uid", "attendee", "organizer") ->from("calendar_invitations") ->where( - $query + $queryCalendarInvitations ->expr() - ->eq("token", $query->createNamedParameter($token)) + ->eq( + "token", + $queryCalendarInvitations->createNamedParameter( + $token + ) + ) ); - $stmt = $query->execute(); + $stmt = $queryCalendarInvitations->execute(); $row = $stmt->fetch(\PDO::FETCH_ASSOC); $uid = $row["uid"]; $sender = substr($row["attendee"], 7); $recipient = substr($row["organizer"], 7); - - $query2 = $this->db->getQueryBuilder(); - $query2 - ->select("*") - ->from("calendarobjects") - ->where( - $query - ->expr() - ->eq("uid", $query2->createNamedParameter($uid)) - ); - $stmt2 = $query2->execute(); - $row2 = $stmt2->fetch(\PDO::FETCH_ASSOC); - $calendarobjectid = $row2["id"]; - - $query3 = $this->db->getQueryBuilder(); - $query3 - ->select("*") - ->from("calendarobjects_props") - ->where( - $query3 - ->expr() - ->eq( - "objectid", - $query3->createNamedParameter($calendarobjectid) - ) - ); - $stmt3 = $query3->execute(); - $row3 = $stmt3->fetchAll(\PDO::FETCH_ASSOC); - foreach ($row3 as $calendarobj1) { - if ( - $calendarobj1["parameter"] == "CN" && - $calendarobj1["name"] == "ATTENDEE" - ) { - $attendeename = $calendarobj1["value"]; - } - if ( - $calendarobj1["parameter"] == "CN" && - $calendarobj1["name"] == "ORGANIZER" - ) { - $organizername = $calendarobj1["value"]; - } - } - - $vObject = Reader::read($row2["calendardata"]); - $SUMMARY = $vObject->VEVENT->SUMMARY; - $datestart = (string) $vObject->VEVENT->DTSTART; - if (str_contains($datestart, "T")) { - $eventdate = date("F d, Y h:i", strtotime($datestart)); - } else { - $eventdate = date("F d, Y", strtotime($datestart)); - } - - if ($attendeename == "") { - $attendeename = $sender; - } - - if ($organizername == "") { - $organizername = $recipient; - } - $userdata = $this->iusermanager->getByEmail($recipient); - $username = $userdata[0]->getUID(); - $userlang = $this->languageFactory->getUserLanguage($userdata[0]); - - if ($methodName === "tentative") { - $meetingTitle = $this->l10n->t("Invitation Tentatively Accepted: %s", [$SUMMARY] ); - - $data = [ - "attendee_name" => (string) $sender ?: $defaultVal, - "invitee_name" => (string) $recipient ?: $defaultVal, - "meeting_title" => (string) $meetingTitle ?: $defaultVal, - ]; - $method = "reply"; - $emailTemplate = $this->mailer->createEMailTemplate( - "dav.calendarInvite." . $method, - $data - ); - $emailTemplate->setSubject($this->l10n->t("Invitation Tentatively Accepted: %s",[$SUMMARY])); - $emailTemplate->addHeader(); - $emailTemplate->addHeading( - $this->l10n->t("Tentatively Accepted") - ); - $mailbodytext = $this->l10n->t( - "%s has tentatively accepted your invitation to %s on %s", - [$attendeename, $SUMMARY, $eventdate] - ); - } - - if ($methodName === "accept") { - $meetingTitle = $this->l10n->t("Invitation Accepted: %s", [$SUMMARY]); - $data = [ - "attendee_name" => (string) $sender ?: $defaultVal, - "invitee_name" => (string) $recipient ?: $defaultVal, - "meeting_title" => (string) $meetingTitle ?: $defaultVal, - ]; - $method = "reply"; - $emailTemplate = $this->mailer->createEMailTemplate( - $recipient, - $data - ); - $emailTemplate->setSubject($this->l10n->t("Invitation Accepted: %s", [$SUMMARY])); - $emailTemplate->addHeader(); - $emailTemplate->addHeading($this->l10n->t("Accepted")); - $mailbodytext = $this->l10n->t( - "%s has accepted your invitation to %s on %s", - [$attendeename, $SUMMARY, $eventdate] - ); - } - - if ($methodName === "decline") { - $meetingTitle = $this->l10n->t("Invitation Declined: %s", [$SUMMARY]); - $data = [ - "attendee_name" => (string) $sender ?: $defaultVal, - "invitee_name" => (string) $recipient ?: $defaultVal, - "meeting_title" => (string) $meetingTitle ?: $defaultVal, - ]; - $method = "reply"; - $emailTemplate = $this->mailer->createEMailTemplate( - "dav.calendarInvite." . $method, - $data - ); - $emailTemplate->setSubject($this->l10n->t("Invitation Declined: %s", [$SUMMARY])); - $emailTemplate->addHeader(); - $emailTemplate->addHeading($this->l10n->t("Declined")); - $mailbodytext = $this->l10n->t( - "%s has declined your invitation to %s on %s", - [$attendeename, $SUMMARY, $eventdate] - ); - } - - $emailTemplate->addBodyText( - htmlspecialchars($mailbodytext), - $mailbodytext - ); - $emailTemplate->addFooter(); - try { - $message = $this->mailer->createMessage(); - $message->setTo([$recipient => $organizername]); - $message->setReplyTo([$sender => $attendeename]); - $message->useTemplate($emailTemplate); - $this->mailer->send($message); - } catch (\Exception $e) { - // Log the exception and continue - $this->logger->logException($e); + if (count($userdata) > 0) { + $username = $userdata[0]->getUID(); + $principaluri = "principals/users/" . $username; + $queryCalendarObjects = $this->db->getQueryBuilder(); + $queryCalendarObjects + ->select("co.id", "co.calendardata") + ->from("calendarobjects", "co") + ->innerJoin( + "co", + "calendars", + "c", + $queryCalendarObjects + ->expr() + ->eq("co.calendarid", "c.id") + ) + ->where( + $queryCalendarObjects + ->expr() + ->eq( + "c.principaluri", + $queryCalendarObjects->createNamedParameter( + $principaluri + ) + ) + ) + ->andWhere( + $queryCalendarObjects + ->expr() + ->eq( + "co.uid", + $queryCalendarObjects->createNamedParameter( + $uid + ) + ) + ); + $stmt2 = $queryCalendarObjects->execute(); + if ($row2 = $stmt2->fetch(\PDO::FETCH_ASSOC)) { + $vObject = Reader::read($row2["calendardata"]); + $SUMMARY = $vObject->VEVENT->SUMMARY; + $datestart = (string) $vObject->VEVENT->DTSTART; + $attendeeName = empty($vObject->VEVENT->ATTENDEE["CN"]) + ? $sender + : $vObject->VEVENT->ATTENDEE["CN"]; + $organizername = empty($vObject->VEVENT->ORGANIZER["CN"]) + ? $recipient + : $vObject->VEVENT->ORGANIZER["CN"]; + if (str_contains($datestart, "T")) { + $eventdate = date("F d, Y h:i", strtotime($datestart)); + } else { + $eventdate = date("F d, Y", strtotime($datestart)); + } + $translationData = [ + "summary" => $SUMMARY, + "attendee_name" => $attendeeName, + "event_date" => $eventdate, + ]; + $translations = $this->getMailAttributes( + $methodName, + $translationData + ); + + $data = [ + "attendee_name" => (string) $sender ?: $defaultVal, + "invitee_name" => (string) $recipient ?: $defaultVal, + "meeting_title" => + (string) $translations["meeting_title"] ?: + $defaultVal, + ]; + $method = "reply"; + $emailTemplate = $this->mailer->createEMailTemplate( + "dav.calendarInvite." . $method, + $data + ); + $emailTemplate->setSubject( + $this->l10n->t($translations["meeting_title"], [ + $SUMMARY, + ]) + ); + $emailTemplate->addHeader(); + $emailTemplate->addHeading($translations["meeting_head"]); + $emailTemplate->addBodyText( + htmlspecialchars($translations["meeting_body"]), + $mailbodytext + ); + $emailTemplate->addFooter(); + try { + $message = $this->mailer->createMessage(); + $message->setTo([$recipient => $organizername]); + $message->setReplyTo([$sender => $attendeename]); + $message->useTemplate($emailTemplate); + $this->mailer->send($message); + } catch (\Exception $e) { + // Log the exception and continue + $this->logger->logException($e); + } + } } } - return $response; } }