diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 66d216c1f5af8..1a3ceeea5607b 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -3619,11 +3619,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 14f03e6ce8f3f..b10292db70043 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -1496,11 +1496,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 985fc3d67a5cf..3a3b8c9f13941 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -1398,11 +1398,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); @@ -1468,7 +1469,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 @@ -1478,7 +1479,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 195eb75545770..482f741d82638 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -875,11 +875,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); @@ -911,7 +912,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 @@ -921,6 +922,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); } }