diff --git a/apps/dav/lib/connector/sabre/node.php b/apps/dav/lib/connector/sabre/node.php index eaba671399..979149fc93 100644 --- a/apps/dav/lib/connector/sabre/node.php +++ b/apps/dav/lib/connector/sabre/node.php @@ -224,7 +224,7 @@ abstract class Node implements \Sabre\DAV\INode { if ($storage->instanceOfStorage('\OC\Files\Storage\Shared')) { /** @var \OC\Files\Storage\Shared $storage */ - $permissions = (int)$storage->getShare()['permissions']; + $permissions = (int)$storage->getShare()->getPermissions(); } else { $permissions = $storage->getPermissions($path); } diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 1ec25750cf..dee9e0cdd2 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -237,6 +237,17 @@ class Manager implements IManager { if (($share->getPermissions() & \OCP\Constants::PERMISSION_READ) === 0) { throw new \InvalidArgumentException('Shares need at least read permissions'); } + + if ($share->getNode() instanceof \OCP\Files\File) { + if ($share->getPermissions() & \OCP\Constants::PERMISSION_DELETE) { + $message_t = $this->l->t('Files can\'t be shared with delete permissions'); + throw new GenericShareException($message_t); + } + if ($share->getPermissions() & \OCP\Constants::PERMISSION_CREATE) { + $message_t = $this->l->t('Files can\'t be shared with create permissions'); + throw new GenericShareException($message_t); + } + } } /** @@ -505,6 +516,24 @@ class Manager implements IManager { $this->generalCreateChecks($share); + // Verify if there are any issues with the path + $this->pathCreateChecks($share->getNode()); + + /* + * On creation of a share the owner is always the owner of the path + * Except for mounted federated shares. + */ + $storage = $share->getNode()->getStorage(); + if ($storage->instanceOfStorage('OCA\Files_Sharing\External\Storage')) { + $parent = $share->getNode()->getParent(); + while($parent->getStorage()->instanceOfStorage('OCA\Files_Sharing\External\Storage')) { + $parent = $parent->getParent(); + } + $share->setShareOwner($parent->getOwner()->getUID()); + } else { + $share->setShareOwner($share->getNode()->getOwner()->getUID()); + } + //Verify share type if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { $this->userCreateChecks($share); @@ -538,24 +567,6 @@ class Manager implements IManager { } } - // Verify if there are any issues with the path - $this->pathCreateChecks($share->getNode()); - - /* - * On creation of a share the owner is always the owner of the path - * Except for mounted federated shares. - */ - $storage = $share->getNode()->getStorage(); - if ($storage->instanceOfStorage('OCA\Files_Sharing\External\Storage')) { - $parent = $share->getNode()->getParent(); - while($parent->getStorage()->instanceOfStorage('OCA\Files_Sharing\External\Storage')) { - $parent = $parent->getParent(); - } - $share->setShareOwner($parent->getOwner()->getUID()); - } else { - $share->setShareOwner($share->getNode()->getOwner()->getUID()); - } - // Cannot share with the owner if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER && $share->getSharedWith() === $share->getShareOwner()) { @@ -818,7 +829,7 @@ class Manager implements IManager { * @param string $recipientId */ public function deleteFromSelf(\OCP\Share\IShare $share, $recipientId) { - list($providerId, ) = $this->splitFullId($share->getId()); + list($providerId, ) = $this->splitFullId($share->getFullId()); $provider = $this->factory->getProvider($providerId); $provider->deleteFromSelf($share, $recipientId); @@ -844,7 +855,7 @@ class Manager implements IManager { } } - list($providerId, ) = $this->splitFullId($share->getId()); + list($providerId, ) = $this->splitFullId($share->getFullId()); $provider = $this->factory->getProvider($providerId); $provider->move($share, $recipientId); diff --git a/lib/private/files/config/usermountcache.php b/lib/private/files/config/usermountcache.php index 78b1997278..6843617402 100644 --- a/lib/private/files/config/usermountcache.php +++ b/lib/private/files/config/usermountcache.php @@ -82,7 +82,7 @@ class UserMountCache implements IUserMountCache { $newMounts = array_map(function (IMountPoint $mount) use ($user) { $storage = $mount->getStorage(); if ($storage->instanceOfStorage('\OC\Files\Storage\Shared')) { - $rootId = (int)$storage->getShare()['file_source']; + $rootId = (int)$storage->getShare()->getNodeId(); } else { $rootId = (int)$storage->getCache()->getId(''); } diff --git a/lib/private/files/storage/wrapper/jail.php b/lib/private/files/storage/wrapper/jail.php index e5f5ab9035..6c2a5199f2 100644 --- a/lib/private/files/storage/wrapper/jail.php +++ b/lib/private/files/storage/wrapper/jail.php @@ -47,7 +47,7 @@ class Jail extends Wrapper { $this->rootPath = $arguments['root']; } - protected function getSourcePath($path) { + public function getSourcePath($path) { if ($path === '') { return $this->rootPath; } else { @@ -415,6 +415,14 @@ class Jail extends Wrapper { return $this->storage->getETag($this->getSourcePath($path)); } + /** + * @param string $path + * @return array + */ + public function getMetaData($path) { + return $this->storage->getMetaData($this->getSourcePath($path)); + } + /** * @param string $path * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE @@ -442,4 +450,9 @@ class Jail extends Wrapper { public function changeLock($path, $type, ILockingProvider $provider) { $this->storage->changeLock($this->getSourcePath($path), $type, $provider); } + + public function resolvePath($path) { + $path = $this->getSourcePath($path); + return \OC\Files\Filesystem::resolvePath($path); + } } diff --git a/lib/private/helper.php b/lib/private/helper.php index 70c50bb7b4..e6aaed0fd1 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -628,7 +628,7 @@ class OC_Helper { /** @var \OC\Files\Storage\Wrapper\Quota $storage */ $quota = $sourceStorage->getQuota(); } - $free = $storage->free_space(''); + $free = $sourceStorage->free_space(''); if ($free >= 0) { $total = $free + $used; } else {