From 3462c0a5d40b22d5885567fba1895853221ee060 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 16 Jul 2025 15:46:32 +0200 Subject: [PATCH 1/4] fix: Make db queries more typesafe Signed-off-by: Marcel Klehr --- lib/Db/BookmarkMapper.php | 6 +++--- lib/Db/FolderMapper.php | 5 +++-- lib/Db/PublicFolderMapper.php | 5 +++-- lib/Db/ShareMapper.php | 15 ++++++------- lib/Db/SharedFolderMapper.php | 21 ++++++++++--------- lib/Db/TagMapper.php | 3 ++- lib/Db/TreeMapper.php | 3 ++- lib/Migration/OrphanedSharesRepairStep.php | 5 +++-- .../Version000014000Date20181029094721.php | 7 ++++--- .../Version003000000Date20191123094721.php | 19 +++++++++-------- 10 files changed, 49 insertions(+), 40 deletions(-) diff --git a/lib/Db/BookmarkMapper.php b/lib/Db/BookmarkMapper.php index d09ece32a..55713b6ab 100644 --- a/lib/Db/BookmarkMapper.php +++ b/lib/Db/BookmarkMapper.php @@ -185,7 +185,7 @@ public function find(int $id): Bookmark { $qb ->select(Bookmark::$columns) ->from('bookmarks') - ->where($qb->expr()->eq('id', $qb->createNamedParameter($id))); + ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } @@ -718,7 +718,7 @@ public function findPendingPreviews(int $limit, int $stalePeriod): array { $qb = $this->db->getQueryBuilder(); $qb->select(Bookmark::$columns); $qb->from('bookmarks', 'b'); - $qb->where($qb->expr()->lt('last_preview', $qb->createPositionalParameter($this->time->getTime() - $stalePeriod))); + $qb->where($qb->expr()->lt('last_preview', $qb->createPositionalParameter($this->time->getTime() - $stalePeriod, IQueryBuilder::PARAM_INT))); $qb->orWhere($qb->expr()->isNull('last_preview')); $qb->setMaxResults($limit); return $this->findEntities($qb); @@ -731,7 +731,7 @@ public function findPendingPreviews(int $limit, int $stalePeriod): array { public function clearLastPreviews(): void { $qb = $this->db->getQueryBuilder(); $qb->update('bookmarks'); - $qb->set('last_preview', $qb->createNamedParameter(0)); + $qb->set('last_preview', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)); $qb->executeStatement(); } diff --git a/lib/Db/FolderMapper.php b/lib/Db/FolderMapper.php index dad1b238e..d8d3c67e5 100644 --- a/lib/Db/FolderMapper.php +++ b/lib/Db/FolderMapper.php @@ -13,6 +13,7 @@ use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\QBMapper; use OCP\DB\Exception; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\EventDispatcher\IEventDispatcher; use OCP\IDBConnection; @@ -70,7 +71,7 @@ public function find(int $id): Folder { $qb ->select('*') ->from('bookmarks_folders') - ->where($qb->expr()->eq('id', $qb->createNamedParameter($id))); + ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } @@ -102,7 +103,7 @@ public function findRootFolder(string $userId): Folder { ->insert('bookmarks_root_folders') ->values([ 'user_id' => $qb->createPositionalParameter($userId), - 'folder_id' => $qb->createPositionalParameter($rootFolder->getId()), + 'folder_id' => $qb->createPositionalParameter($rootFolder->getId(), IQueryBuilder::PARAM_INT), ]) ->execute(); } catch (MultipleObjectsReturnedException $e) { diff --git a/lib/Db/PublicFolderMapper.php b/lib/Db/PublicFolderMapper.php index 601bbcb0b..906fd7dfa 100644 --- a/lib/Db/PublicFolderMapper.php +++ b/lib/Db/PublicFolderMapper.php @@ -13,6 +13,7 @@ use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use RangeException; @@ -65,7 +66,7 @@ public function findByFolder(int $folderId): PublicFolder { $qb ->select('*') ->from('bookmarks_folders_public') - ->where($qb->expr()->eq('folder_id', $qb->createNamedParameter($folderId))); + ->where($qb->expr()->eq('folder_id', $qb->createNamedParameter($folderId, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } @@ -82,7 +83,7 @@ public function findAllCreatedBefore(int $createdAt): array { $qb ->select('*') ->from('bookmarks_folders_public') - ->where($qb->expr()->lt('created_at', $qb->createNamedParameter($createdAt))); + ->where($qb->expr()->lt('created_at', $qb->createNamedParameter($createdAt, IQueryBuilder::PARAM_INT))); return $this->findEntities($qb); } diff --git a/lib/Db/ShareMapper.php b/lib/Db/ShareMapper.php index 7f37688be..89359b1e6 100644 --- a/lib/Db/ShareMapper.php +++ b/lib/Db/ShareMapper.php @@ -13,6 +13,7 @@ use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\QBMapper; use OCP\DB\Exception; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; /** @@ -47,7 +48,7 @@ public function find(int $shareId): Share { $qb = $this->db->getQueryBuilder(); $qb->select(Share::$columns) ->from('bookmarks_shares') - ->where($qb->expr()->eq('id', $qb->createPositionalParameter($shareId))); + ->where($qb->expr()->eq('id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT)));; return $this->findEntity($qb); } @@ -59,7 +60,7 @@ public function findByFolder(int $folderId): array { $qb = $this->db->getQueryBuilder(); $qb->select(Share::$columns) ->from('bookmarks_shares') - ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId))); + ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)));; return $this->findEntities($qb); } @@ -92,7 +93,7 @@ public function findByParticipant(int $type, string $participant): array { $qb->select(Share::$columns) ->from('bookmarks_shares') ->where($qb->expr()->eq('participant', $qb->createPositionalParameter($participant))) - ->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type))); + ->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT))); return $this->findEntities($qb); } @@ -110,9 +111,9 @@ public function findByFolderAndParticipant(int $folderId, int $type, string $par return 's.' . $c; }, Share::$columns)) ->from('bookmarks_shares') - ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId))) + ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('participant', $qb->createPositionalParameter($participant))) - ->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type))); + ->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } @@ -131,7 +132,7 @@ public function findByFolderAndUser(int $folderId, string $userId): Share { ->from('bookmarks_shares', 's') ->leftJoin('s', 'bookmarks_shared_to_shares', 't', 's.id = t.share_id') ->leftJoin('t', 'bookmarks_shared_folders', 'sf', 'sf.id = t.shared_folder_id') - ->where($qb->expr()->eq('s.folder_id', $qb->createPositionalParameter($folderId))) + ->where($qb->expr()->eq('s.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('sf.user_id', $qb->createPositionalParameter($userId))); return $this->findEntity($qb); } @@ -183,7 +184,7 @@ public function findBySharedFolder(int $id): Share { }, Share::$columns)) ->from('bookmarks_shares', 's') ->innerJoin('s', 'bookmarks_shared_to_shares', 't', 's.id = t.share_id') - ->where($qb->expr()->eq('t.shared_folder_id', $qb->createPositionalParameter($id))); + ->where($qb->expr()->eq('t.shared_folder_id', $qb->createPositionalParameter($id, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } diff --git a/lib/Db/SharedFolderMapper.php b/lib/Db/SharedFolderMapper.php index 6937efb8a..536f609c3 100644 --- a/lib/Db/SharedFolderMapper.php +++ b/lib/Db/SharedFolderMapper.php @@ -14,6 +14,7 @@ use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\QBMapper; use OCP\DB\Exception; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\EventDispatcher\IEventDispatcher; use OCP\IDBConnection; @@ -55,7 +56,7 @@ public function find(int $id): SharedFolder { $qb = $this->db->getQueryBuilder(); $qb->select(SharedFolder::$columns) ->from('bookmarks_shared_folders', 'sf') - ->where($qb->expr()->eq('sf.id', $qb->createPositionalParameter($id))); + ->where($qb->expr()->eq('sf.id', $qb->createPositionalParameter($id, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } @@ -68,7 +69,7 @@ public function findByShare(int $shareId): array { $qb->select(SharedFolder::$columns) ->from('bookmarks_shared_folders', 'sf') ->join('sf', 'bookmarks_shared_to_shares', 't', $qb->expr()->eq('sf.id', 't.shared_folder_id')) - ->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId))); + ->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT))); return $this->findEntities($qb); } @@ -82,7 +83,7 @@ public function findByFolder(int $folderId): array { return 'sf.' . $c; }, SharedFolder::$columns)) ->from('bookmarks_shared_folders', 'sf') - ->where($qb->expr()->eq('sf.folder_id', $qb->createPositionalParameter($folderId))); + ->where($qb->expr()->eq('sf.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT))); return $this->findEntities($qb); } @@ -122,7 +123,7 @@ public function findByParticipant(int $type, string $participant): array { ->leftJoin('p', 'bookmarks_shared_to_shares', 't', 'p.id = t.shared_folder_id') ->leftJoin('t', 'bookmarks_shares', 's', 't.share_id = s.id') ->where($qb->expr()->eq('s.participant', $qb->createPositionalParameter($participant))) - ->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type))); + ->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT))); return $this->findEntities($qb); } @@ -142,7 +143,7 @@ public function findByFolderAndParticipant(int $folderId, int $type, string $par ->from('bookmarks_shared_folders', 'p') ->leftJoin('p', 'bookmarks_shared_to_shares', 't', 't.shared_folder_id = p.id') ->leftJoin('t', 'bookmarks_shares', 's', 't.share_id = s.id') - ->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId))) + ->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('participant', $qb->createPositionalParameter($participant))) ->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type))); return $this->findEntity($qb); @@ -161,7 +162,7 @@ public function findByFolderAndUser(int $folderId, string $userId): SharedFolder return 'p.' . $c; }, SharedFolder::$columns)) ->from('bookmarks_shared_folders', 'p') - ->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId))) + ->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('p.user_id', $qb->createPositionalParameter($userId))); return $this->findEntity($qb); } @@ -199,7 +200,7 @@ public function findByShareAndUser(int $shareId, string $userId): SharedFolder { }, SharedFolder::$columns)) ->from('bookmarks_shared_folders', 'p') ->leftJoin('p', 'bookmarks_shared_to_shares', 't', 't.shared_folder_id = p.id') - ->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId))) + ->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('p.user_id', $qb->createPositionalParameter($userId))); return $this->findEntity($qb); } @@ -218,7 +219,7 @@ public function findByParticipantAndUser(int $type, string $participant, string ->leftJoin('p', 'bookmarks_shared_to_shares', 't', 't.shared_folder_id = p.id') ->leftJoin('t', 'bookmarks_shares', 's', 't.share_id = s.id') ->where($qb->expr()->eq('s.participant', $qb->createPositionalParameter($participant))) - ->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type))) + ->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INTy))) ->andWhere($qb->expr()->eq('p.user_id', $qb->createPositionalParameter($userId))); return $this->findEntities($qb); } @@ -226,7 +227,7 @@ public function findByParticipantAndUser(int $type, string $participant, string public function delete(Entity $entity): SharedFolder { $qb = $this->db->getQueryBuilder(); $qb->delete('bookmarks_shared_to_shares') - ->where($qb->expr()->eq('shared_folder_id', $qb->createPositionalParameter($entity->getId()))) + ->where($qb->expr()->eq('shared_folder_id', $qb->createPositionalParameter($entity->getId(), IQueryBuilder::PARAM_INT))) ->execute(); return parent::delete($entity); } @@ -235,7 +236,7 @@ public function mount(int $id, int $share_id): void { $qb = $this->db->getQueryBuilder(); $qb->insert('bookmarks_shared_to_shares')->values([ 'shared_folder_id' => $qb->createPositionalParameter($id), - 'share_id' => $qb->createPositionalParameter($share_id) + 'share_id' => $qb->createPositionalParameter($share_id, IQueryBuilder::PARAM_INT) ])->execute(); $this->eventDispatcher->dispatch(CreateEvent::class, new CreateEvent( TreeMapper::TYPE_SHARE, diff --git a/lib/Db/TagMapper.php b/lib/Db/TagMapper.php index 37f4e4191..3634be612 100644 --- a/lib/Db/TagMapper.php +++ b/lib/Db/TagMapper.php @@ -8,6 +8,7 @@ namespace OCA\Bookmarks\Db; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use PDO; @@ -86,7 +87,7 @@ public function findByBookmark(int $bookmarkId): array { $qb ->from('bookmarks_tags', 't') - ->where($qb->expr()->eq('t.bookmark_id', $qb->createPositionalParameter($bookmarkId))); + ->where($qb->expr()->eq('t.bookmark_id', $qb->createPositionalParameter($bookmarkId, IQueryBuilder::PARAM_INT))); return $qb->execute()->fetchAll(PDO::FETCH_COLUMN); } diff --git a/lib/Db/TreeMapper.php b/lib/Db/TreeMapper.php index 50de4490b..e5093beee 100644 --- a/lib/Db/TreeMapper.php +++ b/lib/Db/TreeMapper.php @@ -644,7 +644,7 @@ public function move(string $type, int $itemId, int $newParentFolderId, ?int $in $qb ->update('bookmarks_tree') ->set('parent_folder', $qb->createPositionalParameter($newParentFolderId, IQueryBuilder::PARAM_INT)) - ->set('index', $qb->createPositionalParameter($index ?? $this->countChildren($newParentFolderId))) + ->set('index', $qb->createPositionalParameter($index ?? $this->countChildren($newParentFolderId), IQueryBuilder::PARAM_INT)) ->where($qb->expr()->eq('id', $qb->createPositionalParameter($itemId, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type))); $qb->execute(); @@ -930,6 +930,7 @@ public function getSubFolders(int $folderId, $layers = 0, ?bool $isSoftDeleted = } return $array; }, $this->findChildren(TreeMapper::TYPE_SHARE, $folderId, $isSoftDeleted)); + $shares = array_values(array_filter($shares, fn($data) => $data !== null)); if (count($shares) > 0) { array_push($folders, ...$shares); } diff --git a/lib/Migration/OrphanedSharesRepairStep.php b/lib/Migration/OrphanedSharesRepairStep.php index cd12bdf11..f30457578 100644 --- a/lib/Migration/OrphanedSharesRepairStep.php +++ b/lib/Migration/OrphanedSharesRepairStep.php @@ -8,6 +8,7 @@ namespace OCA\Bookmarks\Migration; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; @@ -50,14 +51,14 @@ public function run(IOutput $output) { $folders = $qb->select('f.id') ->from('bookmarks_shared_folders', 'f') ->join('f', 'bookmarks_shared_to_shares', 't', $qb->expr()->eq('f.id', 't.shared_folder_id')) - ->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($share))) + ->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($share, IQueryBuilder::PARAM_INT))) ->execute() ->fetchAll(PDO::FETCH_COLUMN); foreach ($folders as $folderId) { $qb = $this->db->getQueryBuilder(); $qb->delete('bookmarks_tree') ->where($qb->expr()->eq('type', $qb->createPositionalParameter('share'))) - ->andWhere($qb->expr()->eq('id', $qb->createPositionalParameter($folderId))) + ->andWhere($qb->expr()->eq('id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT))) ->execute(); } $this->db->executeQuery('DELETE sf FROM *PREFIX*bookmarks_shared_folders sf JOIN *PREFIX*bookmarks_shared_to_shares t ON sf.id = t.shared_folder_id WHERE t.share_id = ?', [$share]); diff --git a/lib/Migration/Version000014000Date20181029094721.php b/lib/Migration/Version000014000Date20181029094721.php index 4f9880251..7fdfbc92e 100644 --- a/lib/Migration/Version000014000Date20181029094721.php +++ b/lib/Migration/Version000014000Date20181029094721.php @@ -10,6 +10,7 @@ use Closure; use OCP\DB\ISchemaWrapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\SimpleMigrationStep; @@ -77,7 +78,7 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $qb ->select('id', 'title', 'parent_folder') ->from('bookmarks_folders') - ->where($qb->expr()->eq('parent_folder', $qb->createPositionalParameter($folder))) + ->where($qb->expr()->eq('parent_folder', $qb->createPositionalParameter($folder, IQueryBuilder::PARAM_INT))) ->orderBy('title', 'DESC'); $childFolders = $qb->execute()->fetchAll(); @@ -85,7 +86,7 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $qb ->select('bookmark_id') ->from('bookmarks_folders_bookmarks') - ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folder))); + ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folder, IQueryBuilder::PARAM_INT))); $childBookmarks = $qb->execute()->fetchAll(); $children = array_merge($childFolders, $childBookmarks); @@ -103,7 +104,7 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $qb = $this->db->getQueryBuilder(); $qb ->update('bookmarks_folders_bookmarks') - ->set('index', $qb->createPositionalParameter($i)) + ->set('index', $qb->createPositionalParameter($i, IQueryBuilder::PARAM_INT)) ->where($qb->expr()->eq('bookmark_id', $qb->createPositionalParameter($child['id']))) ->andWhere($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folder))); $qb->execute(); diff --git a/lib/Migration/Version003000000Date20191123094721.php b/lib/Migration/Version003000000Date20191123094721.php index d4e172038..8d8233825 100644 --- a/lib/Migration/Version003000000Date20191123094721.php +++ b/lib/Migration/Version003000000Date20191123094721.php @@ -11,6 +11,7 @@ use Closure; use Doctrine\DBAL\Schema\SchemaException; use OCP\DB\ISchemaWrapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\SimpleMigrationStep; @@ -209,7 +210,7 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $rootFolderId = $qb->getLastInsertId(); $qb = $this->db->getQueryBuilder(); $qb->insert('bookmarks_root_folders')->values([ - 'folder_id' => $qb->createPositionalParameter($rootFolderId), + 'folder_id' => $qb->createPositionalParameter($rootFolderId, IQueryBuilder::PARAM_INT), 'user_id' => $qb->createPositionalParameter($user), ]); $qb->execute(); @@ -228,7 +229,7 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $folderId = $qb->select('id') ->from('bookmarks_tree') ->where( - $qb->expr()->eq('id', $qb->createPositionalParameter($folder['id'])), + $qb->expr()->eq('id', $qb->createPositionalParameter($folder['id'], IQueryBuilder::PARAM_INT)), $qb->expr()->eq('type', $qb->createPositionalParameter('folder')) ) ->execute() @@ -237,10 +238,10 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $qb = $this->db->getQueryBuilder(); $qb->insert('bookmarks_tree') ->values([ - 'id' => $qb->createPositionalParameter($folder['id']), + 'id' => $qb->createPositionalParameter($folder['id'], IQueryBuilder::PARAM_INT), 'type' => $qb->createPositionalParameter('folder'), - 'parent_folder' => $qb->createPositionalParameter(($folder['parent_folder'] === '-1' || $folder['parent_folder'] === -1) ? $rootFolderId : $folder['parent_folder']), - 'index' => $qb->createPositionalParameter($folder['index']), + 'parent_folder' => $qb->createPositionalParameter(($folder['parent_folder'] === '-1' || $folder['parent_folder'] === -1) ? $rootFolderId : $folder['parent_folder'], IQueryBuilder::PARAM_INT), + 'index' => $qb->createPositionalParameter($folder['index'], IQueryBuilder::PARAM_INT), ])->execute(); } } @@ -256,18 +257,18 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $bookmarkId = $qb->select('id') ->from('bookmarks_tree') ->where( - $qb->expr()->eq('id', $qb->createPositionalParameter($bookmark['bookmark_id'])), + $qb->expr()->eq('id', $qb->createPositionalParameter($bookmark['bookmark_id'], IQueryBuilder::PARAM_INT)), $qb->expr()->eq('type', $qb->createPositionalParameter('bookmark')), - $qb->expr()->eq('parent_folder', $qb->createPositionalParameter($parentFolder)) + $qb->expr()->eq('parent_folder', $qb->createPositionalParameter($parentFolder, IQueryBuilder::PARAM_INT)) ) ->execute() ->fetchColumn(); if ($bookmarkId === false) { $qb = $this->db->getQueryBuilder(); $qb->insert('bookmarks_tree')->values([ - 'id' => $qb->createPositionalParameter($bookmark['bookmark_id']), + 'id' => $qb->createPositionalParameter($bookmark['bookmark_id'], IQueryBuilder::PARAM_INT), 'type' => $qb->createPositionalParameter('bookmark'), - 'parent_folder' => $qb->createPositionalParameter($parentFolder), + 'parent_folder' => $qb->createPositionalParameter($parentFolder, IQueryBuilder::PARAM_INT), 'index' => $qb->createPositionalParameter($bookmark['index']), ])->execute(); } From f4b1c1a070aaea0e17192bb4e5873f04978814d6 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 16 Jul 2025 15:47:03 +0200 Subject: [PATCH 2/4] fix(ShareMapper#findBySharedFolder): Make sure exceptions are caught Signed-off-by: Marcel Klehr --- lib/Db/ShareMapper.php | 5 +++++ lib/Db/TreeMapper.php | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/Db/ShareMapper.php b/lib/Db/ShareMapper.php index 89359b1e6..1a6c393fa 100644 --- a/lib/Db/ShareMapper.php +++ b/lib/Db/ShareMapper.php @@ -177,6 +177,11 @@ public function insertOrUpdate(Entity $entity): Share { return parent::insertOrUpdate($entity); } + /** + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException + * @throws Exception + */ public function findBySharedFolder(int $id): Share { $qb = $this->db->getQueryBuilder(); $qb->select(array_map(static function ($c) { diff --git a/lib/Db/TreeMapper.php b/lib/Db/TreeMapper.php index e5093beee..4e3e90558 100644 --- a/lib/Db/TreeMapper.php +++ b/lib/Db/TreeMapper.php @@ -919,7 +919,12 @@ public function getSubFolders(int $folderId, $layers = 0, ?bool $isSoftDeleted = return $array; }, $this->findChildren(TreeMapper::TYPE_FOLDER, $folderId, $isSoftDeleted)); $shares = array_map(function (SharedFolder $sharedFolder) use ($layers, $folderId, $isSoftDeleted) { - $share = $this->shareMapper->findBySharedFolder($sharedFolder->getId()); + try { + $share = $this->shareMapper->findBySharedFolder($sharedFolder->getId()); + } catch (DoesNotExistException|MultipleObjectsReturnedException|Exception $e) { + $this->logger->error('Failed to load a shared folder', ['exception' => $e]); + return null; + } $array = $sharedFolder->toArray(); $array['id'] = $share->getFolderId(); $array['userId'] = $share->getOwner(); From 005eb761d2670103035a03905973ca1526ab6f65 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 16 Jul 2025 15:50:31 +0200 Subject: [PATCH 3/4] fix typos Signed-off-by: Marcel Klehr --- lib/Db/ShareMapper.php | 4 ++-- lib/Db/SharedFolderMapper.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Db/ShareMapper.php b/lib/Db/ShareMapper.php index 1a6c393fa..be35564e0 100644 --- a/lib/Db/ShareMapper.php +++ b/lib/Db/ShareMapper.php @@ -48,7 +48,7 @@ public function find(int $shareId): Share { $qb = $this->db->getQueryBuilder(); $qb->select(Share::$columns) ->from('bookmarks_shares') - ->where($qb->expr()->eq('id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT)));; + ->where($qb->expr()->eq('id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } @@ -60,7 +60,7 @@ public function findByFolder(int $folderId): array { $qb = $this->db->getQueryBuilder(); $qb->select(Share::$columns) ->from('bookmarks_shares') - ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)));; + ->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT))); return $this->findEntities($qb); } diff --git a/lib/Db/SharedFolderMapper.php b/lib/Db/SharedFolderMapper.php index 536f609c3..118f478eb 100644 --- a/lib/Db/SharedFolderMapper.php +++ b/lib/Db/SharedFolderMapper.php @@ -219,7 +219,7 @@ public function findByParticipantAndUser(int $type, string $participant, string ->leftJoin('p', 'bookmarks_shared_to_shares', 't', 't.shared_folder_id = p.id') ->leftJoin('t', 'bookmarks_shares', 's', 't.share_id = s.id') ->where($qb->expr()->eq('s.participant', $qb->createPositionalParameter($participant))) - ->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INTy))) + ->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('p.user_id', $qb->createPositionalParameter($userId))); return $this->findEntities($qb); } From 130e1554e7b16853ce24b7d9370d5e323c31cb9e Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Wed, 16 Jul 2025 15:56:34 +0200 Subject: [PATCH 4/4] fix: run cs:fix Signed-off-by: Marcel Klehr --- lib/Db/TreeMapper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Db/TreeMapper.php b/lib/Db/TreeMapper.php index 4e3e90558..fc96a2486 100644 --- a/lib/Db/TreeMapper.php +++ b/lib/Db/TreeMapper.php @@ -935,7 +935,7 @@ public function getSubFolders(int $folderId, $layers = 0, ?bool $isSoftDeleted = } return $array; }, $this->findChildren(TreeMapper::TYPE_SHARE, $folderId, $isSoftDeleted)); - $shares = array_values(array_filter($shares, fn($data) => $data !== null)); + $shares = array_values(array_filter($shares, fn ($data) => $data !== null)); if (count($shares) > 0) { array_push($folders, ...$shares); }