From fe31373a93b99a1ee61584f7394c7a912ca04e90 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 31 May 2021 10:47:07 +0200 Subject: [PATCH] Expose deletion timestamp for deleted CalDAV objects Signed-off-by: Christoph Wurst --- .../CalDAV/Trashbin/DeletedCalendarObject.php | 4 ++++ apps/dav/lib/CalDAV/Trashbin/Plugin.php | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php index 43d96b52ef..0517125ef4 100644 --- a/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php +++ b/apps/dav/lib/CalDAV/Trashbin/DeletedCalendarObject.php @@ -93,4 +93,8 @@ class DeletedCalendarObject implements ICalendarObject, IRestorable { public function restore(): void { $this->calDavBackend->restoreCalendarObject($this->objectData); } + + public function getDeletedAt(): ?int { + return $this->objectData['deleted_at'] ? (int) $this->objectData['deleted_at'] : null; + } } diff --git a/apps/dav/lib/CalDAV/Trashbin/Plugin.php b/apps/dav/lib/CalDAV/Trashbin/Plugin.php index d42a09f1c0..7fd127479c 100644 --- a/apps/dav/lib/CalDAV/Trashbin/Plugin.php +++ b/apps/dav/lib/CalDAV/Trashbin/Plugin.php @@ -25,9 +25,12 @@ declare(strict_types=1); namespace OCA\DAV\CalDAV\Trashbin; +use Closure; use OCA\DAV\CalDAV\Calendar; use OCP\IRequest; use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\INode; +use Sabre\DAV\PropFind; use Sabre\DAV\Server; use Sabre\DAV\ServerPlugin; use Sabre\HTTP\RequestInterface; @@ -35,10 +38,8 @@ use Sabre\HTTP\ResponseInterface; use function array_slice; use function implode; -/** - * Conditional logic to bypass the calendar trashbin - */ class Plugin extends ServerPlugin { + public const PROPERTY_DELETED_AT = '{http://nextcloud.com/ns}deleted-at'; /** @var bool */ private $disableTrashbin; @@ -53,6 +54,7 @@ class Plugin extends ServerPlugin { public function initialize(Server $server): void { $this->server = $server; $server->on('beforeMethod:*', [$this, 'beforeMethod']); + $server->on('propFind', Closure::fromCallable([$this, 'propFind'])); } public function beforeMethod(RequestInterface $request, ResponseInterface $response): void { @@ -86,6 +88,16 @@ class Plugin extends ServerPlugin { } } + private function propFind( + PropFind $propFind, + INode $node): void { + if ($node instanceof DeletedCalendarObject) { + $propFind->handle(self::PROPERTY_DELETED_AT, function () use ($node) { + return $node->getDeletedAt(); + }); + } + } + public function getFeatures(): array { return ['nc-calendar-trashbin']; }