disableTrashbin = $request->getHeader('X-NC-CalDAV-No-Trashbin') === '1'; } 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 { if (!$this->disableTrashbin) { return; } $path = $request->getPath(); $pathParts = explode('/', ltrim($path, '/')); if (\count($pathParts) < 3) { // We are looking for a path like calendars/username/calendarname return; } // $calendarPath will look like calendars/username/calendarname $calendarPath = implode( '/', array_slice($pathParts, 0, 3) ); try { $calendar = $this->server->tree->getNodeForPath($calendarPath); if (!($calendar instanceof Calendar)) { // This is odd return; } /** @var Calendar $calendar */ $calendar->disableTrashbin(); } catch (NotFound $ex) { return; } } private function propFind( PropFind $propFind, INode $node): void { if ($node instanceof DeletedCalendarObject) { $propFind->handle(self::PROPERTY_DELETED_AT, function () use ($node) { $ts = $node->getDeletedAt(); if ($ts === null) { return null; } return (new DateTimeImmutable()) ->setTimestamp($ts) ->format(DateTimeInterface::ATOM); }); $propFind->handle(self::PROPERTY_CALENDAR_URI, function () use ($node) { return $node->getCalendarUri(); }); } if ($node instanceof TrashbinHome) { $propFind->handle(self::PROPERTY_RETENTION_DURATION, function () use ($node) { return $this->retentionService->getDuration(); }); } } public function getFeatures(): array { return ['nc-calendar-trashbin']; } public function getPluginName(): string { return 'nc-calendar-trashbin'; } }