Completed
Pull Request — master (#3783)
by Andrius
12:43
created
lib/private/Share20/DefaultShareProvider.php 1 patch
Indentation   +983 added lines, -983 removed lines patch added patch discarded remove patch
@@ -47,1020 +47,1020 @@
 block discarded – undo
47 47
  */
48 48
 class DefaultShareProvider implements IShareProvider {
49 49
 
50
-	// Special share type for user modified group shares
51
-	const SHARE_TYPE_USERGROUP = 2;
52
-
53
-	/** @var IDBConnection */
54
-	private $dbConn;
55
-
56
-	/** @var IUserManager */
57
-	private $userManager;
58
-
59
-	/** @var IGroupManager */
60
-	private $groupManager;
61
-
62
-	/** @var IRootFolder */
63
-	private $rootFolder;
64
-
65
-	/**
66
-	 * DefaultShareProvider constructor.
67
-	 *
68
-	 * @param IDBConnection $connection
69
-	 * @param IUserManager $userManager
70
-	 * @param IGroupManager $groupManager
71
-	 * @param IRootFolder $rootFolder
72
-	 */
73
-	public function __construct(
74
-			IDBConnection $connection,
75
-			IUserManager $userManager,
76
-			IGroupManager $groupManager,
77
-			IRootFolder $rootFolder) {
78
-		$this->dbConn = $connection;
79
-		$this->userManager = $userManager;
80
-		$this->groupManager = $groupManager;
81
-		$this->rootFolder = $rootFolder;
82
-	}
83
-
84
-	/**
85
-	 * Return the identifier of this provider.
86
-	 *
87
-	 * @return string Containing only [a-zA-Z0-9]
88
-	 */
89
-	public function identifier() {
90
-		return 'ocinternal';
91
-	}
92
-
93
-	/**
94
-	 * Share a path
95
-	 *
96
-	 * @param \OCP\Share\IShare $share
97
-	 * @return \OCP\Share\IShare The share object
98
-	 * @throws ShareNotFound
99
-	 * @throws \Exception
100
-	 */
101
-	public function create(\OCP\Share\IShare $share) {
102
-		$qb = $this->dbConn->getQueryBuilder();
103
-
104
-		$qb->insert('share');
105
-		$qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
106
-
107
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
108
-			//Set the UID of the user we share with
109
-			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
110
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
111
-			//Set the GID of the group we share with
112
-			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
113
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
114
-			//Set the token of the share
115
-			$qb->setValue('token', $qb->createNamedParameter($share->getToken()));
116
-
117
-			//If a password is set store it
118
-			if ($share->getPassword() !== null) {
119
-				$qb->setValue('share_with', $qb->createNamedParameter($share->getPassword()));
120
-			}
121
-
122
-			//If an expiration date is set store it
123
-			if ($share->getExpirationDate() !== null) {
124
-				$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
125
-			}
126
-
127
-			if (method_exists($share, 'getParent')) {
128
-				$qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
129
-			}
130
-		} else {
131
-			throw new \Exception('invalid share type!');
132
-		}
133
-
134
-		// Set what is shares
135
-		$qb->setValue('item_type', $qb->createParameter('itemType'));
136
-		if ($share->getNode() instanceof \OCP\Files\File) {
137
-			$qb->setParameter('itemType', 'file');
138
-		} else {
139
-			$qb->setParameter('itemType', 'folder');
140
-		}
141
-
142
-		// Set the file id
143
-		$qb->setValue('item_source', $qb->createNamedParameter($share->getNode()->getId()));
144
-		$qb->setValue('file_source', $qb->createNamedParameter($share->getNode()->getId()));
145
-
146
-		// set the permissions
147
-		$qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions()));
148
-
149
-		// Set who created this share
150
-		$qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()));
151
-
152
-		// Set who is the owner of this file/folder (and this the owner of the share)
153
-		$qb->setValue('uid_owner', $qb->createNamedParameter($share->getShareOwner()));
154
-
155
-		// Set the file target
156
-		$qb->setValue('file_target', $qb->createNamedParameter($share->getTarget()));
157
-
158
-		// Set the time this share was created
159
-		$qb->setValue('stime', $qb->createNamedParameter(time()));
160
-
161
-		// insert the data and fetch the id of the share
162
-		$this->dbConn->beginTransaction();
163
-		$qb->execute();
164
-		$id = $this->dbConn->lastInsertId('*PREFIX*share');
165
-
166
-		// Now fetch the inserted share and create a complete share object
167
-		$qb = $this->dbConn->getQueryBuilder();
168
-		$qb->select('*')
169
-			->from('share')
170
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
171
-
172
-		$cursor = $qb->execute();
173
-		$data = $cursor->fetch();
174
-		$this->dbConn->commit();
175
-		$cursor->closeCursor();
176
-
177
-		if ($data === false) {
178
-			throw new ShareNotFound();
179
-		}
180
-
181
-		$share = $this->createShare($data);
182
-		return $share;
183
-	}
184
-
185
-	/**
186
-	 * Update a share
187
-	 *
188
-	 * @param \OCP\Share\IShare $share
189
-	 * @return \OCP\Share\IShare The share object
190
-	 */
191
-	public function update(\OCP\Share\IShare $share) {
192
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
193
-			/*
50
+    // Special share type for user modified group shares
51
+    const SHARE_TYPE_USERGROUP = 2;
52
+
53
+    /** @var IDBConnection */
54
+    private $dbConn;
55
+
56
+    /** @var IUserManager */
57
+    private $userManager;
58
+
59
+    /** @var IGroupManager */
60
+    private $groupManager;
61
+
62
+    /** @var IRootFolder */
63
+    private $rootFolder;
64
+
65
+    /**
66
+     * DefaultShareProvider constructor.
67
+     *
68
+     * @param IDBConnection $connection
69
+     * @param IUserManager $userManager
70
+     * @param IGroupManager $groupManager
71
+     * @param IRootFolder $rootFolder
72
+     */
73
+    public function __construct(
74
+            IDBConnection $connection,
75
+            IUserManager $userManager,
76
+            IGroupManager $groupManager,
77
+            IRootFolder $rootFolder) {
78
+        $this->dbConn = $connection;
79
+        $this->userManager = $userManager;
80
+        $this->groupManager = $groupManager;
81
+        $this->rootFolder = $rootFolder;
82
+    }
83
+
84
+    /**
85
+     * Return the identifier of this provider.
86
+     *
87
+     * @return string Containing only [a-zA-Z0-9]
88
+     */
89
+    public function identifier() {
90
+        return 'ocinternal';
91
+    }
92
+
93
+    /**
94
+     * Share a path
95
+     *
96
+     * @param \OCP\Share\IShare $share
97
+     * @return \OCP\Share\IShare The share object
98
+     * @throws ShareNotFound
99
+     * @throws \Exception
100
+     */
101
+    public function create(\OCP\Share\IShare $share) {
102
+        $qb = $this->dbConn->getQueryBuilder();
103
+
104
+        $qb->insert('share');
105
+        $qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
106
+
107
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
108
+            //Set the UID of the user we share with
109
+            $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
110
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
111
+            //Set the GID of the group we share with
112
+            $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
113
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
114
+            //Set the token of the share
115
+            $qb->setValue('token', $qb->createNamedParameter($share->getToken()));
116
+
117
+            //If a password is set store it
118
+            if ($share->getPassword() !== null) {
119
+                $qb->setValue('share_with', $qb->createNamedParameter($share->getPassword()));
120
+            }
121
+
122
+            //If an expiration date is set store it
123
+            if ($share->getExpirationDate() !== null) {
124
+                $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
125
+            }
126
+
127
+            if (method_exists($share, 'getParent')) {
128
+                $qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
129
+            }
130
+        } else {
131
+            throw new \Exception('invalid share type!');
132
+        }
133
+
134
+        // Set what is shares
135
+        $qb->setValue('item_type', $qb->createParameter('itemType'));
136
+        if ($share->getNode() instanceof \OCP\Files\File) {
137
+            $qb->setParameter('itemType', 'file');
138
+        } else {
139
+            $qb->setParameter('itemType', 'folder');
140
+        }
141
+
142
+        // Set the file id
143
+        $qb->setValue('item_source', $qb->createNamedParameter($share->getNode()->getId()));
144
+        $qb->setValue('file_source', $qb->createNamedParameter($share->getNode()->getId()));
145
+
146
+        // set the permissions
147
+        $qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions()));
148
+
149
+        // Set who created this share
150
+        $qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()));
151
+
152
+        // Set who is the owner of this file/folder (and this the owner of the share)
153
+        $qb->setValue('uid_owner', $qb->createNamedParameter($share->getShareOwner()));
154
+
155
+        // Set the file target
156
+        $qb->setValue('file_target', $qb->createNamedParameter($share->getTarget()));
157
+
158
+        // Set the time this share was created
159
+        $qb->setValue('stime', $qb->createNamedParameter(time()));
160
+
161
+        // insert the data and fetch the id of the share
162
+        $this->dbConn->beginTransaction();
163
+        $qb->execute();
164
+        $id = $this->dbConn->lastInsertId('*PREFIX*share');
165
+
166
+        // Now fetch the inserted share and create a complete share object
167
+        $qb = $this->dbConn->getQueryBuilder();
168
+        $qb->select('*')
169
+            ->from('share')
170
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
171
+
172
+        $cursor = $qb->execute();
173
+        $data = $cursor->fetch();
174
+        $this->dbConn->commit();
175
+        $cursor->closeCursor();
176
+
177
+        if ($data === false) {
178
+            throw new ShareNotFound();
179
+        }
180
+
181
+        $share = $this->createShare($data);
182
+        return $share;
183
+    }
184
+
185
+    /**
186
+     * Update a share
187
+     *
188
+     * @param \OCP\Share\IShare $share
189
+     * @return \OCP\Share\IShare The share object
190
+     */
191
+    public function update(\OCP\Share\IShare $share) {
192
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
193
+            /*
194 194
 			 * We allow updating the recipient on user shares.
195 195
 			 */
196
-			$qb = $this->dbConn->getQueryBuilder();
197
-			$qb->update('share')
198
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
199
-				->set('share_with', $qb->createNamedParameter($share->getSharedWith()))
200
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
201
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
202
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
203
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
204
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
205
-				->execute();
206
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
207
-			$qb = $this->dbConn->getQueryBuilder();
208
-			$qb->update('share')
209
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
210
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
211
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
212
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
213
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
214
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
215
-				->execute();
216
-
217
-			/*
196
+            $qb = $this->dbConn->getQueryBuilder();
197
+            $qb->update('share')
198
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
199
+                ->set('share_with', $qb->createNamedParameter($share->getSharedWith()))
200
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
201
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
202
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
203
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
204
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
205
+                ->execute();
206
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
207
+            $qb = $this->dbConn->getQueryBuilder();
208
+            $qb->update('share')
209
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
210
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
211
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
212
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
213
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
214
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
215
+                ->execute();
216
+
217
+            /*
218 218
 			 * Update all user defined group shares
219 219
 			 */
220
-			$qb = $this->dbConn->getQueryBuilder();
221
-			$qb->update('share')
222
-				->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
223
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
224
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
225
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
226
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
227
-				->execute();
228
-
229
-			/*
220
+            $qb = $this->dbConn->getQueryBuilder();
221
+            $qb->update('share')
222
+                ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
223
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
224
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
225
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
226
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
227
+                ->execute();
228
+
229
+            /*
230 230
 			 * Now update the permissions for all children that have not set it to 0
231 231
 			 */
232
-			$qb = $this->dbConn->getQueryBuilder();
233
-			$qb->update('share')
234
-				->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
235
-				->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
236
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
237
-				->execute();
238
-
239
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
240
-			$qb = $this->dbConn->getQueryBuilder();
241
-			$qb->update('share')
242
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
243
-				->set('share_with', $qb->createNamedParameter($share->getPassword()))
244
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
245
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
246
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
247
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
248
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
249
-				->set('token', $qb->createNamedParameter($share->getToken()))
250
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
251
-				->execute();
252
-		}
253
-
254
-		return $share;
255
-	}
256
-
257
-	/**
258
-	 * Get all children of this share
259
-	 * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
260
-	 *
261
-	 * @param \OCP\Share\IShare $parent
262
-	 * @return \OCP\Share\IShare[]
263
-	 */
264
-	public function getChildren(\OCP\Share\IShare $parent) {
265
-		$children = [];
266
-
267
-		$qb = $this->dbConn->getQueryBuilder();
268
-		$qb->select('*')
269
-			->from('share')
270
-			->where($qb->expr()->eq('parent', $qb->createNamedParameter($parent->getId())))
271
-			->andWhere(
272
-				$qb->expr()->in(
273
-					'share_type',
274
-					$qb->createNamedParameter([
275
-						\OCP\Share::SHARE_TYPE_USER,
276
-						\OCP\Share::SHARE_TYPE_GROUP,
277
-						\OCP\Share::SHARE_TYPE_LINK,
278
-					], IQueryBuilder::PARAM_INT_ARRAY)
279
-				)
280
-			)
281
-			->andWhere($qb->expr()->orX(
282
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
283
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
284
-			))
285
-			->orderBy('id');
286
-
287
-		$cursor = $qb->execute();
288
-		while($data = $cursor->fetch()) {
289
-			$children[] = $this->createShare($data);
290
-		}
291
-		$cursor->closeCursor();
292
-
293
-		return $children;
294
-	}
295
-
296
-	/**
297
-	 * Delete a share
298
-	 *
299
-	 * @param \OCP\Share\IShare $share
300
-	 */
301
-	public function delete(\OCP\Share\IShare $share) {
302
-		$qb = $this->dbConn->getQueryBuilder();
303
-		$qb->delete('share')
304
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())));
305
-
306
-		/*
232
+            $qb = $this->dbConn->getQueryBuilder();
233
+            $qb->update('share')
234
+                ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
235
+                ->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
236
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
237
+                ->execute();
238
+
239
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
240
+            $qb = $this->dbConn->getQueryBuilder();
241
+            $qb->update('share')
242
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
243
+                ->set('share_with', $qb->createNamedParameter($share->getPassword()))
244
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
245
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
246
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
247
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
248
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
249
+                ->set('token', $qb->createNamedParameter($share->getToken()))
250
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
251
+                ->execute();
252
+        }
253
+
254
+        return $share;
255
+    }
256
+
257
+    /**
258
+     * Get all children of this share
259
+     * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
260
+     *
261
+     * @param \OCP\Share\IShare $parent
262
+     * @return \OCP\Share\IShare[]
263
+     */
264
+    public function getChildren(\OCP\Share\IShare $parent) {
265
+        $children = [];
266
+
267
+        $qb = $this->dbConn->getQueryBuilder();
268
+        $qb->select('*')
269
+            ->from('share')
270
+            ->where($qb->expr()->eq('parent', $qb->createNamedParameter($parent->getId())))
271
+            ->andWhere(
272
+                $qb->expr()->in(
273
+                    'share_type',
274
+                    $qb->createNamedParameter([
275
+                        \OCP\Share::SHARE_TYPE_USER,
276
+                        \OCP\Share::SHARE_TYPE_GROUP,
277
+                        \OCP\Share::SHARE_TYPE_LINK,
278
+                    ], IQueryBuilder::PARAM_INT_ARRAY)
279
+                )
280
+            )
281
+            ->andWhere($qb->expr()->orX(
282
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
283
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
284
+            ))
285
+            ->orderBy('id');
286
+
287
+        $cursor = $qb->execute();
288
+        while($data = $cursor->fetch()) {
289
+            $children[] = $this->createShare($data);
290
+        }
291
+        $cursor->closeCursor();
292
+
293
+        return $children;
294
+    }
295
+
296
+    /**
297
+     * Delete a share
298
+     *
299
+     * @param \OCP\Share\IShare $share
300
+     */
301
+    public function delete(\OCP\Share\IShare $share) {
302
+        $qb = $this->dbConn->getQueryBuilder();
303
+        $qb->delete('share')
304
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())));
305
+
306
+        /*
307 307
 		 * If the share is a group share delete all possible
308 308
 		 * user defined groups shares.
309 309
 		 */
310
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
311
-			$qb->orWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())));
312
-		}
313
-
314
-		$qb->execute();
315
-	}
316
-
317
-	/**
318
-	 * Unshare a share from the recipient. If this is a group share
319
-	 * this means we need a special entry in the share db.
320
-	 *
321
-	 * @param \OCP\Share\IShare $share
322
-	 * @param string $recipient UserId of recipient
323
-	 * @throws BackendError
324
-	 * @throws ProviderException
325
-	 */
326
-	public function deleteFromSelf(\OCP\Share\IShare $share, $recipient) {
327
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
328
-
329
-			$group = $this->groupManager->get($share->getSharedWith());
330
-			$user = $this->userManager->get($recipient);
331
-
332
-			if (!$group->inGroup($user)) {
333
-				throw new ProviderException('Recipient not in receiving group');
334
-			}
335
-
336
-			// Try to fetch user specific share
337
-			$qb = $this->dbConn->getQueryBuilder();
338
-			$stmt = $qb->select('*')
339
-				->from('share')
340
-				->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
341
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
342
-				->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
343
-				->andWhere($qb->expr()->orX(
344
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
345
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
346
-				))
347
-				->execute();
348
-
349
-			$data = $stmt->fetch();
350
-
351
-			/*
310
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
311
+            $qb->orWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())));
312
+        }
313
+
314
+        $qb->execute();
315
+    }
316
+
317
+    /**
318
+     * Unshare a share from the recipient. If this is a group share
319
+     * this means we need a special entry in the share db.
320
+     *
321
+     * @param \OCP\Share\IShare $share
322
+     * @param string $recipient UserId of recipient
323
+     * @throws BackendError
324
+     * @throws ProviderException
325
+     */
326
+    public function deleteFromSelf(\OCP\Share\IShare $share, $recipient) {
327
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
328
+
329
+            $group = $this->groupManager->get($share->getSharedWith());
330
+            $user = $this->userManager->get($recipient);
331
+
332
+            if (!$group->inGroup($user)) {
333
+                throw new ProviderException('Recipient not in receiving group');
334
+            }
335
+
336
+            // Try to fetch user specific share
337
+            $qb = $this->dbConn->getQueryBuilder();
338
+            $stmt = $qb->select('*')
339
+                ->from('share')
340
+                ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
341
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
342
+                ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
343
+                ->andWhere($qb->expr()->orX(
344
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
345
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
346
+                ))
347
+                ->execute();
348
+
349
+            $data = $stmt->fetch();
350
+
351
+            /*
352 352
 			 * Check if there already is a user specific group share.
353 353
 			 * If there is update it (if required).
354 354
 			 */
355
-			if ($data === false) {
356
-				$qb = $this->dbConn->getQueryBuilder();
357
-
358
-				$type = $share->getNode() instanceof \OCP\Files\File ? 'file' : 'folder';
359
-
360
-				//Insert new share
361
-				$qb->insert('share')
362
-					->values([
363
-						'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
364
-						'share_with' => $qb->createNamedParameter($recipient),
365
-						'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
366
-						'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
367
-						'parent' => $qb->createNamedParameter($share->getId()),
368
-						'item_type' => $qb->createNamedParameter($type),
369
-						'item_source' => $qb->createNamedParameter($share->getNode()->getId()),
370
-						'file_source' => $qb->createNamedParameter($share->getNode()->getId()),
371
-						'file_target' => $qb->createNamedParameter($share->getTarget()),
372
-						'permissions' => $qb->createNamedParameter(0),
373
-						'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
374
-					])->execute();
375
-
376
-			} else if ($data['permissions'] !== 0) {
377
-
378
-				// Update existing usergroup share
379
-				$qb = $this->dbConn->getQueryBuilder();
380
-				$qb->update('share')
381
-					->set('permissions', $qb->createNamedParameter(0))
382
-					->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
383
-					->execute();
384
-			}
385
-
386
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
387
-
388
-			if ($share->getSharedWith() !== $recipient) {
389
-				throw new ProviderException('Recipient does not match');
390
-			}
391
-
392
-			// We can just delete user and link shares
393
-			$this->delete($share);
394
-		} else {
395
-			throw new ProviderException('Invalid shareType');
396
-		}
397
-	}
398
-
399
-	/**
400
-	 * @inheritdoc
401
-	 */
402
-	public function move(\OCP\Share\IShare $share, $recipient) {
403
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
404
-			// Just update the target
405
-			$qb = $this->dbConn->getQueryBuilder();
406
-			$qb->update('share')
407
-				->set('file_target', $qb->createNamedParameter($share->getTarget()))
408
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
409
-				->execute();
410
-
411
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
412
-
413
-			// Check if there is a usergroup share
414
-			$qb = $this->dbConn->getQueryBuilder();
415
-			$stmt = $qb->select('id')
416
-				->from('share')
417
-				->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
418
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
419
-				->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
420
-				->andWhere($qb->expr()->orX(
421
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
422
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
423
-				))
424
-				->setMaxResults(1)
425
-				->execute();
426
-
427
-			$data = $stmt->fetch();
428
-			$stmt->closeCursor();
429
-
430
-			if ($data === false) {
431
-				// No usergroup share yet. Create one.
432
-				$qb = $this->dbConn->getQueryBuilder();
433
-				$qb->insert('share')
434
-					->values([
435
-						'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
436
-						'share_with' => $qb->createNamedParameter($recipient),
437
-						'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
438
-						'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
439
-						'parent' => $qb->createNamedParameter($share->getId()),
440
-						'item_type' => $qb->createNamedParameter($share->getNode() instanceof File ? 'file' : 'folder'),
441
-						'item_source' => $qb->createNamedParameter($share->getNode()->getId()),
442
-						'file_source' => $qb->createNamedParameter($share->getNode()->getId()),
443
-						'file_target' => $qb->createNamedParameter($share->getTarget()),
444
-						'permissions' => $qb->createNamedParameter($share->getPermissions()),
445
-						'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
446
-					])->execute();
447
-			} else {
448
-				// Already a usergroup share. Update it.
449
-				$qb = $this->dbConn->getQueryBuilder();
450
-				$qb->update('share')
451
-					->set('file_target', $qb->createNamedParameter($share->getTarget()))
452
-					->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
453
-					->execute();
454
-			}
455
-		}
456
-
457
-		return $share;
458
-	}
459
-
460
-	public function getSharesInFolder($userId, Folder $node, $reshares) {
461
-		$qb = $this->dbConn->getQueryBuilder();
462
-		$qb->select('*')
463
-			->from('share', 's')
464
-			->andWhere($qb->expr()->orX(
465
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
466
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
467
-			));
468
-
469
-		$qb->andWhere($qb->expr()->orX(
470
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
471
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
472
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
473
-		));
474
-
475
-		/**
476
-		 * Reshares for this user are shares where they are the owner.
477
-		 */
478
-		if ($reshares === false) {
479
-			$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
480
-		} else {
481
-			$qb->andWhere(
482
-				$qb->expr()->orX(
483
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
484
-					$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
485
-				)
486
-			);
487
-		}
488
-
489
-		$qb->innerJoin('s', 'filecache' ,'f', 's.file_source = f.fileid');
490
-		$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
491
-
492
-		$qb->orderBy('id');
493
-
494
-		$cursor = $qb->execute();
495
-		$shares = [];
496
-		while ($data = $cursor->fetch()) {
497
-			$shares[$data['fileid']][] = $this->createShare($data);
498
-		}
499
-		$cursor->closeCursor();
500
-
501
-		return $shares;
502
-	}
503
-
504
-	/**
505
-	 * @inheritdoc
506
-	 */
507
-	public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset) {
508
-		$qb = $this->dbConn->getQueryBuilder();
509
-		$qb->select('*')
510
-			->from('share')
511
-			->andWhere($qb->expr()->orX(
512
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
513
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
514
-			));
515
-
516
-		$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
517
-
518
-		/**
519
-		 * Reshares for this user are shares where they are the owner.
520
-		 */
521
-		if ($reshares === false) {
522
-			$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
523
-		} else {
524
-			$qb->andWhere(
525
-				$qb->expr()->orX(
526
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
527
-					$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
528
-				)
529
-			);
530
-		}
531
-
532
-		if ($node !== null) {
533
-			$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
534
-		}
535
-
536
-		if ($limit !== -1) {
537
-			$qb->setMaxResults($limit);
538
-		}
539
-
540
-		$qb->setFirstResult($offset);
541
-		$qb->orderBy('id');
542
-
543
-		$cursor = $qb->execute();
544
-		$shares = [];
545
-		while($data = $cursor->fetch()) {
546
-			$shares[] = $this->createShare($data);
547
-		}
548
-		$cursor->closeCursor();
549
-
550
-		return $shares;
551
-	}
552
-
553
-	/**
554
-	 * @inheritdoc
555
-	 */
556
-	public function getShareById($id, $recipientId = null) {
557
-		$qb = $this->dbConn->getQueryBuilder();
558
-
559
-		$qb->select('*')
560
-			->from('share')
561
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
562
-			->andWhere(
563
-				$qb->expr()->in(
564
-					'share_type',
565
-					$qb->createNamedParameter([
566
-						\OCP\Share::SHARE_TYPE_USER,
567
-						\OCP\Share::SHARE_TYPE_GROUP,
568
-						\OCP\Share::SHARE_TYPE_LINK,
569
-					], IQueryBuilder::PARAM_INT_ARRAY)
570
-				)
571
-			)
572
-			->andWhere($qb->expr()->orX(
573
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
574
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
575
-			));
576
-
577
-		$cursor = $qb->execute();
578
-		$data = $cursor->fetch();
579
-		$cursor->closeCursor();
580
-
581
-		if ($data === false) {
582
-			throw new ShareNotFound();
583
-		}
584
-
585
-		try {
586
-			$share = $this->createShare($data);
587
-		} catch (InvalidShare $e) {
588
-			throw new ShareNotFound();
589
-		}
590
-
591
-		// If the recipient is set for a group share resolve to that user
592
-		if ($recipientId !== null && $share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
593
-			$share = $this->resolveGroupShares([$share], $recipientId)[0];
594
-		}
595
-
596
-		return $share;
597
-	}
598
-
599
-	/**
600
-	 * Get shares for a given path
601
-	 *
602
-	 * @param \OCP\Files\Node $path
603
-	 * @return \OCP\Share\IShare[]
604
-	 */
605
-	public function getSharesByPath(Node $path) {
606
-		$qb = $this->dbConn->getQueryBuilder();
607
-
608
-		$cursor = $qb->select('*')
609
-			->from('share')
610
-			->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
611
-			->andWhere(
612
-				$qb->expr()->orX(
613
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
614
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))
615
-				)
616
-			)
617
-			->andWhere($qb->expr()->orX(
618
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
619
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
620
-			))
621
-			->execute();
622
-
623
-		$shares = [];
624
-		while($data = $cursor->fetch()) {
625
-			$shares[] = $this->createShare($data);
626
-		}
627
-		$cursor->closeCursor();
628
-
629
-		return $shares;
630
-	}
631
-
632
-	/**
633
-	 * Returns whether the given database result can be interpreted as
634
-	 * a share with accessible file (not trashed, not deleted)
635
-	 */
636
-	private function isAccessibleResult($data) {
637
-		// exclude shares leading to deleted file entries
638
-		if ($data['fileid'] === null) {
639
-			return false;
640
-		}
641
-
642
-		// exclude shares leading to trashbin on home storages
643
-		$pathSections = explode('/', $data['path'], 2);
644
-		// FIXME: would not detect rare md5'd home storage case properly
645
-		if ($pathSections[0] !== 'files' 
646
-		    	&& in_array(explode(':', $data['storage_string_id'], 2)[0], array('home', 'object'))) {
647
-			return false;
648
-		}
649
-		return true;
650
-	}
651
-
652
-	/**
653
-	 * @inheritdoc
654
-	 */
655
-	public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
656
-		/** @var Share[] $shares */
657
-		$shares = [];
658
-
659
-		if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
660
-			//Get shares directly with this user
661
-			$qb = $this->dbConn->getQueryBuilder();
662
-			$qb->select('s.*',
663
-				'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
664
-				'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
665
-				'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
666
-			)
667
-				->selectAlias('st.id', 'storage_string_id')
668
-				->from('share', 's')
669
-				->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
670
-				->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
671
-
672
-			// Order by id
673
-			$qb->orderBy('s.id');
674
-
675
-			// Set limit and offset
676
-			if ($limit !== -1) {
677
-				$qb->setMaxResults($limit);
678
-			}
679
-			$qb->setFirstResult($offset);
680
-
681
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)))
682
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
683
-				->andWhere($qb->expr()->orX(
684
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
685
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
686
-				));
687
-
688
-			// Filter by node if provided
689
-			if ($node !== null) {
690
-				$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
691
-			}
692
-
693
-			$cursor = $qb->execute();
694
-
695
-			while($data = $cursor->fetch()) {
696
-				if ($this->isAccessibleResult($data)) {
697
-					$shares[] = $this->createShare($data);
698
-				}
699
-			}
700
-			$cursor->closeCursor();
701
-
702
-		} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
703
-			$user = $this->userManager->get($userId);
704
-			$allGroups = $this->groupManager->getUserGroups($user);
705
-
706
-			/** @var Share[] $shares2 */
707
-			$shares2 = [];
708
-
709
-			$start = 0;
710
-			while(true) {
711
-				$groups = array_slice($allGroups, $start, 100);
712
-				$start += 100;
713
-
714
-				if ($groups === []) {
715
-					break;
716
-				}
717
-
718
-				$qb = $this->dbConn->getQueryBuilder();
719
-				$qb->select('s.*',
720
-					'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
721
-					'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
722
-					'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
723
-				)
724
-					->selectAlias('st.id', 'storage_string_id')
725
-					->from('share', 's')
726
-					->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
727
-					->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
728
-					->orderBy('s.id')
729
-					->setFirstResult(0);
730
-
731
-				if ($limit !== -1) {
732
-					$qb->setMaxResults($limit - count($shares));
733
-				}
734
-
735
-				// Filter by node if provided
736
-				if ($node !== null) {
737
-					$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
738
-				}
739
-
740
-				$groups = array_map(function(IGroup $group) { return $group->getGID(); }, $groups);
741
-
742
-				$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
743
-					->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter(
744
-						$groups,
745
-						IQueryBuilder::PARAM_STR_ARRAY
746
-					)))
747
-					->andWhere($qb->expr()->orX(
748
-						$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
749
-						$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
750
-					));
751
-
752
-				$cursor = $qb->execute();
753
-				while($data = $cursor->fetch()) {
754
-					if ($offset > 0) {
755
-						$offset--;
756
-						continue;
757
-					}
758
-
759
-					if ($this->isAccessibleResult($data)) {
760
-						$shares2[] = $this->createShare($data);
761
-					}
762
-				}
763
-				$cursor->closeCursor();
764
-			}
765
-
766
-			/*
355
+            if ($data === false) {
356
+                $qb = $this->dbConn->getQueryBuilder();
357
+
358
+                $type = $share->getNode() instanceof \OCP\Files\File ? 'file' : 'folder';
359
+
360
+                //Insert new share
361
+                $qb->insert('share')
362
+                    ->values([
363
+                        'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
364
+                        'share_with' => $qb->createNamedParameter($recipient),
365
+                        'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
366
+                        'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
367
+                        'parent' => $qb->createNamedParameter($share->getId()),
368
+                        'item_type' => $qb->createNamedParameter($type),
369
+                        'item_source' => $qb->createNamedParameter($share->getNode()->getId()),
370
+                        'file_source' => $qb->createNamedParameter($share->getNode()->getId()),
371
+                        'file_target' => $qb->createNamedParameter($share->getTarget()),
372
+                        'permissions' => $qb->createNamedParameter(0),
373
+                        'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
374
+                    ])->execute();
375
+
376
+            } else if ($data['permissions'] !== 0) {
377
+
378
+                // Update existing usergroup share
379
+                $qb = $this->dbConn->getQueryBuilder();
380
+                $qb->update('share')
381
+                    ->set('permissions', $qb->createNamedParameter(0))
382
+                    ->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
383
+                    ->execute();
384
+            }
385
+
386
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
387
+
388
+            if ($share->getSharedWith() !== $recipient) {
389
+                throw new ProviderException('Recipient does not match');
390
+            }
391
+
392
+            // We can just delete user and link shares
393
+            $this->delete($share);
394
+        } else {
395
+            throw new ProviderException('Invalid shareType');
396
+        }
397
+    }
398
+
399
+    /**
400
+     * @inheritdoc
401
+     */
402
+    public function move(\OCP\Share\IShare $share, $recipient) {
403
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
404
+            // Just update the target
405
+            $qb = $this->dbConn->getQueryBuilder();
406
+            $qb->update('share')
407
+                ->set('file_target', $qb->createNamedParameter($share->getTarget()))
408
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
409
+                ->execute();
410
+
411
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
412
+
413
+            // Check if there is a usergroup share
414
+            $qb = $this->dbConn->getQueryBuilder();
415
+            $stmt = $qb->select('id')
416
+                ->from('share')
417
+                ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
418
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
419
+                ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
420
+                ->andWhere($qb->expr()->orX(
421
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
422
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
423
+                ))
424
+                ->setMaxResults(1)
425
+                ->execute();
426
+
427
+            $data = $stmt->fetch();
428
+            $stmt->closeCursor();
429
+
430
+            if ($data === false) {
431
+                // No usergroup share yet. Create one.
432
+                $qb = $this->dbConn->getQueryBuilder();
433
+                $qb->insert('share')
434
+                    ->values([
435
+                        'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
436
+                        'share_with' => $qb->createNamedParameter($recipient),
437
+                        'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
438
+                        'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
439
+                        'parent' => $qb->createNamedParameter($share->getId()),
440
+                        'item_type' => $qb->createNamedParameter($share->getNode() instanceof File ? 'file' : 'folder'),
441
+                        'item_source' => $qb->createNamedParameter($share->getNode()->getId()),
442
+                        'file_source' => $qb->createNamedParameter($share->getNode()->getId()),
443
+                        'file_target' => $qb->createNamedParameter($share->getTarget()),
444
+                        'permissions' => $qb->createNamedParameter($share->getPermissions()),
445
+                        'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
446
+                    ])->execute();
447
+            } else {
448
+                // Already a usergroup share. Update it.
449
+                $qb = $this->dbConn->getQueryBuilder();
450
+                $qb->update('share')
451
+                    ->set('file_target', $qb->createNamedParameter($share->getTarget()))
452
+                    ->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
453
+                    ->execute();
454
+            }
455
+        }
456
+
457
+        return $share;
458
+    }
459
+
460
+    public function getSharesInFolder($userId, Folder $node, $reshares) {
461
+        $qb = $this->dbConn->getQueryBuilder();
462
+        $qb->select('*')
463
+            ->from('share', 's')
464
+            ->andWhere($qb->expr()->orX(
465
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
466
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
467
+            ));
468
+
469
+        $qb->andWhere($qb->expr()->orX(
470
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
471
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
472
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
473
+        ));
474
+
475
+        /**
476
+         * Reshares for this user are shares where they are the owner.
477
+         */
478
+        if ($reshares === false) {
479
+            $qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
480
+        } else {
481
+            $qb->andWhere(
482
+                $qb->expr()->orX(
483
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
484
+                    $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
485
+                )
486
+            );
487
+        }
488
+
489
+        $qb->innerJoin('s', 'filecache' ,'f', 's.file_source = f.fileid');
490
+        $qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
491
+
492
+        $qb->orderBy('id');
493
+
494
+        $cursor = $qb->execute();
495
+        $shares = [];
496
+        while ($data = $cursor->fetch()) {
497
+            $shares[$data['fileid']][] = $this->createShare($data);
498
+        }
499
+        $cursor->closeCursor();
500
+
501
+        return $shares;
502
+    }
503
+
504
+    /**
505
+     * @inheritdoc
506
+     */
507
+    public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset) {
508
+        $qb = $this->dbConn->getQueryBuilder();
509
+        $qb->select('*')
510
+            ->from('share')
511
+            ->andWhere($qb->expr()->orX(
512
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
513
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
514
+            ));
515
+
516
+        $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
517
+
518
+        /**
519
+         * Reshares for this user are shares where they are the owner.
520
+         */
521
+        if ($reshares === false) {
522
+            $qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
523
+        } else {
524
+            $qb->andWhere(
525
+                $qb->expr()->orX(
526
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
527
+                    $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
528
+                )
529
+            );
530
+        }
531
+
532
+        if ($node !== null) {
533
+            $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
534
+        }
535
+
536
+        if ($limit !== -1) {
537
+            $qb->setMaxResults($limit);
538
+        }
539
+
540
+        $qb->setFirstResult($offset);
541
+        $qb->orderBy('id');
542
+
543
+        $cursor = $qb->execute();
544
+        $shares = [];
545
+        while($data = $cursor->fetch()) {
546
+            $shares[] = $this->createShare($data);
547
+        }
548
+        $cursor->closeCursor();
549
+
550
+        return $shares;
551
+    }
552
+
553
+    /**
554
+     * @inheritdoc
555
+     */
556
+    public function getShareById($id, $recipientId = null) {
557
+        $qb = $this->dbConn->getQueryBuilder();
558
+
559
+        $qb->select('*')
560
+            ->from('share')
561
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
562
+            ->andWhere(
563
+                $qb->expr()->in(
564
+                    'share_type',
565
+                    $qb->createNamedParameter([
566
+                        \OCP\Share::SHARE_TYPE_USER,
567
+                        \OCP\Share::SHARE_TYPE_GROUP,
568
+                        \OCP\Share::SHARE_TYPE_LINK,
569
+                    ], IQueryBuilder::PARAM_INT_ARRAY)
570
+                )
571
+            )
572
+            ->andWhere($qb->expr()->orX(
573
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
574
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
575
+            ));
576
+
577
+        $cursor = $qb->execute();
578
+        $data = $cursor->fetch();
579
+        $cursor->closeCursor();
580
+
581
+        if ($data === false) {
582
+            throw new ShareNotFound();
583
+        }
584
+
585
+        try {
586
+            $share = $this->createShare($data);
587
+        } catch (InvalidShare $e) {
588
+            throw new ShareNotFound();
589
+        }
590
+
591
+        // If the recipient is set for a group share resolve to that user
592
+        if ($recipientId !== null && $share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
593
+            $share = $this->resolveGroupShares([$share], $recipientId)[0];
594
+        }
595
+
596
+        return $share;
597
+    }
598
+
599
+    /**
600
+     * Get shares for a given path
601
+     *
602
+     * @param \OCP\Files\Node $path
603
+     * @return \OCP\Share\IShare[]
604
+     */
605
+    public function getSharesByPath(Node $path) {
606
+        $qb = $this->dbConn->getQueryBuilder();
607
+
608
+        $cursor = $qb->select('*')
609
+            ->from('share')
610
+            ->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
611
+            ->andWhere(
612
+                $qb->expr()->orX(
613
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
614
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))
615
+                )
616
+            )
617
+            ->andWhere($qb->expr()->orX(
618
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
619
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
620
+            ))
621
+            ->execute();
622
+
623
+        $shares = [];
624
+        while($data = $cursor->fetch()) {
625
+            $shares[] = $this->createShare($data);
626
+        }
627
+        $cursor->closeCursor();
628
+
629
+        return $shares;
630
+    }
631
+
632
+    /**
633
+     * Returns whether the given database result can be interpreted as
634
+     * a share with accessible file (not trashed, not deleted)
635
+     */
636
+    private function isAccessibleResult($data) {
637
+        // exclude shares leading to deleted file entries
638
+        if ($data['fileid'] === null) {
639
+            return false;
640
+        }
641
+
642
+        // exclude shares leading to trashbin on home storages
643
+        $pathSections = explode('/', $data['path'], 2);
644
+        // FIXME: would not detect rare md5'd home storage case properly
645
+        if ($pathSections[0] !== 'files' 
646
+                && in_array(explode(':', $data['storage_string_id'], 2)[0], array('home', 'object'))) {
647
+            return false;
648
+        }
649
+        return true;
650
+    }
651
+
652
+    /**
653
+     * @inheritdoc
654
+     */
655
+    public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
656
+        /** @var Share[] $shares */
657
+        $shares = [];
658
+
659
+        if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
660
+            //Get shares directly with this user
661
+            $qb = $this->dbConn->getQueryBuilder();
662
+            $qb->select('s.*',
663
+                'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
664
+                'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
665
+                'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
666
+            )
667
+                ->selectAlias('st.id', 'storage_string_id')
668
+                ->from('share', 's')
669
+                ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
670
+                ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
671
+
672
+            // Order by id
673
+            $qb->orderBy('s.id');
674
+
675
+            // Set limit and offset
676
+            if ($limit !== -1) {
677
+                $qb->setMaxResults($limit);
678
+            }
679
+            $qb->setFirstResult($offset);
680
+
681
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)))
682
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
683
+                ->andWhere($qb->expr()->orX(
684
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
685
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
686
+                ));
687
+
688
+            // Filter by node if provided
689
+            if ($node !== null) {
690
+                $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
691
+            }
692
+
693
+            $cursor = $qb->execute();
694
+
695
+            while($data = $cursor->fetch()) {
696
+                if ($this->isAccessibleResult($data)) {
697
+                    $shares[] = $this->createShare($data);
698
+                }
699
+            }
700
+            $cursor->closeCursor();
701
+
702
+        } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
703
+            $user = $this->userManager->get($userId);
704
+            $allGroups = $this->groupManager->getUserGroups($user);
705
+
706
+            /** @var Share[] $shares2 */
707
+            $shares2 = [];
708
+
709
+            $start = 0;
710
+            while(true) {
711
+                $groups = array_slice($allGroups, $start, 100);
712
+                $start += 100;
713
+
714
+                if ($groups === []) {
715
+                    break;
716
+                }
717
+
718
+                $qb = $this->dbConn->getQueryBuilder();
719
+                $qb->select('s.*',
720
+                    'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
721
+                    'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
722
+                    'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
723
+                )
724
+                    ->selectAlias('st.id', 'storage_string_id')
725
+                    ->from('share', 's')
726
+                    ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
727
+                    ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
728
+                    ->orderBy('s.id')
729
+                    ->setFirstResult(0);
730
+
731
+                if ($limit !== -1) {
732
+                    $qb->setMaxResults($limit - count($shares));
733
+                }
734
+
735
+                // Filter by node if provided
736
+                if ($node !== null) {
737
+                    $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
738
+                }
739
+
740
+                $groups = array_map(function(IGroup $group) { return $group->getGID(); }, $groups);
741
+
742
+                $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
743
+                    ->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter(
744
+                        $groups,
745
+                        IQueryBuilder::PARAM_STR_ARRAY
746
+                    )))
747
+                    ->andWhere($qb->expr()->orX(
748
+                        $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
749
+                        $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
750
+                    ));
751
+
752
+                $cursor = $qb->execute();
753
+                while($data = $cursor->fetch()) {
754
+                    if ($offset > 0) {
755
+                        $offset--;
756
+                        continue;
757
+                    }
758
+
759
+                    if ($this->isAccessibleResult($data)) {
760
+                        $shares2[] = $this->createShare($data);
761
+                    }
762
+                }
763
+                $cursor->closeCursor();
764
+            }
765
+
766
+            /*
767 767
  			 * Resolve all group shares to user specific shares
768 768
  			 */
769
-			$shares = $this->resolveGroupShares($shares2, $userId);
770
-		} else {
771
-			throw new BackendError('Invalid backend');
772
-		}
773
-
774
-
775
-		return $shares;
776
-	}
777
-
778
-	/**
779
-	 * Get a share by token
780
-	 *
781
-	 * @param string $token
782
-	 * @return \OCP\Share\IShare
783
-	 * @throws ShareNotFound
784
-	 */
785
-	public function getShareByToken($token) {
786
-		$qb = $this->dbConn->getQueryBuilder();
787
-
788
-		$cursor = $qb->select('*')
789
-			->from('share')
790
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)))
791
-			->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
792
-			->andWhere($qb->expr()->orX(
793
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
794
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
795
-			))
796
-			->execute();
797
-
798
-		$data = $cursor->fetch();
799
-
800
-		if ($data === false) {
801
-			throw new ShareNotFound();
802
-		}
803
-
804
-		try {
805
-			$share = $this->createShare($data);
806
-		} catch (InvalidShare $e) {
807
-			throw new ShareNotFound();
808
-		}
809
-
810
-		return $share;
811
-	}
812
-
813
-	/**
814
-	 * Create a share object from an database row
815
-	 *
816
-	 * @param mixed[] $data
817
-	 * @return \OCP\Share\IShare
818
-	 * @throws InvalidShare
819
-	 */
820
-	private function createShare($data) {
821
-		$share = new Share($this->rootFolder, $this->userManager);
822
-		$share->setId((int)$data['id'])
823
-			->setShareType((int)$data['share_type'])
824
-			->setPermissions((int)$data['permissions'])
825
-			->setTarget($data['file_target'])
826
-			->setMailSend((bool)$data['mail_send']);
827
-
828
-		$shareTime = new \DateTime();
829
-		$shareTime->setTimestamp((int)$data['stime']);
830
-		$share->setShareTime($shareTime);
831
-
832
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
833
-			$share->setSharedWith($data['share_with']);
834
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
835
-			$share->setSharedWith($data['share_with']);
836
-		} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
837
-			$share->setPassword($data['share_with']);
838
-			$share->setToken($data['token']);
839
-		}
840
-
841
-		$share->setSharedBy($data['uid_initiator']);
842
-		$share->setShareOwner($data['uid_owner']);
843
-
844
-		$share->setNodeId((int)$data['file_source']);
845
-		$share->setNodeType($data['item_type']);
846
-
847
-		if ($data['expiration'] !== null) {
848
-			$expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']);
849
-			$share->setExpirationDate($expiration);
850
-		}
851
-
852
-		if (isset($data['f_permissions'])) {
853
-			$entryData = $data;
854
-			$entryData['permissions'] = $entryData['f_permissions'];
855
-			$entryData['parent'] = $entryData['f_parent'];;
856
-			$share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData,
857
-				\OC::$server->getMimeTypeLoader()));
858
-		}
859
-
860
-		$share->setProviderId($this->identifier());
861
-
862
-		return $share;
863
-	}
864
-
865
-	/**
866
-	 * @param Share[] $shares
867
-	 * @param $userId
868
-	 * @return Share[] The updates shares if no update is found for a share return the original
869
-	 */
870
-	private function resolveGroupShares($shares, $userId) {
871
-		$result = [];
872
-
873
-		$start = 0;
874
-		while(true) {
875
-			/** @var Share[] $shareSlice */
876
-			$shareSlice = array_slice($shares, $start, 100);
877
-			$start += 100;
878
-
879
-			if ($shareSlice === []) {
880
-				break;
881
-			}
882
-
883
-			/** @var int[] $ids */
884
-			$ids = [];
885
-			/** @var Share[] $shareMap */
886
-			$shareMap = [];
887
-
888
-			foreach ($shareSlice as $share) {
889
-				$ids[] = (int)$share->getId();
890
-				$shareMap[$share->getId()] = $share;
891
-			}
892
-
893
-			$qb = $this->dbConn->getQueryBuilder();
894
-
895
-			$query = $qb->select('*')
896
-				->from('share')
897
-				->where($qb->expr()->in('parent', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
898
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
899
-				->andWhere($qb->expr()->orX(
900
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
901
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
902
-				));
903
-
904
-			$stmt = $query->execute();
905
-
906
-			while($data = $stmt->fetch()) {
907
-				$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
908
-				$shareMap[$data['parent']]->setTarget($data['file_target']);
909
-			}
910
-
911
-			$stmt->closeCursor();
912
-
913
-			foreach ($shareMap as $share) {
914
-				$result[] = $share;
915
-			}
916
-		}
917
-
918
-		return $result;
919
-	}
920
-
921
-	/**
922
-	 * A user is deleted from the system
923
-	 * So clean up the relevant shares.
924
-	 *
925
-	 * @param string $uid
926
-	 * @param int $shareType
927
-	 */
928
-	public function userDeleted($uid, $shareType) {
929
-		$qb = $this->dbConn->getQueryBuilder();
930
-
931
-		$qb->delete('share');
932
-
933
-		if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
934
-			/*
769
+            $shares = $this->resolveGroupShares($shares2, $userId);
770
+        } else {
771
+            throw new BackendError('Invalid backend');
772
+        }
773
+
774
+
775
+        return $shares;
776
+    }
777
+
778
+    /**
779
+     * Get a share by token
780
+     *
781
+     * @param string $token
782
+     * @return \OCP\Share\IShare
783
+     * @throws ShareNotFound
784
+     */
785
+    public function getShareByToken($token) {
786
+        $qb = $this->dbConn->getQueryBuilder();
787
+
788
+        $cursor = $qb->select('*')
789
+            ->from('share')
790
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)))
791
+            ->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
792
+            ->andWhere($qb->expr()->orX(
793
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
794
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
795
+            ))
796
+            ->execute();
797
+
798
+        $data = $cursor->fetch();
799
+
800
+        if ($data === false) {
801
+            throw new ShareNotFound();
802
+        }
803
+
804
+        try {
805
+            $share = $this->createShare($data);
806
+        } catch (InvalidShare $e) {
807
+            throw new ShareNotFound();
808
+        }
809
+
810
+        return $share;
811
+    }
812
+
813
+    /**
814
+     * Create a share object from an database row
815
+     *
816
+     * @param mixed[] $data
817
+     * @return \OCP\Share\IShare
818
+     * @throws InvalidShare
819
+     */
820
+    private function createShare($data) {
821
+        $share = new Share($this->rootFolder, $this->userManager);
822
+        $share->setId((int)$data['id'])
823
+            ->setShareType((int)$data['share_type'])
824
+            ->setPermissions((int)$data['permissions'])
825
+            ->setTarget($data['file_target'])
826
+            ->setMailSend((bool)$data['mail_send']);
827
+
828
+        $shareTime = new \DateTime();
829
+        $shareTime->setTimestamp((int)$data['stime']);
830
+        $share->setShareTime($shareTime);
831
+
832
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
833
+            $share->setSharedWith($data['share_with']);
834
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
835
+            $share->setSharedWith($data['share_with']);
836
+        } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
837
+            $share->setPassword($data['share_with']);
838
+            $share->setToken($data['token']);
839
+        }
840
+
841
+        $share->setSharedBy($data['uid_initiator']);
842
+        $share->setShareOwner($data['uid_owner']);
843
+
844
+        $share->setNodeId((int)$data['file_source']);
845
+        $share->setNodeType($data['item_type']);
846
+
847
+        if ($data['expiration'] !== null) {
848
+            $expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']);
849
+            $share->setExpirationDate($expiration);
850
+        }
851
+
852
+        if (isset($data['f_permissions'])) {
853
+            $entryData = $data;
854
+            $entryData['permissions'] = $entryData['f_permissions'];
855
+            $entryData['parent'] = $entryData['f_parent'];;
856
+            $share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData,
857
+                \OC::$server->getMimeTypeLoader()));
858
+        }
859
+
860
+        $share->setProviderId($this->identifier());
861
+
862
+        return $share;
863
+    }
864
+
865
+    /**
866
+     * @param Share[] $shares
867
+     * @param $userId
868
+     * @return Share[] The updates shares if no update is found for a share return the original
869
+     */
870
+    private function resolveGroupShares($shares, $userId) {
871
+        $result = [];
872
+
873
+        $start = 0;
874
+        while(true) {
875
+            /** @var Share[] $shareSlice */
876
+            $shareSlice = array_slice($shares, $start, 100);
877
+            $start += 100;
878
+
879
+            if ($shareSlice === []) {
880
+                break;
881
+            }
882
+
883
+            /** @var int[] $ids */
884
+            $ids = [];
885
+            /** @var Share[] $shareMap */
886
+            $shareMap = [];
887
+
888
+            foreach ($shareSlice as $share) {
889
+                $ids[] = (int)$share->getId();
890
+                $shareMap[$share->getId()] = $share;
891
+            }
892
+
893
+            $qb = $this->dbConn->getQueryBuilder();
894
+
895
+            $query = $qb->select('*')
896
+                ->from('share')
897
+                ->where($qb->expr()->in('parent', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
898
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
899
+                ->andWhere($qb->expr()->orX(
900
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
901
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
902
+                ));
903
+
904
+            $stmt = $query->execute();
905
+
906
+            while($data = $stmt->fetch()) {
907
+                $shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
908
+                $shareMap[$data['parent']]->setTarget($data['file_target']);
909
+            }
910
+
911
+            $stmt->closeCursor();
912
+
913
+            foreach ($shareMap as $share) {
914
+                $result[] = $share;
915
+            }
916
+        }
917
+
918
+        return $result;
919
+    }
920
+
921
+    /**
922
+     * A user is deleted from the system
923
+     * So clean up the relevant shares.
924
+     *
925
+     * @param string $uid
926
+     * @param int $shareType
927
+     */
928
+    public function userDeleted($uid, $shareType) {
929
+        $qb = $this->dbConn->getQueryBuilder();
930
+
931
+        $qb->delete('share');
932
+
933
+        if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
934
+            /*
935 935
 			 * Delete all user shares that are owned by this user
936 936
 			 * or that are received by this user
937 937
 			 */
938 938
 
939
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)));
939
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)));
940 940
 
941
-			$qb->andWhere(
942
-				$qb->expr()->orX(
943
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
944
-					$qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
945
-				)
946
-			);
947
-		} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
948
-			/*
941
+            $qb->andWhere(
942
+                $qb->expr()->orX(
943
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
944
+                    $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
945
+                )
946
+            );
947
+        } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
948
+            /*
949 949
 			 * Delete all group shares that are owned by this user
950 950
 			 * Or special user group shares that are received by this user
951 951
 			 */
952
-			$qb->where(
953
-				$qb->expr()->andX(
954
-					$qb->expr()->orX(
955
-						$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
956
-						$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
957
-					),
958
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
959
-				)
960
-			);
961
-
962
-			$qb->orWhere(
963
-				$qb->expr()->andX(
964
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)),
965
-					$qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
966
-				)
967
-			);
968
-		} else if ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
969
-			/*
952
+            $qb->where(
953
+                $qb->expr()->andX(
954
+                    $qb->expr()->orX(
955
+                        $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
956
+                        $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
957
+                    ),
958
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
959
+                )
960
+            );
961
+
962
+            $qb->orWhere(
963
+                $qb->expr()->andX(
964
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)),
965
+                    $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
966
+                )
967
+            );
968
+        } else if ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
969
+            /*
970 970
 			 * Delete all link shares owned by this user.
971 971
 			 * And all link shares initiated by this user (until #22327 is in)
972 972
 			 */
973
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
974
-
975
-			$qb->andWhere(
976
-				$qb->expr()->orX(
977
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
978
-					$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($uid))
979
-				)
980
-			);
981
-		}
982
-
983
-		$qb->execute();
984
-	}
985
-
986
-	/**
987
-	 * Delete all shares received by this group. As well as any custom group
988
-	 * shares for group members.
989
-	 *
990
-	 * @param string $gid
991
-	 */
992
-	public function groupDeleted($gid) {
993
-		/*
973
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
974
+
975
+            $qb->andWhere(
976
+                $qb->expr()->orX(
977
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
978
+                    $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($uid))
979
+                )
980
+            );
981
+        }
982
+
983
+        $qb->execute();
984
+    }
985
+
986
+    /**
987
+     * Delete all shares received by this group. As well as any custom group
988
+     * shares for group members.
989
+     *
990
+     * @param string $gid
991
+     */
992
+    public function groupDeleted($gid) {
993
+        /*
994 994
 		 * First delete all custom group shares for group members
995 995
 		 */
996
-		$qb = $this->dbConn->getQueryBuilder();
997
-		$qb->select('id')
998
-			->from('share')
999
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1000
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1001
-
1002
-		$cursor = $qb->execute();
1003
-		$ids = [];
1004
-		while($row = $cursor->fetch()) {
1005
-			$ids[] = (int)$row['id'];
1006
-		}
1007
-		$cursor->closeCursor();
1008
-
1009
-		if (!empty($ids)) {
1010
-			$chunks = array_chunk($ids, 100);
1011
-			foreach ($chunks as $chunk) {
1012
-				$qb->delete('share')
1013
-					->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1014
-					->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1015
-				$qb->execute();
1016
-			}
1017
-		}
1018
-
1019
-		/*
996
+        $qb = $this->dbConn->getQueryBuilder();
997
+        $qb->select('id')
998
+            ->from('share')
999
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1000
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1001
+
1002
+        $cursor = $qb->execute();
1003
+        $ids = [];
1004
+        while($row = $cursor->fetch()) {
1005
+            $ids[] = (int)$row['id'];
1006
+        }
1007
+        $cursor->closeCursor();
1008
+
1009
+        if (!empty($ids)) {
1010
+            $chunks = array_chunk($ids, 100);
1011
+            foreach ($chunks as $chunk) {
1012
+                $qb->delete('share')
1013
+                    ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1014
+                    ->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1015
+                $qb->execute();
1016
+            }
1017
+        }
1018
+
1019
+        /*
1020 1020
 		 * Now delete all the group shares
1021 1021
 		 */
1022
-		$qb = $this->dbConn->getQueryBuilder();
1023
-		$qb->delete('share')
1024
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1025
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1026
-		$qb->execute();
1027
-	}
1028
-
1029
-	/**
1030
-	 * Delete custom group shares to this group for this user
1031
-	 *
1032
-	 * @param string $uid
1033
-	 * @param string $gid
1034
-	 */
1035
-	public function userDeletedFromGroup($uid, $gid) {
1036
-		/*
1022
+        $qb = $this->dbConn->getQueryBuilder();
1023
+        $qb->delete('share')
1024
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1025
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1026
+        $qb->execute();
1027
+    }
1028
+
1029
+    /**
1030
+     * Delete custom group shares to this group for this user
1031
+     *
1032
+     * @param string $uid
1033
+     * @param string $gid
1034
+     */
1035
+    public function userDeletedFromGroup($uid, $gid) {
1036
+        /*
1037 1037
 		 * Get all group shares
1038 1038
 		 */
1039
-		$qb = $this->dbConn->getQueryBuilder();
1040
-		$qb->select('id')
1041
-			->from('share')
1042
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1043
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1044
-
1045
-		$cursor = $qb->execute();
1046
-		$ids = [];
1047
-		while($row = $cursor->fetch()) {
1048
-			$ids[] = (int)$row['id'];
1049
-		}
1050
-		$cursor->closeCursor();
1051
-
1052
-		if (!empty($ids)) {
1053
-			$chunks = array_chunk($ids, 100);
1054
-			foreach ($chunks as $chunk) {
1055
-				/*
1039
+        $qb = $this->dbConn->getQueryBuilder();
1040
+        $qb->select('id')
1041
+            ->from('share')
1042
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1043
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1044
+
1045
+        $cursor = $qb->execute();
1046
+        $ids = [];
1047
+        while($row = $cursor->fetch()) {
1048
+            $ids[] = (int)$row['id'];
1049
+        }
1050
+        $cursor->closeCursor();
1051
+
1052
+        if (!empty($ids)) {
1053
+            $chunks = array_chunk($ids, 100);
1054
+            foreach ($chunks as $chunk) {
1055
+                /*
1056 1056
 				 * Delete all special shares wit this users for the found group shares
1057 1057
 				 */
1058
-				$qb->delete('share')
1059
-					->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1060
-					->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($uid)))
1061
-					->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1062
-				$qb->execute();
1063
-			}
1064
-		}
1065
-	}
1058
+                $qb->delete('share')
1059
+                    ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1060
+                    ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($uid)))
1061
+                    ->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1062
+                $qb->execute();
1063
+            }
1064
+        }
1065
+    }
1066 1066
 }
Please login to merge, or discard this patch.