diff --git a/lib/DAV/Calendar.php b/lib/DAV/Calendar.php index 6c97e8446..9edae7f03 100644 --- a/lib/DAV/Calendar.php +++ b/lib/DAV/Calendar.php @@ -28,6 +28,7 @@ use OCA\Deck\Db\Acl; use OCA\Deck\Db\Board; use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet; use Sabre\DAV\Exception\Forbidden; +use Sabre\DAV\Exception\NotFound; use Sabre\DAV\PropPatch; class Calendar extends ExternalCalendar { @@ -66,24 +67,9 @@ class Calendar extends ExternalCalendar { 'privilege' => '{DAV:}read', 'principal' => $this->getOwner(), 'protected' => true, - ], - [ - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner() . '/calendar-proxy-write', - 'protected' => true, - ], - [ - 'privilege' => '{DAV:}read', - 'principal' => $this->getOwner() . '/calendar-proxy-read', - 'protected' => true, - ], + ] ]; - if ($this->backend->checkBoardPermission($this->board->getId(), Acl::PERMISSION_EDIT)) { - $acl[] = [ - 'privilege' => '{DAV:}write', - 'principal' => $this->getOwner(), - 'protected' => true, - ]; + if ($this->backend->checkBoardPermission($this->board->getId(), Acl::PERMISSION_MANAGE)) { $acl[] = [ 'privilege' => '{DAV:}write-properties', 'principal' => $this->getOwner(), @@ -109,7 +95,7 @@ class Calendar extends ExternalCalendar { } public function createFile($name, $data = null) { - throw new \Sabre\DAV\Exception\Forbidden('Creating a new entry is not implemented'); + throw new Forbidden('Creating a new entry is not implemented'); } public function getChild($name) { @@ -121,9 +107,10 @@ class Calendar extends ExternalCalendar { } )); if (count($card) > 0) { - return new CalendarObject($this, $name, $card[0], $this->backend); + return new CalendarObject($this, $name, $this->backend, $card[0]); } } + throw new NotFound('Node not found'); } public function getChildren() { @@ -151,7 +138,7 @@ class Calendar extends ExternalCalendar { public function delete() { - return null; + throw new Forbidden('Deleting an entry is not implemented'); } public function getLastModified() { @@ -171,7 +158,7 @@ class Calendar extends ExternalCalendar { foreach ($properties as $key => $value) { switch ($key) { case '{DAV:}displayname': - if (mb_substr($value, 0, strlen('Deck: '))) { + if (mb_strpos($value, 'Deck: ') === 0) { $value = mb_substr($value, strlen('Deck: ')); } $this->board->setTitle($value); diff --git a/lib/DAV/CalendarObject.php b/lib/DAV/CalendarObject.php index 2a4d3e041..53b55731e 100644 --- a/lib/DAV/CalendarObject.php +++ b/lib/DAV/CalendarObject.php @@ -42,7 +42,7 @@ class CalendarObject implements ICalendarObject, IACL { /** @var VCalendar */ private $calendarObject; - public function __construct(Calendar $calendar, string $name, $sourceItem = null, DeckCalendarBackend $backend) { + public function __construct(Calendar $calendar, string $name, DeckCalendarBackend $backend, $sourceItem) { $this->calendar = $calendar; $this->name = $name; $this->sourceItem = $sourceItem; diff --git a/lib/DAV/CalendarPlugin.php b/lib/DAV/CalendarPlugin.php index e0f614995..7e24fc1f3 100644 --- a/lib/DAV/CalendarPlugin.php +++ b/lib/DAV/CalendarPlugin.php @@ -26,6 +26,7 @@ namespace OCA\Deck\DAV; use OCA\DAV\CalDAV\Integration\ExternalCalendar; use OCA\DAV\CalDAV\Integration\ICalendarProvider; use OCA\Deck\Db\Board; +use Sabre\DAV\Exception\NotFound; class CalendarPlugin implements ICalendarProvider { @@ -55,10 +56,13 @@ class CalendarPlugin implements ICalendarProvider { public function getCalendarInCalendarHome(string $principalUri, string $calendarUri): ?ExternalCalendar { if ($this->hasCalendarInCalendarHome($principalUri, $calendarUri)) { - $board = $this->backend->getBoard((int)str_replace('board-', '', $calendarUri)); - return new Calendar($principalUri, $calendarUri, $board, $this->backend); + try { + $board = $this->backend->getBoard((int)str_replace('board-', '', $calendarUri)); + return new Calendar($principalUri, $calendarUri, $board, $this->backend); + } catch (NotFound $e) { + // We can just return null if we have no matching board + } } - return null; } } diff --git a/lib/DAV/DeckCalendarBackend.php b/lib/DAV/DeckCalendarBackend.php index 2e001cc08..6d3ca0239 100644 --- a/lib/DAV/DeckCalendarBackend.php +++ b/lib/DAV/DeckCalendarBackend.php @@ -32,6 +32,7 @@ use OCA\Deck\Service\BoardService; use OCA\Deck\Service\CardService; use OCA\Deck\Service\PermissionService; use OCA\Deck\Service\StackService; +use Sabre\DAV\Exception\NotFound; class DeckCalendarBackend { @@ -62,7 +63,11 @@ class DeckCalendarBackend { } public function getBoard(int $id): Board { - return $this->boardService->find($id); + try { + return $this->boardService->find($id); + } catch (\Exception $e) { + throw new NotFound('Board with id ' . $id . ' not found'); + } } public function checkBoardPermission(int $id, int $permission): bool { diff --git a/lib/Db/Card.php b/lib/Db/Card.php index 1bb927d41..bef664fc6 100644 --- a/lib/Db/Card.php +++ b/lib/Db/Card.php @@ -144,14 +144,9 @@ class Card extends RelationalEntity { return $label->getTitle(); }, $this->getLabels()); } - foreach ($this->getAssignedUsers() as $user) { - $participant = $user->resolveParticipant(); - // FIXME use proper uri - $event->add('ATTENDEE', 'https://localhost/remote.php/dav/principals/users/:' . $participant->getUID(), [ 'CN' => $participant->getDisplayName()]); - } - $event->SUMMARY = $this->getTitle(); + $event->DESCRIPTION = $this->getDescription(); $calendar->add($event); return $calendar; } diff --git a/lib/Db/Stack.php b/lib/Db/Stack.php index 1cc679240..9790e6b7c 100644 --- a/lib/Db/Stack.php +++ b/lib/Db/Stack.php @@ -57,7 +57,7 @@ class Stack extends RelationalEntity { $calendar = new VCalendar(); $event = $calendar->createComponent('VTODO'); $event->UID = 'deck-stack-' . $this->getId(); - $event->SUMMARY = '[Stack]: ' . $this->getTitle(); + $event->SUMMARY = 'List : ' . $this->getTitle(); $calendar->add($event); return $calendar; } diff --git a/lib/Service/BoardService.php b/lib/Service/BoardService.php index df7ee1c4c..1d67c9514 100644 --- a/lib/Service/BoardService.php +++ b/lib/Service/BoardService.php @@ -348,7 +348,7 @@ class BoardService { throw new BadRequestException('board id must be a number'); } - $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_READ); + $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); $board = $this->find($id); if ($board->getDeletedAt() > 0) { throw new BadRequestException('This board has already been deleted'); @@ -377,7 +377,7 @@ class BoardService { throw new BadRequestException('board id must be a number'); } - $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_READ); + $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); $board = $this->find($id); $board->setDeletedAt(0); $board = $this->boardMapper->update($board); @@ -404,7 +404,7 @@ class BoardService { throw new BadRequestException('id must be a number'); } - $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_READ); + $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); $board = $this->find($id); $delete = $this->boardMapper->delete($board);