Skip to content

Commit bfa1a11

Browse files
authored
Merge pull request #2310 from nextcloud/fix/typesafe-queries
Some fixes
2 parents 04dece5 + 130e155 commit bfa1a11

10 files changed

Lines changed: 60 additions & 41 deletions

lib/Db/BookmarkMapper.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ public function find(int $id): Bookmark {
185185
$qb
186186
->select(Bookmark::$columns)
187187
->from('bookmarks')
188-
->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
188+
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
189189

190190
return $this->findEntity($qb);
191191
}
@@ -718,7 +718,7 @@ public function findPendingPreviews(int $limit, int $stalePeriod): array {
718718
$qb = $this->db->getQueryBuilder();
719719
$qb->select(Bookmark::$columns);
720720
$qb->from('bookmarks', 'b');
721-
$qb->where($qb->expr()->lt('last_preview', $qb->createPositionalParameter($this->time->getTime() - $stalePeriod)));
721+
$qb->where($qb->expr()->lt('last_preview', $qb->createPositionalParameter($this->time->getTime() - $stalePeriod, IQueryBuilder::PARAM_INT)));
722722
$qb->orWhere($qb->expr()->isNull('last_preview'));
723723
$qb->setMaxResults($limit);
724724
return $this->findEntities($qb);
@@ -731,7 +731,7 @@ public function findPendingPreviews(int $limit, int $stalePeriod): array {
731731
public function clearLastPreviews(): void {
732732
$qb = $this->db->getQueryBuilder();
733733
$qb->update('bookmarks');
734-
$qb->set('last_preview', $qb->createNamedParameter(0));
734+
$qb->set('last_preview', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT));
735735
$qb->executeStatement();
736736
}
737737

lib/Db/FolderMapper.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
1414
use OCP\AppFramework\Db\QBMapper;
1515
use OCP\DB\Exception;
16+
use OCP\DB\QueryBuilder\IQueryBuilder;
1617
use OCP\EventDispatcher\IEventDispatcher;
1718
use OCP\IDBConnection;
1819

@@ -70,7 +71,7 @@ public function find(int $id): Folder {
7071
$qb
7172
->select('*')
7273
->from('bookmarks_folders')
73-
->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
74+
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
7475

7576
return $this->findEntity($qb);
7677
}
@@ -102,7 +103,7 @@ public function findRootFolder(string $userId): Folder {
102103
->insert('bookmarks_root_folders')
103104
->values([
104105
'user_id' => $qb->createPositionalParameter($userId),
105-
'folder_id' => $qb->createPositionalParameter($rootFolder->getId()),
106+
'folder_id' => $qb->createPositionalParameter($rootFolder->getId(), IQueryBuilder::PARAM_INT),
106107
])
107108
->execute();
108109
} catch (MultipleObjectsReturnedException $e) {

lib/Db/PublicFolderMapper.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use OCP\AppFramework\Db\Entity;
1414
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
1515
use OCP\AppFramework\Db\QBMapper;
16+
use OCP\DB\QueryBuilder\IQueryBuilder;
1617
use OCP\IDBConnection;
1718
use RangeException;
1819

@@ -65,7 +66,7 @@ public function findByFolder(int $folderId): PublicFolder {
6566
$qb
6667
->select('*')
6768
->from('bookmarks_folders_public')
68-
->where($qb->expr()->eq('folder_id', $qb->createNamedParameter($folderId)));
69+
->where($qb->expr()->eq('folder_id', $qb->createNamedParameter($folderId, IQueryBuilder::PARAM_INT)));
6970

7071
return $this->findEntity($qb);
7172
}
@@ -82,7 +83,7 @@ public function findAllCreatedBefore(int $createdAt): array {
8283
$qb
8384
->select('*')
8485
->from('bookmarks_folders_public')
85-
->where($qb->expr()->lt('created_at', $qb->createNamedParameter($createdAt)));
86+
->where($qb->expr()->lt('created_at', $qb->createNamedParameter($createdAt, IQueryBuilder::PARAM_INT)));
8687

8788
return $this->findEntities($qb);
8889
}

lib/Db/ShareMapper.php

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
1414
use OCP\AppFramework\Db\QBMapper;
1515
use OCP\DB\Exception;
16+
use OCP\DB\QueryBuilder\IQueryBuilder;
1617
use OCP\IDBConnection;
1718

1819
/**
@@ -47,7 +48,7 @@ public function find(int $shareId): Share {
4748
$qb = $this->db->getQueryBuilder();
4849
$qb->select(Share::$columns)
4950
->from('bookmarks_shares')
50-
->where($qb->expr()->eq('id', $qb->createPositionalParameter($shareId)));
51+
->where($qb->expr()->eq('id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT)));
5152
return $this->findEntity($qb);
5253
}
5354

@@ -59,7 +60,7 @@ public function findByFolder(int $folderId): array {
5960
$qb = $this->db->getQueryBuilder();
6061
$qb->select(Share::$columns)
6162
->from('bookmarks_shares')
62-
->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId)));
63+
->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)));
6364
return $this->findEntities($qb);
6465
}
6566

@@ -92,7 +93,7 @@ public function findByParticipant(int $type, string $participant): array {
9293
$qb->select(Share::$columns)
9394
->from('bookmarks_shares')
9495
->where($qb->expr()->eq('participant', $qb->createPositionalParameter($participant)))
95-
->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type)));
96+
->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT)));
9697
return $this->findEntities($qb);
9798
}
9899

@@ -110,9 +111,9 @@ public function findByFolderAndParticipant(int $folderId, int $type, string $par
110111
return 's.' . $c;
111112
}, Share::$columns))
112113
->from('bookmarks_shares')
113-
->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId)))
114+
->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)))
114115
->andWhere($qb->expr()->eq('participant', $qb->createPositionalParameter($participant)))
115-
->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type)));
116+
->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT)));
116117
return $this->findEntity($qb);
117118
}
118119

@@ -131,7 +132,7 @@ public function findByFolderAndUser(int $folderId, string $userId): Share {
131132
->from('bookmarks_shares', 's')
132133
->leftJoin('s', 'bookmarks_shared_to_shares', 't', 's.id = t.share_id')
133134
->leftJoin('t', 'bookmarks_shared_folders', 'sf', 'sf.id = t.shared_folder_id')
134-
->where($qb->expr()->eq('s.folder_id', $qb->createPositionalParameter($folderId)))
135+
->where($qb->expr()->eq('s.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)))
135136
->andWhere($qb->expr()->eq('sf.user_id', $qb->createPositionalParameter($userId)));
136137
return $this->findEntity($qb);
137138
}
@@ -176,14 +177,19 @@ public function insertOrUpdate(Entity $entity): Share {
176177
return parent::insertOrUpdate($entity);
177178
}
178179

180+
/**
181+
* @throws DoesNotExistException
182+
* @throws MultipleObjectsReturnedException
183+
* @throws Exception
184+
*/
179185
public function findBySharedFolder(int $id): Share {
180186
$qb = $this->db->getQueryBuilder();
181187
$qb->select(array_map(static function ($c) {
182188
return 's.' . $c;
183189
}, Share::$columns))
184190
->from('bookmarks_shares', 's')
185191
->innerJoin('s', 'bookmarks_shared_to_shares', 't', 's.id = t.share_id')
186-
->where($qb->expr()->eq('t.shared_folder_id', $qb->createPositionalParameter($id)));
192+
->where($qb->expr()->eq('t.shared_folder_id', $qb->createPositionalParameter($id, IQueryBuilder::PARAM_INT)));
187193
return $this->findEntity($qb);
188194
}
189195

lib/Db/SharedFolderMapper.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
1515
use OCP\AppFramework\Db\QBMapper;
1616
use OCP\DB\Exception;
17+
use OCP\DB\QueryBuilder\IQueryBuilder;
1718
use OCP\EventDispatcher\IEventDispatcher;
1819
use OCP\IDBConnection;
1920

@@ -55,7 +56,7 @@ public function find(int $id): SharedFolder {
5556
$qb = $this->db->getQueryBuilder();
5657
$qb->select(SharedFolder::$columns)
5758
->from('bookmarks_shared_folders', 'sf')
58-
->where($qb->expr()->eq('sf.id', $qb->createPositionalParameter($id)));
59+
->where($qb->expr()->eq('sf.id', $qb->createPositionalParameter($id, IQueryBuilder::PARAM_INT)));
5960
return $this->findEntity($qb);
6061
}
6162

@@ -68,7 +69,7 @@ public function findByShare(int $shareId): array {
6869
$qb->select(SharedFolder::$columns)
6970
->from('bookmarks_shared_folders', 'sf')
7071
->join('sf', 'bookmarks_shared_to_shares', 't', $qb->expr()->eq('sf.id', 't.shared_folder_id'))
71-
->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId)));
72+
->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT)));
7273
return $this->findEntities($qb);
7374
}
7475

@@ -82,7 +83,7 @@ public function findByFolder(int $folderId): array {
8283
return 'sf.' . $c;
8384
}, SharedFolder::$columns))
8485
->from('bookmarks_shared_folders', 'sf')
85-
->where($qb->expr()->eq('sf.folder_id', $qb->createPositionalParameter($folderId)));
86+
->where($qb->expr()->eq('sf.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)));
8687
return $this->findEntities($qb);
8788
}
8889

@@ -122,7 +123,7 @@ public function findByParticipant(int $type, string $participant): array {
122123
->leftJoin('p', 'bookmarks_shared_to_shares', 't', 'p.id = t.shared_folder_id')
123124
->leftJoin('t', 'bookmarks_shares', 's', 't.share_id = s.id')
124125
->where($qb->expr()->eq('s.participant', $qb->createPositionalParameter($participant)))
125-
->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type)));
126+
->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT)));
126127
return $this->findEntities($qb);
127128
}
128129

@@ -142,7 +143,7 @@ public function findByFolderAndParticipant(int $folderId, int $type, string $par
142143
->from('bookmarks_shared_folders', 'p')
143144
->leftJoin('p', 'bookmarks_shared_to_shares', 't', 't.shared_folder_id = p.id')
144145
->leftJoin('t', 'bookmarks_shares', 's', 't.share_id = s.id')
145-
->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId)))
146+
->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)))
146147
->andWhere($qb->expr()->eq('participant', $qb->createPositionalParameter($participant)))
147148
->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type)));
148149
return $this->findEntity($qb);
@@ -161,7 +162,7 @@ public function findByFolderAndUser(int $folderId, string $userId): SharedFolder
161162
return 'p.' . $c;
162163
}, SharedFolder::$columns))
163164
->from('bookmarks_shared_folders', 'p')
164-
->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId)))
165+
->where($qb->expr()->eq('p.folder_id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)))
165166
->andWhere($qb->expr()->eq('p.user_id', $qb->createPositionalParameter($userId)));
166167
return $this->findEntity($qb);
167168
}
@@ -199,7 +200,7 @@ public function findByShareAndUser(int $shareId, string $userId): SharedFolder {
199200
}, SharedFolder::$columns))
200201
->from('bookmarks_shared_folders', 'p')
201202
->leftJoin('p', 'bookmarks_shared_to_shares', 't', 't.shared_folder_id = p.id')
202-
->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId)))
203+
->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($shareId, IQueryBuilder::PARAM_INT)))
203204
->andWhere($qb->expr()->eq('p.user_id', $qb->createPositionalParameter($userId)));
204205
return $this->findEntity($qb);
205206
}
@@ -218,15 +219,15 @@ public function findByParticipantAndUser(int $type, string $participant, string
218219
->leftJoin('p', 'bookmarks_shared_to_shares', 't', 't.shared_folder_id = p.id')
219220
->leftJoin('t', 'bookmarks_shares', 's', 't.share_id = s.id')
220221
->where($qb->expr()->eq('s.participant', $qb->createPositionalParameter($participant)))
221-
->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type)))
222+
->andWhere($qb->expr()->eq('s.type', $qb->createPositionalParameter($type, IQueryBuilder::PARAM_INT)))
222223
->andWhere($qb->expr()->eq('p.user_id', $qb->createPositionalParameter($userId)));
223224
return $this->findEntities($qb);
224225
}
225226

226227
public function delete(Entity $entity): SharedFolder {
227228
$qb = $this->db->getQueryBuilder();
228229
$qb->delete('bookmarks_shared_to_shares')
229-
->where($qb->expr()->eq('shared_folder_id', $qb->createPositionalParameter($entity->getId())))
230+
->where($qb->expr()->eq('shared_folder_id', $qb->createPositionalParameter($entity->getId(), IQueryBuilder::PARAM_INT)))
230231
->execute();
231232
return parent::delete($entity);
232233
}
@@ -235,7 +236,7 @@ public function mount(int $id, int $share_id): void {
235236
$qb = $this->db->getQueryBuilder();
236237
$qb->insert('bookmarks_shared_to_shares')->values([
237238
'shared_folder_id' => $qb->createPositionalParameter($id),
238-
'share_id' => $qb->createPositionalParameter($share_id)
239+
'share_id' => $qb->createPositionalParameter($share_id, IQueryBuilder::PARAM_INT)
239240
])->execute();
240241
$this->eventDispatcher->dispatch(CreateEvent::class, new CreateEvent(
241242
TreeMapper::TYPE_SHARE,

lib/Db/TagMapper.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace OCA\Bookmarks\Db;
1010

11+
use OCP\DB\QueryBuilder\IQueryBuilder;
1112
use OCP\IDBConnection;
1213
use PDO;
1314

@@ -86,7 +87,7 @@ public function findByBookmark(int $bookmarkId): array {
8687

8788
$qb
8889
->from('bookmarks_tags', 't')
89-
->where($qb->expr()->eq('t.bookmark_id', $qb->createPositionalParameter($bookmarkId)));
90+
->where($qb->expr()->eq('t.bookmark_id', $qb->createPositionalParameter($bookmarkId, IQueryBuilder::PARAM_INT)));
9091

9192
return $qb->execute()->fetchAll(PDO::FETCH_COLUMN);
9293
}

lib/Db/TreeMapper.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ public function move(string $type, int $itemId, int $newParentFolderId, ?int $in
644644
$qb
645645
->update('bookmarks_tree')
646646
->set('parent_folder', $qb->createPositionalParameter($newParentFolderId, IQueryBuilder::PARAM_INT))
647-
->set('index', $qb->createPositionalParameter($index ?? $this->countChildren($newParentFolderId)))
647+
->set('index', $qb->createPositionalParameter($index ?? $this->countChildren($newParentFolderId), IQueryBuilder::PARAM_INT))
648648
->where($qb->expr()->eq('id', $qb->createPositionalParameter($itemId, IQueryBuilder::PARAM_INT)))
649649
->andWhere($qb->expr()->eq('type', $qb->createPositionalParameter($type)));
650650
$qb->execute();
@@ -919,7 +919,12 @@ public function getSubFolders(int $folderId, $layers = 0, ?bool $isSoftDeleted =
919919
return $array;
920920
}, $this->findChildren(TreeMapper::TYPE_FOLDER, $folderId, $isSoftDeleted));
921921
$shares = array_map(function (SharedFolder $sharedFolder) use ($layers, $folderId, $isSoftDeleted) {
922-
$share = $this->shareMapper->findBySharedFolder($sharedFolder->getId());
922+
try {
923+
$share = $this->shareMapper->findBySharedFolder($sharedFolder->getId());
924+
} catch (DoesNotExistException|MultipleObjectsReturnedException|Exception $e) {
925+
$this->logger->error('Failed to load a shared folder', ['exception' => $e]);
926+
return null;
927+
}
923928
$array = $sharedFolder->toArray();
924929
$array['id'] = $share->getFolderId();
925930
$array['userId'] = $share->getOwner();
@@ -930,6 +935,7 @@ public function getSubFolders(int $folderId, $layers = 0, ?bool $isSoftDeleted =
930935
}
931936
return $array;
932937
}, $this->findChildren(TreeMapper::TYPE_SHARE, $folderId, $isSoftDeleted));
938+
$shares = array_values(array_filter($shares, fn ($data) => $data !== null));
933939
if (count($shares) > 0) {
934940
array_push($folders, ...$shares);
935941
}

lib/Migration/OrphanedSharesRepairStep.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace OCA\Bookmarks\Migration;
1010

11+
use OCP\DB\QueryBuilder\IQueryBuilder;
1112
use OCP\IDBConnection;
1213
use OCP\Migration\IOutput;
1314
use OCP\Migration\IRepairStep;
@@ -50,14 +51,14 @@ public function run(IOutput $output) {
5051
$folders = $qb->select('f.id')
5152
->from('bookmarks_shared_folders', 'f')
5253
->join('f', 'bookmarks_shared_to_shares', 't', $qb->expr()->eq('f.id', 't.shared_folder_id'))
53-
->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($share)))
54+
->where($qb->expr()->eq('t.share_id', $qb->createPositionalParameter($share, IQueryBuilder::PARAM_INT)))
5455
->execute()
5556
->fetchAll(PDO::FETCH_COLUMN);
5657
foreach ($folders as $folderId) {
5758
$qb = $this->db->getQueryBuilder();
5859
$qb->delete('bookmarks_tree')
5960
->where($qb->expr()->eq('type', $qb->createPositionalParameter('share')))
60-
->andWhere($qb->expr()->eq('id', $qb->createPositionalParameter($folderId)))
61+
->andWhere($qb->expr()->eq('id', $qb->createPositionalParameter($folderId, IQueryBuilder::PARAM_INT)))
6162
->execute();
6263
}
6364
$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]);

lib/Migration/Version000014000Date20181029094721.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use Closure;
1212
use OCP\DB\ISchemaWrapper;
13+
use OCP\DB\QueryBuilder\IQueryBuilder;
1314
use OCP\IDBConnection;
1415
use OCP\Migration\IOutput;
1516
use OCP\Migration\SimpleMigrationStep;
@@ -77,15 +78,15 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array
7778
$qb
7879
->select('id', 'title', 'parent_folder')
7980
->from('bookmarks_folders')
80-
->where($qb->expr()->eq('parent_folder', $qb->createPositionalParameter($folder)))
81+
->where($qb->expr()->eq('parent_folder', $qb->createPositionalParameter($folder, IQueryBuilder::PARAM_INT)))
8182
->orderBy('title', 'DESC');
8283
$childFolders = $qb->execute()->fetchAll();
8384

8485
$qb = $this->db->getQueryBuilder();
8586
$qb
8687
->select('bookmark_id')
8788
->from('bookmarks_folders_bookmarks')
88-
->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folder)));
89+
->where($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folder, IQueryBuilder::PARAM_INT)));
8990
$childBookmarks = $qb->execute()->fetchAll();
9091

9192
$children = array_merge($childFolders, $childBookmarks);
@@ -103,7 +104,7 @@ public function postSchemaChange(IOutput $output, Closure $schemaClosure, array
103104
$qb = $this->db->getQueryBuilder();
104105
$qb
105106
->update('bookmarks_folders_bookmarks')
106-
->set('index', $qb->createPositionalParameter($i))
107+
->set('index', $qb->createPositionalParameter($i, IQueryBuilder::PARAM_INT))
107108
->where($qb->expr()->eq('bookmark_id', $qb->createPositionalParameter($child['id'])))
108109
->andWhere($qb->expr()->eq('folder_id', $qb->createPositionalParameter($folder)));
109110
$qb->execute();

0 commit comments

Comments
 (0)