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