]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(dav): catch MaxInstancesExceedeException for recurring events without end date 36211/head
authorAnna Larch <anna@nextcloud.com>
Wed, 18 Jan 2023 11:30:58 +0000 (12:30 +0100)
committerAnna Larch <anna@nextcloud.com>
Wed, 18 Jan 2023 14:40:36 +0000 (15:40 +0100)
Ref https://github.com/nextcloud/calendar/issues/4811

Signed-off-by: Anna Larch <anna@nextcloud.com>
apps/dav/lib/CalDAV/Reminder/ReminderService.php

index 3fb8cf9ebe509ab69c3d0ed611ed9ec73d15b6a3..ffb829f454a0d0a21c0c003957ce89cf326e1e16 100644 (file)
@@ -482,49 +482,54 @@ class ReminderService {
                        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']);