Skip to content

Commit

Permalink
fix(caldav): Correctly handle calendar recreation for invitations whe…
Browse files Browse the repository at this point in the history
…n the current calendar is in the trashbin

Follow-up to #32361, see nextcloud/calendar#4098 for details

Signed-off-by: Thomas Citharel <[email protected]>
  • Loading branch information
tcitworld committed Feb 7, 2023
1 parent 6077003 commit 263542c
Showing 1 changed file with 29 additions and 8 deletions.
37 changes: 29 additions & 8 deletions apps/dav/lib/CalDAV/Schedule/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Component\VEvent;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\Document;
use Sabre\VObject\FreeBusyGenerator;
use Sabre\VObject\ITip;
use Sabre\VObject\Parameter;
Expand Down Expand Up @@ -329,12 +328,12 @@ public function propFindDefaultCalendarUrl(PropFind $propFind, INode $node) {

/** @var CalendarHome $calendarHome */
$calendarHome = $this->server->tree->getNodeForPath($calendarHomePath);
if (!$calendarHome->childExists($uri)) {
$currentCalendarDeleted = false;
if (!$calendarHome->childExists($uri) || $currentCalendarDeleted = $this->isCalendarDeleted($calendarHome, $uri)) {
// If the default calendar doesn't exist
if ($isResourceOrRoom) {
$calendarHome->getCalDAVBackend()->createCalendar($principalUrl, $uri, [
'{DAV:}displayname' => $displayName,
]);
// Resources or rooms can't be in the trashbin, so we're fine
$this->createCalendar($calendarHome, $principalUrl, $uri, $displayName);
} else {
// And we're not handling scheduling on resource/room booking
$userCalendars = [];
Expand All @@ -359,9 +358,16 @@ public function propFindDefaultCalendarUrl(PropFind $propFind, INode $node) {
$uri = $userCalendars[0]->getName();
} else {
// Otherwise if we have really nothing, create a new calendar
$calendarHome->getCalDAVBackend()->createCalendar($principalUrl, $uri, [
'{DAV:}displayname' => $displayName,
]);
if ($currentCalendarDeleted) {
// If the calendar exists but is deleted, we need to purge it first
// This may cause some issues in a non synchronous database setup
$calendar = $this->getCalendar($calendarHome, $uri);
if ($calendar instanceof Calendar) {
$calendar->disableTrashbin();
$calendar->delete();
}
}
$this->createCalendar($calendarHome, $principalUrl, $uri, $displayName);
}
}
}
Expand Down Expand Up @@ -609,4 +615,19 @@ private function stripOffMailTo(string $email): string {

return $email;
}

private function getCalendar(CalendarHome $calendarHome, $uri): INode {
return $calendarHome->getChild($uri);
}

private function isCalendarDeleted(CalendarHome $calendarHome, $uri): bool {
$calendar = $this->getCalendar($calendarHome, $uri);
return $calendar instanceof Calendar && $calendar->isDeleted();
}

private function createCalendar(CalendarHome $calendarHome, string $principalUri, string $uri, string $displayName): void {
$calendarHome->getCalDAVBackend()->createCalendar($principalUri, $uri, [
'{DAV:}displayname' => $displayName,
]);
}
}

0 comments on commit 263542c

Please sign in to comment.