aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/dav/lib/CalDAV/Schedule/Plugin.php22
-rw-r--r--apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php2
2 files changed, 18 insertions, 6 deletions
diff --git a/apps/dav/lib/CalDAV/Schedule/Plugin.php b/apps/dav/lib/CalDAV/Schedule/Plugin.php
index 1e67741256c..993edf4f21d 100644
--- a/apps/dav/lib/CalDAV/Schedule/Plugin.php
+++ b/apps/dav/lib/CalDAV/Schedule/Plugin.php
@@ -167,7 +167,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);
@@ -419,12 +419,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);
@@ -691,6 +699,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.
*
diff --git a/apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php b/apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php
index 937a7c1a485..9b52c852946 100644
--- a/apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php
+++ b/apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php
@@ -372,7 +372,7 @@ class PluginTest extends TestCase {
'{DAV:}displayname' => $displayName,
]);
- $calendarHomeObject->expects($this->once())
+ $calendarHomeObject->expects($this->exactly($deleted ? 2 : 1))
->method('getCalDAVBackend')
->with()
->willReturn($calendarBackend);