Skip to content

Commit

Permalink
fix(dav): catch MaxInstancesExceedeException for recurring events wit…
Browse files Browse the repository at this point in the history
…hout end date

Ref nextcloud/calendar#4811

Signed-off-by: Anna Larch <anna@nextcloud.com>
  • Loading branch information
miaulalala committed Jan 18, 2023
1 parent 9e08e49 commit 4f56003
Showing 1 changed file with 39 additions and 34 deletions.
73 changes: 39 additions & 34 deletions apps/dav/lib/CalDAV/Reminder/ReminderService.php
Original file line number Diff line number Diff line change
Expand Up @@ -482,49 +482,54 @@ private function deleteOrProcessNext(array $reminder,
return;
}

while ($iterator->valid()) {
$event = $iterator->getEventObject();

// Recurrence-exceptions are handled separately, so just ignore them here
if (\in_array($event, $recurrenceExceptions, true)) {
$iterator->next();
continue;
}

$recurrenceId = $this->getEffectiveRecurrenceIdOfVEvent($event);
if ($reminder['recurrence_id'] >= $recurrenceId) {
$iterator->next();
continue;
}
try {
while ($iterator->valid()) {
$event = $iterator->getEventObject();

foreach ($event->VALARM as $valarm) {
/** @var VAlarm $valarm */
$alarmHash = $this->getAlarmHash($valarm);
if ($alarmHash !== $reminder['alarm_hash']) {
// Recurrence-exceptions are handled separately, so just ignore them here
if (\in_array($event, $recurrenceExceptions, true)) {
$iterator->next();
continue;
}

$triggerTime = $valarm->getEffectiveTriggerTime();

// If effective trigger time is in the past
// just skip and generate for next event
$diff = $now->diff($triggerTime);
if ($diff->invert === 1) {
$recurrenceId = $this->getEffectiveRecurrenceIdOfVEvent($event);
if ($reminder['recurrence_id'] >= $recurrenceId) {
$iterator->next();
continue;
}

$this->backend->removeReminder($reminder['id']);
$alarms = $this->getRemindersForVAlarm($valarm, [
'calendarid' => $reminder['calendar_id'],
'id' => $reminder['object_id'],
], $reminder['event_hash'], $alarmHash, true, false);
$this->writeRemindersToDatabase($alarms);
foreach ($event->VALARM as $valarm) {
/** @var VAlarm $valarm */
$alarmHash = $this->getAlarmHash($valarm);
if ($alarmHash !== $reminder['alarm_hash']) {
continue;
}

// Abort generating reminders after creating one successfully
return;
}
$triggerTime = $valarm->getEffectiveTriggerTime();

$iterator->next();
// If effective trigger time is in the past
// just skip and generate for next event
$diff = $now->diff($triggerTime);
if ($diff->invert === 1) {
continue;
}

$this->backend->removeReminder($reminder['id']);
$alarms = $this->getRemindersForVAlarm($valarm, [
'calendarid' => $reminder['calendar_id'],
'id' => $reminder['object_id'],
], $reminder['event_hash'], $alarmHash, true, false);
$this->writeRemindersToDatabase($alarms);

// Abort generating reminders after creating one successfully
return;
}

$iterator->next();
}
} catch (MaxInstancesExceededException $e) {
// Using debug logger as this isn't really an error
$this->logger->debug('Recurrence with too many instances detected, skipping VEVENT', ['exception' => $e]);
}

$this->backend->removeReminder($reminder['id']);
Expand Down

0 comments on commit 4f56003

Please sign in to comment.