aboutsummaryrefslogtreecommitdiffstats
path: root/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php')
-rw-r--r--apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php133
1 files changed, 133 insertions, 0 deletions
diff --git a/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php
new file mode 100644
index 00000000000..f75e19689f1
--- /dev/null
+++ b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObjectsCollection.php
@@ -0,0 +1,133 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\DAV\CalDAV\Trashbin;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use Sabre\CalDAV\ICalendarObjectContainer;
+use Sabre\DAV\Exception\BadRequest;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Exception\NotImplemented;
+use Sabre\DAVACL\ACLTrait;
+use Sabre\DAVACL\IACL;
+use function array_map;
+use function implode;
+use function preg_match;
+
+class DeletedCalendarObjectsCollection implements ICalendarObjectContainer, IACL {
+ use ACLTrait;
+
+ public const NAME = 'objects';
+
+ public function __construct(
+ protected CalDavBackend $caldavBackend,
+ /** @var mixed[] */
+ private array $principalInfo,
+ ) {
+ }
+
+ /**
+ * @see \OCA\DAV\CalDAV\Trashbin\DeletedCalendarObjectsCollection::calendarQuery
+ */
+ public function getChildren() {
+ throw new NotImplemented();
+ }
+
+ public function getChild($name) {
+ if (!preg_match("/(\d+)\\.ics/", $name, $matches)) {
+ throw new NotFound();
+ }
+
+ $data = $this->caldavBackend->getCalendarObjectById(
+ $this->principalInfo['uri'],
+ (int)$matches[1],
+ );
+
+ // If the object hasn't been deleted yet then we don't want to find it here
+ if ($data === null) {
+ throw new NotFound();
+ }
+ if (!isset($data['deleted_at'])) {
+ throw new BadRequest('The calendar object you\'re trying to restore is not marked as deleted');
+ }
+
+ return new DeletedCalendarObject(
+ $this->getRelativeObjectPath($data),
+ $data,
+ $this->principalInfo['uri'],
+ $this->caldavBackend
+ );
+ }
+
+ public function createFile($name, $data = null) {
+ throw new Forbidden();
+ }
+
+ public function createDirectory($name) {
+ throw new Forbidden();
+ }
+
+ public function childExists($name) {
+ try {
+ $this->getChild($name);
+ } catch (NotFound $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function delete() {
+ throw new Forbidden();
+ }
+
+ public function getName(): string {
+ return self::NAME;
+ }
+
+ public function setName($name) {
+ throw new Forbidden();
+ }
+
+ public function getLastModified(): int {
+ return 0;
+ }
+
+ public function calendarQuery(array $filters) {
+ return array_map(function (array $calendarObjectInfo) {
+ return $this->getRelativeObjectPath($calendarObjectInfo);
+ }, $this->caldavBackend->getDeletedCalendarObjectsByPrincipal($this->principalInfo['uri']));
+ }
+
+ private function getRelativeObjectPath(array $calendarInfo): string {
+ return implode(
+ '.',
+ [$calendarInfo['id'], 'ics'],
+ );
+ }
+
+ public function getOwner() {
+ return $this->principalInfo['uri'];
+ }
+
+ public function getACL(): array {
+ return [
+ [
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ],
+ [
+ 'privilege' => '{DAV:}unbind',
+ 'principal' => '{DAV:}owner',
+ 'protected' => true,
+ ]
+ ];
+ }
+}