Passed
Push — master ( 9348fd...7904dd )
by Roeland
11:27 queued 12s
created

ShareAPIController::canDeleteShare()   A

Complexity

Conditions 6
Paths 4

Size

Total Lines 23
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 9
nc 4
nop 1
dl 0
loc 23
rs 9.2222
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
/**
4
 * @copyright Copyright (c) 2016, ownCloud, Inc.
5
 *
6
 * @author Bjoern Schiessle <[email protected]>
7
 * @author Joas Schilling <[email protected]>
8
 * @author Lukas Reschke <[email protected]>
9
 * @author Maxence Lange <[email protected]>
10
 * @author Michael Jobst <[email protected]>
11
 * @author Robin Appelman <[email protected]>
12
 * @author Roeland Jago Douma <[email protected]>
13
 * @author Vincent Petry <[email protected]>
14
 * @author John Molakvoæ <[email protected]>
15
 *
16
 * @license AGPL-3.0
17
 *
18
 * This code is free software: you can redistribute it and/or modify
19
 * it under the terms of the GNU Affero General Public License, version 3,
20
 * as published by the Free Software Foundation.
21
 *
22
 * This program is distributed in the hope that it will be useful,
23
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25
 * GNU Affero General Public License for more details.
26
 *
27
 * You should have received a copy of the GNU Affero General Public License, version 3,
28
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
29
 *
30
 */
31
32
namespace OCA\Files_Sharing\Controller;
33
34
use OCA\Files\Helper;
35
use OCP\App\IAppManager;
36
use OCP\AppFramework\Http\DataResponse;
37
use OCP\AppFramework\OCS\OCSBadRequestException;
38
use OCP\AppFramework\OCS\OCSException;
39
use OCP\AppFramework\OCS\OCSForbiddenException;
40
use OCP\AppFramework\OCS\OCSNotFoundException;
41
use OCP\AppFramework\OCSController;
42
use OCP\AppFramework\QueryException;
43
use OCP\Constants;
44
use OCP\Files\Node;
45
use OCP\Files\NotFoundException;
46
use OCP\IConfig;
47
use OCP\IGroupManager;
48
use OCP\IL10N;
49
use OCP\IUserManager;
50
use OCP\IRequest;
51
use OCP\IServerContainer;
52
use OCP\IURLGenerator;
53
use OCP\Files\IRootFolder;
54
use OCP\Lock\LockedException;
55
use OCP\Share;
56
use OCP\Share\IManager;
57
use OCP\Share\Exceptions\ShareNotFound;
58
use OCP\Share\Exceptions\GenericShareException;
59
use OCP\Lock\ILockingProvider;
60
use OCP\Share\IShare;
61
use OCA\Files_Sharing\External\Storage;
62
63
/**
64
 * Class Share20OCS
65
 *
66
 * @package OCA\Files_Sharing\API
67
 */
68
class ShareAPIController extends OCSController {
69
70
	/** @var IManager */
71
	private $shareManager;
72
	/** @var IGroupManager */
73
	private $groupManager;
74
	/** @var IUserManager */
75
	private $userManager;
76
	/** @var IRootFolder */
77
	private $rootFolder;
78
	/** @var IURLGenerator */
79
	private $urlGenerator;
80
	/** @var string */
81
	private $currentUser;
82
	/** @var IL10N */
83
	private $l;
84
	/** @var \OCP\Files\Node */
85
	private $lockedNode;
86
	/** @var IConfig */
87
	private $config;
88
	/** @var IAppManager */
89
	private $appManager;
90
	/** @var IServerContainer */
91
	private $serverContainer;
92
93
	/**
94
	 * Share20OCS constructor.
95
	 *
96
	 * @param string $appName
97
	 * @param IRequest $request
98
	 * @param IManager $shareManager
99
	 * @param IGroupManager $groupManager
100
	 * @param IUserManager $userManager
101
	 * @param IRootFolder $rootFolder
102
	 * @param IURLGenerator $urlGenerator
103
	 * @param string $userId
104
	 * @param IL10N $l10n
105
	 * @param IConfig $config
106
	 * @param IAppManager $appManager
107
	 * @param IServerContainer $serverContainer
108
	 */
109
	public function __construct(
110
		string $appName,
111
		IRequest $request,
112
		IManager $shareManager,
113
		IGroupManager $groupManager,
114
		IUserManager $userManager,
115
		IRootFolder $rootFolder,
116
		IURLGenerator $urlGenerator,
117
		string $userId = null,
118
		IL10N $l10n,
119
		IConfig $config,
120
		IAppManager $appManager,
121
		IServerContainer $serverContainer
122
	) {
123
		parent::__construct($appName, $request);
124
125
		$this->shareManager = $shareManager;
126
		$this->userManager = $userManager;
127
		$this->groupManager = $groupManager;
128
		$this->request = $request;
129
		$this->rootFolder = $rootFolder;
130
		$this->urlGenerator = $urlGenerator;
131
		$this->currentUser = $userId;
132
		$this->l = $l10n;
133
		$this->config = $config;
134
		$this->appManager = $appManager;
135
		$this->serverContainer = $serverContainer;
136
	}
137
138
	/**
139
	 * Convert an IShare to an array for OCS output
140
	 *
141
	 * @param \OCP\Share\IShare $share
142
	 * @param Node|null $recipientNode
143
	 * @return array
144
	 * @throws NotFoundException In case the node can't be resolved.
145
	 *
146
	 * @suppress PhanUndeclaredClassMethod
147
	 */
148
	protected function formatShare(\OCP\Share\IShare $share, Node $recipientNode = null): array {
149
		$sharedBy = $this->userManager->get($share->getSharedBy());
150
		$shareOwner = $this->userManager->get($share->getShareOwner());
151
152
		$result = [
153
			'id' => $share->getId(),
154
			'share_type' => $share->getShareType(),
155
			'uid_owner' => $share->getSharedBy(),
156
			'displayname_owner' => $sharedBy !== null ? $sharedBy->getDisplayName() : $share->getSharedBy(),
157
			'permissions' => $share->getPermissions(),
158
			'stime' => $share->getShareTime()->getTimestamp(),
159
			'parent' => null,
160
			'expiration' => null,
161
			'token' => null,
162
			'uid_file_owner' => $share->getShareOwner(),
163
			'note' => $share->getNote(),
164
			'label' => $share->getLabel(),
165
			'displayname_file_owner' => $shareOwner !== null ? $shareOwner->getDisplayName() : $share->getShareOwner(),
166
		];
167
168
		$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
169
		if ($recipientNode) {
170
			$node = $recipientNode;
171
		} else {
172
			$nodes = $userFolder->getById($share->getNodeId());
173
			if (empty($nodes)) {
174
				// fallback to guessing the path
175
				$node = $userFolder->get($share->getTarget());
176
				if ($node === null || $share->getTarget() === '') {
177
					throw new NotFoundException();
178
				}
179
			} else {
180
				$node = $nodes[0];
181
			}
182
		}
183
184
		$result['path'] = $userFolder->getRelativePath($node->getPath());
185
		if ($node instanceof \OCP\Files\Folder) {
186
			$result['item_type'] = 'folder';
187
		} else {
188
			$result['item_type'] = 'file';
189
		}
190
191
		$result['mimetype'] = $node->getMimetype();
192
		$result['storage_id'] = $node->getStorage()->getId();
193
		$result['storage'] = $node->getStorage()->getCache()->getNumericStorageId();
194
		$result['item_source'] = $node->getId();
195
		$result['file_source'] = $node->getId();
196
		$result['file_parent'] = $node->getParent()->getId();
197
		$result['file_target'] = $share->getTarget();
198
199
		$expiration = $share->getExpirationDate();
200
		if ($expiration !== null) {
201
			$result['expiration'] = $expiration->format('Y-m-d 00:00:00');
202
		}
203
204
		if ($share->getShareType() === Share::SHARE_TYPE_USER) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_USER has been deprecated: 17.0.0 - use IShare::TYPE_USER instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

204
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_USER) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
205
			$sharedWith = $this->userManager->get($share->getSharedWith());
206
			$result['share_with'] = $share->getSharedWith();
207
			$result['share_with_displayname'] = $sharedWith !== null ? $sharedWith->getDisplayName() : $share->getSharedWith();
208
		} else if ($share->getShareType() === Share::SHARE_TYPE_GROUP) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

208
		} else if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_GROUP) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
209
			$group = $this->groupManager->get($share->getSharedWith());
210
			$result['share_with'] = $share->getSharedWith();
211
			$result['share_with_displayname'] = $group !== null ? $group->getDisplayName() : $share->getSharedWith();
212
		} else if ($share->getShareType() === Share::SHARE_TYPE_LINK) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_LINK has been deprecated: 17.0.0 - use IShare::TYPE_LINK instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

212
		} else if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_LINK) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
213
214
			// "share_with" and "share_with_displayname" for passwords of link
215
			// shares was deprecated in Nextcloud 15, use "password" instead.
216
			$result['share_with'] = $share->getPassword();
217
			$result['share_with_displayname'] = $share->getPassword();
218
219
			$result['password'] = $share->getPassword();
220
221
			$result['send_password_by_talk'] = $share->getSendPasswordByTalk();
222
223
			$result['token'] = $share->getToken();
224
			$result['url'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $share->getToken()]);
225
		} else if ($share->getShareType() === Share::SHARE_TYPE_REMOTE || $share->getShareType() === Share::SHARE_TYPE_REMOTE_GROUP) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_REMOTE has been deprecated: 17.0.0 - use IShare::TYPE_REMOTE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

225
		} else if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_REMOTE || $share->getShareType() === Share::SHARE_TYPE_REMOTE_GROUP) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_REMOTE_GROUP has been deprecated: 17.0.0 - use IShare::REMOTE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

225
		} else if ($share->getShareType() === Share::SHARE_TYPE_REMOTE || $share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_REMOTE_GROUP) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
226
			$result['share_with'] = $share->getSharedWith();
227
			$result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'CLOUD');
228
			$result['token'] = $share->getToken();
229
		} else if ($share->getShareType() === Share::SHARE_TYPE_EMAIL) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_EMAIL has been deprecated: 17.0.0 - use IShare::TYPE_EMAIL instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

229
		} else if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_EMAIL) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
230
			$result['share_with'] = $share->getSharedWith();
231
			$result['password'] = $share->getPassword();
232
			$result['send_password_by_talk'] = $share->getSendPasswordByTalk();
233
			$result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'EMAIL');
234
			$result['token'] = $share->getToken();
235
		} else if ($share->getShareType() === Share::SHARE_TYPE_CIRCLE) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_CIRCLE has been deprecated: 17.0.0 - use IShare::TYPE_CIRCLE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

235
		} else if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_CIRCLE) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
236
			// getSharedWith() returns either "name (type, owner)" or
237
			// "name (type, owner) [id]", depending on the Circles app version.
238
			$hasCircleId = (substr($share->getSharedWith(), -1) === ']');
239
240
			$result['share_with_displayname'] = $share->getSharedWithDisplayName();
241
			if (empty($result['share_with_displayname'])) {
242
				$displayNameLength = ($hasCircleId ? strrpos($share->getSharedWith(), ' ') : strlen($share->getSharedWith()));
243
				$result['share_with_displayname'] = substr($share->getSharedWith(), 0, $displayNameLength);
244
			}
245
246
			$result['share_with_avatar'] = $share->getSharedWithAvatar();
247
248
			$shareWithStart = ($hasCircleId ? strrpos($share->getSharedWith(), '[') + 1 : 0);
249
			$shareWithLength = ($hasCircleId ? -1 : strpos($share->getSharedWith(), ' '));
250
			if (is_bool($shareWithLength)) {
0 ignored issues
show
introduced by
The condition is_bool($shareWithLength) is always false.
Loading history...
251
				$shareWithLength = -1;
252
			}
253
			$result['share_with'] = substr($share->getSharedWith(), $shareWithStart, $shareWithLength);
254
		} else if ($share->getShareType() === Share::SHARE_TYPE_ROOM) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_ROOM has been deprecated: 17.0.0 - use IShare::TYPE_ROOM instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

254
		} else if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_ROOM) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
255
			$result['share_with'] = $share->getSharedWith();
256
			$result['share_with_displayname'] = '';
257
258
			try {
259
				$result = array_merge($result, $this->getRoomShareHelper()->formatShare($share));
260
			} catch (QueryException $e) {}
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
261
		}
262
263
264
		$result['mail_send'] = $share->getMailSend() ? 1 : 0;
265
		$result['hide_download'] = $share->getHideDownload() ? 1 : 0;
266
267
		return $result;
268
	}
269
270
	/**
271
	 * Check if one of the users address books knows the exact property, if
272
	 * yes we return the full name.
273
	 *
274
	 * @param string $query
275
	 * @param string $property
276
	 * @return string
277
	 */
278
	private function getDisplayNameFromAddressBook(string $query, string $property): string {
279
		// FIXME: If we inject the contacts manager it gets initialized bofore any address books are registered
280
		$result = \OC::$server->getContactsManager()->search($query, [$property]);
281
		foreach ($result as $r) {
282
			foreach ($r[$property] as $value) {
283
				if ($value === $query) {
284
					return $r['FN'];
285
				}
286
			}
287
		}
288
289
		return $query;
290
	}
291
292
	/**
293
	 * Get a specific share by id
294
	 *
295
	 * @NoAdminRequired
296
	 *
297
	 * @param string $id
298
	 * @return DataResponse
299
	 * @throws OCSNotFoundException
300
	 */
301
	public function getShare(string $id): DataResponse {
302
		try {
303
			$share = $this->getShareById($id);
304
		} catch (ShareNotFound $e) {
305
			throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
306
		}
307
308
		try {
309
			if ($this->canAccessShare($share)) {
310
				$share = $this->formatShare($share);
311
				return new DataResponse([$share]);
312
			}
313
		} catch (NotFoundException $e) {
314
			// Fall trough
315
		}
316
317
		throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
318
	}
319
320
	/**
321
	 * Delete a share
322
	 *
323
	 * @NoAdminRequired
324
	 *
325
	 * @param string $id
326
	 * @return DataResponse
327
	 * @throws OCSNotFoundException
328
	 */
329
	public function deleteShare(string $id): DataResponse {
330
		try {
331
			$share = $this->getShareById($id);
332
		} catch (ShareNotFound $e) {
333
			throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
334
		}
335
336
		try {
337
			$this->lock($share->getNode());
338
		} catch (LockedException $e) {
339
			throw new OCSNotFoundException($this->l->t('Could not delete share'));
340
		}
341
342
		if (!$this->canAccessShare($share)) {
343
			throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
344
		}
345
346
		// if it's a group share or a room share
347
		// we don't delete the share, but only the
348
		// mount point. Allowing it to be restored
349
		// from the deleted shares
350
		if ($this->canDeleteShareFromSelf($share)) {
351
			$this->shareManager->deleteFromSelf($share, $this->currentUser);
352
		} else {
353
			if (!$this->canDeleteShare($share)) {
354
				throw new OCSForbiddenException($this->l->t('Could not delete share'));
355
			}
356
357
			$this->shareManager->deleteShare($share);
358
		}
359
360
		return new DataResponse();
361
	}
362
363
	/**
364
	 * @NoAdminRequired
365
	 *
366
	 * @param string $path
367
	 * @param int $permissions
368
	 * @param int $shareType
369
	 * @param string $shareWith
370
	 * @param string $publicUpload
371
	 * @param string $password
372
	 * @param string $sendPasswordByTalk
373
	 * @param string $expireDate
374
	 * @param string $label
375
	 *
376
	 * @return DataResponse
377
	 * @throws NotFoundException
378
	 * @throws OCSBadRequestException
379
	 * @throws OCSException
380
	 * @throws OCSForbiddenException
381
	 * @throws OCSNotFoundException
382
	 * @throws \OCP\Files\InvalidPathException
383
	 * @suppress PhanUndeclaredClassMethod
384
	 */
385
	public function createShare(
386
		string $path = null,
387
		int $permissions = null,
388
		int $shareType = -1,
389
		string $shareWith = null,
390
		string $publicUpload = 'false',
391
		string $password = '',
392
		string $sendPasswordByTalk = null,
393
		string $expireDate = '',
394
		string $label = ''
395
	): DataResponse {
396
		$share = $this->shareManager->newShare();
397
398
		if ($permissions === null) {
399
			$permissions = $this->config->getAppValue('core', 'shareapi_default_permissions', Constants::PERMISSION_ALL);
400
		}
401
402
		// Verify path
403
		if ($path === null) {
404
			throw new OCSNotFoundException($this->l->t('Please specify a file or folder path'));
405
		}
406
407
		$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
408
		try {
409
			$path = $userFolder->get($path);
410
		} catch (NotFoundException $e) {
411
			throw new OCSNotFoundException($this->l->t('Wrong path, file/folder doesn\'t exist'));
412
		}
413
414
		$share->setNode($path);
415
416
		try {
417
			$this->lock($share->getNode());
418
		} catch (LockedException $e) {
419
			throw new OCSNotFoundException($this->l->t('Could not create share'));
420
		}
421
422
		if ($permissions < 0 || $permissions > Constants::PERMISSION_ALL) {
423
			throw new OCSNotFoundException($this->l->t('invalid permissions'));
424
		}
425
426
		// Shares always require read permissions
427
		$permissions |= Constants::PERMISSION_READ;
428
429
		if ($path instanceof \OCP\Files\File) {
430
			// Single file shares should never have delete or create permissions
431
			$permissions &= ~Constants::PERMISSION_DELETE;
432
			$permissions &= ~Constants::PERMISSION_CREATE;
433
		}
434
435
		/**
436
		 * Hack for https://github.com/owncloud/core/issues/22587
437
		 * We check the permissions via webdav. But the permissions of the mount point
438
		 * do not equal the share permissions. Here we fix that for federated mounts.
439
		 */
440
		if ($path->getStorage()->instanceOfStorage(Storage::class)) {
441
			$permissions &= ~($permissions & ~$path->getPermissions());
442
		}
443
444
		if ($shareType === Share::SHARE_TYPE_USER) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_USER has been deprecated: 17.0.0 - use IShare::TYPE_USER instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

444
		if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_USER) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
445
			// Valid user is required to share
446
			if ($shareWith === null || !$this->userManager->userExists($shareWith)) {
447
				throw new OCSNotFoundException($this->l->t('Please specify a valid user'));
448
			}
449
			$share->setSharedWith($shareWith);
450
			$share->setPermissions($permissions);
451
		} else if ($shareType === Share::SHARE_TYPE_GROUP) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

451
		} else if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_GROUP) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
452
			if (!$this->shareManager->allowGroupSharing()) {
453
				throw new OCSNotFoundException($this->l->t('Group sharing is disabled by the administrator'));
454
			}
455
456
			// Valid group is required to share
457
			if ($shareWith === null || !$this->groupManager->groupExists($shareWith)) {
458
				throw new OCSNotFoundException($this->l->t('Please specify a valid group'));
459
			}
460
			$share->setSharedWith($shareWith);
461
			$share->setPermissions($permissions);
462
		} else if ($shareType === Share::SHARE_TYPE_LINK
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_LINK has been deprecated: 17.0.0 - use IShare::TYPE_LINK instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

462
		} else if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_LINK

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
463
			|| $shareType === Share::SHARE_TYPE_EMAIL) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_EMAIL has been deprecated: 17.0.0 - use IShare::TYPE_EMAIL instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

463
			|| $shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_EMAIL) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
464
465
			// Can we even share links?
466
			if (!$this->shareManager->shareApiAllowLinks()) {
467
				throw new OCSNotFoundException($this->l->t('Public link sharing is disabled by the administrator'));
468
			}
469
470
			if ($publicUpload === 'true') {
471
				// Check if public upload is allowed
472
				if (!$this->shareManager->shareApiLinkAllowPublicUpload()) {
473
					throw new OCSForbiddenException($this->l->t('Public upload disabled by the administrator'));
474
				}
475
476
				// Public upload can only be set for folders
477
				if ($path instanceof \OCP\Files\File) {
478
					throw new OCSNotFoundException($this->l->t('Public upload is only possible for publicly shared folders'));
479
				}
480
481
				$share->setPermissions(
482
					Constants::PERMISSION_READ |
483
					Constants::PERMISSION_CREATE |
484
					Constants::PERMISSION_UPDATE |
485
					Constants::PERMISSION_DELETE
486
				);
487
			} else {
488
				$share->setPermissions(Constants::PERMISSION_READ);
489
			}
490
491
			// Set password
492
			if ($password !== '') {
493
				$share->setPassword($password);
494
			}
495
496
			// Only share by mail have a recipient
497
			if ($shareType === Share::SHARE_TYPE_EMAIL) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_EMAIL has been deprecated: 17.0.0 - use IShare::TYPE_EMAIL instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

497
			if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_EMAIL) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
498
				$share->setSharedWith($shareWith);
499
			} else {
500
				// Only link share have a label
501
				if (!empty($label)) {
502
					$share->setLabel($label);
503
				}
504
			}
505
506
			if ($sendPasswordByTalk === 'true') {
507
				if (!$this->appManager->isEnabledForUser('spreed')) {
508
					throw new OCSForbiddenException($this->l->t('Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled', [$path->getPath()]));
509
				}
510
511
				$share->setSendPasswordByTalk(true);
512
			}
513
514
			//Expire date
515
			if ($expireDate !== '') {
516
				try {
517
					$expireDate = $this->parseDate($expireDate);
518
					$share->setExpirationDate($expireDate);
519
				} catch (\Exception $e) {
520
					throw new OCSNotFoundException($this->l->t('Invalid date, date format must be YYYY-MM-DD'));
521
				}
522
			}
523
		} else if ($shareType === Share::SHARE_TYPE_REMOTE) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_REMOTE has been deprecated: 17.0.0 - use IShare::TYPE_REMOTE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

523
		} else if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_REMOTE) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
524
			if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
525
				throw new OCSForbiddenException($this->l->t('Sharing %1$s failed because the back end does not allow shares from type %2$s', [$path->getPath(), $shareType]));
526
			}
527
528
			$share->setSharedWith($shareWith);
529
			$share->setPermissions($permissions);
530
		} else if ($shareType === Share::SHARE_TYPE_REMOTE_GROUP) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_REMOTE_GROUP has been deprecated: 17.0.0 - use IShare::REMOTE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

530
		} else if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_REMOTE_GROUP) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
531
			if (!$this->shareManager->outgoingServer2ServerGroupSharesAllowed()) {
532
				throw new OCSForbiddenException($this->l->t('Sharing %1$s failed because the back end does not allow shares from type %2$s', [$path->getPath(), $shareType]));
533
			}
534
535
			$share->setSharedWith($shareWith);
536
			$share->setPermissions($permissions);
537
		} else if ($shareType === Share::SHARE_TYPE_CIRCLE) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_CIRCLE has been deprecated: 17.0.0 - use IShare::TYPE_CIRCLE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

537
		} else if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_CIRCLE) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
538
			if (!\OC::$server->getAppManager()->isEnabledForUser('circles') || !class_exists('\OCA\Circles\ShareByCircleProvider')) {
539
				throw new OCSNotFoundException($this->l->t('You cannot share to a Circle if the app is not enabled'));
540
			}
541
542
			$circle = \OCA\Circles\Api\v1\Circles::detailsCircle($shareWith);
0 ignored issues
show
Bug introduced by
The type OCA\Circles\Api\v1\Circles was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
543
544
			// Valid circle is required to share
545
			if ($circle === null) {
546
				throw new OCSNotFoundException($this->l->t('Please specify a valid circle'));
547
			}
548
			$share->setSharedWith($shareWith);
549
			$share->setPermissions($permissions);
550
		} else if ($shareType === Share::SHARE_TYPE_ROOM) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_ROOM has been deprecated: 17.0.0 - use IShare::TYPE_ROOM instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

550
		} else if ($shareType === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_ROOM) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
551
			try {
552
				$this->getRoomShareHelper()->createShare($share, $shareWith, $permissions, $expireDate);
553
			} catch (QueryException $e) {
554
				throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not support room shares', [$path->getPath()]));
555
			}
556
		} else {
557
			throw new OCSBadRequestException($this->l->t('Unknown share type'));
558
		}
559
560
		$share->setShareType($shareType);
561
		$share->setSharedBy($this->currentUser);
562
563
		try {
564
			$share = $this->shareManager->createShare($share);
565
		} catch (GenericShareException $e) {
566
			$code = $e->getCode() === 0 ? 403 : $e->getCode();
567
			throw new OCSException($e->getHint(), $code);
568
		} catch (\Exception $e) {
569
			throw new OCSForbiddenException($e->getMessage(), $e);
570
		}
571
572
		$output = $this->formatShare($share);
573
574
		return new DataResponse($output);
575
	}
576
577
	/**
578
	 * @param \OCP\Files\File|\OCP\Files\Folder $node
579
	 * @param boolean $includeTags
580
	 * @return DataResponse
581
	 */
582
	private function getSharedWithMe($node = null, bool $includeTags): DataResponse {
583
584
		$userShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_USER, $node, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_USER has been deprecated: 17.0.0 - use IShare::TYPE_USER instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

584
		$userShares = $this->shareManager->getSharedWith($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_USER, $node, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
585
		$groupShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_GROUP, $node, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

585
		$groupShares = $this->shareManager->getSharedWith($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_GROUP, $node, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
586
		$circleShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_CIRCLE, $node, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_CIRCLE has been deprecated: 17.0.0 - use IShare::TYPE_CIRCLE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

586
		$circleShares = $this->shareManager->getSharedWith($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_CIRCLE, $node, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
587
		$roomShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_ROOM, $node, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_ROOM has been deprecated: 17.0.0 - use IShare::TYPE_ROOM instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

587
		$roomShares = $this->shareManager->getSharedWith($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_ROOM, $node, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
588
589
		$shares = array_merge($userShares, $groupShares, $circleShares, $roomShares);
590
591
		$shares = array_filter($shares, function (IShare $share) {
592
			return $share->getShareOwner() !== $this->currentUser;
593
		});
594
595
		$formatted = [];
596
		foreach ($shares as $share) {
597
			if ($this->canAccessShare($share)) {
598
				try {
599
					$formatted[] = $this->formatShare($share);
600
				} catch (NotFoundException $e) {
601
					// Ignore this share
602
				}
603
			}
604
		}
605
606
		if ($includeTags) {
607
			$formatted = Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager());
608
		}
609
610
		return new DataResponse($formatted);
611
	}
612
613
	/**
614
	 * @param \OCP\Files\Folder $folder
615
	 * @return array
616
	 * @throws OCSBadRequestException
617
	 */
618
	private function getSharesInDir(Node $folder): array {
619
		if (!($folder instanceof \OCP\Files\Folder)) {
620
			throw new OCSBadRequestException($this->l->t('Not a directory'));
621
		}
622
623
		$nodes = $folder->getDirectoryListing();
624
625
		/** @var \OCP\Share\IShare[] $shares */
626
		$shares = array_reduce($nodes, function($carry, $node) {
627
			$carry = array_merge($carry, $this->getAllShares($node, true));
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->getAllShares($node, true) targeting OCA\Files_Sharing\Contro...troller::getAllShares() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
$this->getAllShares($node, true) of type void is incompatible with the type array|null expected by parameter $array2 of array_merge(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

627
			$carry = array_merge($carry, /** @scrutinizer ignore-type */ $this->getAllShares($node, true));
Loading history...
628
			return $carry;
629
		}, []);
630
631
		// filter out duplicate shares
632
		$known = [];
633
		return array_filter($shares, function($share) use (&$known) {
634
			if (in_array($share->getId(), $known)) {
635
				return false;
636
			}
637
			$known[] = $share->getId();
638
			return true;
639
		});
640
	}
641
642
	/**
643
	 * The getShares function.
644
	 *
645
	 * @NoAdminRequired
646
	 *
647
	 * @param string $shared_with_me
648
	 * @param string $reshares
649
	 * @param string $subfiles
650
	 * @param string $path
651
	 *
652
	 * - Get shares by the current user
653
	 * - Get shares by the current user and reshares (?reshares=true)
654
	 * - Get shares with the current user (?shared_with_me=true)
655
	 * - Get shares for a specific path (?path=...)
656
	 * - Get all shares in a folder (?subfiles=true&path=..)
657
	 *
658
	 * @return DataResponse
659
	 * @throws OCSNotFoundException
660
	 */
661
	public function getShares(
662
		string $shared_with_me = 'false',
663
		string $reshares = 'false',
664
		string $subfiles = 'false',
665
		string $path = null,
666
		string $include_tags = 'false'
667
	): DataResponse {
668
669
		if ($path !== null) {
670
			$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
671
			try {
672
				$path = $userFolder->get($path);
673
				$this->lock($path);
674
			} catch (\OCP\Files\NotFoundException $e) {
675
				throw new OCSNotFoundException($this->l->t('Wrong path, file/folder doesn\'t exist'));
676
			} catch (LockedException $e) {
677
				throw new OCSNotFoundException($this->l->t('Could not lock path'));
678
			}
679
		}
680
681
		$include_tags = $include_tags === 'true';
682
683
		if ($shared_with_me === 'true') {
684
			$result = $this->getSharedWithMe($path, $include_tags);
685
			return $result;
686
		}
687
688
		if ($reshares === 'true') {
689
			$reshares = true;
690
		} else {
691
			$reshares = false;
692
		}
693
694
		if ($subfiles === 'true') {
695
			$shares = $this->getSharesInDir($path);
696
			$recipientNode = null;
697
		} else {
698
			// get all shares
699
			$shares = $this->getAllShares($path, $reshares);
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $shares is correct as $this->getAllShares($path, $reshares) targeting OCA\Files_Sharing\Contro...troller::getAllShares() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
700
			$recipientNode = $path;
701
		}
702
703
		// process all shares
704
		$formatted = $miniFormatted = [];
705
		$resharingRight = false;
706
		foreach ($shares as $share) {
707
			/** @var IShare $share */
708
709
			// do not list the shares of the current user
710
			if ($share->getSharedWith() === $this->currentUser) {
711
				continue;
712
			}
713
714
			try {
715
				$format = $this->formatShare($share, $recipientNode);
716
				$formatted[] = $format;
717
718
				// let's also build a list of shares created
719
				// by the current user only, in case
720
				// there is no resharing rights
721
				if ($share->getSharedBy() === $this->currentUser) {
722
					$miniFormatted[] = $format;
723
				}
724
725
				// check if one of those share is shared with me
726
				// and if I have resharing rights on it
727
				if (!$resharingRight && $this->shareProviderResharingRights($this->currentUser, $share, $path)) {
728
					$resharingRight = true;
729
				}
730
			} catch (\Exception $e) {
731
				//Ignore share
732
			}
733
		}
734
735
		if (!$resharingRight) {
736
			$formatted = $miniFormatted;
737
		}
738
739
		if ($include_tags) {
740
			$formatted = Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager());
741
		}
742
743
		return new DataResponse($formatted);
744
	}
745
746
	/**
747
	 * @NoAdminRequired
748
	 *
749
	 * @param string $id
750
	 * @param int $permissions
751
	 * @param string $password
752
	 * @param string $sendPasswordByTalk
753
	 * @param string $publicUpload
754
	 * @param string $expireDate
755
	 * @param string $note
756
	 * @param string $label
757
	 * @param string $hideDownload
758
	 * @return DataResponse
759
	 * @throws LockedException
760
	 * @throws NotFoundException
761
	 * @throws OCSBadRequestException
762
	 * @throws OCSForbiddenException
763
	 * @throws OCSNotFoundException
764
	 */
765
	public function updateShare(
766
		string $id,
767
		int $permissions = null,
768
		string $password = null,
769
		string $sendPasswordByTalk = null,
770
		string $publicUpload = null,
771
		string $expireDate = null,
772
		string $note = null,
773
		string $label = null,
774
		string $hideDownload = null
775
	): DataResponse {
776
		try {
777
			$share = $this->getShareById($id);
778
		} catch (ShareNotFound $e) {
779
			throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
780
		}
781
782
		$this->lock($share->getNode());
783
784
		if (!$this->canAccessShare($share, false)) {
785
			throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
786
		}
787
788
		if (!$this->canEditShare($share)) {
789
			throw new OCSForbiddenException('You are not allowed to edit incoming shares');
790
		}
791
792
		if (
793
			$permissions === null &&
794
			$password === null &&
795
			$sendPasswordByTalk === null &&
796
			$publicUpload === null &&
797
			$expireDate === null &&
798
			$note === null &&
799
			$label === null &&
800
			$hideDownload === null
801
		) {
802
			throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given'));
803
		}
804
805
		if ($note !== null) {
806
			$share->setNote($note);
807
		}
808
809
		/**
810
		 * expirationdate, password and publicUpload only make sense for link shares
811
		 */
812
		if ($share->getShareType() === Share::SHARE_TYPE_LINK
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_LINK has been deprecated: 17.0.0 - use IShare::TYPE_LINK instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

812
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_LINK

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
813
			|| $share->getShareType() === Share::SHARE_TYPE_EMAIL) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_EMAIL has been deprecated: 17.0.0 - use IShare::TYPE_EMAIL instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

813
			|| $share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_EMAIL) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
814
815
			/**
816
			 * We do not allow editing link shares that the current user
817
			 * doesn't own. This is confusing and lead to errors when
818
			 * someone else edit a password or expiration date without
819
			 * the share owner knowing about it.
820
			 * We only allow deletion
821
			 */
822
823
			if ($share->getSharedBy() !== $this->currentUser) {
824
				throw new OCSForbiddenException('You are not allowed to edit link shares that you don\'t own');
825
			}
826
827
			// Update hide download state
828
			if ($hideDownload === 'true') {
829
				$share->setHideDownload(true);
830
			} else if ($hideDownload === 'false') {
831
				$share->setHideDownload(false);
832
			}
833
834
			$newPermissions = null;
835
			if ($publicUpload === 'true') {
836
				$newPermissions = Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE;
837
			} else if ($publicUpload === 'false') {
838
				$newPermissions = Constants::PERMISSION_READ;
839
			}
840
841
			if ($permissions !== null) {
842
				$newPermissions = (int) $permissions;
843
				$newPermissions = $newPermissions & ~Constants::PERMISSION_SHARE;
844
			}
845
846
			if ($newPermissions !== null &&
847
				!in_array($newPermissions, [
848
					Constants::PERMISSION_READ,
849
					Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE, // legacy
850
					Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE, // correct
851
					Constants::PERMISSION_CREATE, // hidden file list
852
					Constants::PERMISSION_READ | Constants::PERMISSION_UPDATE, // allow to edit single files
853
				], true)
854
			) {
855
				throw new OCSBadRequestException($this->l->t('Can\'t change permissions for public share links'));
856
			}
857
858
			if (
859
				// legacy
860
				$newPermissions === (Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE) ||
861
				// correct
862
				$newPermissions === (Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE)
863
			) {
864
				if (!$this->shareManager->shareApiLinkAllowPublicUpload()) {
865
					throw new OCSForbiddenException($this->l->t('Public upload disabled by the administrator'));
866
				}
867
868
				if (!($share->getNode() instanceof \OCP\Files\Folder)) {
869
					throw new OCSBadRequestException($this->l->t('Public upload is only possible for publicly shared folders'));
870
				}
871
872
				// normalize to correct public upload permissions
873
				$newPermissions = Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE;
874
			}
875
876
			if ($newPermissions !== null) {
877
				$share->setPermissions($newPermissions);
878
				$permissions = $newPermissions;
0 ignored issues
show
Unused Code introduced by
The assignment to $permissions is dead and can be removed.
Loading history...
879
			}
880
881
			if ($expireDate === '') {
882
				$share->setExpirationDate(null);
883
			} else if ($expireDate !== null) {
884
				try {
885
					$expireDate = $this->parseDate($expireDate);
886
				} catch (\Exception $e) {
887
					throw new OCSBadRequestException($e->getMessage(), $e);
888
				}
889
				$share->setExpirationDate($expireDate);
890
			}
891
892
			if ($password === '') {
893
				$share->setPassword(null);
894
			} else if ($password !== null) {
895
				$share->setPassword($password);
896
			}
897
898
			// only link shares have labels
899
			if ($share->getShareType() === Share::SHARE_TYPE_LINK && $label !== null) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_LINK has been deprecated: 17.0.0 - use IShare::TYPE_LINK instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

899
			if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_LINK && $label !== null) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
900
				$share->setLabel($label);
901
			}
902
903
			if ($sendPasswordByTalk === 'true') {
904
				if (!$this->appManager->isEnabledForUser('spreed')) {
905
					throw new OCSForbiddenException($this->l->t('Sharing sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled'));
906
				}
907
908
				$share->setSendPasswordByTalk(true);
909
			} else if ($sendPasswordByTalk !== null) {
910
				$share->setSendPasswordByTalk(false);
911
			}
912
		}
913
914
		// NOT A LINK SHARE
915
		else {
916
			if ($permissions !== null) {
917
				$permissions = (int) $permissions;
918
				$share->setPermissions($permissions);
919
			}
920
921
			if ($expireDate === '') {
922
				$share->setExpirationDate(null);
923
			} else if ($expireDate !== null) {
924
				try {
925
					$expireDate = $this->parseDate($expireDate);
926
				} catch (\Exception $e) {
927
					throw new OCSBadRequestException($e->getMessage(), $e);
928
				}
929
				$share->setExpirationDate($expireDate);
930
			}
931
		}
932
933
		try {
934
			$share = $this->shareManager->updateShare($share);
935
		} catch (GenericShareException $e) {
936
			$code = $e->getCode() === 0 ? 403 : $e->getCode();
937
			throw new OCSException($e->getHint(), $code);
938
		} catch (\Exception $e) {
939
			throw new OCSBadRequestException($e->getMessage(), $e);
940
		}
941
942
		return new DataResponse($this->formatShare($share));
943
	}
944
945
	/**
946
	 * Does the user have read permission on the share
947
	 *
948
	 * @param \OCP\Share\IShare $share the share to check
949
	 * @param boolean $checkGroups check groups as well?
950
	 * @return boolean
951
	 * @throws NotFoundException
952
	 *
953
	 * @suppress PhanUndeclaredClassMethod
954
	 */
955
	protected function canAccessShare(\OCP\Share\IShare $share, bool $checkGroups = true): bool {
956
		// A file with permissions 0 can't be accessed by us. So Don't show it
957
		if ($share->getPermissions() === 0) {
958
			return false;
959
		}
960
961
		// Owner of the file and the sharer of the file can always get share
962
		if ($share->getShareOwner() === $this->currentUser
963
			|| $share->getSharedBy() === $this->currentUser) {
964
			return true;
965
		}
966
967
		// If the share is shared with you, you can access it!
968
		if ($share->getShareType() === Share::SHARE_TYPE_USER
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_USER has been deprecated: 17.0.0 - use IShare::TYPE_USER instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

968
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_USER

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
969
			&& $share->getSharedWith() === $this->currentUser) {
970
			return true;
971
		}
972
973
		// Have reshare rights on the shared file/folder ?
974
		// Does the currentUser have access to the shared file?
975
		$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
976
		$files = $userFolder->getById($share->getNodeId());
977
		if (!empty($files) && $this->shareProviderResharingRights($this->currentUser, $share, $files[0])) {
978
			return true;
979
		}
980
981
		// If in the recipient group, you can see the share
982
		if ($checkGroups && $share->getShareType() === Share::SHARE_TYPE_GROUP) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

982
		if ($checkGroups && $share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_GROUP) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
983
			$sharedWith = $this->groupManager->get($share->getSharedWith());
984
			$user = $this->userManager->get($this->currentUser);
985
			if ($user !== null && $sharedWith !== null && $sharedWith->inGroup($user)) {
986
				return true;
987
			}
988
		}
989
990
		if ($share->getShareType() === Share::SHARE_TYPE_CIRCLE) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_CIRCLE has been deprecated: 17.0.0 - use IShare::TYPE_CIRCLE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

990
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_CIRCLE) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
991
			// TODO: have a sanity check like above?
992
			return true;
993
		}
994
995
		if ($share->getShareType() === Share::SHARE_TYPE_ROOM) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_ROOM has been deprecated: 17.0.0 - use IShare::TYPE_ROOM instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

995
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_ROOM) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
996
			try {
997
				return $this->getRoomShareHelper()->canAccessShare($share, $this->currentUser);
998
			} catch (QueryException $e) {
999
				return false;
1000
			}
1001
		}
1002
1003
		return false;
1004
	}
1005
1006
	/**
1007
	 * Does the user have edit permission on the share
1008
	 *
1009
	 * @param \OCP\Share\IShare $share the share to check
1010
	 * @return boolean
1011
	 */
1012
	protected function canEditShare(\OCP\Share\IShare $share): bool {
1013
		// A file with permissions 0 can't be accessed by us. So Don't show it
1014
		if ($share->getPermissions() === 0) {
1015
			return false;
1016
		}
1017
1018
		// The owner of the file and the creator of the share
1019
		// can always edit the share
1020
		if ($share->getShareOwner() === $this->currentUser ||
1021
			$share->getSharedBy() === $this->currentUser
1022
		) {
1023
			return true;
1024
		}
1025
1026
		//! we do NOT support some kind of `admin` in groups.
1027
		//! You cannot edit shares shared to a group you're
1028
		//! a member of if you're not the share owner or the file owner!
1029
1030
		return false;
1031
	}
1032
1033
	/**
1034
	 * Does the user have delete permission on the share
1035
	 *
1036
	 * @param \OCP\Share\IShare $share the share to check
1037
	 * @return boolean
1038
	 */
1039
	protected function canDeleteShare(\OCP\Share\IShare $share): bool {
1040
		// A file with permissions 0 can't be accessed by us. So Don't show it
1041
		if ($share->getPermissions() === 0) {
1042
			return false;
1043
		}
1044
1045
		// if the user is the recipient, i can unshare
1046
		// the share with self
1047
		if ($share->getShareType() === Share::SHARE_TYPE_USER &&
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_USER has been deprecated: 17.0.0 - use IShare::TYPE_USER instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1047
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_USER &&

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1048
			$share->getSharedWith() === $this->currentUser
1049
		) {
1050
			return true;
1051
		}
1052
1053
		// The owner of the file and the creator of the share
1054
		// can always delete the share
1055
		if ($share->getShareOwner() === $this->currentUser ||
1056
			$share->getSharedBy() === $this->currentUser
1057
		) {
1058
			return true;
1059
		}
1060
1061
		return false;
1062
	}
1063
1064
	/**
1065
	 * Does the user have delete permission on the share
1066
	 * This differs from the canDeleteShare function as it only
1067
	 * remove the share for the current user. It does NOT
1068
	 * completely delete the share but only the mount point.
1069
	 * It can then be restored from the deleted shares section.
1070
	 *
1071
	 * @param \OCP\Share\IShare $share the share to check
1072
	 * @return boolean
1073
	 *
1074
	 * @suppress PhanUndeclaredClassMethod
1075
	 */
1076
	protected function canDeleteShareFromSelf(\OCP\Share\IShare $share): bool {
1077
		if ($share->getShareType() !== Share::SHARE_TYPE_GROUP &&
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1077
		if ($share->getShareType() !== /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_GROUP &&

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1078
			$share->getShareType() !== Share::SHARE_TYPE_ROOM
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_ROOM has been deprecated: 17.0.0 - use IShare::TYPE_ROOM instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1078
			$share->getShareType() !== /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_ROOM

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1079
		) {
1080
			return false;
1081
		}
1082
1083
		if ($share->getShareOwner() === $this->currentUser ||
1084
			$share->getSharedBy() === $this->currentUser
1085
		) {
1086
			// Delete the whole share, not just for self
1087
			return false;
1088
		}
1089
1090
		// If in the recipient group, you can delete the share from self
1091
		if ($share->getShareType() === Share::SHARE_TYPE_GROUP) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1091
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_GROUP) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1092
			$sharedWith = $this->groupManager->get($share->getSharedWith());
1093
			$user = $this->userManager->get($this->currentUser);
1094
			if ($user !== null && $sharedWith !== null && $sharedWith->inGroup($user)) {
1095
				return true;
1096
			}
1097
		}
1098
1099
		if ($share->getShareType() === Share::SHARE_TYPE_ROOM) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_ROOM has been deprecated: 17.0.0 - use IShare::TYPE_ROOM instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1099
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_ROOM) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1100
			try {
1101
				return $this->getRoomShareHelper()->canAccessShare($share, $this->currentUser);
1102
			} catch (QueryException $e) {
1103
				return false;
1104
			}
1105
		}
1106
1107
		return false;
1108
	}
1109
1110
	/**
1111
	 * Make sure that the passed date is valid ISO 8601
1112
	 * So YYYY-MM-DD
1113
	 * If not throw an exception
1114
	 *
1115
	 * @param string $expireDate
1116
	 *
1117
	 * @throws \Exception
1118
	 * @return \DateTime
1119
	 */
1120
	private function parseDate(string $expireDate): \DateTime {
1121
		try {
1122
			$date = new \DateTime($expireDate);
1123
		} catch (\Exception $e) {
1124
			throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
1125
		}
1126
1127
		if ($date === false) {
0 ignored issues
show
introduced by
The condition $date === false is always false.
Loading history...
1128
			throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
1129
		}
1130
1131
		$date->setTime(0, 0, 0);
1132
1133
		return $date;
1134
	}
1135
1136
	/**
1137
	 * Since we have multiple providers but the OCS Share API v1 does
1138
	 * not support this we need to check all backends.
1139
	 *
1140
	 * @param string $id
1141
	 * @return \OCP\Share\IShare
1142
	 * @throws ShareNotFound
1143
	 */
1144
	private function getShareById(string $id): IShare {
1145
		$share = null;
0 ignored issues
show
Unused Code introduced by
The assignment to $share is dead and can be removed.
Loading history...
1146
1147
		// First check if it is an internal share.
1148
		try {
1149
			$share = $this->shareManager->getShareById('ocinternal:' . $id, $this->currentUser);
1150
			return $share;
1151
		} catch (ShareNotFound $e) {
1152
			// Do nothing, just try the other share type
1153
		}
1154
1155
1156
		try {
1157
			if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_CIRCLE)) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_CIRCLE has been deprecated: 17.0.0 - use IShare::TYPE_CIRCLE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1157
			if ($this->shareManager->shareProviderExists(/** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_CIRCLE)) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1158
				$share = $this->shareManager->getShareById('ocCircleShare:' . $id, $this->currentUser);
1159
				return $share;
1160
			}
1161
		} catch (ShareNotFound $e) {
1162
			// Do nothing, just try the other share type
1163
		}
1164
1165
		try {
1166
			if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_EMAIL)) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_EMAIL has been deprecated: 17.0.0 - use IShare::TYPE_EMAIL instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1166
			if ($this->shareManager->shareProviderExists(/** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_EMAIL)) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1167
				$share = $this->shareManager->getShareById('ocMailShare:' . $id, $this->currentUser);
1168
				return $share;
1169
			}
1170
		} catch (ShareNotFound $e) {
1171
			// Do nothing, just try the other share type
1172
		}
1173
1174
		try {
1175
			$share = $this->shareManager->getShareById('ocRoomShare:' . $id, $this->currentUser);
1176
			return $share;
1177
		} catch (ShareNotFound $e) {
1178
			// Do nothing, just try the other share type
1179
		}
1180
1181
		if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
1182
			throw new ShareNotFound();
1183
		}
1184
		$share = $this->shareManager->getShareById('ocFederatedSharing:' . $id, $this->currentUser);
1185
1186
		return $share;
1187
	}
1188
1189
	/**
1190
	 * Lock a Node
1191
	 *
1192
	 * @param \OCP\Files\Node $node
1193
	 * @throws LockedException
1194
	 */
1195
	private function lock(\OCP\Files\Node $node) {
1196
		$node->lock(ILockingProvider::LOCK_SHARED);
1197
		$this->lockedNode = $node;
1198
	}
1199
1200
	/**
1201
	 * Cleanup the remaining locks
1202
	 * @throws @LockedException
1203
	 */
1204
	public function cleanup() {
1205
		if ($this->lockedNode !== null) {
1206
			$this->lockedNode->unlock(ILockingProvider::LOCK_SHARED);
1207
		}
1208
	}
1209
1210
	/**
1211
	 * Returns the helper of ShareAPIController for room shares.
1212
	 *
1213
	 * If the Talk application is not enabled or the helper is not available
1214
	 * a QueryException is thrown instead.
1215
	 *
1216
	 * @return \OCA\Talk\Share\Helper\ShareAPIController
0 ignored issues
show
Bug introduced by
The type OCA\Talk\Share\Helper\ShareAPIController was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
1217
	 * @throws QueryException
1218
	 */
1219
	private function getRoomShareHelper() {
1220
		if (!$this->appManager->isEnabledForUser('spreed')) {
1221
			throw new QueryException();
1222
		}
1223
1224
		return $this->serverContainer->query('\OCA\Talk\Share\Helper\ShareAPIController');
1225
	}
1226
1227
1228
	/**
1229
	 * Returns if we can find resharing rights in an IShare object for a specific user.
1230
	 *
1231
	 * @suppress PhanUndeclaredClassMethod
1232
	 *
1233
	 * @param string $userId
1234
	 * @param IShare $share
1235
	 * @param Node $node
1236
	 * @return bool
1237
	 * @throws NotFoundException
1238
	 * @throws \OCP\Files\InvalidPathException
1239
	 */
1240
	private function shareProviderResharingRights(string $userId, IShare $share, $node): bool {
1241
1242
		if ($share->getShareOwner() === $userId) {
1243
			return true;
1244
		}
1245
1246
		// we check that current user have parent resharing rights on the current file
1247
		if ($node !== null && ($node->getPermissions() & \OCP\Constants::PERMISSION_SHARE) !== 0) {
1248
			return true;
1249
		}
1250
1251
		if ((\OCP\Constants::PERMISSION_SHARE & $share->getPermissions()) === 0) {
1252
			return false;
1253
		}
1254
1255
		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER && $share->getSharedWith() === $userId) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_USER has been deprecated: 17.0.0 - use IShare::TYPE_USER instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1255
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ \OCP\Share::SHARE_TYPE_USER && $share->getSharedWith() === $userId) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1256
			return true;
1257
		}
1258
1259
		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP && $this->groupManager->isInGroup($userId, $share->getSharedWith())) {
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1259
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ \OCP\Share::SHARE_TYPE_GROUP && $this->groupManager->isInGroup($userId, $share->getSharedWith())) {

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1260
			return true;
1261
		}
1262
1263
		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_CIRCLE && \OC::$server->getAppManager()->isEnabledForUser('circles')
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_CIRCLE has been deprecated: 17.0.0 - use IShare::TYPE_CIRCLE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1263
		if ($share->getShareType() === /** @scrutinizer ignore-deprecated */ \OCP\Share::SHARE_TYPE_CIRCLE && \OC::$server->getAppManager()->isEnabledForUser('circles')

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1264
			&& class_exists('\OCA\Circles\Api\v1\Circles')) {
1265
1266
			$hasCircleId = (substr($share->getSharedWith(), -1) === ']');
1267
			$shareWithStart = ($hasCircleId ? strrpos($share->getSharedWith(), '[') + 1 : 0);
1268
			$shareWithLength = ($hasCircleId ? -1 : strpos($share->getSharedWith(), ' '));
1269
			if (is_bool($shareWithLength)) {
0 ignored issues
show
introduced by
The condition is_bool($shareWithLength) is always false.
Loading history...
1270
				$shareWithLength = -1;
1271
			}
1272
			$sharedWith = substr($share->getSharedWith(), $shareWithStart, $shareWithLength);
1273
			try {
1274
				$member = \OCA\Circles\Api\v1\Circles::getMember($sharedWith, $userId, 1);
1275
				if ($member->getLevel() >= 4) {
1276
					return true;
1277
				}
1278
				return false;
1279
			} catch (QueryException $e) {
1280
				return false;
1281
			}
1282
		}
1283
1284
		return false;
1285
	}
1286
1287
	/**
1288
	 * Get all the shares for the current user
1289
	 *
1290
	 * @param Node|null $path
1291
	 * @param boolean $reshares
1292
	 * @return void
1293
	 */
1294
	private function getAllShares(?Node $path = null, bool $reshares = false) {
1295
		// Get all shares
1296
		$userShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_USER, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_USER has been deprecated: 17.0.0 - use IShare::TYPE_USER instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1296
		$userShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_USER, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1297
		$groupShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_GROUP, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_GROUP has been deprecated: 17.0.0 - use IShare::TYPE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1297
		$groupShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_GROUP, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1298
		$linkShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_LINK, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_LINK has been deprecated: 17.0.0 - use IShare::TYPE_LINK instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1298
		$linkShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_LINK, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1299
1300
		// EMAIL SHARES
1301
		$mailShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_EMAIL, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_EMAIL has been deprecated: 17.0.0 - use IShare::TYPE_EMAIL instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1301
		$mailShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_EMAIL, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1302
1303
		// CIRCLE SHARES
1304
		$circleShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_CIRCLE, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_CIRCLE has been deprecated: 17.0.0 - use IShare::TYPE_CIRCLE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1304
		$circleShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_CIRCLE, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1305
1306
		// TALK SHARES
1307
		$roomShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_ROOM, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_ROOM has been deprecated: 17.0.0 - use IShare::TYPE_ROOM instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1307
		$roomShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_ROOM, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1308
1309
		// FEDERATION
1310
		if ($this->shareManager->outgoingServer2ServerSharesAllowed()) {
1311
			$federatedShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_REMOTE, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_REMOTE has been deprecated: 17.0.0 - use IShare::TYPE_REMOTE instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1311
			$federatedShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_REMOTE, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1312
		} else {
1313
			$federatedShares = [];
1314
		}
1315
		if ($this->shareManager->outgoingServer2ServerGroupSharesAllowed()) {
1316
			$federatedGroupShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_REMOTE_GROUP, $path, $reshares, -1, 0);
0 ignored issues
show
Deprecated Code introduced by
The constant OC\Share\Constants::SHARE_TYPE_REMOTE_GROUP has been deprecated: 17.0.0 - use IShare::REMOTE_GROUP instead ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

1316
			$federatedGroupShares = $this->shareManager->getSharesBy($this->currentUser, /** @scrutinizer ignore-deprecated */ Share::SHARE_TYPE_REMOTE_GROUP, $path, $reshares, -1, 0);

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
1317
		} else {
1318
			$federatedGroupShares = [];
1319
		}
1320
1321
		return array_merge($userShares, $groupShares, $linkShares, $mailShares, $circleShares, $roomShares, $federatedShares, $federatedGroupShares);
0 ignored issues
show
Bug Best Practice introduced by
The expression return array_merge($user... $federatedGroupShares) returns the type array which is incompatible with the documented return type void.
Loading history...
1322
	}
1323
1324
}
1325