Merge pull request #30048 from nextcloud/fix/caldav-search-time-range-recurrence

Carefully filter out non matching time ranges for CalDAV search
pull/29368/head
Christoph Wurst 2021-12-14 14:50:31 +07:00 committed by GitHub
commit 5613ff365b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 35 additions and 1 deletions

@ -100,7 +100,9 @@ use function array_merge;
use function array_values;
use function explode;
use function is_array;
use function is_resource;
use function pathinfo;
use function rewind;
use function sprintf;
use function str_replace;
use function strtolower;
@ -1915,7 +1917,39 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
}
$result = $outerQuery->executeQuery();
$calendarObjects = $result->fetchAll();
$calendarObjects = array_filter($result->fetchAll(), function (array $row) use ($options) {
$start = $options['timerange']['start'] ?? null;
$end = $options['timerange']['end'] ?? null;
if ($start === null || !($start instanceof DateTimeInterface) || $end === null || !($end instanceof DateTimeInterface)) {
// No filter required
return true;
}
$isValid = $this->validateFilterForObject($row, [
'name' => 'VCALENDAR',
'comp-filters' => [
[
'name' => 'VEVENT',
'comp-filters' => [],
'prop-filters' => [],
'is-not-defined' => false,
'time-range' => [
'start' => $start,
'end' => $end,
],
],
],
'prop-filters' => [],
'is-not-defined' => false,
'time-range' => null,
]);
if (is_resource($row['calendardata'])) {
// Put the stream back to the beginning so it can be read another time
rewind($row['calendardata']);
}
return $isValid;
});
$result->closeCursor();
return array_map(function ($o) {