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