diff options
author | Lukas Reschke <lukas@statuscode.ch> | 2017-11-07 21:55:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-07 21:55:09 +0100 |
commit | b754a2e385cd328220c80cbfabcb9fde8566f6ee (patch) | |
tree | 79fadca29f54abaf39692c063375f8ff012608ec | |
parent | 0913bc2157293acafa186afec4018ad25d7fbb22 (diff) | |
parent | 4df08f296b6242f9df7b1fc729801b7bd221be25 (diff) | |
download | nextcloud-server-b754a2e385cd328220c80cbfabcb9fde8566f6ee.tar.gz nextcloud-server-b754a2e385cd328220c80cbfabcb9fde8566f6ee.zip |
Merge pull request #7042 from nextcloud/bugfix/noid/ensure_unique_uid_for_calendar_objects
ensure uid for calendar objects is unique
-rw-r--r-- | apps/dav/lib/CalDAV/CalDavBackend.php | 14 | ||||
-rw-r--r-- | apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php | 4 | ||||
-rw-r--r-- | apps/dav/tests/unit/CalDAV/CalDavBackendTest.php | 105 |
3 files changed, 115 insertions, 8 deletions
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 8d22a8bb346..9505a00ea55 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -961,6 +961,20 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription function createCalendarObject($calendarId, $objectUri, $calendarData) { $extraData = $this->getDenormalizedData($calendarData); + $q = $this->db->getQueryBuilder(); + $q->select($q->createFunction('COUNT(*)')) + ->from('calendarobjects') + ->where($q->expr()->eq('calendarid', $q->createNamedParameter($calendarId))) + ->andWhere($q->expr()->eq('uid', $q->createNamedParameter($extraData['uid']))); + + $result = $q->execute(); + $count = (int) $result->fetchColumn(); + $result->closeCursor(); + + if ($count !== 0) { + throw new \Sabre\DAV\Exception\BadRequest('Calendar object with uid already exists in this calendar collection.'); + } + $query = $this->db->getQueryBuilder(); $query->insert('calendarobjects') ->values([ diff --git a/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php index 71b1de09ed2..90bf860b24d 100644 --- a/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php +++ b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php @@ -140,13 +140,15 @@ abstract class AbstractCalDavBackend extends TestCase { protected function createEvent($calendarId, $start = '20130912T130000Z', $end = '20130912T140000Z') { + $randomPart = self::getUniqueID(); + $calData = <<<EOD BEGIN:VCALENDAR VERSION:2.0 PRODID:ownCloud Calendar BEGIN:VEVENT CREATED;VALUE=DATE-TIME:20130910T125139Z -UID:47d15e3ec8 +UID:47d15e3ec8-$randomPart LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z DTSTAMP;VALUE=DATE-TIME:20130910T125139Z SUMMARY:Test Event diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index a60b586e233..fae2156a6b4 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -275,18 +275,66 @@ EOD; $this->assertCount(0, $calendarObjects); } + /** + * @expectedException \Sabre\DAV\Exception\BadRequest + * @expectedExceptionMessage Calendar object with uid already exists in this calendar collection. + */ + public function testMultipleCalendarObjectsWithSameUID() { + $calendarId = $this->createTestCalendar(); + + $calData = <<<'EOD' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:ownCloud Calendar +BEGIN:VEVENT +CREATED;VALUE=DATE-TIME:20130910T125139Z +UID:47d15e3ec8-1 +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; + + $uri0 = static::getUniqueID('event'); + $uri1 = static::getUniqueID('event'); + $this->backend->createCalendarObject($calendarId, $uri0, $calData); + $this->backend->createCalendarObject($calendarId, $uri1, $calData); + } + public function testMultiCalendarObjects() { $calendarId = $this->createTestCalendar(); // create an event - $calData = <<<'EOD' + $calData = []; + $calData[] = <<<'EOD' BEGIN:VCALENDAR VERSION:2.0 PRODID:ownCloud Calendar BEGIN:VEVENT CREATED;VALUE=DATE-TIME:20130910T125139Z -UID:47d15e3ec8 +UID:47d15e3ec8-1 +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; + + $calData[] = <<<'EOD' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:ownCloud Calendar +BEGIN:VEVENT +CREATED;VALUE=DATE-TIME:20130910T125139Z +UID:47d15e3ec8-2 LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z DTSTAMP;VALUE=DATE-TIME:20130910T125139Z SUMMARY:Test Event @@ -296,21 +344,39 @@ CLASS:PUBLIC END:VEVENT END:VCALENDAR EOD; + + $calData[] = <<<'EOD' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:ownCloud Calendar +BEGIN:VEVENT +CREATED;VALUE=DATE-TIME:20130910T125139Z +UID:47d15e3ec8-3 +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; + $uri0 = static::getUniqueID('card'); $this->dispatcher->expects($this->at(0)) ->method('dispatch') ->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject'); - $this->backend->createCalendarObject($calendarId, $uri0, $calData); + $this->backend->createCalendarObject($calendarId, $uri0, $calData[0]); $uri1 = static::getUniqueID('card'); $this->dispatcher->expects($this->at(0)) ->method('dispatch') ->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject'); - $this->backend->createCalendarObject($calendarId, $uri1, $calData); + $this->backend->createCalendarObject($calendarId, $uri1, $calData[1]); $uri2 = static::getUniqueID('card'); $this->dispatcher->expects($this->at(0)) ->method('dispatch') ->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject'); - $this->backend->createCalendarObject($calendarId, $uri2, $calData); + $this->backend->createCalendarObject($calendarId, $uri2, $calData[2]); // get all the cards $calendarObjects = $this->backend->getCalendarObjects($calendarId); @@ -326,9 +392,15 @@ EOD; $this->assertArrayHasKey('etag', $card); $this->assertArrayHasKey('size', $card); $this->assertArrayHasKey('classification', $card); - $this->assertEquals($calData, $card['calendardata']); } + usort($calendarObjects, function($a, $b) { + return $a['id'] - $b['id']; + }); + + $this->assertEquals($calData[1], $calendarObjects[0]['calendardata']); + $this->assertEquals($calData[2], $calendarObjects[1]['calendardata']); + // delete the card $this->dispatcher->expects($this->at(0)) ->method('dispatch') @@ -371,7 +443,26 @@ EOD; public function testGetCalendarObjectByUID() { $calendarId = $this->createTestCalendar(); - $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z'); + $uri = static::getUniqueID('calobj'); + $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; + + + $this->backend->createCalendarObject($calendarId, $uri, $calData); $co = $this->backend->getCalendarObjectByUID(self::UNIT_TEST_USER, '47d15e3ec8'); $this->assertNotNull($co); |