diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 29fd63c20c635..4da22c36bd3ac 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -3866,11 +3866,13 @@ public function pruneOutdatedSyncTokens(int $keep, int $retention): int { return 0; } + $cutoff = max(0, time() - $retention); + $query = $this->db->getQueryBuilder(); $query->delete('calendarchanges') ->where( $query->expr()->lte('id', $query->createNamedParameter($maxId - $keep, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT), - $query->expr()->lte('created_at', $query->createNamedParameter($retention)), + $query->expr()->lte('created_at', $query->createNamedParameter($cutoff, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT), ); return $query->executeStatement(); } diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 8d208d6220972..98a50ed5d0df2 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -1517,11 +1517,13 @@ public function pruneOutdatedSyncTokens(int $keep, int $retention): int { return 0; } + $cutoff = max(0, time() - $retention); + $query = $this->db->getQueryBuilder(); $query->delete('addressbookchanges') ->where( $query->expr()->lte('id', $query->createNamedParameter($maxId - $keep, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT), - $query->expr()->lte('created_at', $query->createNamedParameter($retention)), + $query->expr()->lte('created_at', $query->createNamedParameter($cutoff, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT), ); return $query->executeStatement(); } diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index 30b1828c7ed01..84b6b6fce65ef 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -1534,11 +1534,12 @@ public function testPruneOutdatedSyncTokens(): void { EOD; $this->backend->updateCalendarObject($calendarId, $uri, $calData); - // Keep everything - $deleted = $this->backend->pruneOutdatedSyncTokens(0, 0); + // Keep everything by using a retention duration larger than the row age + $deleted = $this->backend->pruneOutdatedSyncTokens(0, time()); self::assertSame(0, $deleted); - $deleted = $this->backend->pruneOutdatedSyncTokens(0, time()); + // A retention duration of 0 means everything older than "now" is eligible + $deleted = $this->backend->pruneOutdatedSyncTokens(0, 0); // At least one from the object creation and one from the object update $this->assertGreaterThanOrEqual(2, $deleted); $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 1); @@ -1604,7 +1605,7 @@ public function testPruneOutdatedSyncTokens(): void { $this->assertEmpty($changes['deleted']); // Delete all but last change - $deleted = $this->backend->pruneOutdatedSyncTokens(1, time()); + $deleted = $this->backend->pruneOutdatedSyncTokens(1, 0); $this->assertEquals(1, $deleted); // We had two changes before, now one // Only update should remain @@ -1614,7 +1615,7 @@ public function testPruneOutdatedSyncTokens(): void { $this->assertEmpty($changes['deleted']); // Check that no crash occurs when prune is called without current changes - $deleted = $this->backend->pruneOutdatedSyncTokens(1, time()); + $deleted = $this->backend->pruneOutdatedSyncTokens(1, 0); self::assertSame(0, $deleted); } diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index 9dd36c6ee2490..8b6b9fccd13fb 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -899,11 +899,12 @@ public function testPruneOutdatedSyncTokens(): void { $this->backend->createCard($addressBookId, $uri, $this->vcardTest0); $this->backend->updateCard($addressBookId, $uri, $this->vcardTest1); - // Do not delete anything if week data as old as ts=0 - $deleted = $this->backend->pruneOutdatedSyncTokens(0, 0); + // Keep everything by using a retention duration larger than the row age + $deleted = $this->backend->pruneOutdatedSyncTokens(0, time()); self::assertSame(0, $deleted); - $deleted = $this->backend->pruneOutdatedSyncTokens(0, time()); + // A retention duration of 0 means everything older than "now" is eligible + $deleted = $this->backend->pruneOutdatedSyncTokens(0, 0); // At least one from the object creation and one from the object update $this->assertGreaterThanOrEqual(2, $deleted); $changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 1); @@ -935,7 +936,7 @@ public function testPruneOutdatedSyncTokens(): void { $this->assertEmpty($changes['deleted']); // Delete all but last change - $deleted = $this->backend->pruneOutdatedSyncTokens(1, time()); + $deleted = $this->backend->pruneOutdatedSyncTokens(1, 0); $this->assertEquals(1, $deleted); // We had two changes before, now one // Only update should remain @@ -945,6 +946,6 @@ public function testPruneOutdatedSyncTokens(): void { $this->assertEmpty($changes['deleted']); // Check that no crash occurs when prune is called without current changes - $deleted = $this->backend->pruneOutdatedSyncTokens(1, time()); + $deleted = $this->backend->pruneOutdatedSyncTokens(1, 0); } }