From cd2b567c21c7329640ff8b819261dec6ee819249 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 10 May 2017 15:45:18 +0200 Subject: [PATCH 1/2] Make sure we use the passed-in storage when there is one Signed-off-by: Joas Schilling --- lib/private/Files/Storage/Wrapper/PermissionsMask.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/private/Files/Storage/Wrapper/PermissionsMask.php b/lib/private/Files/Storage/Wrapper/PermissionsMask.php index d66390dad4..170929aa9f 100644 --- a/lib/private/Files/Storage/Wrapper/PermissionsMask.php +++ b/lib/private/Files/Storage/Wrapper/PermissionsMask.php @@ -149,6 +149,9 @@ class PermissionsMask extends Wrapper { } public function getScanner($path = '', $storage = null) { - return parent::getScanner($path, $this->storage); + if (!$storage) { + $storage = $this->storage; + } + return parent::getScanner($path, $storage); } } From 1f1e1b0d000488ac6a7032ae2ba8ba7e25232b22 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 18 May 2017 16:38:54 +0200 Subject: [PATCH 2/2] use unmasked permissions during scanning Signed-off-by: Robin Appelman --- lib/private/Files/Cache/Scanner.php | 3 ++ .../Cache/Wrapper/CachePermissionsMask.php | 1 + .../Files/Storage/Wrapper/PermissionsMask.php | 3 +- .../Storage/Wrapper/PermissionsMaskTest.php | 47 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php index fe25da6d09..229c6fc7d6 100644 --- a/lib/private/Files/Cache/Scanner.php +++ b/lib/private/Files/Cache/Scanner.php @@ -266,6 +266,9 @@ class Scanner extends BasicEmitter implements IScanner { * @return int the id of the added file */ protected function addToCache($path, $data, $fileId = -1) { + if (isset($data['scan_permissions'])) { + $data['permissions'] = $data['scan_permissions']; + } \OC_Hook::emit('Scanner', 'addToCache', array('file' => $path, 'data' => $data)); $this->emit('\OC\Files\Cache\Scanner', 'addToCache', array($path, $this->storageId, $data)); if ($this->cacheActive) { diff --git a/lib/private/Files/Cache/Wrapper/CachePermissionsMask.php b/lib/private/Files/Cache/Wrapper/CachePermissionsMask.php index 83cf01045a..6125887fb8 100644 --- a/lib/private/Files/Cache/Wrapper/CachePermissionsMask.php +++ b/lib/private/Files/Cache/Wrapper/CachePermissionsMask.php @@ -40,6 +40,7 @@ class CachePermissionsMask extends CacheWrapper { protected function formatCacheEntry($entry) { if (isset($entry['permissions'])) { + $entry['scan_permissions'] = $entry['permissions']; $entry['permissions'] &= $this->mask; } return $entry; diff --git a/lib/private/Files/Storage/Wrapper/PermissionsMask.php b/lib/private/Files/Storage/Wrapper/PermissionsMask.php index 170929aa9f..1bda92f13a 100644 --- a/lib/private/Files/Storage/Wrapper/PermissionsMask.php +++ b/lib/private/Files/Storage/Wrapper/PermissionsMask.php @@ -143,7 +143,8 @@ class PermissionsMask extends Wrapper { $data = parent::getMetaData($path); if ($data && isset($data['permissions'])) { - $data['permissions'] = $data['permissions'] & $this->mask; + $data['scan_permissions'] = $data['permissions']; + $data['permissions'] &= $this->mask; } return $data; } diff --git a/tests/lib/Files/Storage/Wrapper/PermissionsMaskTest.php b/tests/lib/Files/Storage/Wrapper/PermissionsMaskTest.php index d0903ce5f9..354db9d069 100644 --- a/tests/lib/Files/Storage/Wrapper/PermissionsMaskTest.php +++ b/tests/lib/Files/Storage/Wrapper/PermissionsMaskTest.php @@ -8,7 +8,9 @@ namespace Test\Files\Storage\Wrapper; +use OC\Files\Storage\Wrapper\Wrapper; use OCP\Constants; +use OCP\Files\Cache\IScanner; /** * @group DB @@ -114,4 +116,49 @@ class PermissionsMaskTest extends \Test\Files\Storage\Storage { $this->assertEquals(Constants::PERMISSION_ALL - Constants::PERMISSION_CREATE, $this->sourceStorage->getCache()->get('foo')->getPermissions()); $this->assertEquals(Constants::PERMISSION_READ, $storage->getCache()->get('foo')->getPermissions()); } + + public function testScanNewWrappedFiles() { + $storage = $this->getMaskedStorage(Constants::PERMISSION_READ + Constants::PERMISSION_CREATE); + $wrappedStorage = new Wrapper(['storage' => $storage]); + $wrappedStorage->file_put_contents('foo', 'bar'); + $wrappedStorage->getScanner()->scan(''); + + $this->assertEquals(Constants::PERMISSION_ALL - Constants::PERMISSION_CREATE, $this->sourceStorage->getCache()->get('foo')->getPermissions()); + $this->assertEquals(Constants::PERMISSION_READ, $storage->getCache()->get('foo')->getPermissions()); + } + + public function testScanUnchanged() { + $this->sourceStorage->mkdir('foo'); + $this->sourceStorage->file_put_contents('foo/bar.txt', 'bar'); + + $this->sourceStorage->getScanner()->scan('foo'); + + $storage = $this->getMaskedStorage(Constants::PERMISSION_READ); + $scanner = $storage->getScanner(); + $called = false; + $scanner->listen('\OC\Files\Cache\Scanner', 'addToCache', function () use (&$called) { + $called = true; + }); + $scanner->scan('foo', IScanner::SCAN_RECURSIVE, IScanner::REUSE_ETAG | IScanner::REUSE_SIZE); + + $this->assertFalse($called); + } + + public function testScanUnchangedWrapped() { + $this->sourceStorage->mkdir('foo'); + $this->sourceStorage->file_put_contents('foo/bar.txt', 'bar'); + + $this->sourceStorage->getScanner()->scan('foo'); + + $storage = $this->getMaskedStorage(Constants::PERMISSION_READ); + $wrappedStorage = new Wrapper(['storage' => $storage]); + $scanner = $wrappedStorage->getScanner(); + $called = false; + $scanner->listen('\OC\Files\Cache\Scanner', 'addToCache', function () use (&$called) { + $called = true; + }); + $scanner->scan('foo', IScanner::SCAN_RECURSIVE, IScanner::REUSE_ETAG | IScanner::REUSE_SIZE); + + $this->assertFalse($called); + } }