From fc8daf58ee7947b197b6eb93516aeec4443d481e Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Wed, 2 Jun 2021 10:35:46 +0200 Subject: [PATCH] Add missing ACLs for deleted calendar objects to fix deletion Due to a bug in Sabre it's necessary for calendar objects to implement ACLs. Otherwise the scheduling plugin will throw an error when it tries to fetch the owner of a calendar object that is being deleted. Ref https://github.com/sabre-io/dav/issues/1345 Signed-off-by: Christoph Wurst --- .../CalDAV/Trashbin/DeletedCalendarObject.php | 36 +++++++++++++++++-- .../DeletedCalendarObjectsCollection.php | 5 +-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php index c704f454e7..877ae82157 100644 --- a/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php +++ b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php @@ -29,8 +29,11 @@ use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CalDAV\IRestorable; use Sabre\CalDAV\ICalendarObject; use Sabre\DAV\Exception\Forbidden; +use Sabre\DAVACL\ACLTrait; +use Sabre\DAVACL\IACL; -class DeletedCalendarObject implements ICalendarObject, IRestorable { +class DeletedCalendarObject implements IACL, ICalendarObject, IRestorable { + use ACLTrait; /** @var string */ private $name; @@ -38,19 +41,29 @@ class DeletedCalendarObject implements ICalendarObject, IRestorable { /** @var mixed[] */ private $objectData; + /** @var string */ + private $principalUri; + /** @var CalDavBackend */ private $calDavBackend; public function __construct(string $name, array $objectData, + string $principalUri, CalDavBackend $calDavBackend) { $this->name = $name; $this->objectData = $objectData; $this->calDavBackend = $calDavBackend; + $this->principalUri = $principalUri; } public function delete() { - throw new Forbidden(); + $this->calDavBackend->deleteCalendarObject( + $this->objectData['calendarid'], + $this->objectData['uri'], + CalDavBackend::CALENDAR_TYPE_CALENDAR, + true + ); } public function getName() { @@ -101,4 +114,23 @@ class DeletedCalendarObject implements ICalendarObject, IRestorable { public function getCalendarUri(): string { return $this->objectData['calendaruri']; } + + public function getACL(): array { + return [ + [ + 'privilege' => '{DAV:}read', // For queries + 'principal' => $this->getOwner(), + 'protected' => true, + ], + [ + 'privilege' => '{DAV:}unbind', // For moving and deletion + 'principal' => '{DAV:}owner', + 'protected' => true, + ], + ]; + } + + public function getOwner() { + return $this->principalUri; + } } diff --git a/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php index 2d79db03bc..6b084d7c85 100644 --- a/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php +++ b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php @@ -78,6 +78,7 @@ class DeletedCalendarObjectsCollection implements ICalendarObjectContainer { return new DeletedCalendarObject( $this->getRelativeObjectPath($data), $data, + $this->principalInfo['uri'], $this->caldavBackend ); } @@ -117,8 +118,8 @@ class DeletedCalendarObjectsCollection implements ICalendarObjectContainer { } public function calendarQuery(array $filters) { - return array_map(function (array $calendarInfo) { - return $this->getRelativeObjectPath($calendarInfo); + return array_map(function (array $calendarObjectInfo) { + return $this->getRelativeObjectPath($calendarObjectInfo); }, $this->caldavBackend->getDeletedCalendarObjectsByPrincipal($this->principalInfo['uri'])); }