diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index f05b9676b83d9..5c988782655ad 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -1541,7 +1541,7 @@ public function createCalendarObject($calendarId, $objectUri, $calendarData, $ca if ($found !== false) { // the object existed previously but has been deleted // remove the trashbin entry and continue as if it was a new object - $this->deleteCalendarObject($calendarId, $found['uri']); + $this->deleteCalendarObject($calendarId, $found['uri'], $calendarType, true); } $query = $this->db->getQueryBuilder(); diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index f9205d5d322a7..16e618d21aae3 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -295,6 +295,46 @@ public function testMultipleCalendarObjectsWithSameUID(): void { $this->backend->createCalendarObject($calendarId, $uri1, $calData); } + public function testCreateCalendarObjectWithSameUidAsObjectInTrashbin(): void { + $calendarId = $this->createTestCalendar(); + + $calData = <<<'EOD' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:ownCloud Calendar +BEGIN:VEVENT +CREATED;VALUE=DATE-TIME:20130910T125139Z +UID:47d15e3ec8 +LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z +DTSTAMP;VALUE=DATE-TIME:20130910T125139Z +SUMMARY:Test Event +DTSTART;VALUE=DATE-TIME:20130912T130000Z +DTEND;VALUE=DATE-TIME:20130912T140000Z +CLASS:PUBLIC +END:VEVENT +END:VCALENDAR +EOD; + + $uri = static::getUniqueID('event') . '.ics'; + $this->backend->createCalendarObject($calendarId, $uri, $calData); + + // Soft-delete the object so it is moved to the trashbin but keeps its UID + $this->backend->deleteCalendarObject($calendarId, $uri); + $trashbinUri = str_replace('.ics', '-deleted.ics', $uri); + $trashedObject = $this->backend->getCalendarObject($calendarId, $trashbinUri); + $this->assertNotNull($trashedObject); + + // Recreating an object with the same UID must purge the trashbin entry + // instead of violating the unique index on (calendarid, calendartype, uid) + $newUri = static::getUniqueID('event') . '.ics'; + $this->backend->createCalendarObject($calendarId, $newUri, $calData); + + $this->assertNull($this->backend->getCalendarObject($calendarId, $trashbinUri)); + $newObject = $this->backend->getCalendarObject($calendarId, $newUri); + $this->assertNotNull($newObject); + $this->assertEquals($calData, $newObject['calendardata']); + } + public function testMultiCalendarObjects(): void { $calendarId = $this->createTestCalendar();