From fbc7fb1ba0285b15bc33ee2f4f357fa4d0e1c653 Mon Sep 17 00:00:00 2001 From: Anna Larch Date: Thu, 9 Apr 2026 15:01:52 +0200 Subject: [PATCH] fix(user_status): exclude backups from cleanup queries and filter from list methods The background cleanup job operated on all rows including backups: - clearOlderThanClearAt() deleted backup rows with expired clear_at, destroying saved statuses before they could be restored - clearStatusesOlderThan() overwrote backup statuses to OFFLINE, corrupting saved DND/away states Additionally, findAll() leaked backup rows into user-facing lists, and findAllRecent() filtered backups via slow LIKE pattern instead of the is_backup column. Add is_backup=false filter to all four methods. AI-Assisted-By: Claude Opus 4.6 Signed-off-by: Anna Larch --- apps/user_status/lib/Db/UserStatusMapper.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/user_status/lib/Db/UserStatusMapper.php b/apps/user_status/lib/Db/UserStatusMapper.php index 1fcbaff29c5..ea3b76c8e56 100644 --- a/apps/user_status/lib/Db/UserStatusMapper.php +++ b/apps/user_status/lib/Db/UserStatusMapper.php @@ -36,7 +36,8 @@ class UserStatusMapper extends QBMapper { $qb = $this->db->getQueryBuilder(); $qb ->select('*') - ->from($this->tableName); + ->from($this->tableName) + ->where($qb->expr()->eq('is_backup', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))); if ($limit !== null) { $qb->setMaxResults($limit); @@ -68,7 +69,7 @@ class UserStatusMapper extends QBMapper { $qb->expr()->isNotNull('custom_icon'), $qb->expr()->isNotNull('custom_message'), ), - $qb->expr()->notLike('user_id', $qb->createNamedParameter($this->db->escapeLikeParameter('_') . '%')) + $qb->expr()->eq('is_backup', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)) )); if ($limit !== null) { @@ -125,7 +126,8 @@ class UserStatusMapper extends QBMapper { ->andWhere($qb->expr()->orX( $qb->expr()->eq('is_user_defined', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL), IQueryBuilder::PARAM_BOOL), $qb->expr()->eq('status', $qb->createNamedParameter(IUserStatus::ONLINE)) - )); + )) + ->andWhere($qb->expr()->eq('is_backup', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))); $qb->executeStatement(); } @@ -139,7 +141,8 @@ class UserStatusMapper extends QBMapper { $qb = $this->db->getQueryBuilder(); $qb->delete($this->tableName) ->where($qb->expr()->isNotNull('clear_at')) - ->andWhere($qb->expr()->lte('clear_at', $qb->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT))); + ->andWhere($qb->expr()->lte('clear_at', $qb->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT))) + ->andWhere($qb->expr()->eq('is_backup', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))); $qb->executeStatement(); }