diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index e1875fe239..9b6d53e182 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -34,6 +34,7 @@ namespace OC\Files\Storage; use OC\Files\Filesystem; use OC\Files\Cache\FailedCache; use OCA\Files_Sharing\ISharedStorage; +use OC\Files\Storage\Wrapper\PermissionsMask; use OCP\Constants; use OCP\Files\Cache\ICacheEntry; use OCP\Files\NotFoundException; @@ -70,6 +71,9 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage { */ private $logger; + /** @var IStorage */ + private $nonMaskedStorage; + public function __construct($arguments) { $this->ownerView = $arguments['ownerView']; $this->logger = \OC::$server->getLogger(); @@ -93,8 +97,12 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage { try { Filesystem::initMountPoints($this->superShare->getShareOwner()); $sourcePath = $this->ownerView->getPath($this->superShare->getNodeId()); - list($this->storage, $this->rootPath) = $this->ownerView->resolvePath($sourcePath); - $this->sourceRootInfo = $this->storage->getCache()->get($this->rootPath); + list($this->nonMaskedStorage, $this->rootPath) = $this->ownerView->resolvePath($sourcePath); + $this->storage = new PermissionsMask([ + 'storage' => $this->nonMaskedStorage, + 'mask' => $this->superShare->getPermissions() + ]); + $this->sourceRootInfo = $this->nonMaskedStorage->getCache()->get($this->rootPath); } catch (NotFoundException $e) { $this->storage = new FailedStorage(['exception' => $e]); $this->rootPath = ''; @@ -232,7 +240,7 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage { 'mode' => $mode, ); \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'fopen', $info); - return parent::fopen($path, $mode); + return $this->nonMaskedStorage->fopen($this->getSourcePath($path), $mode); } return false; } @@ -245,6 +253,7 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage { * @return bool */ public function rename($path1, $path2) { + $this->init(); $isPartFile = pathinfo($path1, PATHINFO_EXTENSION) === 'part'; $targetExists = $this->file_exists($path2); $sameFodler = dirname($path1) === dirname($path2); @@ -259,7 +268,7 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage { } } - return parent::rename($path1, $path2); + return $this->nonMaskedStorage->rename($this->getSourcePath($path1), $this->getSourcePath($path2)); } /** diff --git a/apps/files_sharing/tests/SharedStorageTest.php b/apps/files_sharing/tests/SharedStorageTest.php index 9be52b3feb..cdbcd55f4b 100644 --- a/apps/files_sharing/tests/SharedStorageTest.php +++ b/apps/files_sharing/tests/SharedStorageTest.php @@ -202,13 +202,13 @@ class SharedStorageTest extends TestCase { $this->assertTrue(\OC\Files\Filesystem::is_dir($this->folder)); // for the share root we expect: - // the shared permissions (1) + // the read permissions (1) // the delete permission (8), to enable unshare $rootInfo = \OC\Files\Filesystem::getFileInfo($this->folder); $this->assertSame(9, $rootInfo->getPermissions()); // for the file within the shared folder we expect: - // the shared permissions (1) + // the read permissions (1) $subfileInfo = \OC\Files\Filesystem::getFileInfo($this->folder . $this->filename); $this->assertSame(1, $subfileInfo->getPermissions()); diff --git a/lib/private/Files/Storage/Wrapper/PermissionsMask.php b/lib/private/Files/Storage/Wrapper/PermissionsMask.php index 39375602c3..cdbdd5b493 100644 --- a/lib/private/Files/Storage/Wrapper/PermissionsMask.php +++ b/lib/private/Files/Storage/Wrapper/PermissionsMask.php @@ -104,7 +104,7 @@ class PermissionsMask extends Wrapper { public function file_put_contents($path, $data) { $permissions = $this->file_exists($path) ? Constants::PERMISSION_UPDATE : Constants::PERMISSION_CREATE; - return $this->checkMask($permissions) and parent::file_put_contents($path, $data); + return $this->checkMask($permissions) ? parent::file_put_contents($path, $data) : false; } public function fopen($path, $mode) {