diff --git a/.htaccess b/.htaccess index 9aa16c7cb933c..cc2e0c95eb11c 100644 --- a/.htaccess +++ b/.htaccess @@ -65,7 +65,3 @@ Options -Indexes ModPagespeed Off -#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### - -ErrorDocument 403 // -ErrorDocument 404 // diff --git a/apps/dav/lib/Connector/Sabre/SharesPlugin.php b/apps/dav/lib/Connector/Sabre/SharesPlugin.php index e395bb7313a8b..be76171c33dd6 100644 --- a/apps/dav/lib/Connector/Sabre/SharesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/SharesPlugin.php @@ -27,13 +27,9 @@ */ namespace OCA\DAV\Connector\Sabre; -use OCA\DAV\Connector\Sabre\Exception\FileLocked; use \Sabre\DAV\PropFind; use OCP\IUserSession; use OCP\Share\IShare; -use OCP\Files\NotFoundException; -use OCP\Lock\LockedException; -use \OCA\DAV\Connector\Sabre\Node; /** * Sabre Plugin to provide share-related properties @@ -223,67 +219,45 @@ public function handleGetProperties( }); $propFind->handle(self::SHAREES_PROPERTYNAME, function() use ($sabreNode) { - $test = $this->server->httpRequest->getRawServerValue('PHP_AUTH_USER'); - return $this->getShareeFromShare($sabreNode, $test); - }); - } - - /** - * @param \Sabre\DAV\INode $sabreNode - * @param string $user - * @return string - * @throws FileLocked - * @throws NotFoundException - */ - public function getShareeFromShare(\Sabre\DAV\INode $sabreNode, $user) { - $sharees = []; + $user = $this->server->httpRequest->getRawServerValue('PHP_AUTH_USER'); - if ($user == null) { - return $sharees; - } - $types = [ - Share::SHARE_TYPE_USER, - Share::SHARE_TYPE_REMOTE, - Share::SHARE_TYPE_GROUP, - ]; - - if ($sabreNode->getPath() === "/") { - return $sharees; - } + if ($user == null) { + return []; + } - $path = $this->getPath(); + if ($sabreNode->getPath() === "/") { + return []; + } - if ($path !== null) { $userFolder = \OC::$server->getRootFolder()->getUserFolder($user); - try { - $path = $userFolder->get($path); - $this->lock($path); - } catch (\OCP\Files\NotFoundException $e) { - throw new NotFoundException($this->l->t('Wrong path, file/folder doesn\'t exist')); - } catch (LockedException $e) { - throw new FileLocked($e->getMessage(), $e->getCode(), $e); - } - } + $path = $userFolder->get($sabreNode->getPath()); - foreach ($types as $shareType) { - $shares = $this->shareManager->getSharesBy($user, $shareType, $path, false, -1, 0); - foreach ($shares as $share) { - if ($share->getSharedBy() === $user) { - $sharees[] = $share->getSharedWith(); + if (isset($this->cachedShareTypes[$sabreNode->getId()])) { + $shareTypes = $this->cachedShareTypes[$sabreNode->getId()]; + } else { + list($parentPath,) = \Sabre\Uri\split($sabreNode->getPath()); + if ($parentPath === '') { + $parentPath = '/'; + } + // if we already cached the folder this file is in we know there are no shares for this file + if (array_search($parentPath, $this->cachedFolders) === false) { + $node = $this->userFolder->get($sabreNode->getPath()); + $shareTypes = $this->getShareTypes($node); + } else { + return []; } } - } - return implode(', ', $sharees); - } - /** - * Lock a Node - * - * @param \OCP\Files\Node $node - * @throws LockedException - */ - private function lock(\OCP\Files\Node $node) { - $node->lock(ILockingProvider::LOCK_SHARED); - $this->lockedNode = $node; + foreach ($shareTypes as $shareType) { + $shares = $this->shareManager->getSharesBy($user, $shareType, $path, false, -1, 0); + + foreach ($shares as $share) { + if ($share->getSharedBy() === $user) { + $sharees[] = $share->getSharedWith(); + } + } + } + return implode(', ', $sharees); + }); } }