From e6481310107b91e01f5e51f861d7bbc69e5022c1 Mon Sep 17 00:00:00 2001 From: Benjamin Gaussorgues Date: Thu, 9 Jul 2026 16:15:23 +0200 Subject: [PATCH] feat(login): clean remember me tokens Signed-off-by: Benjamin Gaussorgues --- lib/composer/composer/autoload_classmap.php | 2 + lib/composer/composer/autoload_static.php | 2 + lib/private/Repair.php | 2 + lib/private/Repair/AddCleanupLoginTokens.php | 32 ++++++++++++++++ lib/private/Setup.php | 2 + .../BackgroundJobs/CleanupLoginTokens.php | 38 +++++++++++++++++++ 6 files changed, 78 insertions(+) create mode 100644 lib/private/Repair/AddCleanupLoginTokens.php create mode 100644 lib/private/User/BackgroundJobs/CleanupLoginTokens.php diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index e316ae06d853f..5e0347765c438 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -2080,6 +2080,7 @@ 'OC\\Repair\\AddBruteForceCleanupJob' => $baseDir . '/lib/private/Repair/AddBruteForceCleanupJob.php', 'OC\\Repair\\AddCleanupBackgroundJobsJob' => $baseDir . '/lib/private/Repair/AddCleanupBackgroundJobsJob.php', 'OC\\Repair\\AddCleanupDeletedUsersBackgroundJob' => $baseDir . '/lib/private/Repair/AddCleanupDeletedUsersBackgroundJob.php', + 'OC\\Repair\\AddCleanupLoginTokens' => $baseDir . '/lib/private/Repair/AddCleanupLoginTokens.php', 'OC\\Repair\\AddCleanupUpdaterBackupsJob' => $baseDir . '/lib/private/Repair/AddCleanupUpdaterBackupsJob.php', 'OC\\Repair\\AddMetadataGenerationJob' => $baseDir . '/lib/private/Repair/AddMetadataGenerationJob.php', 'OC\\Repair\\AddMovePreviewJob' => $baseDir . '/lib/private/Repair/AddMovePreviewJob.php', @@ -2302,6 +2303,7 @@ 'OC\\User\\AvailabilityCoordinator' => $baseDir . '/lib/private/User/AvailabilityCoordinator.php', 'OC\\User\\Backend' => $baseDir . '/lib/private/User/Backend.php', 'OC\\User\\BackgroundJobs\\CleanupDeletedUsers' => $baseDir . '/lib/private/User/BackgroundJobs/CleanupDeletedUsers.php', + 'OC\\User\\BackgroundJobs\\CleanupLoginTokens' => $baseDir . '/lib/private/User/BackgroundJobs/CleanupLoginTokens.php', 'OC\\User\\Database' => $baseDir . '/lib/private/User/Database.php', 'OC\\User\\DisabledUserException' => $baseDir . '/lib/private/User/DisabledUserException.php', 'OC\\User\\DisplayNameCache' => $baseDir . '/lib/private/User/DisplayNameCache.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 8409a3b9c8204..68fc86ea5f22c 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -2121,6 +2121,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\Repair\\AddBruteForceCleanupJob' => __DIR__ . '/../../..' . '/lib/private/Repair/AddBruteForceCleanupJob.php', 'OC\\Repair\\AddCleanupBackgroundJobsJob' => __DIR__ . '/../../..' . '/lib/private/Repair/AddCleanupBackgroundJobsJob.php', 'OC\\Repair\\AddCleanupDeletedUsersBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/AddCleanupDeletedUsersBackgroundJob.php', + 'OC\\Repair\\AddCleanupLoginTokens' => __DIR__ . '/../../..' . '/lib/private/Repair/AddCleanupLoginTokens.php', 'OC\\Repair\\AddCleanupUpdaterBackupsJob' => __DIR__ . '/../../..' . '/lib/private/Repair/AddCleanupUpdaterBackupsJob.php', 'OC\\Repair\\AddMetadataGenerationJob' => __DIR__ . '/../../..' . '/lib/private/Repair/AddMetadataGenerationJob.php', 'OC\\Repair\\AddMovePreviewJob' => __DIR__ . '/../../..' . '/lib/private/Repair/AddMovePreviewJob.php', @@ -2343,6 +2344,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\User\\AvailabilityCoordinator' => __DIR__ . '/../../..' . '/lib/private/User/AvailabilityCoordinator.php', 'OC\\User\\Backend' => __DIR__ . '/../../..' . '/lib/private/User/Backend.php', 'OC\\User\\BackgroundJobs\\CleanupDeletedUsers' => __DIR__ . '/../../..' . '/lib/private/User/BackgroundJobs/CleanupDeletedUsers.php', + 'OC\\User\\BackgroundJobs\\CleanupLoginTokens' => __DIR__ . '/../../..' . '/lib/private/User/BackgroundJobs/CleanupLoginTokens.php', 'OC\\User\\Database' => __DIR__ . '/../../..' . '/lib/private/User/Database.php', 'OC\\User\\DisabledUserException' => __DIR__ . '/../../..' . '/lib/private/User/DisabledUserException.php', 'OC\\User\\DisplayNameCache' => __DIR__ . '/../../..' . '/lib/private/User/DisplayNameCache.php', diff --git a/lib/private/Repair.php b/lib/private/Repair.php index 0f94de519155c..132209647632f 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -11,6 +11,7 @@ use OC\Repair\AddBruteForceCleanupJob; use OC\Repair\AddCleanupBackgroundJobsJob; use OC\Repair\AddCleanupDeletedUsersBackgroundJob; +use OC\Repair\AddCleanupLoginTokens; use OC\Repair\AddCleanupUpdaterBackupsJob; use OC\Repair\AddMetadataGenerationJob; use OC\Repair\AddMovePreviewJob; @@ -194,6 +195,7 @@ public static function getRepairSteps(bool $includeExpensive = false): array { Server::get(RepairLogoDimension::class), Server::get(RemoveLegacyDatadirFile::class), Server::get(AddCleanupDeletedUsersBackgroundJob::class), + Server::get(AddCleanupLoginTokens::class), Server::get(SanitizeAccountProperties::class), Server::get(AddMovePreviewJob::class), Server::get(ConfigKeyMigration::class), diff --git a/lib/private/Repair/AddCleanupLoginTokens.php b/lib/private/Repair/AddCleanupLoginTokens.php new file mode 100644 index 0000000000000..9f8d196771e6f --- /dev/null +++ b/lib/private/Repair/AddCleanupLoginTokens.php @@ -0,0 +1,32 @@ +jobList->add(CleanupLoginTokens::class); + } +} diff --git a/lib/private/Setup.php b/lib/private/Setup.php index 74b0686dd7b62..05a55a149fa2e 100644 --- a/lib/private/Setup.php +++ b/lib/private/Setup.php @@ -29,6 +29,7 @@ use OC\Setup\Sqlite; use OC\TextProcessing\RemoveOldTasksBackgroundJob; use OC\User\BackgroundJobs\CleanupDeletedUsers; +use OC\User\BackgroundJobs\CleanupLoginTokens; use OC\User\Session; use OCP\AppFramework\QueryException; use OCP\AppFramework\Utility\ITimeFactory; @@ -530,6 +531,7 @@ public static function installBackgroundJobs(): void { $jobList->add(BackgroundCleanupJob::class); $jobList->add(RemoveOldTasksBackgroundJob::class); $jobList->add(CleanupDeletedUsers::class); + $jobList->add(CleanupLoginTokens::class); $jobList->add(GenerateMetadataJob::class); $jobList->add(PreviewMigrationJob::class); $jobList->add(ExpirePreviewsJob::class); diff --git a/lib/private/User/BackgroundJobs/CleanupLoginTokens.php b/lib/private/User/BackgroundJobs/CleanupLoginTokens.php new file mode 100644 index 0000000000000..1e0f68c51db39 --- /dev/null +++ b/lib/private/User/BackgroundJobs/CleanupLoginTokens.php @@ -0,0 +1,38 @@ +setTimeSensitivity(self::TIME_INSENSITIVE); + $this->setInterval(24 * 60 * 60); + } + + #[\Override] + protected function run($argument): void { + $rememberMeMaxAge = $this->config->getSystemValueInt('remember_login_cookie_lifetime', 60 * 60 * 24 * 15); + $qb = $this->connection->getQueryBuilder(); + $qb + ->delete() + ->where($qb->expr()->eq('appid', $qb->expr()->literal('login_token'))) + ->andWhere($qb->expr()->lt('configvalue', $qb->createNamedParameter(time() - $rememberMeMaxAge))) + ->executeStatement(); + } +}