Passed
Push — master ( d8314b...922fd4 )
by Morris
18:41 queued 08:35
created
lib/private/Share20/DefaultShareProvider.php 1 patch
Indentation   +1287 added lines, -1287 removed lines patch added patch discarded remove patch
@@ -58,1324 +58,1324 @@
 block discarded – undo
58 58
  */
59 59
 class DefaultShareProvider implements IShareProvider {
60 60
 
61
-	// Special share type for user modified group shares
62
-	const SHARE_TYPE_USERGROUP = 2;
63
-
64
-	/** @var IDBConnection */
65
-	private $dbConn;
66
-
67
-	/** @var IUserManager */
68
-	private $userManager;
69
-
70
-	/** @var IGroupManager */
71
-	private $groupManager;
72
-
73
-	/** @var IRootFolder */
74
-	private $rootFolder;
75
-
76
-	/** @var IMailer */
77
-	private $mailer;
78
-
79
-	/** @var Defaults */
80
-	private $defaults;
81
-
82
-	/** @var IL10N */
83
-	private $l;
84
-
85
-	/** @var IURLGenerator */
86
-	private $urlGenerator;
87
-
88
-	/**
89
-	 * DefaultShareProvider constructor.
90
-	 *
91
-	 * @param IDBConnection $connection
92
-	 * @param IUserManager $userManager
93
-	 * @param IGroupManager $groupManager
94
-	 * @param IRootFolder $rootFolder
95
-	 * @param IMailer $mailer ;
96
-	 * @param Defaults $defaults
97
-	 * @param IL10N $l
98
-	 * @param IURLGenerator $urlGenerator
99
-	 */
100
-	public function __construct(
101
-			IDBConnection $connection,
102
-			IUserManager $userManager,
103
-			IGroupManager $groupManager,
104
-			IRootFolder $rootFolder,
105
-			IMailer $mailer,
106
-			Defaults $defaults,
107
-			IL10N $l,
108
-			IURLGenerator $urlGenerator) {
109
-		$this->dbConn = $connection;
110
-		$this->userManager = $userManager;
111
-		$this->groupManager = $groupManager;
112
-		$this->rootFolder = $rootFolder;
113
-		$this->mailer = $mailer;
114
-		$this->defaults = $defaults;
115
-		$this->l = $l;
116
-		$this->urlGenerator = $urlGenerator;
117
-	}
118
-
119
-	/**
120
-	 * Return the identifier of this provider.
121
-	 *
122
-	 * @return string Containing only [a-zA-Z0-9]
123
-	 */
124
-	public function identifier() {
125
-		return 'ocinternal';
126
-	}
127
-
128
-	/**
129
-	 * Share a path
130
-	 *
131
-	 * @param \OCP\Share\IShare $share
132
-	 * @return \OCP\Share\IShare The share object
133
-	 * @throws ShareNotFound
134
-	 * @throws \Exception
135
-	 */
136
-	public function create(\OCP\Share\IShare $share) {
137
-		$qb = $this->dbConn->getQueryBuilder();
138
-
139
-		$qb->insert('share');
140
-		$qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
141
-
142
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
143
-			//Set the UID of the user we share with
144
-			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
145
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
146
-			//Set the GID of the group we share with
147
-			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
148
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
149
-			//set label for public link
150
-			$qb->setValue('label', $qb->createNamedParameter($share->getLabel()));
151
-			//Set the token of the share
152
-			$qb->setValue('token', $qb->createNamedParameter($share->getToken()));
153
-
154
-			//If a password is set store it
155
-			if ($share->getPassword() !== null) {
156
-				$qb->setValue('password', $qb->createNamedParameter($share->getPassword()));
157
-			}
158
-
159
-			$qb->setValue('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL));
160
-
161
-			//If an expiration date is set store it
162
-			if ($share->getExpirationDate() !== null) {
163
-				$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
164
-			}
165
-
166
-			if (method_exists($share, 'getParent')) {
167
-				$qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
168
-			}
169
-		} else {
170
-			throw new \Exception('invalid share type!');
171
-		}
172
-
173
-		// Set what is shares
174
-		$qb->setValue('item_type', $qb->createParameter('itemType'));
175
-		if ($share->getNode() instanceof \OCP\Files\File) {
176
-			$qb->setParameter('itemType', 'file');
177
-		} else {
178
-			$qb->setParameter('itemType', 'folder');
179
-		}
180
-
181
-		// Set the file id
182
-		$qb->setValue('item_source', $qb->createNamedParameter($share->getNode()->getId()));
183
-		$qb->setValue('file_source', $qb->createNamedParameter($share->getNode()->getId()));
184
-
185
-		// set the permissions
186
-		$qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions()));
187
-
188
-		// Set who created this share
189
-		$qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()));
190
-
191
-		// Set who is the owner of this file/folder (and this the owner of the share)
192
-		$qb->setValue('uid_owner', $qb->createNamedParameter($share->getShareOwner()));
193
-
194
-		// Set the file target
195
-		$qb->setValue('file_target', $qb->createNamedParameter($share->getTarget()));
196
-
197
-		// Set the time this share was created
198
-		$qb->setValue('stime', $qb->createNamedParameter(time()));
199
-
200
-		// insert the data and fetch the id of the share
201
-		$this->dbConn->beginTransaction();
202
-		$qb->execute();
203
-		$id = $this->dbConn->lastInsertId('*PREFIX*share');
204
-
205
-		// Now fetch the inserted share and create a complete share object
206
-		$qb = $this->dbConn->getQueryBuilder();
207
-		$qb->select('*')
208
-			->from('share')
209
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
210
-
211
-		$cursor = $qb->execute();
212
-		$data = $cursor->fetch();
213
-		$this->dbConn->commit();
214
-		$cursor->closeCursor();
215
-
216
-		if ($data === false) {
217
-			throw new ShareNotFound();
218
-		}
219
-
220
-		$mailSendValue = $share->getMailSend();
221
-		$data['mail_send'] = ($mailSendValue === null) ? true : $mailSendValue;
222
-
223
-		$share = $this->createShare($data);
224
-		return $share;
225
-	}
226
-
227
-	/**
228
-	 * Update a share
229
-	 *
230
-	 * @param \OCP\Share\IShare $share
231
-	 * @return \OCP\Share\IShare The share object
232
-	 * @throws ShareNotFound
233
-	 * @throws \OCP\Files\InvalidPathException
234
-	 * @throws \OCP\Files\NotFoundException
235
-	 */
236
-	public function update(\OCP\Share\IShare $share) {
237
-
238
-		$originalShare = $this->getShareById($share->getId());
239
-
240
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
241
-			/*
61
+    // Special share type for user modified group shares
62
+    const SHARE_TYPE_USERGROUP = 2;
63
+
64
+    /** @var IDBConnection */
65
+    private $dbConn;
66
+
67
+    /** @var IUserManager */
68
+    private $userManager;
69
+
70
+    /** @var IGroupManager */
71
+    private $groupManager;
72
+
73
+    /** @var IRootFolder */
74
+    private $rootFolder;
75
+
76
+    /** @var IMailer */
77
+    private $mailer;
78
+
79
+    /** @var Defaults */
80
+    private $defaults;
81
+
82
+    /** @var IL10N */
83
+    private $l;
84
+
85
+    /** @var IURLGenerator */
86
+    private $urlGenerator;
87
+
88
+    /**
89
+     * DefaultShareProvider constructor.
90
+     *
91
+     * @param IDBConnection $connection
92
+     * @param IUserManager $userManager
93
+     * @param IGroupManager $groupManager
94
+     * @param IRootFolder $rootFolder
95
+     * @param IMailer $mailer ;
96
+     * @param Defaults $defaults
97
+     * @param IL10N $l
98
+     * @param IURLGenerator $urlGenerator
99
+     */
100
+    public function __construct(
101
+            IDBConnection $connection,
102
+            IUserManager $userManager,
103
+            IGroupManager $groupManager,
104
+            IRootFolder $rootFolder,
105
+            IMailer $mailer,
106
+            Defaults $defaults,
107
+            IL10N $l,
108
+            IURLGenerator $urlGenerator) {
109
+        $this->dbConn = $connection;
110
+        $this->userManager = $userManager;
111
+        $this->groupManager = $groupManager;
112
+        $this->rootFolder = $rootFolder;
113
+        $this->mailer = $mailer;
114
+        $this->defaults = $defaults;
115
+        $this->l = $l;
116
+        $this->urlGenerator = $urlGenerator;
117
+    }
118
+
119
+    /**
120
+     * Return the identifier of this provider.
121
+     *
122
+     * @return string Containing only [a-zA-Z0-9]
123
+     */
124
+    public function identifier() {
125
+        return 'ocinternal';
126
+    }
127
+
128
+    /**
129
+     * Share a path
130
+     *
131
+     * @param \OCP\Share\IShare $share
132
+     * @return \OCP\Share\IShare The share object
133
+     * @throws ShareNotFound
134
+     * @throws \Exception
135
+     */
136
+    public function create(\OCP\Share\IShare $share) {
137
+        $qb = $this->dbConn->getQueryBuilder();
138
+
139
+        $qb->insert('share');
140
+        $qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
141
+
142
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
143
+            //Set the UID of the user we share with
144
+            $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
145
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
146
+            //Set the GID of the group we share with
147
+            $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
148
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
149
+            //set label for public link
150
+            $qb->setValue('label', $qb->createNamedParameter($share->getLabel()));
151
+            //Set the token of the share
152
+            $qb->setValue('token', $qb->createNamedParameter($share->getToken()));
153
+
154
+            //If a password is set store it
155
+            if ($share->getPassword() !== null) {
156
+                $qb->setValue('password', $qb->createNamedParameter($share->getPassword()));
157
+            }
158
+
159
+            $qb->setValue('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL));
160
+
161
+            //If an expiration date is set store it
162
+            if ($share->getExpirationDate() !== null) {
163
+                $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
164
+            }
165
+
166
+            if (method_exists($share, 'getParent')) {
167
+                $qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
168
+            }
169
+        } else {
170
+            throw new \Exception('invalid share type!');
171
+        }
172
+
173
+        // Set what is shares
174
+        $qb->setValue('item_type', $qb->createParameter('itemType'));
175
+        if ($share->getNode() instanceof \OCP\Files\File) {
176
+            $qb->setParameter('itemType', 'file');
177
+        } else {
178
+            $qb->setParameter('itemType', 'folder');
179
+        }
180
+
181
+        // Set the file id
182
+        $qb->setValue('item_source', $qb->createNamedParameter($share->getNode()->getId()));
183
+        $qb->setValue('file_source', $qb->createNamedParameter($share->getNode()->getId()));
184
+
185
+        // set the permissions
186
+        $qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions()));
187
+
188
+        // Set who created this share
189
+        $qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()));
190
+
191
+        // Set who is the owner of this file/folder (and this the owner of the share)
192
+        $qb->setValue('uid_owner', $qb->createNamedParameter($share->getShareOwner()));
193
+
194
+        // Set the file target
195
+        $qb->setValue('file_target', $qb->createNamedParameter($share->getTarget()));
196
+
197
+        // Set the time this share was created
198
+        $qb->setValue('stime', $qb->createNamedParameter(time()));
199
+
200
+        // insert the data and fetch the id of the share
201
+        $this->dbConn->beginTransaction();
202
+        $qb->execute();
203
+        $id = $this->dbConn->lastInsertId('*PREFIX*share');
204
+
205
+        // Now fetch the inserted share and create a complete share object
206
+        $qb = $this->dbConn->getQueryBuilder();
207
+        $qb->select('*')
208
+            ->from('share')
209
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
210
+
211
+        $cursor = $qb->execute();
212
+        $data = $cursor->fetch();
213
+        $this->dbConn->commit();
214
+        $cursor->closeCursor();
215
+
216
+        if ($data === false) {
217
+            throw new ShareNotFound();
218
+        }
219
+
220
+        $mailSendValue = $share->getMailSend();
221
+        $data['mail_send'] = ($mailSendValue === null) ? true : $mailSendValue;
222
+
223
+        $share = $this->createShare($data);
224
+        return $share;
225
+    }
226
+
227
+    /**
228
+     * Update a share
229
+     *
230
+     * @param \OCP\Share\IShare $share
231
+     * @return \OCP\Share\IShare The share object
232
+     * @throws ShareNotFound
233
+     * @throws \OCP\Files\InvalidPathException
234
+     * @throws \OCP\Files\NotFoundException
235
+     */
236
+    public function update(\OCP\Share\IShare $share) {
237
+
238
+        $originalShare = $this->getShareById($share->getId());
239
+
240
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
241
+            /*
242 242
 			 * We allow updating the recipient on user shares.
243 243
 			 */
244
-			$qb = $this->dbConn->getQueryBuilder();
245
-			$qb->update('share')
246
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
247
-				->set('share_with', $qb->createNamedParameter($share->getSharedWith()))
248
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
249
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
250
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
251
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
252
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
253
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
254
-				->set('note', $qb->createNamedParameter($share->getNote()))
255
-				->execute();
256
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
257
-			$qb = $this->dbConn->getQueryBuilder();
258
-			$qb->update('share')
259
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
260
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
261
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
262
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
263
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
264
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
265
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
266
-				->set('note', $qb->createNamedParameter($share->getNote()))
267
-				->execute();
268
-
269
-			/*
244
+            $qb = $this->dbConn->getQueryBuilder();
245
+            $qb->update('share')
246
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
247
+                ->set('share_with', $qb->createNamedParameter($share->getSharedWith()))
248
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
249
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
250
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
251
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
252
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
253
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
254
+                ->set('note', $qb->createNamedParameter($share->getNote()))
255
+                ->execute();
256
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
257
+            $qb = $this->dbConn->getQueryBuilder();
258
+            $qb->update('share')
259
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
260
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
261
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
262
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
263
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
264
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
265
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
266
+                ->set('note', $qb->createNamedParameter($share->getNote()))
267
+                ->execute();
268
+
269
+            /*
270 270
 			 * Update all user defined group shares
271 271
 			 */
272
-			$qb = $this->dbConn->getQueryBuilder();
273
-			$qb->update('share')
274
-				->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
275
-				->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
276
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
277
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
278
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
279
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
280
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
281
-				->set('note', $qb->createNamedParameter($share->getNote()))
282
-				->execute();
283
-
284
-			/*
272
+            $qb = $this->dbConn->getQueryBuilder();
273
+            $qb->update('share')
274
+                ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
275
+                ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
276
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
277
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
278
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
279
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
280
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
281
+                ->set('note', $qb->createNamedParameter($share->getNote()))
282
+                ->execute();
283
+
284
+            /*
285 285
 			 * Now update the permissions for all children that have not set it to 0
286 286
 			 */
287
-			$qb = $this->dbConn->getQueryBuilder();
288
-			$qb->update('share')
289
-				->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
290
-				->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
291
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
292
-				->execute();
293
-
294
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
295
-			$qb = $this->dbConn->getQueryBuilder();
296
-			$qb->update('share')
297
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
298
-				->set('password', $qb->createNamedParameter($share->getPassword()))
299
-				->set('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL))
300
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
301
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
302
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
303
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
304
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
305
-				->set('token', $qb->createNamedParameter($share->getToken()))
306
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
307
-				->set('note', $qb->createNamedParameter($share->getNote()))
308
-				->set('label', $qb->createNamedParameter($share->getLabel()))
309
-				->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT)
310
-				->execute();
311
-		}
312
-
313
-		if ($originalShare->getNote() !== $share->getNote() && $share->getNote() !== '') {
314
-			$this->propagateNote($share);
315
-		}
316
-
317
-
318
-		return $share;
319
-	}
320
-
321
-	/**
322
-	 * Get all children of this share
323
-	 * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
324
-	 *
325
-	 * @param \OCP\Share\IShare $parent
326
-	 * @return \OCP\Share\IShare[]
327
-	 */
328
-	public function getChildren(\OCP\Share\IShare $parent) {
329
-		$children = [];
330
-
331
-		$qb = $this->dbConn->getQueryBuilder();
332
-		$qb->select('*')
333
-			->from('share')
334
-			->where($qb->expr()->eq('parent', $qb->createNamedParameter($parent->getId())))
335
-			->andWhere(
336
-				$qb->expr()->in(
337
-					'share_type',
338
-					$qb->createNamedParameter([
339
-						\OCP\Share::SHARE_TYPE_USER,
340
-						\OCP\Share::SHARE_TYPE_GROUP,
341
-						\OCP\Share::SHARE_TYPE_LINK,
342
-					], IQueryBuilder::PARAM_INT_ARRAY)
343
-				)
344
-			)
345
-			->andWhere($qb->expr()->orX(
346
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
347
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
348
-			))
349
-			->orderBy('id');
350
-
351
-		$cursor = $qb->execute();
352
-		while($data = $cursor->fetch()) {
353
-			$children[] = $this->createShare($data);
354
-		}
355
-		$cursor->closeCursor();
356
-
357
-		return $children;
358
-	}
359
-
360
-	/**
361
-	 * Delete a share
362
-	 *
363
-	 * @param \OCP\Share\IShare $share
364
-	 */
365
-	public function delete(\OCP\Share\IShare $share) {
366
-		$qb = $this->dbConn->getQueryBuilder();
367
-		$qb->delete('share')
368
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())));
369
-
370
-		/*
287
+            $qb = $this->dbConn->getQueryBuilder();
288
+            $qb->update('share')
289
+                ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
290
+                ->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
291
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
292
+                ->execute();
293
+
294
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
295
+            $qb = $this->dbConn->getQueryBuilder();
296
+            $qb->update('share')
297
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
298
+                ->set('password', $qb->createNamedParameter($share->getPassword()))
299
+                ->set('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL))
300
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
301
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
302
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
303
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
304
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
305
+                ->set('token', $qb->createNamedParameter($share->getToken()))
306
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
307
+                ->set('note', $qb->createNamedParameter($share->getNote()))
308
+                ->set('label', $qb->createNamedParameter($share->getLabel()))
309
+                ->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT)
310
+                ->execute();
311
+        }
312
+
313
+        if ($originalShare->getNote() !== $share->getNote() && $share->getNote() !== '') {
314
+            $this->propagateNote($share);
315
+        }
316
+
317
+
318
+        return $share;
319
+    }
320
+
321
+    /**
322
+     * Get all children of this share
323
+     * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
324
+     *
325
+     * @param \OCP\Share\IShare $parent
326
+     * @return \OCP\Share\IShare[]
327
+     */
328
+    public function getChildren(\OCP\Share\IShare $parent) {
329
+        $children = [];
330
+
331
+        $qb = $this->dbConn->getQueryBuilder();
332
+        $qb->select('*')
333
+            ->from('share')
334
+            ->where($qb->expr()->eq('parent', $qb->createNamedParameter($parent->getId())))
335
+            ->andWhere(
336
+                $qb->expr()->in(
337
+                    'share_type',
338
+                    $qb->createNamedParameter([
339
+                        \OCP\Share::SHARE_TYPE_USER,
340
+                        \OCP\Share::SHARE_TYPE_GROUP,
341
+                        \OCP\Share::SHARE_TYPE_LINK,
342
+                    ], IQueryBuilder::PARAM_INT_ARRAY)
343
+                )
344
+            )
345
+            ->andWhere($qb->expr()->orX(
346
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
347
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
348
+            ))
349
+            ->orderBy('id');
350
+
351
+        $cursor = $qb->execute();
352
+        while($data = $cursor->fetch()) {
353
+            $children[] = $this->createShare($data);
354
+        }
355
+        $cursor->closeCursor();
356
+
357
+        return $children;
358
+    }
359
+
360
+    /**
361
+     * Delete a share
362
+     *
363
+     * @param \OCP\Share\IShare $share
364
+     */
365
+    public function delete(\OCP\Share\IShare $share) {
366
+        $qb = $this->dbConn->getQueryBuilder();
367
+        $qb->delete('share')
368
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())));
369
+
370
+        /*
371 371
 		 * If the share is a group share delete all possible
372 372
 		 * user defined groups shares.
373 373
 		 */
374
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
375
-			$qb->orWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())));
376
-		}
377
-
378
-		$qb->execute();
379
-	}
380
-
381
-	/**
382
-	 * Unshare a share from the recipient. If this is a group share
383
-	 * this means we need a special entry in the share db.
384
-	 *
385
-	 * @param \OCP\Share\IShare $share
386
-	 * @param string $recipient UserId of recipient
387
-	 * @throws BackendError
388
-	 * @throws ProviderException
389
-	 */
390
-	public function deleteFromSelf(\OCP\Share\IShare $share, $recipient) {
391
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
392
-
393
-			$group = $this->groupManager->get($share->getSharedWith());
394
-			$user = $this->userManager->get($recipient);
395
-
396
-			if (is_null($group)) {
397
-				throw new ProviderException('Group "' . $share->getSharedWith() . '" does not exist');
398
-			}
399
-
400
-			if (!$group->inGroup($user)) {
401
-				throw new ProviderException('Recipient not in receiving group');
402
-			}
403
-
404
-			// Try to fetch user specific share
405
-			$qb = $this->dbConn->getQueryBuilder();
406
-			$stmt = $qb->select('*')
407
-				->from('share')
408
-				->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
409
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
410
-				->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
411
-				->andWhere($qb->expr()->orX(
412
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
413
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
414
-				))
415
-				->execute();
416
-
417
-			$data = $stmt->fetch();
418
-
419
-			/*
374
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
375
+            $qb->orWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())));
376
+        }
377
+
378
+        $qb->execute();
379
+    }
380
+
381
+    /**
382
+     * Unshare a share from the recipient. If this is a group share
383
+     * this means we need a special entry in the share db.
384
+     *
385
+     * @param \OCP\Share\IShare $share
386
+     * @param string $recipient UserId of recipient
387
+     * @throws BackendError
388
+     * @throws ProviderException
389
+     */
390
+    public function deleteFromSelf(\OCP\Share\IShare $share, $recipient) {
391
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
392
+
393
+            $group = $this->groupManager->get($share->getSharedWith());
394
+            $user = $this->userManager->get($recipient);
395
+
396
+            if (is_null($group)) {
397
+                throw new ProviderException('Group "' . $share->getSharedWith() . '" does not exist');
398
+            }
399
+
400
+            if (!$group->inGroup($user)) {
401
+                throw new ProviderException('Recipient not in receiving group');
402
+            }
403
+
404
+            // Try to fetch user specific share
405
+            $qb = $this->dbConn->getQueryBuilder();
406
+            $stmt = $qb->select('*')
407
+                ->from('share')
408
+                ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
409
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
410
+                ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
411
+                ->andWhere($qb->expr()->orX(
412
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
413
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
414
+                ))
415
+                ->execute();
416
+
417
+            $data = $stmt->fetch();
418
+
419
+            /*
420 420
 			 * Check if there already is a user specific group share.
421 421
 			 * If there is update it (if required).
422 422
 			 */
423
-			if ($data === false) {
424
-				$qb = $this->dbConn->getQueryBuilder();
425
-
426
-				$type = $share->getNodeType();
427
-
428
-				//Insert new share
429
-				$qb->insert('share')
430
-					->values([
431
-						'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
432
-						'share_with' => $qb->createNamedParameter($recipient),
433
-						'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
434
-						'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
435
-						'parent' => $qb->createNamedParameter($share->getId()),
436
-						'item_type' => $qb->createNamedParameter($type),
437
-						'item_source' => $qb->createNamedParameter($share->getNodeId()),
438
-						'file_source' => $qb->createNamedParameter($share->getNodeId()),
439
-						'file_target' => $qb->createNamedParameter($share->getTarget()),
440
-						'permissions' => $qb->createNamedParameter(0),
441
-						'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
442
-					])->execute();
443
-
444
-			} else if ($data['permissions'] !== 0) {
445
-
446
-				// Update existing usergroup share
447
-				$qb = $this->dbConn->getQueryBuilder();
448
-				$qb->update('share')
449
-					->set('permissions', $qb->createNamedParameter(0))
450
-					->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
451
-					->execute();
452
-			}
453
-
454
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
455
-
456
-			if ($share->getSharedWith() !== $recipient) {
457
-				throw new ProviderException('Recipient does not match');
458
-			}
459
-
460
-			// We can just delete user and link shares
461
-			$this->delete($share);
462
-		} else {
463
-			throw new ProviderException('Invalid shareType');
464
-		}
465
-	}
466
-
467
-	/**
468
-	 * @inheritdoc
469
-	 *
470
-	 * For now this only works for group shares
471
-	 * If this gets implemented for normal shares we have to extend it
472
-	 */
473
-	public function restore(IShare $share, string $recipient): IShare {
474
-		$qb = $this->dbConn->getQueryBuilder();
475
-		$qb->select('permissions')
476
-			->from('share')
477
-			->where(
478
-				$qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))
479
-			);
480
-		$cursor = $qb->execute();
481
-		$data = $cursor->fetch();
482
-		$cursor->closeCursor();
483
-
484
-		$originalPermission = $data['permissions'];
485
-
486
-		$qb = $this->dbConn->getQueryBuilder();
487
-		$qb->update('share')
488
-			->set('permissions', $qb->createNamedParameter($originalPermission))
489
-			->where(
490
-				$qb->expr()->eq('parent', $qb->createNamedParameter($share->getParent()))
491
-			)->andWhere(
492
-				$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
493
-			)->andWhere(
494
-				$qb->expr()->eq('share_with', $qb->createNamedParameter($recipient))
495
-			);
496
-
497
-		$qb->execute();
498
-
499
-		return $this->getShareById($share->getId(), $recipient);
500
-	}
501
-
502
-	/**
503
-	 * @inheritdoc
504
-	 */
505
-	public function move(\OCP\Share\IShare $share, $recipient) {
506
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
507
-			// Just update the target
508
-			$qb = $this->dbConn->getQueryBuilder();
509
-			$qb->update('share')
510
-				->set('file_target', $qb->createNamedParameter($share->getTarget()))
511
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
512
-				->execute();
513
-
514
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
515
-
516
-			// Check if there is a usergroup share
517
-			$qb = $this->dbConn->getQueryBuilder();
518
-			$stmt = $qb->select('id')
519
-				->from('share')
520
-				->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
521
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
522
-				->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
523
-				->andWhere($qb->expr()->orX(
524
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
525
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
526
-				))
527
-				->setMaxResults(1)
528
-				->execute();
529
-
530
-			$data = $stmt->fetch();
531
-			$stmt->closeCursor();
532
-
533
-			if ($data === false) {
534
-				// No usergroup share yet. Create one.
535
-				$qb = $this->dbConn->getQueryBuilder();
536
-				$qb->insert('share')
537
-					->values([
538
-						'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
539
-						'share_with' => $qb->createNamedParameter($recipient),
540
-						'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
541
-						'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
542
-						'parent' => $qb->createNamedParameter($share->getId()),
543
-						'item_type' => $qb->createNamedParameter($share->getNodeType()),
544
-						'item_source' => $qb->createNamedParameter($share->getNodeId()),
545
-						'file_source' => $qb->createNamedParameter($share->getNodeId()),
546
-						'file_target' => $qb->createNamedParameter($share->getTarget()),
547
-						'permissions' => $qb->createNamedParameter($share->getPermissions()),
548
-						'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
549
-					])->execute();
550
-			} else {
551
-				// Already a usergroup share. Update it.
552
-				$qb = $this->dbConn->getQueryBuilder();
553
-				$qb->update('share')
554
-					->set('file_target', $qb->createNamedParameter($share->getTarget()))
555
-					->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
556
-					->execute();
557
-			}
558
-		}
559
-
560
-		return $share;
561
-	}
562
-
563
-	public function getSharesInFolder($userId, Folder $node, $reshares) {
564
-		$qb = $this->dbConn->getQueryBuilder();
565
-		$qb->select('*')
566
-			->from('share', 's')
567
-			->andWhere($qb->expr()->orX(
568
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
569
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
570
-			));
571
-
572
-		$qb->andWhere($qb->expr()->orX(
573
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
574
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
575
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
576
-		));
577
-
578
-		/**
579
-		 * Reshares for this user are shares where they are the owner.
580
-		 */
581
-		if ($reshares === false) {
582
-			$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
583
-		} else {
584
-			$qb->andWhere(
585
-				$qb->expr()->orX(
586
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
587
-					$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
588
-				)
589
-			);
590
-		}
591
-
592
-		$qb->innerJoin('s', 'filecache' ,'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
593
-		$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
594
-
595
-		$qb->orderBy('id');
596
-
597
-		$cursor = $qb->execute();
598
-		$shares = [];
599
-		while ($data = $cursor->fetch()) {
600
-			$shares[$data['fileid']][] = $this->createShare($data);
601
-		}
602
-		$cursor->closeCursor();
603
-
604
-		return $shares;
605
-	}
606
-
607
-	/**
608
-	 * @inheritdoc
609
-	 */
610
-	public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset) {
611
-		$qb = $this->dbConn->getQueryBuilder();
612
-		$qb->select('*')
613
-			->from('share')
614
-			->andWhere($qb->expr()->orX(
615
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
616
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
617
-			));
618
-
619
-		$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
620
-
621
-		/**
622
-		 * Reshares for this user are shares where they are the owner.
623
-		 */
624
-		if ($reshares === false) {
625
-			$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
626
-		} else {
627
-			if ($node === null) {
628
-				$qb->andWhere(
629
-					$qb->expr()->orX(
630
-						$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
631
-						$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
632
-					)
633
-				);
634
-			}
635
-		}
636
-
637
-		if ($node !== null) {
638
-			$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
639
-		}
640
-
641
-		if ($limit !== -1) {
642
-			$qb->setMaxResults($limit);
643
-		}
644
-
645
-		$qb->setFirstResult($offset);
646
-		$qb->orderBy('id');
647
-
648
-		$cursor = $qb->execute();
649
-		$shares = [];
650
-		while($data = $cursor->fetch()) {
651
-			$shares[] = $this->createShare($data);
652
-		}
653
-		$cursor->closeCursor();
654
-
655
-		return $shares;
656
-	}
657
-
658
-	/**
659
-	 * @inheritdoc
660
-	 */
661
-	public function getShareById($id, $recipientId = null) {
662
-		$qb = $this->dbConn->getQueryBuilder();
663
-
664
-		$qb->select('*')
665
-			->from('share')
666
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
667
-			->andWhere(
668
-				$qb->expr()->in(
669
-					'share_type',
670
-					$qb->createNamedParameter([
671
-						\OCP\Share::SHARE_TYPE_USER,
672
-						\OCP\Share::SHARE_TYPE_GROUP,
673
-						\OCP\Share::SHARE_TYPE_LINK,
674
-					], IQueryBuilder::PARAM_INT_ARRAY)
675
-				)
676
-			)
677
-			->andWhere($qb->expr()->orX(
678
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
679
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
680
-			));
681
-
682
-		$cursor = $qb->execute();
683
-		$data = $cursor->fetch();
684
-		$cursor->closeCursor();
685
-
686
-		if ($data === false) {
687
-			throw new ShareNotFound();
688
-		}
689
-
690
-		try {
691
-			$share = $this->createShare($data);
692
-		} catch (InvalidShare $e) {
693
-			throw new ShareNotFound();
694
-		}
695
-
696
-		// If the recipient is set for a group share resolve to that user
697
-		if ($recipientId !== null && $share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
698
-			$share = $this->resolveGroupShares([$share], $recipientId)[0];
699
-		}
700
-
701
-		return $share;
702
-	}
703
-
704
-	/**
705
-	 * Get shares for a given path
706
-	 *
707
-	 * @param \OCP\Files\Node $path
708
-	 * @return \OCP\Share\IShare[]
709
-	 */
710
-	public function getSharesByPath(Node $path) {
711
-		$qb = $this->dbConn->getQueryBuilder();
712
-
713
-		$cursor = $qb->select('*')
714
-			->from('share')
715
-			->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
716
-			->andWhere(
717
-				$qb->expr()->orX(
718
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
719
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))
720
-				)
721
-			)
722
-			->andWhere($qb->expr()->orX(
723
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
724
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
725
-			))
726
-			->execute();
727
-
728
-		$shares = [];
729
-		while($data = $cursor->fetch()) {
730
-			$shares[] = $this->createShare($data);
731
-		}
732
-		$cursor->closeCursor();
733
-
734
-		return $shares;
735
-	}
736
-
737
-	/**
738
-	 * Returns whether the given database result can be interpreted as
739
-	 * a share with accessible file (not trashed, not deleted)
740
-	 */
741
-	private function isAccessibleResult($data) {
742
-		// exclude shares leading to deleted file entries
743
-		if ($data['fileid'] === null) {
744
-			return false;
745
-		}
746
-
747
-		// exclude shares leading to trashbin on home storages
748
-		$pathSections = explode('/', $data['path'], 2);
749
-		// FIXME: would not detect rare md5'd home storage case properly
750
-		if ($pathSections[0] !== 'files'
751
-		    	&& in_array(explode(':', $data['storage_string_id'], 2)[0], array('home', 'object'))) {
752
-			return false;
753
-		}
754
-		return true;
755
-	}
756
-
757
-	/**
758
-	 * @inheritdoc
759
-	 */
760
-	public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
761
-		/** @var Share[] $shares */
762
-		$shares = [];
763
-
764
-		if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
765
-			//Get shares directly with this user
766
-			$qb = $this->dbConn->getQueryBuilder();
767
-			$qb->select('s.*',
768
-				'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
769
-				'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
770
-				'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
771
-			)
772
-				->selectAlias('st.id', 'storage_string_id')
773
-				->from('share', 's')
774
-				->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
775
-				->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
776
-
777
-			// Order by id
778
-			$qb->orderBy('s.id');
779
-
780
-			// Set limit and offset
781
-			if ($limit !== -1) {
782
-				$qb->setMaxResults($limit);
783
-			}
784
-			$qb->setFirstResult($offset);
785
-
786
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)))
787
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
788
-				->andWhere($qb->expr()->orX(
789
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
790
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
791
-				));
792
-
793
-			// Filter by node if provided
794
-			if ($node !== null) {
795
-				$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
796
-			}
797
-
798
-			$cursor = $qb->execute();
799
-
800
-			while($data = $cursor->fetch()) {
801
-				if ($this->isAccessibleResult($data)) {
802
-					$shares[] = $this->createShare($data);
803
-				}
804
-			}
805
-			$cursor->closeCursor();
806
-
807
-		} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
808
-			$user = $this->userManager->get($userId);
809
-			$allGroups = $this->groupManager->getUserGroups($user);
810
-
811
-			/** @var Share[] $shares2 */
812
-			$shares2 = [];
813
-
814
-			$start = 0;
815
-			while(true) {
816
-				$groups = array_slice($allGroups, $start, 100);
817
-				$start += 100;
818
-
819
-				if ($groups === []) {
820
-					break;
821
-				}
822
-
823
-				$qb = $this->dbConn->getQueryBuilder();
824
-				$qb->select('s.*',
825
-					'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
826
-					'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
827
-					'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
828
-				)
829
-					->selectAlias('st.id', 'storage_string_id')
830
-					->from('share', 's')
831
-					->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
832
-					->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
833
-					->orderBy('s.id')
834
-					->setFirstResult(0);
835
-
836
-				if ($limit !== -1) {
837
-					$qb->setMaxResults($limit - count($shares));
838
-				}
839
-
840
-				// Filter by node if provided
841
-				if ($node !== null) {
842
-					$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
843
-				}
844
-
845
-
846
-				$groups = array_filter($groups, function($group) { return $group instanceof IGroup; });
847
-				$groups = array_map(function(IGroup $group) { return $group->getGID(); }, $groups);
848
-
849
-				$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
850
-					->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter(
851
-						$groups,
852
-						IQueryBuilder::PARAM_STR_ARRAY
853
-					)))
854
-					->andWhere($qb->expr()->orX(
855
-						$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
856
-						$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
857
-					));
858
-
859
-				$cursor = $qb->execute();
860
-				while($data = $cursor->fetch()) {
861
-					if ($offset > 0) {
862
-						$offset--;
863
-						continue;
864
-					}
865
-
866
-					if ($this->isAccessibleResult($data)) {
867
-						$shares2[] = $this->createShare($data);
868
-					}
869
-				}
870
-				$cursor->closeCursor();
871
-			}
872
-
873
-			/*
423
+            if ($data === false) {
424
+                $qb = $this->dbConn->getQueryBuilder();
425
+
426
+                $type = $share->getNodeType();
427
+
428
+                //Insert new share
429
+                $qb->insert('share')
430
+                    ->values([
431
+                        'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
432
+                        'share_with' => $qb->createNamedParameter($recipient),
433
+                        'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
434
+                        'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
435
+                        'parent' => $qb->createNamedParameter($share->getId()),
436
+                        'item_type' => $qb->createNamedParameter($type),
437
+                        'item_source' => $qb->createNamedParameter($share->getNodeId()),
438
+                        'file_source' => $qb->createNamedParameter($share->getNodeId()),
439
+                        'file_target' => $qb->createNamedParameter($share->getTarget()),
440
+                        'permissions' => $qb->createNamedParameter(0),
441
+                        'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
442
+                    ])->execute();
443
+
444
+            } else if ($data['permissions'] !== 0) {
445
+
446
+                // Update existing usergroup share
447
+                $qb = $this->dbConn->getQueryBuilder();
448
+                $qb->update('share')
449
+                    ->set('permissions', $qb->createNamedParameter(0))
450
+                    ->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
451
+                    ->execute();
452
+            }
453
+
454
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
455
+
456
+            if ($share->getSharedWith() !== $recipient) {
457
+                throw new ProviderException('Recipient does not match');
458
+            }
459
+
460
+            // We can just delete user and link shares
461
+            $this->delete($share);
462
+        } else {
463
+            throw new ProviderException('Invalid shareType');
464
+        }
465
+    }
466
+
467
+    /**
468
+     * @inheritdoc
469
+     *
470
+     * For now this only works for group shares
471
+     * If this gets implemented for normal shares we have to extend it
472
+     */
473
+    public function restore(IShare $share, string $recipient): IShare {
474
+        $qb = $this->dbConn->getQueryBuilder();
475
+        $qb->select('permissions')
476
+            ->from('share')
477
+            ->where(
478
+                $qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))
479
+            );
480
+        $cursor = $qb->execute();
481
+        $data = $cursor->fetch();
482
+        $cursor->closeCursor();
483
+
484
+        $originalPermission = $data['permissions'];
485
+
486
+        $qb = $this->dbConn->getQueryBuilder();
487
+        $qb->update('share')
488
+            ->set('permissions', $qb->createNamedParameter($originalPermission))
489
+            ->where(
490
+                $qb->expr()->eq('parent', $qb->createNamedParameter($share->getParent()))
491
+            )->andWhere(
492
+                $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
493
+            )->andWhere(
494
+                $qb->expr()->eq('share_with', $qb->createNamedParameter($recipient))
495
+            );
496
+
497
+        $qb->execute();
498
+
499
+        return $this->getShareById($share->getId(), $recipient);
500
+    }
501
+
502
+    /**
503
+     * @inheritdoc
504
+     */
505
+    public function move(\OCP\Share\IShare $share, $recipient) {
506
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
507
+            // Just update the target
508
+            $qb = $this->dbConn->getQueryBuilder();
509
+            $qb->update('share')
510
+                ->set('file_target', $qb->createNamedParameter($share->getTarget()))
511
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
512
+                ->execute();
513
+
514
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
515
+
516
+            // Check if there is a usergroup share
517
+            $qb = $this->dbConn->getQueryBuilder();
518
+            $stmt = $qb->select('id')
519
+                ->from('share')
520
+                ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
521
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
522
+                ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
523
+                ->andWhere($qb->expr()->orX(
524
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
525
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
526
+                ))
527
+                ->setMaxResults(1)
528
+                ->execute();
529
+
530
+            $data = $stmt->fetch();
531
+            $stmt->closeCursor();
532
+
533
+            if ($data === false) {
534
+                // No usergroup share yet. Create one.
535
+                $qb = $this->dbConn->getQueryBuilder();
536
+                $qb->insert('share')
537
+                    ->values([
538
+                        'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
539
+                        'share_with' => $qb->createNamedParameter($recipient),
540
+                        'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
541
+                        'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
542
+                        'parent' => $qb->createNamedParameter($share->getId()),
543
+                        'item_type' => $qb->createNamedParameter($share->getNodeType()),
544
+                        'item_source' => $qb->createNamedParameter($share->getNodeId()),
545
+                        'file_source' => $qb->createNamedParameter($share->getNodeId()),
546
+                        'file_target' => $qb->createNamedParameter($share->getTarget()),
547
+                        'permissions' => $qb->createNamedParameter($share->getPermissions()),
548
+                        'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
549
+                    ])->execute();
550
+            } else {
551
+                // Already a usergroup share. Update it.
552
+                $qb = $this->dbConn->getQueryBuilder();
553
+                $qb->update('share')
554
+                    ->set('file_target', $qb->createNamedParameter($share->getTarget()))
555
+                    ->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
556
+                    ->execute();
557
+            }
558
+        }
559
+
560
+        return $share;
561
+    }
562
+
563
+    public function getSharesInFolder($userId, Folder $node, $reshares) {
564
+        $qb = $this->dbConn->getQueryBuilder();
565
+        $qb->select('*')
566
+            ->from('share', 's')
567
+            ->andWhere($qb->expr()->orX(
568
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
569
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
570
+            ));
571
+
572
+        $qb->andWhere($qb->expr()->orX(
573
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
574
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
575
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
576
+        ));
577
+
578
+        /**
579
+         * Reshares for this user are shares where they are the owner.
580
+         */
581
+        if ($reshares === false) {
582
+            $qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
583
+        } else {
584
+            $qb->andWhere(
585
+                $qb->expr()->orX(
586
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
587
+                    $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
588
+                )
589
+            );
590
+        }
591
+
592
+        $qb->innerJoin('s', 'filecache' ,'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
593
+        $qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
594
+
595
+        $qb->orderBy('id');
596
+
597
+        $cursor = $qb->execute();
598
+        $shares = [];
599
+        while ($data = $cursor->fetch()) {
600
+            $shares[$data['fileid']][] = $this->createShare($data);
601
+        }
602
+        $cursor->closeCursor();
603
+
604
+        return $shares;
605
+    }
606
+
607
+    /**
608
+     * @inheritdoc
609
+     */
610
+    public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset) {
611
+        $qb = $this->dbConn->getQueryBuilder();
612
+        $qb->select('*')
613
+            ->from('share')
614
+            ->andWhere($qb->expr()->orX(
615
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
616
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
617
+            ));
618
+
619
+        $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
620
+
621
+        /**
622
+         * Reshares for this user are shares where they are the owner.
623
+         */
624
+        if ($reshares === false) {
625
+            $qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
626
+        } else {
627
+            if ($node === null) {
628
+                $qb->andWhere(
629
+                    $qb->expr()->orX(
630
+                        $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
631
+                        $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
632
+                    )
633
+                );
634
+            }
635
+        }
636
+
637
+        if ($node !== null) {
638
+            $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
639
+        }
640
+
641
+        if ($limit !== -1) {
642
+            $qb->setMaxResults($limit);
643
+        }
644
+
645
+        $qb->setFirstResult($offset);
646
+        $qb->orderBy('id');
647
+
648
+        $cursor = $qb->execute();
649
+        $shares = [];
650
+        while($data = $cursor->fetch()) {
651
+            $shares[] = $this->createShare($data);
652
+        }
653
+        $cursor->closeCursor();
654
+
655
+        return $shares;
656
+    }
657
+
658
+    /**
659
+     * @inheritdoc
660
+     */
661
+    public function getShareById($id, $recipientId = null) {
662
+        $qb = $this->dbConn->getQueryBuilder();
663
+
664
+        $qb->select('*')
665
+            ->from('share')
666
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
667
+            ->andWhere(
668
+                $qb->expr()->in(
669
+                    'share_type',
670
+                    $qb->createNamedParameter([
671
+                        \OCP\Share::SHARE_TYPE_USER,
672
+                        \OCP\Share::SHARE_TYPE_GROUP,
673
+                        \OCP\Share::SHARE_TYPE_LINK,
674
+                    ], IQueryBuilder::PARAM_INT_ARRAY)
675
+                )
676
+            )
677
+            ->andWhere($qb->expr()->orX(
678
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
679
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
680
+            ));
681
+
682
+        $cursor = $qb->execute();
683
+        $data = $cursor->fetch();
684
+        $cursor->closeCursor();
685
+
686
+        if ($data === false) {
687
+            throw new ShareNotFound();
688
+        }
689
+
690
+        try {
691
+            $share = $this->createShare($data);
692
+        } catch (InvalidShare $e) {
693
+            throw new ShareNotFound();
694
+        }
695
+
696
+        // If the recipient is set for a group share resolve to that user
697
+        if ($recipientId !== null && $share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
698
+            $share = $this->resolveGroupShares([$share], $recipientId)[0];
699
+        }
700
+
701
+        return $share;
702
+    }
703
+
704
+    /**
705
+     * Get shares for a given path
706
+     *
707
+     * @param \OCP\Files\Node $path
708
+     * @return \OCP\Share\IShare[]
709
+     */
710
+    public function getSharesByPath(Node $path) {
711
+        $qb = $this->dbConn->getQueryBuilder();
712
+
713
+        $cursor = $qb->select('*')
714
+            ->from('share')
715
+            ->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
716
+            ->andWhere(
717
+                $qb->expr()->orX(
718
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
719
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))
720
+                )
721
+            )
722
+            ->andWhere($qb->expr()->orX(
723
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
724
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
725
+            ))
726
+            ->execute();
727
+
728
+        $shares = [];
729
+        while($data = $cursor->fetch()) {
730
+            $shares[] = $this->createShare($data);
731
+        }
732
+        $cursor->closeCursor();
733
+
734
+        return $shares;
735
+    }
736
+
737
+    /**
738
+     * Returns whether the given database result can be interpreted as
739
+     * a share with accessible file (not trashed, not deleted)
740
+     */
741
+    private function isAccessibleResult($data) {
742
+        // exclude shares leading to deleted file entries
743
+        if ($data['fileid'] === null) {
744
+            return false;
745
+        }
746
+
747
+        // exclude shares leading to trashbin on home storages
748
+        $pathSections = explode('/', $data['path'], 2);
749
+        // FIXME: would not detect rare md5'd home storage case properly
750
+        if ($pathSections[0] !== 'files'
751
+                && in_array(explode(':', $data['storage_string_id'], 2)[0], array('home', 'object'))) {
752
+            return false;
753
+        }
754
+        return true;
755
+    }
756
+
757
+    /**
758
+     * @inheritdoc
759
+     */
760
+    public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
761
+        /** @var Share[] $shares */
762
+        $shares = [];
763
+
764
+        if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
765
+            //Get shares directly with this user
766
+            $qb = $this->dbConn->getQueryBuilder();
767
+            $qb->select('s.*',
768
+                'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
769
+                'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
770
+                'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
771
+            )
772
+                ->selectAlias('st.id', 'storage_string_id')
773
+                ->from('share', 's')
774
+                ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
775
+                ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
776
+
777
+            // Order by id
778
+            $qb->orderBy('s.id');
779
+
780
+            // Set limit and offset
781
+            if ($limit !== -1) {
782
+                $qb->setMaxResults($limit);
783
+            }
784
+            $qb->setFirstResult($offset);
785
+
786
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)))
787
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
788
+                ->andWhere($qb->expr()->orX(
789
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
790
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
791
+                ));
792
+
793
+            // Filter by node if provided
794
+            if ($node !== null) {
795
+                $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
796
+            }
797
+
798
+            $cursor = $qb->execute();
799
+
800
+            while($data = $cursor->fetch()) {
801
+                if ($this->isAccessibleResult($data)) {
802
+                    $shares[] = $this->createShare($data);
803
+                }
804
+            }
805
+            $cursor->closeCursor();
806
+
807
+        } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
808
+            $user = $this->userManager->get($userId);
809
+            $allGroups = $this->groupManager->getUserGroups($user);
810
+
811
+            /** @var Share[] $shares2 */
812
+            $shares2 = [];
813
+
814
+            $start = 0;
815
+            while(true) {
816
+                $groups = array_slice($allGroups, $start, 100);
817
+                $start += 100;
818
+
819
+                if ($groups === []) {
820
+                    break;
821
+                }
822
+
823
+                $qb = $this->dbConn->getQueryBuilder();
824
+                $qb->select('s.*',
825
+                    'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
826
+                    'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
827
+                    'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
828
+                )
829
+                    ->selectAlias('st.id', 'storage_string_id')
830
+                    ->from('share', 's')
831
+                    ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
832
+                    ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
833
+                    ->orderBy('s.id')
834
+                    ->setFirstResult(0);
835
+
836
+                if ($limit !== -1) {
837
+                    $qb->setMaxResults($limit - count($shares));
838
+                }
839
+
840
+                // Filter by node if provided
841
+                if ($node !== null) {
842
+                    $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
843
+                }
844
+
845
+
846
+                $groups = array_filter($groups, function($group) { return $group instanceof IGroup; });
847
+                $groups = array_map(function(IGroup $group) { return $group->getGID(); }, $groups);
848
+
849
+                $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
850
+                    ->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter(
851
+                        $groups,
852
+                        IQueryBuilder::PARAM_STR_ARRAY
853
+                    )))
854
+                    ->andWhere($qb->expr()->orX(
855
+                        $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
856
+                        $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
857
+                    ));
858
+
859
+                $cursor = $qb->execute();
860
+                while($data = $cursor->fetch()) {
861
+                    if ($offset > 0) {
862
+                        $offset--;
863
+                        continue;
864
+                    }
865
+
866
+                    if ($this->isAccessibleResult($data)) {
867
+                        $shares2[] = $this->createShare($data);
868
+                    }
869
+                }
870
+                $cursor->closeCursor();
871
+            }
872
+
873
+            /*
874 874
  			 * Resolve all group shares to user specific shares
875 875
  			 */
876
-			$shares = $this->resolveGroupShares($shares2, $userId);
877
-		} else {
878
-			throw new BackendError('Invalid backend');
879
-		}
880
-
881
-
882
-		return $shares;
883
-	}
884
-
885
-	/**
886
-	 * Get a share by token
887
-	 *
888
-	 * @param string $token
889
-	 * @return \OCP\Share\IShare
890
-	 * @throws ShareNotFound
891
-	 */
892
-	public function getShareByToken($token) {
893
-		$qb = $this->dbConn->getQueryBuilder();
894
-
895
-		$cursor = $qb->select('*')
896
-			->from('share')
897
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)))
898
-			->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
899
-			->andWhere($qb->expr()->orX(
900
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
901
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
902
-			))
903
-			->execute();
904
-
905
-		$data = $cursor->fetch();
906
-
907
-		if ($data === false) {
908
-			throw new ShareNotFound();
909
-		}
910
-
911
-		try {
912
-			$share = $this->createShare($data);
913
-		} catch (InvalidShare $e) {
914
-			throw new ShareNotFound();
915
-		}
916
-
917
-		return $share;
918
-	}
919
-
920
-	/**
921
-	 * Create a share object from an database row
922
-	 *
923
-	 * @param mixed[] $data
924
-	 * @return \OCP\Share\IShare
925
-	 * @throws InvalidShare
926
-	 */
927
-	private function createShare($data) {
928
-		$share = new Share($this->rootFolder, $this->userManager);
929
-		$share->setId((int)$data['id'])
930
-			->setShareType((int)$data['share_type'])
931
-			->setPermissions((int)$data['permissions'])
932
-			->setTarget($data['file_target'])
933
-			->setNote($data['note'])
934
-			->setMailSend((bool)$data['mail_send'])
935
-			->setLabel($data['label']);
936
-
937
-		$shareTime = new \DateTime();
938
-		$shareTime->setTimestamp((int)$data['stime']);
939
-		$share->setShareTime($shareTime);
940
-
941
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
942
-			$share->setSharedWith($data['share_with']);
943
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
944
-			$share->setSharedWith($data['share_with']);
945
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
946
-			$share->setPassword($data['password']);
947
-			$share->setSendPasswordByTalk((bool)$data['password_by_talk']);
948
-			$share->setToken($data['token']);
949
-		}
950
-
951
-		$share->setSharedBy($data['uid_initiator']);
952
-		$share->setShareOwner($data['uid_owner']);
953
-
954
-		$share->setNodeId((int)$data['file_source']);
955
-		$share->setNodeType($data['item_type']);
956
-
957
-		if ($data['expiration'] !== null) {
958
-			$expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']);
959
-			$share->setExpirationDate($expiration);
960
-		}
961
-
962
-		if (isset($data['f_permissions'])) {
963
-			$entryData = $data;
964
-			$entryData['permissions'] = $entryData['f_permissions'];
965
-			$entryData['parent'] = $entryData['f_parent'];
966
-			$share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData,
967
-				\OC::$server->getMimeTypeLoader()));
968
-		}
969
-
970
-		$share->setProviderId($this->identifier());
971
-		$share->setHideDownload((int)$data['hide_download'] === 1);
972
-
973
-		return $share;
974
-	}
975
-
976
-	/**
977
-	 * @param Share[] $shares
978
-	 * @param $userId
979
-	 * @return Share[] The updates shares if no update is found for a share return the original
980
-	 */
981
-	private function resolveGroupShares($shares, $userId) {
982
-		$result = [];
983
-
984
-		$start = 0;
985
-		while(true) {
986
-			/** @var Share[] $shareSlice */
987
-			$shareSlice = array_slice($shares, $start, 100);
988
-			$start += 100;
989
-
990
-			if ($shareSlice === []) {
991
-				break;
992
-			}
993
-
994
-			/** @var int[] $ids */
995
-			$ids = [];
996
-			/** @var Share[] $shareMap */
997
-			$shareMap = [];
998
-
999
-			foreach ($shareSlice as $share) {
1000
-				$ids[] = (int)$share->getId();
1001
-				$shareMap[$share->getId()] = $share;
1002
-			}
1003
-
1004
-			$qb = $this->dbConn->getQueryBuilder();
1005
-
1006
-			$query = $qb->select('*')
1007
-				->from('share')
1008
-				->where($qb->expr()->in('parent', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1009
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
1010
-				->andWhere($qb->expr()->orX(
1011
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1012
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1013
-				));
1014
-
1015
-			$stmt = $query->execute();
1016
-
1017
-			while($data = $stmt->fetch()) {
1018
-				$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
1019
-				$shareMap[$data['parent']]->setTarget($data['file_target']);
1020
-				$shareMap[$data['parent']]->setParent($data['parent']);
1021
-			}
1022
-
1023
-			$stmt->closeCursor();
1024
-
1025
-			foreach ($shareMap as $share) {
1026
-				$result[] = $share;
1027
-			}
1028
-		}
1029
-
1030
-		return $result;
1031
-	}
1032
-
1033
-	/**
1034
-	 * A user is deleted from the system
1035
-	 * So clean up the relevant shares.
1036
-	 *
1037
-	 * @param string $uid
1038
-	 * @param int $shareType
1039
-	 */
1040
-	public function userDeleted($uid, $shareType) {
1041
-		$qb = $this->dbConn->getQueryBuilder();
1042
-
1043
-		$qb->delete('share');
1044
-
1045
-		if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
1046
-			/*
876
+            $shares = $this->resolveGroupShares($shares2, $userId);
877
+        } else {
878
+            throw new BackendError('Invalid backend');
879
+        }
880
+
881
+
882
+        return $shares;
883
+    }
884
+
885
+    /**
886
+     * Get a share by token
887
+     *
888
+     * @param string $token
889
+     * @return \OCP\Share\IShare
890
+     * @throws ShareNotFound
891
+     */
892
+    public function getShareByToken($token) {
893
+        $qb = $this->dbConn->getQueryBuilder();
894
+
895
+        $cursor = $qb->select('*')
896
+            ->from('share')
897
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)))
898
+            ->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
899
+            ->andWhere($qb->expr()->orX(
900
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
901
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
902
+            ))
903
+            ->execute();
904
+
905
+        $data = $cursor->fetch();
906
+
907
+        if ($data === false) {
908
+            throw new ShareNotFound();
909
+        }
910
+
911
+        try {
912
+            $share = $this->createShare($data);
913
+        } catch (InvalidShare $e) {
914
+            throw new ShareNotFound();
915
+        }
916
+
917
+        return $share;
918
+    }
919
+
920
+    /**
921
+     * Create a share object from an database row
922
+     *
923
+     * @param mixed[] $data
924
+     * @return \OCP\Share\IShare
925
+     * @throws InvalidShare
926
+     */
927
+    private function createShare($data) {
928
+        $share = new Share($this->rootFolder, $this->userManager);
929
+        $share->setId((int)$data['id'])
930
+            ->setShareType((int)$data['share_type'])
931
+            ->setPermissions((int)$data['permissions'])
932
+            ->setTarget($data['file_target'])
933
+            ->setNote($data['note'])
934
+            ->setMailSend((bool)$data['mail_send'])
935
+            ->setLabel($data['label']);
936
+
937
+        $shareTime = new \DateTime();
938
+        $shareTime->setTimestamp((int)$data['stime']);
939
+        $share->setShareTime($shareTime);
940
+
941
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
942
+            $share->setSharedWith($data['share_with']);
943
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
944
+            $share->setSharedWith($data['share_with']);
945
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
946
+            $share->setPassword($data['password']);
947
+            $share->setSendPasswordByTalk((bool)$data['password_by_talk']);
948
+            $share->setToken($data['token']);
949
+        }
950
+
951
+        $share->setSharedBy($data['uid_initiator']);
952
+        $share->setShareOwner($data['uid_owner']);
953
+
954
+        $share->setNodeId((int)$data['file_source']);
955
+        $share->setNodeType($data['item_type']);
956
+
957
+        if ($data['expiration'] !== null) {
958
+            $expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']);
959
+            $share->setExpirationDate($expiration);
960
+        }
961
+
962
+        if (isset($data['f_permissions'])) {
963
+            $entryData = $data;
964
+            $entryData['permissions'] = $entryData['f_permissions'];
965
+            $entryData['parent'] = $entryData['f_parent'];
966
+            $share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData,
967
+                \OC::$server->getMimeTypeLoader()));
968
+        }
969
+
970
+        $share->setProviderId($this->identifier());
971
+        $share->setHideDownload((int)$data['hide_download'] === 1);
972
+
973
+        return $share;
974
+    }
975
+
976
+    /**
977
+     * @param Share[] $shares
978
+     * @param $userId
979
+     * @return Share[] The updates shares if no update is found for a share return the original
980
+     */
981
+    private function resolveGroupShares($shares, $userId) {
982
+        $result = [];
983
+
984
+        $start = 0;
985
+        while(true) {
986
+            /** @var Share[] $shareSlice */
987
+            $shareSlice = array_slice($shares, $start, 100);
988
+            $start += 100;
989
+
990
+            if ($shareSlice === []) {
991
+                break;
992
+            }
993
+
994
+            /** @var int[] $ids */
995
+            $ids = [];
996
+            /** @var Share[] $shareMap */
997
+            $shareMap = [];
998
+
999
+            foreach ($shareSlice as $share) {
1000
+                $ids[] = (int)$share->getId();
1001
+                $shareMap[$share->getId()] = $share;
1002
+            }
1003
+
1004
+            $qb = $this->dbConn->getQueryBuilder();
1005
+
1006
+            $query = $qb->select('*')
1007
+                ->from('share')
1008
+                ->where($qb->expr()->in('parent', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1009
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
1010
+                ->andWhere($qb->expr()->orX(
1011
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1012
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1013
+                ));
1014
+
1015
+            $stmt = $query->execute();
1016
+
1017
+            while($data = $stmt->fetch()) {
1018
+                $shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
1019
+                $shareMap[$data['parent']]->setTarget($data['file_target']);
1020
+                $shareMap[$data['parent']]->setParent($data['parent']);
1021
+            }
1022
+
1023
+            $stmt->closeCursor();
1024
+
1025
+            foreach ($shareMap as $share) {
1026
+                $result[] = $share;
1027
+            }
1028
+        }
1029
+
1030
+        return $result;
1031
+    }
1032
+
1033
+    /**
1034
+     * A user is deleted from the system
1035
+     * So clean up the relevant shares.
1036
+     *
1037
+     * @param string $uid
1038
+     * @param int $shareType
1039
+     */
1040
+    public function userDeleted($uid, $shareType) {
1041
+        $qb = $this->dbConn->getQueryBuilder();
1042
+
1043
+        $qb->delete('share');
1044
+
1045
+        if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
1046
+            /*
1047 1047
 			 * Delete all user shares that are owned by this user
1048 1048
 			 * or that are received by this user
1049 1049
 			 */
1050 1050
 
1051
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)));
1051
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)));
1052 1052
 
1053
-			$qb->andWhere(
1054
-				$qb->expr()->orX(
1055
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1056
-					$qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1057
-				)
1058
-			);
1059
-		} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
1060
-			/*
1053
+            $qb->andWhere(
1054
+                $qb->expr()->orX(
1055
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1056
+                    $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1057
+                )
1058
+            );
1059
+        } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
1060
+            /*
1061 1061
 			 * Delete all group shares that are owned by this user
1062 1062
 			 * Or special user group shares that are received by this user
1063 1063
 			 */
1064
-			$qb->where(
1065
-				$qb->expr()->andX(
1066
-					$qb->expr()->orX(
1067
-						$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1068
-						$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
1069
-					),
1070
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
1071
-				)
1072
-			);
1073
-
1074
-			$qb->orWhere(
1075
-				$qb->expr()->andX(
1076
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)),
1077
-					$qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1078
-				)
1079
-			);
1080
-		} else if ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
1081
-			/*
1064
+            $qb->where(
1065
+                $qb->expr()->andX(
1066
+                    $qb->expr()->orX(
1067
+                        $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1068
+                        $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
1069
+                    ),
1070
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
1071
+                )
1072
+            );
1073
+
1074
+            $qb->orWhere(
1075
+                $qb->expr()->andX(
1076
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)),
1077
+                    $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1078
+                )
1079
+            );
1080
+        } else if ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
1081
+            /*
1082 1082
 			 * Delete all link shares owned by this user.
1083 1083
 			 * And all link shares initiated by this user (until #22327 is in)
1084 1084
 			 */
1085
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
1086
-
1087
-			$qb->andWhere(
1088
-				$qb->expr()->orX(
1089
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1090
-					$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($uid))
1091
-				)
1092
-			);
1093
-		}
1094
-
1095
-		$qb->execute();
1096
-	}
1097
-
1098
-	/**
1099
-	 * Delete all shares received by this group. As well as any custom group
1100
-	 * shares for group members.
1101
-	 *
1102
-	 * @param string $gid
1103
-	 */
1104
-	public function groupDeleted($gid) {
1105
-		/*
1085
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
1086
+
1087
+            $qb->andWhere(
1088
+                $qb->expr()->orX(
1089
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1090
+                    $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($uid))
1091
+                )
1092
+            );
1093
+        }
1094
+
1095
+        $qb->execute();
1096
+    }
1097
+
1098
+    /**
1099
+     * Delete all shares received by this group. As well as any custom group
1100
+     * shares for group members.
1101
+     *
1102
+     * @param string $gid
1103
+     */
1104
+    public function groupDeleted($gid) {
1105
+        /*
1106 1106
 		 * First delete all custom group shares for group members
1107 1107
 		 */
1108
-		$qb = $this->dbConn->getQueryBuilder();
1109
-		$qb->select('id')
1110
-			->from('share')
1111
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1112
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1113
-
1114
-		$cursor = $qb->execute();
1115
-		$ids = [];
1116
-		while($row = $cursor->fetch()) {
1117
-			$ids[] = (int)$row['id'];
1118
-		}
1119
-		$cursor->closeCursor();
1120
-
1121
-		if (!empty($ids)) {
1122
-			$chunks = array_chunk($ids, 100);
1123
-			foreach ($chunks as $chunk) {
1124
-				$qb->delete('share')
1125
-					->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1126
-					->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1127
-				$qb->execute();
1128
-			}
1129
-		}
1130
-
1131
-		/*
1108
+        $qb = $this->dbConn->getQueryBuilder();
1109
+        $qb->select('id')
1110
+            ->from('share')
1111
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1112
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1113
+
1114
+        $cursor = $qb->execute();
1115
+        $ids = [];
1116
+        while($row = $cursor->fetch()) {
1117
+            $ids[] = (int)$row['id'];
1118
+        }
1119
+        $cursor->closeCursor();
1120
+
1121
+        if (!empty($ids)) {
1122
+            $chunks = array_chunk($ids, 100);
1123
+            foreach ($chunks as $chunk) {
1124
+                $qb->delete('share')
1125
+                    ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1126
+                    ->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1127
+                $qb->execute();
1128
+            }
1129
+        }
1130
+
1131
+        /*
1132 1132
 		 * Now delete all the group shares
1133 1133
 		 */
1134
-		$qb = $this->dbConn->getQueryBuilder();
1135
-		$qb->delete('share')
1136
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1137
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1138
-		$qb->execute();
1139
-	}
1140
-
1141
-	/**
1142
-	 * Delete custom group shares to this group for this user
1143
-	 *
1144
-	 * @param string $uid
1145
-	 * @param string $gid
1146
-	 */
1147
-	public function userDeletedFromGroup($uid, $gid) {
1148
-		/*
1134
+        $qb = $this->dbConn->getQueryBuilder();
1135
+        $qb->delete('share')
1136
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1137
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1138
+        $qb->execute();
1139
+    }
1140
+
1141
+    /**
1142
+     * Delete custom group shares to this group for this user
1143
+     *
1144
+     * @param string $uid
1145
+     * @param string $gid
1146
+     */
1147
+    public function userDeletedFromGroup($uid, $gid) {
1148
+        /*
1149 1149
 		 * Get all group shares
1150 1150
 		 */
1151
-		$qb = $this->dbConn->getQueryBuilder();
1152
-		$qb->select('id')
1153
-			->from('share')
1154
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1155
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1156
-
1157
-		$cursor = $qb->execute();
1158
-		$ids = [];
1159
-		while($row = $cursor->fetch()) {
1160
-			$ids[] = (int)$row['id'];
1161
-		}
1162
-		$cursor->closeCursor();
1163
-
1164
-		if (!empty($ids)) {
1165
-			$chunks = array_chunk($ids, 100);
1166
-			foreach ($chunks as $chunk) {
1167
-				/*
1151
+        $qb = $this->dbConn->getQueryBuilder();
1152
+        $qb->select('id')
1153
+            ->from('share')
1154
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1155
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1156
+
1157
+        $cursor = $qb->execute();
1158
+        $ids = [];
1159
+        while($row = $cursor->fetch()) {
1160
+            $ids[] = (int)$row['id'];
1161
+        }
1162
+        $cursor->closeCursor();
1163
+
1164
+        if (!empty($ids)) {
1165
+            $chunks = array_chunk($ids, 100);
1166
+            foreach ($chunks as $chunk) {
1167
+                /*
1168 1168
 				 * Delete all special shares wit this users for the found group shares
1169 1169
 				 */
1170
-				$qb->delete('share')
1171
-					->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1172
-					->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($uid)))
1173
-					->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1174
-				$qb->execute();
1175
-			}
1176
-		}
1177
-	}
1178
-
1179
-	/**
1180
-	 * @inheritdoc
1181
-	 */
1182
-	public function getAccessList($nodes, $currentAccess) {
1183
-		$ids = [];
1184
-		foreach ($nodes as $node) {
1185
-			$ids[] = $node->getId();
1186
-		}
1187
-
1188
-		$qb = $this->dbConn->getQueryBuilder();
1189
-
1190
-		$or = $qb->expr()->orX(
1191
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
1192
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1193
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
1194
-		);
1195
-
1196
-		if ($currentAccess) {
1197
-			$or->add($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)));
1198
-		}
1199
-
1200
-		$qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
1201
-			->from('share')
1202
-			->where(
1203
-				$or
1204
-			)
1205
-			->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1206
-			->andWhere($qb->expr()->orX(
1207
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1208
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1209
-			));
1210
-		$cursor = $qb->execute();
1211
-
1212
-		$users = [];
1213
-		$link = false;
1214
-		while($row = $cursor->fetch()) {
1215
-			$type = (int)$row['share_type'];
1216
-			if ($type === \OCP\Share::SHARE_TYPE_USER) {
1217
-				$uid = $row['share_with'];
1218
-				$users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1219
-				$users[$uid][$row['id']] = $row;
1220
-			} else if ($type === \OCP\Share::SHARE_TYPE_GROUP) {
1221
-				$gid = $row['share_with'];
1222
-				$group = $this->groupManager->get($gid);
1223
-
1224
-				if ($group === null) {
1225
-					continue;
1226
-				}
1227
-
1228
-				$userList = $group->getUsers();
1229
-				foreach ($userList as $user) {
1230
-					$uid = $user->getUID();
1231
-					$users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1232
-					$users[$uid][$row['id']] = $row;
1233
-				}
1234
-			} else if ($type === \OCP\Share::SHARE_TYPE_LINK) {
1235
-				$link = true;
1236
-			} else if ($type === self::SHARE_TYPE_USERGROUP && $currentAccess === true) {
1237
-				$uid = $row['share_with'];
1238
-				$users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1239
-				$users[$uid][$row['id']] = $row;
1240
-			}
1241
-		}
1242
-		$cursor->closeCursor();
1243
-
1244
-		if ($currentAccess === true) {
1245
-			$users = array_map([$this, 'filterSharesOfUser'], $users);
1246
-			$users = array_filter($users);
1247
-		} else {
1248
-			$users = array_keys($users);
1249
-		}
1250
-
1251
-		return ['users' => $users, 'public' => $link];
1252
-	}
1253
-
1254
-	/**
1255
-	 * For each user the path with the fewest slashes is returned
1256
-	 * @param array $shares
1257
-	 * @return array
1258
-	 */
1259
-	protected function filterSharesOfUser(array $shares) {
1260
-		// Group shares when the user has a share exception
1261
-		foreach ($shares as $id => $share) {
1262
-			$type = (int) $share['share_type'];
1263
-			$permissions = (int) $share['permissions'];
1264
-
1265
-			if ($type === self::SHARE_TYPE_USERGROUP) {
1266
-				unset($shares[$share['parent']]);
1267
-
1268
-				if ($permissions === 0) {
1269
-					unset($shares[$id]);
1270
-				}
1271
-			}
1272
-		}
1273
-
1274
-		$best = [];
1275
-		$bestDepth = 0;
1276
-		foreach ($shares as $id => $share) {
1277
-			$depth = substr_count($share['file_target'], '/');
1278
-			if (empty($best) || $depth < $bestDepth) {
1279
-				$bestDepth = $depth;
1280
-				$best = [
1281
-					'node_id' => $share['file_source'],
1282
-					'node_path' => $share['file_target'],
1283
-				];
1284
-			}
1285
-		}
1286
-
1287
-		return $best;
1288
-	}
1289
-
1290
-	/**
1291
-	 * propagate notes to the recipients
1292
-	 *
1293
-	 * @param IShare $share
1294
-	 * @throws \OCP\Files\NotFoundException
1295
-	 */
1296
-	private function propagateNote(IShare $share) {
1297
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
1298
-			$user = $this->userManager->get($share->getSharedWith());
1299
-			$this->sendNote([$user], $share);
1300
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
1301
-			$group = $this->groupManager->get($share->getSharedWith());
1302
-			$groupMembers = $group->getUsers();
1303
-			$this->sendNote($groupMembers, $share);
1304
-		}
1305
-	}
1306
-
1307
-	/**
1308
-	 * send note by mail
1309
-	 *
1310
-	 * @param array $recipients
1311
-	 * @param IShare $share
1312
-	 * @throws \OCP\Files\NotFoundException
1313
-	 */
1314
-	private function sendNote(array $recipients, IShare $share) {
1315
-
1316
-		$toList = [];
1317
-
1318
-		foreach ($recipients as $recipient) {
1319
-			/** @var IUser $recipient */
1320
-			$email = $recipient->getEMailAddress();
1321
-			if ($email) {
1322
-				$toList[$email] = $recipient->getDisplayName();
1323
-			}
1324
-		}
1325
-
1326
-		if (!empty($toList)) {
1327
-
1328
-			$filename = $share->getNode()->getName();
1329
-			$initiator = $share->getSharedBy();
1330
-			$note = $share->getNote();
1331
-
1332
-			$initiatorUser = $this->userManager->get($initiator);
1333
-			$initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
1334
-			$initiatorEmailAddress = ($initiatorUser instanceof IUser) ? $initiatorUser->getEMailAddress() : null;
1335
-			$plainHeading = $this->l->t('%1$s shared »%2$s« with you and wants to add:', [$initiatorDisplayName, $filename]);
1336
-			$htmlHeading = $this->l->t('%1$s shared »%2$s« with you and wants to add', [$initiatorDisplayName, $filename]);
1337
-			$message = $this->mailer->createMessage();
1338
-
1339
-			$emailTemplate = $this->mailer->createEMailTemplate('defaultShareProvider.sendNote');
1340
-
1341
-			$emailTemplate->setSubject($this->l->t('»%s« added a note to a file shared with you', [$initiatorDisplayName]));
1342
-			$emailTemplate->addHeader();
1343
-			$emailTemplate->addHeading($htmlHeading, $plainHeading);
1344
-			$emailTemplate->addBodyText(htmlspecialchars($note), $note);
1345
-
1346
-			$link = $this->urlGenerator->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $share->getNode()->getId()]);
1347
-			$emailTemplate->addBodyButton(
1348
-				$this->l->t('Open »%s«', [$filename]),
1349
-				$link
1350
-			);
1351
-
1352
-
1353
-			// The "From" contains the sharers name
1354
-			$instanceName = $this->defaults->getName();
1355
-			$senderName = $this->l->t(
1356
-				'%1$s via %2$s',
1357
-				[
1358
-					$initiatorDisplayName,
1359
-					$instanceName
1360
-				]
1361
-			);
1362
-			$message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]);
1363
-			if ($initiatorEmailAddress !== null) {
1364
-				$message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]);
1365
-				$emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan());
1366
-			} else {
1367
-				$emailTemplate->addFooter();
1368
-			}
1369
-
1370
-			if (count($toList) === 1) {
1371
-				$message->setTo($toList);
1372
-			} else {
1373
-				$message->setTo([]);
1374
-				$message->setBcc($toList);
1375
-			}
1376
-			$message->useTemplate($emailTemplate);
1377
-			$this->mailer->send($message);
1378
-		}
1379
-
1380
-	}
1170
+                $qb->delete('share')
1171
+                    ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1172
+                    ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($uid)))
1173
+                    ->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1174
+                $qb->execute();
1175
+            }
1176
+        }
1177
+    }
1178
+
1179
+    /**
1180
+     * @inheritdoc
1181
+     */
1182
+    public function getAccessList($nodes, $currentAccess) {
1183
+        $ids = [];
1184
+        foreach ($nodes as $node) {
1185
+            $ids[] = $node->getId();
1186
+        }
1187
+
1188
+        $qb = $this->dbConn->getQueryBuilder();
1189
+
1190
+        $or = $qb->expr()->orX(
1191
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
1192
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1193
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
1194
+        );
1195
+
1196
+        if ($currentAccess) {
1197
+            $or->add($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)));
1198
+        }
1199
+
1200
+        $qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
1201
+            ->from('share')
1202
+            ->where(
1203
+                $or
1204
+            )
1205
+            ->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1206
+            ->andWhere($qb->expr()->orX(
1207
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1208
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1209
+            ));
1210
+        $cursor = $qb->execute();
1211
+
1212
+        $users = [];
1213
+        $link = false;
1214
+        while($row = $cursor->fetch()) {
1215
+            $type = (int)$row['share_type'];
1216
+            if ($type === \OCP\Share::SHARE_TYPE_USER) {
1217
+                $uid = $row['share_with'];
1218
+                $users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1219
+                $users[$uid][$row['id']] = $row;
1220
+            } else if ($type === \OCP\Share::SHARE_TYPE_GROUP) {
1221
+                $gid = $row['share_with'];
1222
+                $group = $this->groupManager->get($gid);
1223
+
1224
+                if ($group === null) {
1225
+                    continue;
1226
+                }
1227
+
1228
+                $userList = $group->getUsers();
1229
+                foreach ($userList as $user) {
1230
+                    $uid = $user->getUID();
1231
+                    $users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1232
+                    $users[$uid][$row['id']] = $row;
1233
+                }
1234
+            } else if ($type === \OCP\Share::SHARE_TYPE_LINK) {
1235
+                $link = true;
1236
+            } else if ($type === self::SHARE_TYPE_USERGROUP && $currentAccess === true) {
1237
+                $uid = $row['share_with'];
1238
+                $users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1239
+                $users[$uid][$row['id']] = $row;
1240
+            }
1241
+        }
1242
+        $cursor->closeCursor();
1243
+
1244
+        if ($currentAccess === true) {
1245
+            $users = array_map([$this, 'filterSharesOfUser'], $users);
1246
+            $users = array_filter($users);
1247
+        } else {
1248
+            $users = array_keys($users);
1249
+        }
1250
+
1251
+        return ['users' => $users, 'public' => $link];
1252
+    }
1253
+
1254
+    /**
1255
+     * For each user the path with the fewest slashes is returned
1256
+     * @param array $shares
1257
+     * @return array
1258
+     */
1259
+    protected function filterSharesOfUser(array $shares) {
1260
+        // Group shares when the user has a share exception
1261
+        foreach ($shares as $id => $share) {
1262
+            $type = (int) $share['share_type'];
1263
+            $permissions = (int) $share['permissions'];
1264
+
1265
+            if ($type === self::SHARE_TYPE_USERGROUP) {
1266
+                unset($shares[$share['parent']]);
1267
+
1268
+                if ($permissions === 0) {
1269
+                    unset($shares[$id]);
1270
+                }
1271
+            }
1272
+        }
1273
+
1274
+        $best = [];
1275
+        $bestDepth = 0;
1276
+        foreach ($shares as $id => $share) {
1277
+            $depth = substr_count($share['file_target'], '/');
1278
+            if (empty($best) || $depth < $bestDepth) {
1279
+                $bestDepth = $depth;
1280
+                $best = [
1281
+                    'node_id' => $share['file_source'],
1282
+                    'node_path' => $share['file_target'],
1283
+                ];
1284
+            }
1285
+        }
1286
+
1287
+        return $best;
1288
+    }
1289
+
1290
+    /**
1291
+     * propagate notes to the recipients
1292
+     *
1293
+     * @param IShare $share
1294
+     * @throws \OCP\Files\NotFoundException
1295
+     */
1296
+    private function propagateNote(IShare $share) {
1297
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
1298
+            $user = $this->userManager->get($share->getSharedWith());
1299
+            $this->sendNote([$user], $share);
1300
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
1301
+            $group = $this->groupManager->get($share->getSharedWith());
1302
+            $groupMembers = $group->getUsers();
1303
+            $this->sendNote($groupMembers, $share);
1304
+        }
1305
+    }
1306
+
1307
+    /**
1308
+     * send note by mail
1309
+     *
1310
+     * @param array $recipients
1311
+     * @param IShare $share
1312
+     * @throws \OCP\Files\NotFoundException
1313
+     */
1314
+    private function sendNote(array $recipients, IShare $share) {
1315
+
1316
+        $toList = [];
1317
+
1318
+        foreach ($recipients as $recipient) {
1319
+            /** @var IUser $recipient */
1320
+            $email = $recipient->getEMailAddress();
1321
+            if ($email) {
1322
+                $toList[$email] = $recipient->getDisplayName();
1323
+            }
1324
+        }
1325
+
1326
+        if (!empty($toList)) {
1327
+
1328
+            $filename = $share->getNode()->getName();
1329
+            $initiator = $share->getSharedBy();
1330
+            $note = $share->getNote();
1331
+
1332
+            $initiatorUser = $this->userManager->get($initiator);
1333
+            $initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
1334
+            $initiatorEmailAddress = ($initiatorUser instanceof IUser) ? $initiatorUser->getEMailAddress() : null;
1335
+            $plainHeading = $this->l->t('%1$s shared »%2$s« with you and wants to add:', [$initiatorDisplayName, $filename]);
1336
+            $htmlHeading = $this->l->t('%1$s shared »%2$s« with you and wants to add', [$initiatorDisplayName, $filename]);
1337
+            $message = $this->mailer->createMessage();
1338
+
1339
+            $emailTemplate = $this->mailer->createEMailTemplate('defaultShareProvider.sendNote');
1340
+
1341
+            $emailTemplate->setSubject($this->l->t('»%s« added a note to a file shared with you', [$initiatorDisplayName]));
1342
+            $emailTemplate->addHeader();
1343
+            $emailTemplate->addHeading($htmlHeading, $plainHeading);
1344
+            $emailTemplate->addBodyText(htmlspecialchars($note), $note);
1345
+
1346
+            $link = $this->urlGenerator->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $share->getNode()->getId()]);
1347
+            $emailTemplate->addBodyButton(
1348
+                $this->l->t('Open »%s«', [$filename]),
1349
+                $link
1350
+            );
1351
+
1352
+
1353
+            // The "From" contains the sharers name
1354
+            $instanceName = $this->defaults->getName();
1355
+            $senderName = $this->l->t(
1356
+                '%1$s via %2$s',
1357
+                [
1358
+                    $initiatorDisplayName,
1359
+                    $instanceName
1360
+                ]
1361
+            );
1362
+            $message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]);
1363
+            if ($initiatorEmailAddress !== null) {
1364
+                $message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]);
1365
+                $emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan());
1366
+            } else {
1367
+                $emailTemplate->addFooter();
1368
+            }
1369
+
1370
+            if (count($toList) === 1) {
1371
+                $message->setTo($toList);
1372
+            } else {
1373
+                $message->setTo([]);
1374
+                $message->setBcc($toList);
1375
+            }
1376
+            $message->useTemplate($emailTemplate);
1377
+            $this->mailer->send($message);
1378
+        }
1379
+
1380
+    }
1381 1381
 }
Please login to merge, or discard this patch.