2015-10-30 15:10:08 +03:00
|
|
|
<?php
|
2018-04-23 21:31:57 +03:00
|
|
|
declare(strict_types=1);
|
2015-10-30 15:10:08 +03:00
|
|
|
/**
|
2016-01-12 17:02:16 +03:00
|
|
|
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
2016-07-21 17:49:16 +03:00
|
|
|
*
|
2017-11-06 17:56:42 +03:00
|
|
|
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
2016-07-21 17:49:16 +03:00
|
|
|
* @author Joas Schilling <coding@schilljs.com>
|
2017-11-06 17:56:42 +03:00
|
|
|
* @author Lukas Reschke <lukas@statuscode.ch>
|
|
|
|
* @author Maxence Lange <maxence@nextcloud.com>
|
|
|
|
* @author Michael Jobst <mjobst+github@tecratech.de>
|
|
|
|
* @author Robin Appelman <robin@icewind.nl>
|
2016-07-21 17:49:16 +03:00
|
|
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
|
|
* @author Vincent Petry <pvince81@owncloud.com>
|
|
|
|
*
|
2015-10-30 15:10:08 +03:00
|
|
|
* @license AGPL-3.0
|
|
|
|
*
|
|
|
|
* This code is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License, version 3,
|
|
|
|
* as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Affero General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
|
|
*
|
|
|
|
*/
|
2016-10-21 21:25:07 +03:00
|
|
|
namespace OCA\Files_Sharing\Controller;
|
2015-10-30 15:10:08 +03:00
|
|
|
|
2016-11-10 11:13:25 +03:00
|
|
|
use OCA\Files\Helper;
|
2016-07-20 10:55:43 +03:00
|
|
|
use OCP\AppFramework\Http\DataResponse;
|
2016-07-20 11:41:09 +03:00
|
|
|
use OCP\AppFramework\OCS\OCSBadRequestException;
|
|
|
|
use OCP\AppFramework\OCS\OCSException;
|
|
|
|
use OCP\AppFramework\OCS\OCSForbiddenException;
|
2016-07-20 10:55:43 +03:00
|
|
|
use OCP\AppFramework\OCS\OCSNotFoundException;
|
2016-07-19 15:13:27 +03:00
|
|
|
use OCP\AppFramework\OCSController;
|
2017-12-01 16:49:35 +03:00
|
|
|
use OCP\Constants;
|
2018-04-23 21:31:57 +03:00
|
|
|
use OCP\Files\Folder;
|
2016-09-20 18:59:04 +03:00
|
|
|
use OCP\Files\Node;
|
2016-02-16 18:04:17 +03:00
|
|
|
use OCP\Files\NotFoundException;
|
2017-12-01 16:49:35 +03:00
|
|
|
use OCP\IConfig;
|
2015-11-24 11:37:17 +03:00
|
|
|
use OCP\IGroupManager;
|
2016-04-15 15:05:36 +03:00
|
|
|
use OCP\IL10N;
|
2015-11-24 11:37:17 +03:00
|
|
|
use OCP\IUserManager;
|
|
|
|
use OCP\IRequest;
|
|
|
|
use OCP\IURLGenerator;
|
2015-11-24 12:16:02 +03:00
|
|
|
use OCP\Files\IRootFolder;
|
2016-03-09 11:11:41 +03:00
|
|
|
use OCP\Lock\LockedException;
|
2018-06-13 15:19:59 +03:00
|
|
|
use OCP\Share;
|
2016-02-03 10:14:48 +03:00
|
|
|
use OCP\Share\IManager;
|
2016-02-02 16:18:59 +03:00
|
|
|
use OCP\Share\Exceptions\ShareNotFound;
|
|
|
|
use OCP\Share\Exceptions\GenericShareException;
|
2016-03-17 13:09:11 +03:00
|
|
|
use OCP\Lock\ILockingProvider;
|
2016-09-07 19:38:08 +03:00
|
|
|
use OCP\Share\IShare;
|
2018-04-23 21:31:57 +03:00
|
|
|
use OCA\Files_Sharing\External\Storage;
|
2016-02-02 16:18:59 +03:00
|
|
|
|
2016-03-07 18:12:40 +03:00
|
|
|
/**
|
|
|
|
* Class Share20OCS
|
|
|
|
*
|
|
|
|
* @package OCA\Files_Sharing\API
|
|
|
|
*/
|
2016-10-21 21:25:07 +03:00
|
|
|
class ShareAPIController extends OCSController {
|
2015-10-30 15:10:08 +03:00
|
|
|
|
2016-02-03 10:14:48 +03:00
|
|
|
/** @var IManager */
|
2015-10-30 15:10:08 +03:00
|
|
|
private $shareManager;
|
2015-11-24 11:37:17 +03:00
|
|
|
/** @var IGroupManager */
|
2015-10-30 15:10:08 +03:00
|
|
|
private $groupManager;
|
2015-11-24 11:37:17 +03:00
|
|
|
/** @var IUserManager */
|
2015-10-30 15:10:08 +03:00
|
|
|
private $userManager;
|
2015-11-24 12:16:02 +03:00
|
|
|
/** @var IRootFolder */
|
|
|
|
private $rootFolder;
|
2016-03-10 23:35:22 +03:00
|
|
|
/** @var IURLGenerator */
|
2015-11-24 11:37:17 +03:00
|
|
|
private $urlGenerator;
|
2016-10-21 21:25:07 +03:00
|
|
|
/** @var string */
|
2015-11-24 11:37:17 +03:00
|
|
|
private $currentUser;
|
2016-04-15 15:05:36 +03:00
|
|
|
/** @var IL10N */
|
|
|
|
private $l;
|
2016-07-20 11:11:01 +03:00
|
|
|
/** @var \OCP\Files\Node */
|
|
|
|
private $lockedNode;
|
2017-12-01 16:49:35 +03:00
|
|
|
/** @var IConfig */
|
|
|
|
private $config;
|
2015-11-24 11:37:17 +03:00
|
|
|
|
2016-02-03 10:14:48 +03:00
|
|
|
/**
|
|
|
|
* Share20OCS constructor.
|
|
|
|
*
|
2016-07-19 15:13:27 +03:00
|
|
|
* @param string $appName
|
|
|
|
* @param IRequest $request
|
2016-02-03 10:14:48 +03:00
|
|
|
* @param IManager $shareManager
|
|
|
|
* @param IGroupManager $groupManager
|
|
|
|
* @param IUserManager $userManager
|
|
|
|
* @param IRootFolder $rootFolder
|
|
|
|
* @param IURLGenerator $urlGenerator
|
2016-10-21 21:25:07 +03:00
|
|
|
* @param string $userId
|
2016-07-19 15:13:27 +03:00
|
|
|
* @param IL10N $l10n
|
2017-12-01 16:49:35 +03:00
|
|
|
* @param IConfig $config
|
2016-02-03 10:14:48 +03:00
|
|
|
*/
|
2015-11-24 11:37:17 +03:00
|
|
|
public function __construct(
|
2018-04-23 21:31:57 +03:00
|
|
|
string $appName,
|
2016-09-21 18:35:09 +03:00
|
|
|
IRequest $request,
|
|
|
|
IManager $shareManager,
|
|
|
|
IGroupManager $groupManager,
|
|
|
|
IUserManager $userManager,
|
|
|
|
IRootFolder $rootFolder,
|
|
|
|
IURLGenerator $urlGenerator,
|
2018-04-23 21:31:57 +03:00
|
|
|
string $userId,
|
2017-12-01 16:49:35 +03:00
|
|
|
IL10N $l10n,
|
|
|
|
IConfig $config
|
2015-11-24 11:37:17 +03:00
|
|
|
) {
|
2016-07-19 15:13:27 +03:00
|
|
|
parent::__construct($appName, $request);
|
|
|
|
|
2015-10-30 15:10:08 +03:00
|
|
|
$this->shareManager = $shareManager;
|
|
|
|
$this->userManager = $userManager;
|
|
|
|
$this->groupManager = $groupManager;
|
|
|
|
$this->request = $request;
|
2015-11-24 12:16:02 +03:00
|
|
|
$this->rootFolder = $rootFolder;
|
2015-11-06 14:05:19 +03:00
|
|
|
$this->urlGenerator = $urlGenerator;
|
2016-10-21 21:25:07 +03:00
|
|
|
$this->currentUser = $userId;
|
2016-04-15 15:05:36 +03:00
|
|
|
$this->l = $l10n;
|
2017-12-01 16:49:35 +03:00
|
|
|
$this->config = $config;
|
2015-11-06 14:05:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert an IShare to an array for OCS output
|
|
|
|
*
|
2016-01-27 14:13:53 +03:00
|
|
|
* @param \OCP\Share\IShare $share
|
2016-09-20 18:59:04 +03:00
|
|
|
* @param Node|null $recipientNode
|
2015-11-06 14:05:19 +03:00
|
|
|
* @return array
|
2016-02-16 18:04:17 +03:00
|
|
|
* @throws NotFoundException In case the node can't be resolved.
|
2015-11-06 14:05:19 +03:00
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
protected function formatShare(\OCP\Share\IShare $share, Node $recipientNode = null): array {
|
2016-02-03 10:14:48 +03:00
|
|
|
$sharedBy = $this->userManager->get($share->getSharedBy());
|
2016-06-07 13:50:12 +03:00
|
|
|
$shareOwner = $this->userManager->get($share->getShareOwner());
|
|
|
|
|
2015-11-06 14:05:19 +03:00
|
|
|
$result = [
|
|
|
|
'id' => $share->getId(),
|
|
|
|
'share_type' => $share->getShareType(),
|
2016-02-03 10:14:48 +03:00
|
|
|
'uid_owner' => $share->getSharedBy(),
|
2016-02-11 23:17:22 +03:00
|
|
|
'displayname_owner' => $sharedBy !== null ? $sharedBy->getDisplayName() : $share->getSharedBy(),
|
2015-11-06 14:05:19 +03:00
|
|
|
'permissions' => $share->getPermissions(),
|
2016-01-27 22:51:26 +03:00
|
|
|
'stime' => $share->getShareTime()->getTimestamp(),
|
|
|
|
'parent' => null,
|
2015-11-06 14:05:19 +03:00
|
|
|
'expiration' => null,
|
|
|
|
'token' => null,
|
2016-02-03 10:14:48 +03:00
|
|
|
'uid_file_owner' => $share->getShareOwner(),
|
2016-02-12 12:44:34 +03:00
|
|
|
'displayname_file_owner' => $shareOwner !== null ? $shareOwner->getDisplayName() : $share->getShareOwner(),
|
2015-11-06 14:05:19 +03:00
|
|
|
];
|
|
|
|
|
2016-10-21 21:25:07 +03:00
|
|
|
$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
|
2016-09-20 18:59:04 +03:00
|
|
|
if ($recipientNode) {
|
|
|
|
$node = $recipientNode;
|
|
|
|
} else {
|
|
|
|
$nodes = $userFolder->getById($share->getNodeId());
|
|
|
|
if (empty($nodes)) {
|
2016-09-21 19:55:58 +03:00
|
|
|
// fallback to guessing the path
|
|
|
|
$node = $userFolder->get($share->getTarget());
|
2018-04-04 12:33:05 +03:00
|
|
|
if ($node === null || $share->getTarget() === '') {
|
2016-09-21 19:55:58 +03:00
|
|
|
throw new NotFoundException();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$node = $nodes[0];
|
2016-09-20 18:59:04 +03:00
|
|
|
}
|
|
|
|
}
|
2016-06-07 13:50:12 +03:00
|
|
|
|
|
|
|
$result['path'] = $userFolder->getRelativePath($node->getPath());
|
2016-01-27 22:51:26 +03:00
|
|
|
if ($node instanceOf \OCP\Files\Folder) {
|
2015-11-06 14:05:19 +03:00
|
|
|
$result['item_type'] = 'folder';
|
|
|
|
} else {
|
|
|
|
$result['item_type'] = 'file';
|
|
|
|
}
|
2016-07-19 15:13:27 +03:00
|
|
|
$result['mimetype'] = $node->getMimetype();
|
2016-01-27 22:51:26 +03:00
|
|
|
$result['storage_id'] = $node->getStorage()->getId();
|
|
|
|
$result['storage'] = $node->getStorage()->getCache()->getNumericStorageId();
|
|
|
|
$result['item_source'] = $node->getId();
|
|
|
|
$result['file_source'] = $node->getId();
|
|
|
|
$result['file_parent'] = $node->getParent()->getId();
|
2015-11-06 14:05:19 +03:00
|
|
|
$result['file_target'] = $share->getTarget();
|
|
|
|
|
2017-03-29 17:50:23 +03:00
|
|
|
$expiration = $share->getExpirationDate();
|
|
|
|
if ($expiration !== null) {
|
|
|
|
$result['expiration'] = $expiration->format('Y-m-d 00:00:00');
|
|
|
|
}
|
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($share->getShareType() === Share::SHARE_TYPE_USER) {
|
2016-02-03 10:14:48 +03:00
|
|
|
$sharedWith = $this->userManager->get($share->getSharedWith());
|
2016-02-12 12:44:34 +03:00
|
|
|
$result['share_with'] = $share->getSharedWith();
|
|
|
|
$result['share_with_displayname'] = $sharedWith !== null ? $sharedWith->getDisplayName() : $share->getSharedWith();
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($share->getShareType() === Share::SHARE_TYPE_GROUP) {
|
2016-11-30 22:56:10 +03:00
|
|
|
$group = $this->groupManager->get($share->getSharedWith());
|
2016-02-03 10:14:48 +03:00
|
|
|
$result['share_with'] = $share->getSharedWith();
|
2016-11-30 22:56:10 +03:00
|
|
|
$result['share_with_displayname'] = $group !== null ? $group->getDisplayName() : $share->getSharedWith();
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($share->getShareType() === Share::SHARE_TYPE_LINK) {
|
2015-11-06 14:05:19 +03:00
|
|
|
|
|
|
|
$result['share_with'] = $share->getPassword();
|
|
|
|
$result['share_with_displayname'] = $share->getPassword();
|
|
|
|
|
|
|
|
$result['token'] = $share->getToken();
|
|
|
|
$result['url'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $share->getToken()]);
|
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($share->getShareType() === Share::SHARE_TYPE_REMOTE || $share->getShareType() || Share::SHARE_TYPE_REMOTE_GROUP) {
|
2015-11-06 14:05:19 +03:00
|
|
|
$result['share_with'] = $share->getSharedWith();
|
2016-10-25 17:24:24 +03:00
|
|
|
$result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'CLOUD');
|
2015-11-06 14:05:19 +03:00
|
|
|
$result['token'] = $share->getToken();
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($share->getShareType() === Share::SHARE_TYPE_EMAIL) {
|
2016-07-29 16:38:31 +03:00
|
|
|
$result['share_with'] = $share->getSharedWith();
|
2017-03-28 16:11:07 +03:00
|
|
|
$result['password'] = $share->getPassword();
|
2016-10-25 17:24:24 +03:00
|
|
|
$result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'EMAIL');
|
2016-07-29 16:38:31 +03:00
|
|
|
$result['token'] = $share->getToken();
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($share->getShareType() === Share::SHARE_TYPE_CIRCLE) {
|
2018-03-16 06:23:46 +03:00
|
|
|
// getSharedWith() returns either "name (type, owner)" or
|
|
|
|
// "name (type, owner) [id]", depending on the Circles app version.
|
|
|
|
$hasCircleId = (substr($share->getSharedWith(), -1) === ']');
|
|
|
|
|
|
|
|
$displayNameLength = ($hasCircleId? strrpos($share->getSharedWith(), ' '): strlen($share->getSharedWith()));
|
|
|
|
$result['share_with_displayname'] = substr($share->getSharedWith(), 0, $displayNameLength);
|
|
|
|
|
|
|
|
$shareWithStart = ($hasCircleId? strrpos($share->getSharedWith(), '[') + 1: 0);
|
|
|
|
$shareWithLength = ($hasCircleId? -1: strpos($share->getSharedWith(), ' '));
|
|
|
|
$result['share_with'] = substr($share->getSharedWith(), $shareWithStart, $shareWithLength);
|
2015-11-06 14:05:19 +03:00
|
|
|
}
|
|
|
|
|
2017-03-17 22:48:33 +03:00
|
|
|
|
2015-11-06 14:05:19 +03:00
|
|
|
$result['mail_send'] = $share->getMailSend() ? 1 : 0;
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
2016-10-25 17:24:24 +03:00
|
|
|
/**
|
|
|
|
* Check if one of the users address books knows the exact property, if
|
|
|
|
* yes we return the full name.
|
|
|
|
*
|
|
|
|
* @param string $query
|
|
|
|
* @param string $property
|
|
|
|
* @return string
|
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
private function getDisplayNameFromAddressBook(string $query, string $property): string {
|
2016-10-25 17:24:24 +03:00
|
|
|
// FIXME: If we inject the contacts manager it gets initialized bofore any address books are registered
|
|
|
|
$result = \OC::$server->getContactsManager()->search($query, [$property]);
|
|
|
|
foreach ($result as $r) {
|
|
|
|
foreach($r[$property] as $value) {
|
|
|
|
if ($value === $query) {
|
|
|
|
return $r['FN'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $query;
|
|
|
|
}
|
|
|
|
|
2015-11-06 14:05:19 +03:00
|
|
|
/**
|
|
|
|
* Get a specific share by id
|
|
|
|
*
|
2016-07-19 15:13:27 +03:00
|
|
|
* @NoAdminRequired
|
|
|
|
*
|
2015-11-06 14:05:19 +03:00
|
|
|
* @param string $id
|
2016-07-20 10:55:43 +03:00
|
|
|
* @return DataResponse
|
|
|
|
* @throws OCSNotFoundException
|
2015-11-06 14:05:19 +03:00
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
public function getShare(string $id): DataResponse {
|
2015-11-06 14:05:19 +03:00
|
|
|
try {
|
2016-03-07 18:10:27 +03:00
|
|
|
$share = $this->getShareById($id);
|
2016-02-02 16:18:59 +03:00
|
|
|
} catch (ShareNotFound $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
|
2015-11-06 14:05:19 +03:00
|
|
|
}
|
|
|
|
|
2015-11-24 11:37:17 +03:00
|
|
|
if ($this->canAccessShare($share)) {
|
2016-02-16 18:04:17 +03:00
|
|
|
try {
|
|
|
|
$share = $this->formatShare($share);
|
2016-08-09 11:04:29 +03:00
|
|
|
return new DataResponse([$share]);
|
2016-02-16 18:04:17 +03:00
|
|
|
} catch (NotFoundException $e) {
|
|
|
|
//Fall trough
|
|
|
|
}
|
2015-11-24 11:37:17 +03:00
|
|
|
}
|
2016-02-16 18:04:17 +03:00
|
|
|
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
|
2015-10-30 15:10:08 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete a share
|
|
|
|
*
|
2016-07-19 15:13:27 +03:00
|
|
|
* @NoAdminRequired
|
|
|
|
*
|
2015-11-06 14:05:19 +03:00
|
|
|
* @param string $id
|
2016-07-20 11:11:01 +03:00
|
|
|
* @return DataResponse
|
2016-07-20 10:55:43 +03:00
|
|
|
* @throws OCSNotFoundException
|
2015-10-30 15:10:08 +03:00
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
public function deleteShare(string $id): DataResponse {
|
2015-10-30 15:10:08 +03:00
|
|
|
try {
|
2016-03-07 18:10:27 +03:00
|
|
|
$share = $this->getShareById($id);
|
2016-02-02 16:18:59 +03:00
|
|
|
} catch (ShareNotFound $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
|
2015-11-02 21:49:39 +03:00
|
|
|
}
|
|
|
|
|
2016-03-09 11:11:41 +03:00
|
|
|
try {
|
2016-07-20 11:11:01 +03:00
|
|
|
$this->lock($share->getNode());
|
2016-03-09 11:11:41 +03:00
|
|
|
} catch (LockedException $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('could not delete share'));
|
2016-03-09 11:11:41 +03:00
|
|
|
}
|
|
|
|
|
2016-10-25 11:18:42 +03:00
|
|
|
if (!$this->canAccessShare($share)) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Could not delete share'));
|
2015-11-24 11:37:17 +03:00
|
|
|
}
|
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($share->getShareType() === Share::SHARE_TYPE_GROUP &&
|
2016-10-25 11:18:42 +03:00
|
|
|
$share->getShareOwner() !== $this->currentUser &&
|
|
|
|
$share->getSharedBy() !== $this->currentUser) {
|
|
|
|
$this->shareManager->deleteFromSelf($share, $this->currentUser);
|
|
|
|
} else {
|
|
|
|
$this->shareManager->deleteShare($share);
|
|
|
|
}
|
2015-10-30 15:10:08 +03:00
|
|
|
|
2016-07-20 11:44:52 +03:00
|
|
|
return new DataResponse();
|
2015-10-30 15:10:08 +03:00
|
|
|
}
|
2015-11-24 11:37:17 +03:00
|
|
|
|
2015-12-15 11:54:50 +03:00
|
|
|
/**
|
2016-07-19 15:13:27 +03:00
|
|
|
* @NoAdminRequired
|
|
|
|
*
|
2016-08-16 23:45:49 +03:00
|
|
|
* @param string $path
|
|
|
|
* @param int $permissions
|
|
|
|
* @param int $shareType
|
|
|
|
* @param string $shareWith
|
|
|
|
* @param string $publicUpload
|
|
|
|
* @param string $password
|
|
|
|
* @param string $expireDate
|
|
|
|
*
|
2016-07-20 10:55:43 +03:00
|
|
|
* @return DataResponse
|
|
|
|
* @throws OCSNotFoundException
|
2016-07-20 11:41:09 +03:00
|
|
|
* @throws OCSForbiddenException
|
|
|
|
* @throws OCSBadRequestException
|
|
|
|
* @throws OCSException
|
2017-07-18 21:38:40 +03:00
|
|
|
*
|
|
|
|
* @suppress PhanUndeclaredClassMethod
|
2015-12-15 11:54:50 +03:00
|
|
|
*/
|
2016-08-16 23:45:49 +03:00
|
|
|
public function createShare(
|
2018-04-23 21:31:57 +03:00
|
|
|
string $path = null,
|
|
|
|
int $permissions = null,
|
|
|
|
int $shareType = -1,
|
|
|
|
string $shareWith = null,
|
|
|
|
string $publicUpload = 'false',
|
|
|
|
string $password = '',
|
|
|
|
string $expireDate = ''
|
|
|
|
): DataResponse {
|
2015-12-15 11:54:50 +03:00
|
|
|
$share = $this->shareManager->newShare();
|
|
|
|
|
2017-12-01 16:49:35 +03:00
|
|
|
if ($permissions === null) {
|
|
|
|
$permissions = $this->config->getAppValue('core', 'shareapi_default_permissions', Constants::PERMISSION_ALL);
|
|
|
|
}
|
|
|
|
|
2015-12-15 11:54:50 +03:00
|
|
|
// Verify path
|
|
|
|
if ($path === null) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Please specify a file or folder path'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
2016-10-21 21:25:07 +03:00
|
|
|
$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
|
2015-12-15 11:54:50 +03:00
|
|
|
try {
|
|
|
|
$path = $userFolder->get($path);
|
2016-03-17 13:09:11 +03:00
|
|
|
} catch (NotFoundException $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Wrong path, file/folder doesn\'t exist'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
2016-01-27 22:51:26 +03:00
|
|
|
$share->setNode($path);
|
2016-03-17 13:09:11 +03:00
|
|
|
|
|
|
|
try {
|
2016-07-20 11:11:01 +03:00
|
|
|
$this->lock($share->getNode());
|
2016-03-17 13:09:11 +03:00
|
|
|
} catch (LockedException $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Could not create share'));
|
2016-03-17 13:09:11 +03:00
|
|
|
}
|
2015-12-15 11:54:50 +03:00
|
|
|
|
2017-12-01 16:49:35 +03:00
|
|
|
if ($permissions < 0 || $permissions > Constants::PERMISSION_ALL) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('invalid permissions'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Shares always require read permissions
|
2017-12-01 16:49:35 +03:00
|
|
|
$permissions |= Constants::PERMISSION_READ;
|
2015-12-15 11:54:50 +03:00
|
|
|
|
|
|
|
if ($path instanceof \OCP\Files\File) {
|
|
|
|
// Single file shares should never have delete or create permissions
|
2017-12-01 16:49:35 +03:00
|
|
|
$permissions &= ~Constants::PERMISSION_DELETE;
|
|
|
|
$permissions &= ~Constants::PERMISSION_CREATE;
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
2016-02-25 12:30:03 +03:00
|
|
|
/*
|
|
|
|
* Hack for https://github.com/owncloud/core/issues/22587
|
|
|
|
* We check the permissions via webdav. But the permissions of the mount point
|
|
|
|
* do not equal the share permissions. Here we fix that for federated mounts.
|
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
if ($path->getStorage()->instanceOfStorage(Storage::class)) {
|
2016-02-25 12:30:03 +03:00
|
|
|
$permissions &= ~($permissions & ~$path->getPermissions());
|
|
|
|
}
|
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($shareType === Share::SHARE_TYPE_USER) {
|
2015-12-15 11:54:50 +03:00
|
|
|
// Valid user is required to share
|
|
|
|
if ($shareWith === null || !$this->userManager->userExists($shareWith)) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Please specify a valid user'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
2016-02-03 10:14:48 +03:00
|
|
|
$share->setSharedWith($shareWith);
|
2015-12-15 11:54:50 +03:00
|
|
|
$share->setPermissions($permissions);
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($shareType === Share::SHARE_TYPE_GROUP) {
|
2016-03-18 18:36:27 +03:00
|
|
|
if (!$this->shareManager->allowGroupSharing()) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Group sharing is disabled by the administrator'));
|
2016-03-18 18:36:27 +03:00
|
|
|
}
|
|
|
|
|
2015-12-15 11:54:50 +03:00
|
|
|
// Valid group is required to share
|
|
|
|
if ($shareWith === null || !$this->groupManager->groupExists($shareWith)) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Please specify a valid group'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
2016-02-03 10:14:48 +03:00
|
|
|
$share->setSharedWith($shareWith);
|
2015-12-15 11:54:50 +03:00
|
|
|
$share->setPermissions($permissions);
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($shareType === Share::SHARE_TYPE_LINK) {
|
2015-12-15 11:54:50 +03:00
|
|
|
//Can we even share links?
|
|
|
|
if (!$this->shareManager->shareApiAllowLinks()) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Public link sharing is disabled by the administrator'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
2016-02-28 23:24:23 +03:00
|
|
|
/*
|
|
|
|
* For now we only allow 1 link share.
|
|
|
|
* Return the existing link share if this is a duplicate
|
|
|
|
*/
|
2018-06-13 15:19:59 +03:00
|
|
|
$existingShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_LINK, $path, false, 1, 0);
|
2016-02-28 23:24:23 +03:00
|
|
|
if (!empty($existingShares)) {
|
2016-08-09 11:04:29 +03:00
|
|
|
return new DataResponse($this->formatShare($existingShares[0]));
|
2016-02-28 23:24:23 +03:00
|
|
|
}
|
|
|
|
|
2015-12-15 11:54:50 +03:00
|
|
|
if ($publicUpload === 'true') {
|
|
|
|
// Check if public upload is allowed
|
|
|
|
if (!$this->shareManager->shareApiLinkAllowPublicUpload()) {
|
2016-07-20 11:41:09 +03:00
|
|
|
throw new OCSForbiddenException($this->l->t('Public upload disabled by the administrator'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Public upload can only be set for folders
|
|
|
|
if ($path instanceof \OCP\Files\File) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Public upload is only possible for publicly shared folders'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
$share->setPermissions(
|
2017-12-01 16:49:35 +03:00
|
|
|
Constants::PERMISSION_READ |
|
|
|
|
Constants::PERMISSION_CREATE |
|
|
|
|
Constants::PERMISSION_UPDATE |
|
|
|
|
Constants::PERMISSION_DELETE
|
2015-12-15 11:54:50 +03:00
|
|
|
);
|
|
|
|
} else {
|
2017-12-01 16:49:35 +03:00
|
|
|
$share->setPermissions(Constants::PERMISSION_READ);
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Set password
|
2016-01-27 17:42:11 +03:00
|
|
|
if ($password !== '') {
|
|
|
|
$share->setPassword($password);
|
|
|
|
}
|
2015-12-15 11:54:50 +03:00
|
|
|
|
|
|
|
//Expire date
|
2016-01-27 17:42:11 +03:00
|
|
|
if ($expireDate !== '') {
|
2015-12-15 11:54:50 +03:00
|
|
|
try {
|
|
|
|
$expireDate = $this->parseDate($expireDate);
|
|
|
|
$share->setExpirationDate($expireDate);
|
|
|
|
} catch (\Exception $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Invalid date, date format must be YYYY-MM-DD'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($shareType === Share::SHARE_TYPE_REMOTE) {
|
2016-02-04 13:13:06 +03:00
|
|
|
if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
|
2016-07-20 11:41:09 +03:00
|
|
|
throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not allow shares from type %s', [$path->getPath(), $shareType]));
|
2016-02-04 13:13:06 +03:00
|
|
|
}
|
|
|
|
|
2016-02-04 12:01:40 +03:00
|
|
|
$share->setSharedWith($shareWith);
|
|
|
|
$share->setPermissions($permissions);
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($shareType === Share::SHARE_TYPE_REMOTE_GROUP) {
|
|
|
|
if (!$this->shareManager->outgoingServer2ServerGroupSharesAllowed()) {
|
|
|
|
throw new OCSForbiddenException($this->l->t('Sharing %s failed because the back end does not allow shares from type %s', [$path->getPath(), $shareType]));
|
|
|
|
}
|
|
|
|
|
|
|
|
$share->setSharedWith($shareWith);
|
|
|
|
$share->setPermissions($permissions);
|
|
|
|
} else if ($shareType === Share::SHARE_TYPE_EMAIL) {
|
2016-10-05 18:51:43 +03:00
|
|
|
if ($share->getNodeType() === 'file') {
|
2017-12-01 16:49:35 +03:00
|
|
|
$share->setPermissions(Constants::PERMISSION_READ);
|
2016-10-05 18:51:43 +03:00
|
|
|
} else {
|
2017-12-01 16:49:35 +03:00
|
|
|
$share->setPermissions($permissions);
|
2016-10-05 18:51:43 +03:00
|
|
|
}
|
2016-07-29 16:38:31 +03:00
|
|
|
$share->setSharedWith($shareWith);
|
2018-06-13 15:19:59 +03:00
|
|
|
} else if ($shareType === Share::SHARE_TYPE_CIRCLE) {
|
2017-07-11 14:21:24 +03:00
|
|
|
if (!\OC::$server->getAppManager()->isEnabledForUser('circles') || !class_exists('\OCA\Circles\ShareByCircleProvider')) {
|
2017-03-17 22:48:33 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('You cannot share to a Circle if the app is not enabled'));
|
|
|
|
}
|
|
|
|
|
2017-07-11 14:21:24 +03:00
|
|
|
$circle = \OCA\Circles\Api\v1\Circles::detailsCircle($shareWith);
|
2017-03-17 22:48:33 +03:00
|
|
|
|
|
|
|
// Valid circle is required to share
|
|
|
|
if ($circle === null) {
|
|
|
|
throw new OCSNotFoundException($this->l->t('Please specify a valid circle'));
|
|
|
|
}
|
|
|
|
$share->setSharedWith($shareWith);
|
|
|
|
$share->setPermissions($permissions);
|
2015-12-15 11:54:50 +03:00
|
|
|
} else {
|
2016-07-20 11:44:52 +03:00
|
|
|
throw new OCSBadRequestException($this->l->t('Unknown share type'));
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
$share->setShareType($shareType);
|
2016-10-21 21:25:07 +03:00
|
|
|
$share->setSharedBy($this->currentUser);
|
2015-12-15 11:54:50 +03:00
|
|
|
|
|
|
|
try {
|
|
|
|
$share = $this->shareManager->createShare($share);
|
2016-02-02 16:18:59 +03:00
|
|
|
} catch (GenericShareException $e) {
|
2016-01-05 14:50:00 +03:00
|
|
|
$code = $e->getCode() === 0 ? 403 : $e->getCode();
|
2016-07-20 11:41:09 +03:00
|
|
|
throw new OCSException($e->getHint(), $code);
|
2016-09-20 12:29:12 +03:00
|
|
|
} catch (\Exception $e) {
|
2018-01-17 17:21:56 +03:00
|
|
|
throw new OCSForbiddenException($e->getMessage(), $e);
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
2016-09-21 19:55:58 +03:00
|
|
|
$output = $this->formatShare($share);
|
2016-03-09 11:11:41 +03:00
|
|
|
|
2016-08-09 11:04:29 +03:00
|
|
|
return new DataResponse($output);
|
2015-12-15 11:54:50 +03:00
|
|
|
}
|
|
|
|
|
2016-01-29 17:26:04 +03:00
|
|
|
/**
|
|
|
|
* @param \OCP\Files\File|\OCP\Files\Folder $node
|
2016-11-10 11:13:25 +03:00
|
|
|
* @param boolean $includeTags
|
2016-07-20 10:55:43 +03:00
|
|
|
* @return DataResponse
|
2016-01-29 17:26:04 +03:00
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
private function getSharedWithMe($node = null, bool $includeTags): DataResponse {
|
2017-03-17 22:48:33 +03:00
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
$userShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_USER, $node, -1, 0);
|
|
|
|
$groupShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_GROUP, $node, -1, 0);
|
|
|
|
$circleShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_CIRCLE, $node, -1, 0);
|
2015-12-03 12:51:41 +03:00
|
|
|
|
2017-03-17 22:48:33 +03:00
|
|
|
$shares = array_merge($userShares, $groupShares, $circleShares);
|
2015-12-03 12:51:41 +03:00
|
|
|
|
2016-09-21 18:35:09 +03:00
|
|
|
$shares = array_filter($shares, function (IShare $share) {
|
2016-10-21 21:25:07 +03:00
|
|
|
return $share->getShareOwner() !== $this->currentUser;
|
2016-09-07 19:38:08 +03:00
|
|
|
});
|
|
|
|
|
2015-12-03 12:51:41 +03:00
|
|
|
$formatted = [];
|
|
|
|
foreach ($shares as $share) {
|
2016-01-27 11:02:12 +03:00
|
|
|
if ($this->canAccessShare($share)) {
|
2016-02-16 18:04:17 +03:00
|
|
|
try {
|
|
|
|
$formatted[] = $this->formatShare($share);
|
|
|
|
} catch (NotFoundException $e) {
|
|
|
|
// Ignore this share
|
|
|
|
}
|
2016-01-27 11:02:12 +03:00
|
|
|
}
|
2015-12-03 12:51:41 +03:00
|
|
|
}
|
|
|
|
|
2016-11-10 11:13:25 +03:00
|
|
|
if ($includeTags) {
|
2017-08-22 19:46:47 +03:00
|
|
|
$formatted = Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager());
|
2016-11-10 11:13:25 +03:00
|
|
|
}
|
|
|
|
|
2016-08-09 11:04:29 +03:00
|
|
|
return new DataResponse($formatted);
|
2015-12-03 12:51:41 +03:00
|
|
|
}
|
|
|
|
|
2016-01-19 16:35:16 +03:00
|
|
|
/**
|
|
|
|
* @param \OCP\Files\Folder $folder
|
2016-07-20 10:55:43 +03:00
|
|
|
* @return DataResponse
|
2016-07-20 11:41:09 +03:00
|
|
|
* @throws OCSBadRequestException
|
2016-01-19 16:35:16 +03:00
|
|
|
*/
|
2018-04-24 09:07:25 +03:00
|
|
|
private function getSharesInDir(Node $folder): DataResponse {
|
2016-01-19 16:35:16 +03:00
|
|
|
if (!($folder instanceof \OCP\Files\Folder)) {
|
2016-07-20 11:41:09 +03:00
|
|
|
throw new OCSBadRequestException($this->l->t('Not a directory'));
|
2016-01-19 16:35:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
$nodes = $folder->getDirectoryListing();
|
2016-01-27 14:13:53 +03:00
|
|
|
/** @var \OCP\Share\IShare[] $shares */
|
2016-01-19 16:35:16 +03:00
|
|
|
$shares = [];
|
|
|
|
foreach ($nodes as $node) {
|
2018-06-13 15:19:59 +03:00
|
|
|
$shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_USER, $node, false, -1, 0));
|
|
|
|
$shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_GROUP, $node, false, -1, 0));
|
|
|
|
$shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_LINK, $node, false, -1, 0));
|
|
|
|
if($this->shareManager->shareProviderExists(Share::SHARE_TYPE_EMAIL)) {
|
|
|
|
$shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_EMAIL, $node, false, -1, 0));
|
2016-10-27 13:27:09 +03:00
|
|
|
}
|
2016-02-04 13:13:06 +03:00
|
|
|
if ($this->shareManager->outgoingServer2ServerSharesAllowed()) {
|
2018-06-13 15:19:59 +03:00
|
|
|
$shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_REMOTE, $node, false, -1, 0));
|
2016-02-04 13:13:06 +03:00
|
|
|
}
|
2016-01-19 16:35:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
$formatted = [];
|
|
|
|
foreach ($shares as $share) {
|
2016-02-16 18:04:17 +03:00
|
|
|
try {
|
|
|
|
$formatted[] = $this->formatShare($share);
|
|
|
|
} catch (NotFoundException $e) {
|
|
|
|
//Ignore this share
|
|
|
|
}
|
2016-01-19 16:35:16 +03:00
|
|
|
}
|
|
|
|
|
2016-08-09 11:04:29 +03:00
|
|
|
return new DataResponse($formatted);
|
2016-01-19 16:35:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The getShares function.
|
|
|
|
*
|
2016-07-19 15:13:27 +03:00
|
|
|
* @NoAdminRequired
|
|
|
|
*
|
2016-08-17 11:05:09 +03:00
|
|
|
* @param string $shared_with_me
|
|
|
|
* @param string $reshares
|
|
|
|
* @param string $subfiles
|
|
|
|
* @param string $path
|
|
|
|
*
|
2016-01-19 16:35:16 +03:00
|
|
|
* - Get shares by the current user
|
|
|
|
* - Get shares by the current user and reshares (?reshares=true)
|
|
|
|
* - Get shares with the current user (?shared_with_me=true)
|
|
|
|
* - Get shares for a specific path (?path=...)
|
|
|
|
* - Get all shares in a folder (?subfiles=true&path=..)
|
|
|
|
*
|
2016-07-20 10:55:43 +03:00
|
|
|
* @return DataResponse
|
|
|
|
* @throws OCSNotFoundException
|
2016-01-19 16:35:16 +03:00
|
|
|
*/
|
2016-08-17 11:05:09 +03:00
|
|
|
public function getShares(
|
2018-04-23 21:31:57 +03:00
|
|
|
string $shared_with_me = 'false',
|
|
|
|
string $reshares = 'false',
|
|
|
|
string $subfiles = 'false',
|
|
|
|
string $path = null,
|
|
|
|
string $include_tags = 'false'
|
|
|
|
): DataResponse {
|
2015-12-03 12:51:41 +03:00
|
|
|
|
|
|
|
if ($path !== null) {
|
2016-10-21 21:25:07 +03:00
|
|
|
$userFolder = $this->rootFolder->getUserFolder($this->currentUser);
|
2015-12-03 12:51:41 +03:00
|
|
|
try {
|
|
|
|
$path = $userFolder->get($path);
|
2016-07-20 15:24:22 +03:00
|
|
|
$this->lock($path);
|
2015-12-03 12:51:41 +03:00
|
|
|
} catch (\OCP\Files\NotFoundException $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Wrong path, file/folder doesn\'t exist'));
|
2016-03-17 13:09:11 +03:00
|
|
|
} catch (LockedException $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Could not lock path'));
|
2015-12-03 12:51:41 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-24 09:07:25 +03:00
|
|
|
$include_tags = $include_tags === 'true';
|
|
|
|
|
2016-08-17 11:05:09 +03:00
|
|
|
if ($shared_with_me === 'true') {
|
2016-11-10 11:13:25 +03:00
|
|
|
$result = $this->getSharedWithMe($path, $include_tags);
|
2016-03-17 13:09:11 +03:00
|
|
|
return $result;
|
2016-01-29 17:26:04 +03:00
|
|
|
}
|
|
|
|
|
2016-01-19 16:35:16 +03:00
|
|
|
if ($subfiles === 'true') {
|
2016-03-17 13:09:11 +03:00
|
|
|
$result = $this->getSharesInDir($path);
|
|
|
|
return $result;
|
2016-01-19 16:35:16 +03:00
|
|
|
}
|
|
|
|
|
2015-12-03 12:51:41 +03:00
|
|
|
if ($reshares === 'true') {
|
|
|
|
$reshares = true;
|
|
|
|
} else {
|
|
|
|
$reshares = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get all shares
|
2018-06-13 15:19:59 +03:00
|
|
|
$userShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_USER, $path, $reshares, -1, 0);
|
|
|
|
$groupShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_GROUP, $path, $reshares, -1, 0);
|
|
|
|
$linkShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_LINK, $path, $reshares, -1, 0);
|
|
|
|
if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_EMAIL)) {
|
|
|
|
$mailShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_EMAIL, $path, $reshares, -1, 0);
|
2016-10-24 18:04:40 +03:00
|
|
|
} else {
|
|
|
|
$mailShares = [];
|
|
|
|
}
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_CIRCLE)) {
|
|
|
|
$circleShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_CIRCLE, $path, $reshares, -1, 0);
|
2017-03-17 22:48:33 +03:00
|
|
|
} else {
|
|
|
|
$circleShares = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
$shares = array_merge($userShares, $groupShares, $linkShares, $mailShares, $circleShares);
|
2016-02-04 13:13:06 +03:00
|
|
|
|
|
|
|
if ($this->shareManager->outgoingServer2ServerSharesAllowed()) {
|
2018-06-13 15:19:59 +03:00
|
|
|
$federatedShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_REMOTE, $path, $reshares, -1, 0);
|
|
|
|
$shares = array_merge($shares, $federatedShares);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->shareManager->outgoingServer2ServerGroupSharesAllowed()) {
|
|
|
|
$federatedShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_REMOTE_GROUP, $path, $reshares, -1, 0);
|
2016-02-04 13:13:06 +03:00
|
|
|
$shares = array_merge($shares, $federatedShares);
|
|
|
|
}
|
2015-12-03 12:51:41 +03:00
|
|
|
|
|
|
|
$formatted = [];
|
|
|
|
foreach ($shares as $share) {
|
2016-02-16 18:04:17 +03:00
|
|
|
try {
|
2016-09-20 18:59:04 +03:00
|
|
|
$formatted[] = $this->formatShare($share, $path);
|
2016-02-16 18:04:17 +03:00
|
|
|
} catch (NotFoundException $e) {
|
|
|
|
//Ignore share
|
|
|
|
}
|
2015-12-03 12:51:41 +03:00
|
|
|
}
|
|
|
|
|
2016-11-10 11:13:25 +03:00
|
|
|
if ($include_tags) {
|
2017-08-22 19:46:47 +03:00
|
|
|
$formatted = Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager());
|
2016-11-10 11:13:25 +03:00
|
|
|
}
|
|
|
|
|
2016-08-09 11:04:29 +03:00
|
|
|
return new DataResponse($formatted);
|
2015-12-03 12:51:41 +03:00
|
|
|
}
|
|
|
|
|
2016-01-22 16:52:20 +03:00
|
|
|
/**
|
2016-07-19 15:13:27 +03:00
|
|
|
* @NoAdminRequired
|
|
|
|
*
|
2018-04-23 21:31:57 +03:00
|
|
|
* @param string $id
|
2016-08-17 11:05:09 +03:00
|
|
|
* @param int $permissions
|
|
|
|
* @param string $password
|
|
|
|
* @param string $publicUpload
|
|
|
|
* @param string $expireDate
|
2016-07-20 10:55:43 +03:00
|
|
|
* @return DataResponse
|
|
|
|
* @throws OCSNotFoundException
|
2016-07-20 11:41:09 +03:00
|
|
|
* @throws OCSBadRequestException
|
|
|
|
* @throws OCSForbiddenException
|
2016-01-22 16:52:20 +03:00
|
|
|
*/
|
2016-08-17 11:05:09 +03:00
|
|
|
public function updateShare(
|
2018-04-23 21:31:57 +03:00
|
|
|
string $id,
|
|
|
|
int $permissions = null,
|
|
|
|
string $password = null,
|
|
|
|
string $publicUpload = null,
|
|
|
|
string $expireDate = null
|
|
|
|
): DataResponse {
|
2016-01-22 16:52:20 +03:00
|
|
|
try {
|
2016-03-07 18:10:27 +03:00
|
|
|
$share = $this->getShareById($id);
|
2016-02-02 16:18:59 +03:00
|
|
|
} catch (ShareNotFound $e) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
|
2016-01-22 16:52:20 +03:00
|
|
|
}
|
|
|
|
|
2016-07-20 11:11:01 +03:00
|
|
|
$this->lock($share->getNode());
|
2016-03-09 11:11:41 +03:00
|
|
|
|
2016-07-28 17:52:00 +03:00
|
|
|
if (!$this->canAccessShare($share, false)) {
|
2016-07-20 10:55:43 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
|
2016-01-22 16:52:20 +03:00
|
|
|
}
|
|
|
|
|
2017-03-30 18:03:04 +03:00
|
|
|
if ($permissions === null && $password === null && $publicUpload === null && $expireDate === null) {
|
|
|
|
throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given'));
|
|
|
|
}
|
|
|
|
|
2016-01-27 18:46:48 +03:00
|
|
|
/*
|
|
|
|
* expirationdate, password and publicUpload only make sense for link shares
|
|
|
|
*/
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($share->getShareType() === Share::SHARE_TYPE_LINK) {
|
2016-01-22 16:52:20 +03:00
|
|
|
|
2016-01-27 22:32:04 +03:00
|
|
|
$newPermissions = null;
|
|
|
|
if ($publicUpload === 'true') {
|
2017-12-01 16:49:35 +03:00
|
|
|
$newPermissions = Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE;
|
2016-01-27 22:32:04 +03:00
|
|
|
} else if ($publicUpload === 'false') {
|
2017-12-01 16:49:35 +03:00
|
|
|
$newPermissions = Constants::PERMISSION_READ;
|
2016-01-22 16:52:20 +03:00
|
|
|
}
|
|
|
|
|
2016-01-27 22:32:04 +03:00
|
|
|
if ($permissions !== null) {
|
|
|
|
$newPermissions = (int)$permissions;
|
2017-12-01 16:49:35 +03:00
|
|
|
$newPermissions = $newPermissions & ~Constants::PERMISSION_SHARE;
|
2016-01-27 22:32:04 +03:00
|
|
|
}
|
2016-01-22 16:52:20 +03:00
|
|
|
|
2016-01-27 22:32:04 +03:00
|
|
|
if ($newPermissions !== null &&
|
2016-07-14 11:27:29 +03:00
|
|
|
!in_array($newPermissions, [
|
2017-12-01 16:49:35 +03:00
|
|
|
Constants::PERMISSION_READ,
|
|
|
|
Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE, // legacy
|
|
|
|
Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE, // correct
|
|
|
|
Constants::PERMISSION_CREATE, // hidden file list
|
|
|
|
Constants::PERMISSION_READ | Constants::PERMISSION_UPDATE, // allow to edit single files
|
2018-04-23 21:31:57 +03:00
|
|
|
], true)
|
2016-06-23 16:43:21 +03:00
|
|
|
) {
|
2016-07-20 11:41:09 +03:00
|
|
|
throw new OCSBadRequestException($this->l->t('Can\'t change permissions for public share links'));
|
2016-01-27 22:32:04 +03:00
|
|
|
}
|
|
|
|
|
2016-06-23 16:43:21 +03:00
|
|
|
if (
|
|
|
|
// legacy
|
2017-12-01 16:49:35 +03:00
|
|
|
$newPermissions === (Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE) ||
|
2016-06-23 16:43:21 +03:00
|
|
|
// correct
|
2017-12-01 16:49:35 +03:00
|
|
|
$newPermissions === (Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE)
|
2016-06-23 16:43:21 +03:00
|
|
|
) {
|
2016-01-27 22:32:04 +03:00
|
|
|
if (!$this->shareManager->shareApiLinkAllowPublicUpload()) {
|
2016-07-20 11:41:09 +03:00
|
|
|
throw new OCSForbiddenException($this->l->t('Public upload disabled by the administrator'));
|
2016-01-27 22:32:04 +03:00
|
|
|
}
|
|
|
|
|
2016-01-28 15:17:16 +03:00
|
|
|
if (!($share->getNode() instanceof \OCP\Files\Folder)) {
|
2016-07-20 11:41:09 +03:00
|
|
|
throw new OCSBadRequestException($this->l->t('Public upload is only possible for publicly shared folders'));
|
2016-01-27 22:32:04 +03:00
|
|
|
}
|
2016-06-23 16:43:21 +03:00
|
|
|
|
|
|
|
// normalize to correct public upload permissions
|
2017-12-01 16:49:35 +03:00
|
|
|
$newPermissions = Constants::PERMISSION_READ | Constants::PERMISSION_CREATE | Constants::PERMISSION_UPDATE | Constants::PERMISSION_DELETE;
|
2016-01-27 22:32:04 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($newPermissions !== null) {
|
|
|
|
$share->setPermissions($newPermissions);
|
2016-11-13 22:29:34 +03:00
|
|
|
$permissions = $newPermissions;
|
2016-01-27 22:32:04 +03:00
|
|
|
}
|
2016-01-22 16:52:20 +03:00
|
|
|
|
2016-01-27 18:46:48 +03:00
|
|
|
if ($expireDate === '') {
|
|
|
|
$share->setExpirationDate(null);
|
2016-01-27 19:09:02 +03:00
|
|
|
} else if ($expireDate !== null) {
|
2016-01-27 18:46:48 +03:00
|
|
|
try {
|
|
|
|
$expireDate = $this->parseDate($expireDate);
|
|
|
|
} catch (\Exception $e) {
|
2018-01-17 17:21:56 +03:00
|
|
|
throw new OCSBadRequestException($e->getMessage(), $e);
|
2016-01-27 18:46:48 +03:00
|
|
|
}
|
|
|
|
$share->setExpirationDate($expireDate);
|
|
|
|
}
|
2016-01-22 16:52:20 +03:00
|
|
|
|
2016-01-27 18:46:48 +03:00
|
|
|
if ($password === '') {
|
|
|
|
$share->setPassword(null);
|
2016-01-27 19:09:02 +03:00
|
|
|
} else if ($password !== null) {
|
2016-01-27 18:46:48 +03:00
|
|
|
$share->setPassword($password);
|
2016-01-22 16:52:20 +03:00
|
|
|
}
|
|
|
|
|
2016-01-27 18:46:48 +03:00
|
|
|
} else {
|
2017-03-29 17:50:23 +03:00
|
|
|
if ($permissions !== null) {
|
2016-01-27 18:46:48 +03:00
|
|
|
$permissions = (int)$permissions;
|
|
|
|
$share->setPermissions($permissions);
|
|
|
|
}
|
2017-03-28 15:39:38 +03:00
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($share->getShareType() === Share::SHARE_TYPE_EMAIL) {
|
2017-03-28 15:39:38 +03:00
|
|
|
if ($password === '') {
|
|
|
|
$share->setPassword(null);
|
|
|
|
} else if ($password !== null) {
|
|
|
|
$share->setPassword($password);
|
|
|
|
}
|
|
|
|
}
|
2017-03-29 17:50:23 +03:00
|
|
|
|
|
|
|
if ($expireDate === '') {
|
|
|
|
$share->setExpirationDate(null);
|
|
|
|
} else if ($expireDate !== null) {
|
|
|
|
try {
|
|
|
|
$expireDate = $this->parseDate($expireDate);
|
|
|
|
} catch (\Exception $e) {
|
2018-01-17 17:21:56 +03:00
|
|
|
throw new OCSBadRequestException($e->getMessage(), $e);
|
2017-03-29 17:50:23 +03:00
|
|
|
}
|
|
|
|
$share->setExpirationDate($expireDate);
|
|
|
|
}
|
|
|
|
|
2016-01-22 16:52:20 +03:00
|
|
|
}
|
|
|
|
|
2016-10-21 21:25:07 +03:00
|
|
|
if ($permissions !== null && $share->getShareOwner() !== $this->currentUser) {
|
2016-02-29 21:12:19 +03:00
|
|
|
/* Check if this is an incomming share */
|
2018-06-13 15:19:59 +03:00
|
|
|
$incomingShares = $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_USER, $share->getNode(), -1, 0);
|
|
|
|
$incomingShares = array_merge($incomingShares, $this->shareManager->getSharedWith($this->currentUser, Share::SHARE_TYPE_GROUP, $share->getNode(), -1, 0));
|
2016-02-29 21:12:19 +03:00
|
|
|
|
2016-07-20 10:55:43 +03:00
|
|
|
/** @var \OCP\Share\IShare[] $incomingShares */
|
2016-02-29 21:12:19 +03:00
|
|
|
if (!empty($incomingShares)) {
|
|
|
|
$maxPermissions = 0;
|
|
|
|
foreach ($incomingShares as $incomingShare) {
|
|
|
|
$maxPermissions |= $incomingShare->getPermissions();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($share->getPermissions() & ~$maxPermissions) {
|
2016-07-20 15:24:22 +03:00
|
|
|
throw new OCSNotFoundException($this->l->t('Cannot increase permissions'));
|
2016-02-29 21:12:19 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-01-27 18:46:48 +03:00
|
|
|
|
|
|
|
|
2016-01-22 16:52:20 +03:00
|
|
|
try {
|
|
|
|
$share = $this->shareManager->updateShare($share);
|
|
|
|
} catch (\Exception $e) {
|
2018-01-17 17:21:56 +03:00
|
|
|
throw new OCSBadRequestException($e->getMessage(), $e);
|
2016-01-22 16:52:20 +03:00
|
|
|
}
|
|
|
|
|
2016-08-09 11:04:29 +03:00
|
|
|
return new DataResponse($this->formatShare($share));
|
2016-01-22 16:52:20 +03:00
|
|
|
}
|
|
|
|
|
2018-04-23 21:31:57 +03:00
|
|
|
protected function canAccessShare(\OCP\Share\IShare $share, bool $checkGroups = true): bool {
|
2016-01-27 11:02:12 +03:00
|
|
|
// A file with permissions 0 can't be accessed by us. So Don't show it
|
|
|
|
if ($share->getPermissions() === 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-11-24 11:37:17 +03:00
|
|
|
// Owner of the file and the sharer of the file can always get share
|
2016-10-21 21:25:07 +03:00
|
|
|
if ($share->getShareOwner() === $this->currentUser ||
|
|
|
|
$share->getSharedBy() === $this->currentUser
|
2015-11-24 11:37:17 +03:00
|
|
|
) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If the share is shared with you (or a group you are a member of)
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($share->getShareType() === Share::SHARE_TYPE_USER &&
|
2016-10-21 21:25:07 +03:00
|
|
|
$share->getSharedWith() === $this->currentUser
|
2016-09-21 18:35:09 +03:00
|
|
|
) {
|
2015-11-24 11:37:17 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($checkGroups && $share->getShareType() === Share::SHARE_TYPE_GROUP) {
|
2016-02-03 10:14:48 +03:00
|
|
|
$sharedWith = $this->groupManager->get($share->getSharedWith());
|
2016-10-21 21:25:07 +03:00
|
|
|
$user = $this->userManager->get($this->currentUser);
|
2017-01-19 17:02:46 +03:00
|
|
|
if ($user !== null && $sharedWith !== null && $sharedWith->inGroup($user)) {
|
2016-02-03 10:14:48 +03:00
|
|
|
return true;
|
|
|
|
}
|
2015-11-24 11:37:17 +03:00
|
|
|
}
|
|
|
|
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($share->getShareType() === Share::SHARE_TYPE_CIRCLE) {
|
2017-03-17 22:48:33 +03:00
|
|
|
// TODO: have a sanity check like above?
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-11-24 11:37:17 +03:00
|
|
|
return false;
|
|
|
|
}
|
2015-12-15 11:54:50 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Make sure that the passed date is valid ISO 8601
|
|
|
|
* So YYYY-MM-DD
|
|
|
|
* If not throw an exception
|
|
|
|
*
|
|
|
|
* @param string $expireDate
|
|
|
|
*
|
|
|
|
* @throws \Exception
|
|
|
|
* @return \DateTime
|
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
private function parseDate(string $expireDate): \DateTime {
|
2015-12-15 11:54:50 +03:00
|
|
|
try {
|
|
|
|
$date = new \DateTime($expireDate);
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($date === false) {
|
|
|
|
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
|
|
|
|
}
|
|
|
|
|
2016-09-21 18:35:09 +03:00
|
|
|
$date->setTime(0, 0, 0);
|
2015-12-15 11:54:50 +03:00
|
|
|
|
|
|
|
return $date;
|
|
|
|
}
|
2016-03-07 18:10:27 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Since we have multiple providers but the OCS Share API v1 does
|
|
|
|
* not support this we need to check all backends.
|
|
|
|
*
|
|
|
|
* @param string $id
|
|
|
|
* @return \OCP\Share\IShare
|
|
|
|
* @throws ShareNotFound
|
|
|
|
*/
|
2018-04-23 21:31:57 +03:00
|
|
|
private function getShareById(string $id): IShare {
|
2016-03-07 18:10:27 +03:00
|
|
|
$share = null;
|
|
|
|
|
|
|
|
// First check if it is an internal share.
|
|
|
|
try {
|
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
|
|
|
$share = $this->shareManager->getShareById('ocinternal:' . $id, $this->currentUser);
|
2016-07-29 16:38:31 +03:00
|
|
|
return $share;
|
|
|
|
} catch (ShareNotFound $e) {
|
|
|
|
// Do nothing, just try the other share type
|
|
|
|
}
|
|
|
|
|
2017-03-17 22:48:33 +03:00
|
|
|
|
|
|
|
try {
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_CIRCLE)) {
|
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
|
|
|
$share = $this->shareManager->getShareById('ocCircleShare:' . $id, $this->currentUser);
|
2017-03-17 22:48:33 +03:00
|
|
|
return $share;
|
|
|
|
}
|
|
|
|
} catch (ShareNotFound $e) {
|
|
|
|
// Do nothing, just try the other share type
|
|
|
|
}
|
|
|
|
|
2016-07-29 16:38:31 +03:00
|
|
|
try {
|
2018-06-13 15:19:59 +03:00
|
|
|
if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_EMAIL)) {
|
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
|
|
|
$share = $this->shareManager->getShareById('ocMailShare:' . $id, $this->currentUser);
|
2016-10-27 13:27:09 +03:00
|
|
|
return $share;
|
2016-03-07 18:10:27 +03:00
|
|
|
}
|
2016-10-27 13:27:09 +03:00
|
|
|
} catch (ShareNotFound $e) {
|
|
|
|
// Do nothing, just try the other share type
|
|
|
|
}
|
2016-03-07 18:10:27 +03:00
|
|
|
|
2016-10-27 13:27:09 +03:00
|
|
|
if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
|
|
|
|
throw new ShareNotFound();
|
2016-03-07 18:10:27 +03:00
|
|
|
}
|
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
|
|
|
$share = $this->shareManager->getShareById('ocFederatedSharing:' . $id, $this->currentUser);
|
2016-03-07 18:10:27 +03:00
|
|
|
|
|
|
|
return $share;
|
|
|
|
}
|
2016-07-20 11:11:01 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Lock a Node
|
2016-09-21 18:35:09 +03:00
|
|
|
*
|
2016-07-20 11:11:01 +03:00
|
|
|
* @param \OCP\Files\Node $node
|
2018-04-23 21:31:57 +03:00
|
|
|
* @throws LockedException
|
2016-07-20 11:11:01 +03:00
|
|
|
*/
|
|
|
|
private function lock(\OCP\Files\Node $node) {
|
|
|
|
$node->lock(ILockingProvider::LOCK_SHARED);
|
|
|
|
$this->lockedNode = $node;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cleanup the remaining locks
|
2018-04-23 21:31:57 +03:00
|
|
|
* @throws @LockedException
|
2016-07-20 11:11:01 +03:00
|
|
|
*/
|
|
|
|
public function cleanup() {
|
|
|
|
if ($this->lockedNode !== null) {
|
|
|
|
$this->lockedNode->unlock(ILockingProvider::LOCK_SHARED);
|
|
|
|
}
|
|
|
|
}
|
2015-10-30 15:10:08 +03:00
|
|
|
}
|