From aebcc3126adf91e5666b76abc8e4b72a061e3243 Mon Sep 17 00:00:00 2001 From: Anna Larch Date: Mon, 31 Oct 2022 11:16:45 +0100 Subject: [PATCH] Move iMIP to it's own interface and clean up the code a bit. Added: - author Removed: - unused imports Changed: - moved iMIP handling to new interface - pointed code to new implementation Signed-off-by: Anna Larch --- apps/dav/lib/CalDAV/CalendarImpl.php | 15 +++---- lib/private/Calendar/Manager.php | 6 ++- lib/public/Calendar/ICreateFromString.php | 7 ---- lib/public/Calendar/IHandleImipMessage.php | 48 ++++++++++++++++++++++ 4 files changed, 58 insertions(+), 18 deletions(-) create mode 100644 lib/public/Calendar/IHandleImipMessage.php diff --git a/apps/dav/lib/CalDAV/CalendarImpl.php b/apps/dav/lib/CalDAV/CalendarImpl.php index 53cde5a7b75e9..79a5626f322c1 100644 --- a/apps/dav/lib/CalDAV/CalendarImpl.php +++ b/apps/dav/lib/CalDAV/CalendarImpl.php @@ -8,6 +8,7 @@ * @author Christoph Wurst * @author Georg Ehrke * @author Roeland Jago Douma + * @author Anna Larch * * @license GNU AGPL version 3 or any later version * @@ -29,22 +30,18 @@ use OCA\DAV\CalDAV\Auth\CustomPrincipalPlugin; use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer; -use OCP\AppFramework\Utility\ITimeFactory; use OCP\Calendar\Exceptions\CalendarException; use OCP\Calendar\ICreateFromString; +use OCP\Calendar\IHandleImipMessage; use OCP\Constants; -use OCP\Security\ISecureRandom; -use Psr\Log\LoggerInterface; use Sabre\DAV\Exception\Conflict; use Sabre\VObject\Component\VCalendar; use Sabre\VObject\Component\VEvent; -use Sabre\VObject\Document; use Sabre\VObject\ITip\Message; -use Sabre\VObject\Property\VCard\DateTime; use Sabre\VObject\Reader; use function Sabre\Uri\split as uriSplit; -class CalendarImpl implements ICreateFromString { +class CalendarImpl implements ICreateFromString, IHandleImipMessage { private CalDavBackend $backend; private Calendar $calendar; @@ -214,20 +211,20 @@ public function handleIMipMessage(string $name, string $calendarData): void { if(!isset($vEvent->{'ORGANIZER'}) || !isset($vEvent->{'ATTENDEE'})) { throw new CalendarException('Could not process scheduling data, neccessary data missing from ICAL'); } - $orgaizer = $vEvent->{'ORGANIZER'}->getValue(); + $organizer = $vEvent->{'ORGANIZER'}->getValue(); $attendee = $vEvent->{'ATTENDEE'}->getValue(); $iTipMessage->method = $vObject->{'METHOD'}->getValue(); if($iTipMessage->method === 'REPLY') { if ($server->isExternalAttendee($vEvent->{'ATTENDEE'}->getValue())) { - $iTipMessage->recipient = $orgaizer; + $iTipMessage->recipient = $organizer; } else { $iTipMessage->recipient = $attendee; } $iTipMessage->sender = $attendee; } else if($iTipMessage->method === 'CANCEL') { $iTipMessage->recipient = $attendee; - $iTipMessage->sender = $orgaizer; + $iTipMessage->sender = $organizer; } $iTipMessage->uid = isset($vEvent->{'UID'}) ? $vEvent->{'UID'}->getValue() : ''; $iTipMessage->component = 'VEVENT'; diff --git a/lib/private/Calendar/Manager.php b/lib/private/Calendar/Manager.php index 550ba36dd6bc3..e85c2d2e37717 100644 --- a/lib/private/Calendar/Manager.php +++ b/lib/private/Calendar/Manager.php @@ -7,6 +7,7 @@ * * @author Christoph Wurst * @author Georg Ehrke + * @author Anna Larch * * @license GNU AGPL version 3 or any later version * @@ -33,6 +34,7 @@ use OCP\Calendar\ICalendarProvider; use OCP\Calendar\ICalendarQuery; use OCP\Calendar\ICreateFromString; +use OCP\Calendar\IHandleImipMessage; use OCP\Calendar\IManager; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; @@ -280,7 +282,7 @@ public function handleIMipReply(string $principalUri, string $sender, string $re // Drawback: attendees that have been deleted will still be able to update their partstat foreach ($calendars as $calendar) { // We should not search in writable calendars - if ($calendar instanceof ICreateFromString) { + if ($calendar instanceof IHandleImipMessage) { $o = $calendar->search($sender, ['ATTENDEE'], ['uid' => $vEvent->{'UID'}->getValue()]); if (!empty($o)) { $found = $calendar; @@ -358,7 +360,7 @@ public function handleIMipCancel(string $principalUri, string $sender, ?string $ // Drawback: attendees that have been deleted will still be able to update their partstat foreach ($calendars as $calendar) { // We should not search in writable calendars - if ($calendar instanceof ICreateFromString) { + if ($calendar instanceof IHandleImipMessage) { $o = $calendar->search($recipient, ['ATTENDEE'], ['uid' => $vEvent->{'UID'}->getValue()]); if (!empty($o)) { $found = $calendar; diff --git a/lib/public/Calendar/ICreateFromString.php b/lib/public/Calendar/ICreateFromString.php index 8c4bdd4404133..17d529cdef3f3 100644 --- a/lib/public/Calendar/ICreateFromString.php +++ b/lib/public/Calendar/ICreateFromString.php @@ -40,11 +40,4 @@ interface ICreateFromString extends ICalendar { * @throws CalendarException */ public function createFromString(string $name, string $calendarData): void; - - /** - * @since 25.0.0 - * - * @throws CalendarException - */ - public function handleIMipMessage(string $name, string $calendarData): void; } diff --git a/lib/public/Calendar/IHandleImipMessage.php b/lib/public/Calendar/IHandleImipMessage.php new file mode 100644 index 0000000000000..58c1400d987ee --- /dev/null +++ b/lib/public/Calendar/IHandleImipMessage.php @@ -0,0 +1,48 @@ + + * + * @author Anna Larch + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace OCP\Calendar; + +use OCP\Calendar\Exceptions\CalendarException; + +/** + * Extends the current ICalendar interface + * to add a public write method to handle + * iMIP data + * + * @link https://www.rfc-editor.org/rfc/rfc6047 + * + * @since 26.0.0 + */ +interface IHandleImipMessage extends ICalendar { + + /** + * Handle an iMIP VEvent for validation and processing + * + * @since 26.0.0 + * + * @throws CalendarException on validation failure or calendar write error + */ + public function handleIMipMessage(string $name, string $calendarData): void; +}