mirror of
https://github.com/nextcloud/server.git
synced 2026-04-02 15:45:38 -04:00
fix(dav): catch MaxInstancesExceedeException for recurring events without end date
Ref https://github.com/nextcloud/calendar/issues/4811 Signed-off-by: Anna Larch <anna@nextcloud.com>
This commit is contained in:
parent
9e08e49998
commit
a9264b007f
1 changed files with 39 additions and 34 deletions
|
|
@ -482,49 +482,54 @@ class ReminderService {
|
|||
return;
|
||||
}
|
||||
|
||||
while ($iterator->valid()) {
|
||||
$event = $iterator->getEventObject();
|
||||
try {
|
||||
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;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
$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']);
|
||||
|
|
|
|||
Loading…
Reference in a new issue