Skip to content

Commit 47ac907

Browse files
authored
Merge pull request #44017 from rcwschaller/fix/caldav/eventcomparisionservice-uses-wrong-array-comparison
2 parents 0c941d3 + fa6e613 commit 47ac907

2 files changed

Lines changed: 68 additions & 1 deletion

File tree

apps/dav/lib/CalDAV/EventComparisonService.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private function removeIfUnchanged(VEvent $filterEvent, array &$eventsToFilter):
6565
$eventToFilterData[] = IMipService::readPropertyWithDefault($eventToFilter, $eventDiff, '');
6666
}
6767
// events are identical and can be removed
68-
if (empty(array_diff($filterEventData, $eventToFilterData))) {
68+
if ($filterEventData === $eventToFilterData) {
6969
unset($eventsToFilter[$k]);
7070
return true;
7171
}

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

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
/**
66
* @copyright 2023 Daniel Kesselberg <mail@danielkesselberg.de>
7+
* @copyright 2024 Robert C. Schaller <gtbc_robert.schaller@rsxc.de>
78
*
89
* @author 2023 Daniel Kesselberg <mail@danielkesselberg.de>
910
*
@@ -137,4 +138,70 @@ public function testModifiedUnmodifiedEvent(): void {
137138
$this->assertEquals([$vEventOld2], $result['old']);
138139
$this->assertEquals([$vEventNew2], $result['new']);
139140
}
141+
142+
// First test to certify fix for issue nextcloud/server#41084
143+
public function testSequenceNumberIncrementDetectedForFirstModificationToEventWithoutZeroInit(): void {
144+
$vCalendarOld = new VCalendar();
145+
$vCalendarNew = new VCalendar();
146+
147+
$vEventOld = $vCalendarOld->add('VEVENT', [
148+
'UID' => 'uid-1234',
149+
'LAST-MODIFIED' => 123456,
150+
// 'SEQUENCE' => 0, // sequence number may not be set to zero during event creation and instead fully omitted
151+
'SUMMARY' => 'Fellowship meeting',
152+
'DTSTART' => new \DateTime('2016-01-01 00:00:00'),
153+
'RRULE' => 'FREQ=DAILY;INTERVAL=1;UNTIL=20160201T000000Z',
154+
]);
155+
$vEventOld->add('ORGANIZER', 'mailto:gandalf@wiz.ard');
156+
$vEventOld->add('ATTENDEE', 'mailto:' . 'frodo@hobb.it', ['RSVP' => 'TRUE', 'CN' => 'Frodo']);
157+
158+
$vEventNew = $vCalendarNew->add('VEVENT', [
159+
'UID' => 'uid-1234',
160+
'LAST-MODIFIED' => 123456,
161+
'SEQUENCE' => 1,
162+
'SUMMARY' => 'Fellowship meeting',
163+
'DTSTART' => new \DateTime('2016-01-01 00:00:00'),
164+
'RRULE' => 'FREQ=DAILY;INTERVAL=1;UNTIL=20160201T000000Z',
165+
]);
166+
$vEventNew->add('ORGANIZER', 'mailto:gandalf@wiz.ard');
167+
$vEventNew->add('ATTENDEE', 'mailto:' . 'frodo@hobb.it', ['RSVP' => 'TRUE', 'CN' => 'Frodo']);
168+
169+
$result = $this->eventComparisonService->findModified($vCalendarNew, $vCalendarOld);
170+
$this->assertEquals([$vEventOld], $result['old']);
171+
$this->assertEquals([$vEventNew], $result['new']);
172+
}
173+
174+
// Second test to certify fix for issue nextcloud/server#41084
175+
public function testSequenceNumberIncrementDetectedForFirstModificationToEventWithZeroInit(): void {
176+
$vCalendarOld = new VCalendar();
177+
$vCalendarNew = new VCalendar();
178+
179+
$vEventOld = $vCalendarOld->add('VEVENT', [
180+
'UID' => 'uid-1234',
181+
'LAST-MODIFIED' => 123456,
182+
'SEQUENCE' => 0,
183+
'SUMMARY' => 'Fellowship meeting',
184+
'DTSTART' => new \DateTime('2016-01-01 00:00:00'),
185+
'RRULE' => 'FREQ=DAILY;INTERVAL=1;UNTIL=20160201T000000Z',
186+
]);
187+
$vEventOld->add('ORGANIZER', 'mailto:gandalf@wiz.ard');
188+
$vEventOld->add('ATTENDEE', 'mailto:' . 'frodo@hobb.it', ['RSVP' => 'TRUE', 'CN' => 'Frodo']);
189+
190+
$vEventNew = $vCalendarNew->add('VEVENT', [
191+
'UID' => 'uid-1234',
192+
'LAST-MODIFIED' => 123456,
193+
'SEQUENCE' => 1,
194+
'SUMMARY' => 'Fellowship meeting',
195+
'DTSTART' => new \DateTime('2016-01-01 00:00:00'),
196+
'RRULE' => 'FREQ=DAILY;INTERVAL=1;UNTIL=20160201T000000Z',
197+
]);
198+
$vEventNew->add('ORGANIZER', 'mailto:gandalf@wiz.ard');
199+
$vEventNew->add('ATTENDEE', 'mailto:' . 'frodo@hobb.it', ['RSVP' => 'TRUE', 'CN' => 'Frodo']);
200+
201+
$result = $this->eventComparisonService->findModified($vCalendarNew, $vCalendarOld);
202+
$this->assertEquals([$vEventOld], $result['old']);
203+
$this->assertEquals([$vEventNew], $result['new']);
204+
}
205+
206+
140207
}

0 commit comments

Comments
 (0)