@ -138,7 +138,7 @@ class Plugin extends \Sabre\CalDAV\Schedule\Plugin {
if ($result === null) {
$result = [];
}
// iterate through items and html decode values
foreach ($result as $key => $value) {
$result[$key] = urldecode($value);
@ -197,12 +197,12 @@ class Plugin extends \Sabre\CalDAV\Schedule\Plugin {
}
// process request
$this->processICalendarChange($currentObject, $vCal, $addresses, [], $modified);
if ($currentObject) {
// Destroy circular references so PHP will GC the object.
$currentObject->destroy();
}
} catch (SameOrganizerForAllComponentsException $e) {
$this->handleSameOrganizerException($e, $vCal, $calendarPath);
}
@ -430,12 +430,20 @@ EOF;
} else {
// Otherwise if we have really nothing, create a new calendar
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
// If the calendar exists but is in the trash bin, we try to rename its uri
// so that we can create the new one and still restore the previous one
// otherwise we just purge the calendar by removing it before recreating it
$calendar = $this->getCalendar($calendarHome, $uri);
if ($calendar instanceof Calendar) {
$calendar->disableTrashbin();
$calendar->delete();
$backend = $calendarHome->getCalDAVBackend();
if ($backend instanceof CalDavBackend) {
// If the CalDAV backend supports moving calendars
$this->moveCalendar($backend, $principalUrl, $uri, $uri . '-back-' . time());
} else {
// Otherwise just purge the calendar
$calendar->disableTrashbin();
$calendar->delete();
}
}
}
$this->createCalendar($calendarHome, $principalUrl, $uri, $displayName);
@ -572,7 +580,7 @@ EOF;
$homePath = $result[0][200]['{' . self::NS_CALDAV . '}calendar-home-set']->getHref();
/** @var Calendar $node */
foreach ($this->server->tree->getNodeForPath($homePath)->getChildren() as $node) {
if (!$node instanceof ICalendar) {
continue;
}
@ -704,6 +712,10 @@ EOF;
]);
}
private function moveCalendar(CalDavBackend $calDavBackend, string $principalUri, string $oldUri, string $newUri): void {
$calDavBackend->moveCalendar($oldUri, $principalUri, $principalUri, $newUri);
}
/**
* Try to handle the given exception gracefully or throw it if necessary.
*