aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Reschke <lukas@statuscode.ch>2017-11-07 21:55:09 +0100
committerGitHub <noreply@github.com>2017-11-07 21:55:09 +0100
commitb754a2e385cd328220c80cbfabcb9fde8566f6ee (patch)
tree79fadca29f54abaf39692c063375f8ff012608ec
parent0913bc2157293acafa186afec4018ad25d7fbb22 (diff)
parent4df08f296b6242f9df7b1fc729801b7bd221be25 (diff)
downloadnextcloud-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.php14
-rw-r--r--apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php4
-rw-r--r--apps/dav/tests/unit/CalDAV/CalDavBackendTest.php105
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);