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