summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2021-06-02 10:35:46 +0200
committerChristoph Wurst <christoph@winzerhof-wurst.at>2021-06-02 15:41:51 +0200
commitfc8daf58ee7947b197b6eb93516aeec4443d481e (patch)
tree70cd8803e19824077b21512c0ab2aa00b27ed5cf
parentd9a9714675eaeca689302eea8e432ff32ca2f048 (diff)
downloadnextcloud-server-fc8daf58ee7947b197b6eb93516aeec4443d481e.tar.gz
nextcloud-server-fc8daf58ee7947b197b6eb93516aeec4443d481e.zip
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 <christoph@winzerhof-wurst.at>
-rw-r--r--apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php36
-rw-r--r--apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php5
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 c704f454e7f..877ae82157d 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 2d79db03bce..6b084d7c857 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']));
}