diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 86ed21795f4c1..b3b9ebf4238bd 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -3914,11 +3914,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 3d26ef9507efd..8c4da892e041f 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -1527,11 +1527,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 75bd0f118906f..a45ee73cd2e06 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -1531,11 +1531,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); @@ -1601,7 +1602,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 @@ -1611,7 +1612,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 df7b99a84bcc1..03d049b34da83 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -922,11 +922,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); @@ -958,7 +959,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 @@ -968,6 +969,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); } }