Skip to content

Commit 86d6b91

Browse files
committed
ensure uid for calendar objects is unique
Signed-off-by: Georg Ehrke <developer@georgehrke.com>
1 parent db48575 commit 86d6b91

3 files changed

Lines changed: 106 additions & 8 deletions

File tree

apps/dav/lib/CalDAV/CalDavBackend.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,20 @@ function getMultipleCalendarObjects($calendarId, array $uris) {
957957
function createCalendarObject($calendarId, $objectUri, $calendarData) {
958958
$extraData = $this->getDenormalizedData($calendarData);
959959

960+
$q = $this->db->getQueryBuilder();
961+
$q->select($q->createFunction('COUNT(*)'))
962+
->from('calendarobjects')
963+
->where($q->expr()->eq('calendarid', $q->createNamedParameter($calendarId)))
964+
->andWhere($q->expr()->eq('uid', $q->createNamedParameter($extraData['uid'])));
965+
966+
$result = $q->execute();
967+
$count = (int) $result->fetchColumn();
968+
$result->closeCursor();
969+
970+
if ($count !== 0) {
971+
throw new \Sabre\DAV\Exception\BadRequest('Calendar object with uid already exists in this calendar collection.');
972+
}
973+
960974
$query = $this->db->getQueryBuilder();
961975
$query->insert('calendarobjects')
962976
->values([

apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,15 @@ protected function createTestCalendar() {
137137

138138
protected function createEvent($calendarId, $start = '20130912T130000Z', $end = '20130912T140000Z') {
139139

140+
$randomPart = self::getUniqueID();
141+
140142
$calData = <<<EOD
141143
BEGIN:VCALENDAR
142144
VERSION:2.0
143145
PRODID:ownCloud Calendar
144146
BEGIN:VEVENT
145147
CREATED;VALUE=DATE-TIME:20130910T125139Z
146-
UID:47d15e3ec8
148+
UID:47d15e3ec8-$randomPart
147149
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
148150
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
149151
SUMMARY:Test Event

apps/dav/tests/unit/CalDAV/CalDavBackendTest.php

Lines changed: 89 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,18 +274,74 @@ public function testCalendarObjectsOperations() {
274274
$this->assertCount(0, $calendarObjects);
275275
}
276276

277+
public function testMultipleCalendarObjectsWithSameUID() {
278+
$calendarId = $this->createTestCalendar();
279+
280+
$calData = <<<'EOD'
281+
BEGIN:VCALENDAR
282+
VERSION:2.0
283+
PRODID:ownCloud Calendar
284+
BEGIN:VEVENT
285+
CREATED;VALUE=DATE-TIME:20130910T125139Z
286+
UID:47d15e3ec8-1
287+
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
288+
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
289+
SUMMARY:Test Event
290+
DTSTART;VALUE=DATE-TIME:20130912T130000Z
291+
DTEND;VALUE=DATE-TIME:20130912T140000Z
292+
CLASS:PUBLIC
293+
END:VEVENT
294+
END:VCALENDAR
295+
EOD;
296+
}
297+
277298
public function testMultiCalendarObjects() {
278299

279300
$calendarId = $this->createTestCalendar();
280301

281302
// create an event
282-
$calData = <<<'EOD'
303+
$calData = [];
304+
$calData[] = <<<'EOD'
283305
BEGIN:VCALENDAR
284306
VERSION:2.0
285307
PRODID:ownCloud Calendar
286308
BEGIN:VEVENT
287309
CREATED;VALUE=DATE-TIME:20130910T125139Z
288-
UID:47d15e3ec8
310+
UID:47d15e3ec8-1
311+
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
312+
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
313+
SUMMARY:Test Event
314+
DTSTART;VALUE=DATE-TIME:20130912T130000Z
315+
DTEND;VALUE=DATE-TIME:20130912T140000Z
316+
CLASS:PUBLIC
317+
END:VEVENT
318+
END:VCALENDAR
319+
EOD;
320+
321+
$calData[] = <<<'EOD'
322+
BEGIN:VCALENDAR
323+
VERSION:2.0
324+
PRODID:ownCloud Calendar
325+
BEGIN:VEVENT
326+
CREATED;VALUE=DATE-TIME:20130910T125139Z
327+
UID:47d15e3ec8-2
328+
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
329+
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
330+
SUMMARY:Test Event
331+
DTSTART;VALUE=DATE-TIME:20130912T130000Z
332+
DTEND;VALUE=DATE-TIME:20130912T140000Z
333+
CLASS:PUBLIC
334+
END:VEVENT
335+
END:VCALENDAR
336+
EOD;
337+
338+
$calData[] = <<<'EOD'
339+
BEGIN:VCALENDAR
340+
VERSION:2.0
341+
PRODID:ownCloud Calendar
342+
BEGIN:VEVENT
343+
CREATED;VALUE=DATE-TIME:20130910T125139Z
344+
UID:47d15e3ec8-3
289345
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
290346
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
291347
SUMMARY:Test Event
@@ -295,21 +351,22 @@ public function testMultiCalendarObjects() {
295351
END:VEVENT
296352
END:VCALENDAR
297353
EOD;
354+
298355
$uri0 = static::getUniqueID('card');
299356
$this->dispatcher->expects($this->at(0))
300357
->method('dispatch')
301358
->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject');
302-
$this->backend->createCalendarObject($calendarId, $uri0, $calData);
359+
$this->backend->createCalendarObject($calendarId, $uri0, $calData[0]);
303360
$uri1 = static::getUniqueID('card');
304361
$this->dispatcher->expects($this->at(0))
305362
->method('dispatch')
306363
->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject');
307-
$this->backend->createCalendarObject($calendarId, $uri1, $calData);
364+
$this->backend->createCalendarObject($calendarId, $uri1, $calData[1]);
308365
$uri2 = static::getUniqueID('card');
309366
$this->dispatcher->expects($this->at(0))
310367
->method('dispatch')
311368
->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject');
312-
$this->backend->createCalendarObject($calendarId, $uri2, $calData);
369+
$this->backend->createCalendarObject($calendarId, $uri2, $calData[2]);
313370

314371
// get all the cards
315372
$calendarObjects = $this->backend->getCalendarObjects($calendarId);
@@ -325,9 +382,15 @@ public function testMultiCalendarObjects() {
325382
$this->assertArrayHasKey('etag', $card);
326383
$this->assertArrayHasKey('size', $card);
327384
$this->assertArrayHasKey('classification', $card);
328-
$this->assertEquals($calData, $card['calendardata']);
329385
}
330386

387+
usort($calendarObjects, function($a, $b) {
388+
return $a['id'] - $b['id'];
389+
});
390+
391+
$this->assertEquals($calData[1], $calendarObjects[0]['calendardata']);
392+
$this->assertEquals($calData[2], $calendarObjects[1]['calendardata']);
393+
331394
// delete the card
332395
$this->dispatcher->expects($this->at(0))
333396
->method('dispatch')
@@ -370,7 +433,26 @@ public function testCalendarQuery($expectedEventsInResult, $propFilters, $compFi
370433

371434
public function testGetCalendarObjectByUID() {
372435
$calendarId = $this->createTestCalendar();
373-
$this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z');
436+
$uri = static::getUniqueID('calobj');
437+
$calData = <<<'EOD'
438+
BEGIN:VCALENDAR
439+
VERSION:2.0
440+
PRODID:ownCloud Calendar
441+
BEGIN:VEVENT
442+
CREATED;VALUE=DATE-TIME:20130910T125139Z
443+
UID:47d15e3ec8
444+
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
445+
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
446+
SUMMARY:Test Event
447+
DTSTART;VALUE=DATE-TIME:20130912T130000Z
448+
DTEND;VALUE=DATE-TIME:20130912T140000Z
449+
CLASS:PUBLIC
450+
END:VEVENT
451+
END:VCALENDAR
452+
EOD;
453+
454+
455+
$this->backend->createCalendarObject($calendarId, $uri, $calData);
374456

375457
$co = $this->backend->getCalendarObjectByUID(self::UNIT_TEST_USER, '47d15e3ec8');
376458
$this->assertNotNull($co);

0 commit comments

Comments
 (0)