diff options
author | Vincent Petry <pvince81@owncloud.com> | 2014-06-11 18:28:55 +0200 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2014-06-11 18:28:55 +0200 |
commit | 75a53b3c4956724b7e242ad58b487bccb9be2279 (patch) | |
tree | 18ed2716dc7a421582ec6b4a73a4afed3402d77c | |
parent | 2facfe9984230b70cf24467ca439e9192388e30a (diff) | |
parent | a9786070118f67881750d40458e88f6795363e55 (diff) | |
download | nextcloud-server-75a53b3c4956724b7e242ad58b487bccb9be2279.tar.gz nextcloud-server-75a53b3c4956724b7e242ad58b487bccb9be2279.zip |
Merge pull request #8901 from owncloud/permissions-update-cache
Save the permissions in the filecache if it's not saved yet
-rw-r--r-- | apps/files_sharing/lib/cache.php | 4 | ||||
-rw-r--r-- | apps/files_sharing/tests/permissions.php | 50 | ||||
-rw-r--r-- | lib/private/files/view.php | 24 |
3 files changed, 56 insertions, 22 deletions
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index b2594aa0b4d..7a6b70d82b5 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -95,7 +95,7 @@ class Shared_Cache extends Cache { } $data['uid_owner'] = $this->storage->getOwner($file); if (isset($data['permissions'])) { - $data['permissions'] = $data['permissions'] & $this->storage->getPermissions(''); + $data['permissions'] &= $this->storage->getPermissions(''); } else { $data['permissions'] = $this->storage->getPermissions(''); } @@ -135,7 +135,7 @@ class Shared_Cache extends Cache { $data['name'] = basename($this->storage->getMountPoint()); $data['is_share_mount_point'] = true; } - $data['permissions'] = $data['permissions'] & $this->storage->getPermissions(''); + $data['permissions'] &= $this->storage->getPermissions(''); return $data; } return false; diff --git a/apps/files_sharing/tests/permissions.php b/apps/files_sharing/tests/permissions.php index 0a222b08512..2cbc412d261 100644 --- a/apps/files_sharing/tests/permissions.php +++ b/apps/files_sharing/tests/permissions.php @@ -19,13 +19,49 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ +use OC\Files\Cache\Cache; +use OC\Files\Storage\Storage; +use OC\Files\View; + require_once __DIR__ . '/base.php'; class Test_Files_Sharing_Permissions extends Test_Files_Sharing_Base { + /** + * @var Storage + */ private $sharedStorageRestrictedShare; + + /** + * @var Storage + */ private $sharedCacheRestrictedShare; + /** + * @var View + */ + private $secondView; + + /** + * @var Storage + */ + private $ownerStorage; + + /** + * @var Storage + */ + private $sharedStorage; + + /** + * @var Cache + */ + private $sharedCache; + + /** + * @var Cache + */ + private $ownerCache; + function setUp() { parent::setUp(); @@ -105,16 +141,14 @@ class Test_Files_Sharing_Permissions extends Test_Files_Sharing_Base { $this->assertEquals('subdir', $contents[0]['name']); $this->assertEquals(31, $contents[0]['permissions']); $this->assertEquals('textfile.txt', $contents[1]['name']); - $this->assertEquals(31, $contents[1]['permissions']); + // 27 is correct because create is reserved to folders only - requires more unit tests overall to ensure this + $this->assertEquals(27, $contents[1]['permissions']); $contents = $this->secondView->getDirectoryContent('files/shareddirrestricted'); $this->assertEquals('subdir', $contents[0]['name']); - $this->assertEquals(7, $contents[0]['permissions']); + $this->assertEquals(7 | \OCP\PERMISSION_DELETE, $contents[0]['permissions']); $this->assertEquals('textfile1.txt', $contents[1]['name']); - $this->assertEquals(7, $contents[1]['permissions']); - - // the share mount point should always have delete permissions to allow the user - // to unmount it - $restrictedShare = $this->secondView->getFileInfo('files/shareddirrestricted'); - $this->assertEquals(7 | \OCP\PERMISSION_DELETE, $restrictedShare['permissions']); + // 3 is correct because create is reserved to folders only + // delete permissions are added since mount points can always be deleted + $this->assertEquals(3 | \OCP\PERMISSION_DELETE, $contents[1]['permissions']); } } diff --git a/lib/private/files/view.php b/lib/private/files/view.php index d42f6cbf9fe..afccdf9f733 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -861,8 +861,12 @@ class View { } if ($data and isset($data['fileid'])) { + if ($data['permissions'] === 0) { + $data['permissions'] = $storage->getPermissions($data['path']); + $cache->update($data['fileid'], array('permissions' => $data['permissions'])); + } if ($includeMountPoints and $data['mimetype'] === 'httpd/unix-directory') { - //add the sizes of other mountpoints to the folder + //add the sizes of other mount points to the folder $extOnly = ($includeMountPoints === 'ext'); $mountPoints = Filesystem::getMountPoints($path); foreach ($mountPoints as $mountPoint) { @@ -917,21 +921,17 @@ class View { } $folderId = $cache->getId($internalPath); + /** + * @var \OC\Files\FileInfo[] $files + */ $files = array(); $contents = $cache->getFolderContents($internalPath, $folderId); //TODO: mimetype_filter foreach ($contents as $content) { - $files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content); - } - - $ids = array(); - foreach ($files as $i => $file) { - $files[$i]['type'] = $file['mimetype'] === 'httpd/unix-directory' ? 'dir' : 'file'; - $ids[] = $file['fileid']; - - if (!isset($permissions[$file['fileid']])) { - $permissions[$file['fileid']] = $storage->getPermissions($file['path']); + if ($content['permissions'] === 0) { + $content['permissions'] = $storage->getPermissions($content['path']); + $cache->update($content['fileid'], array('permissions' => $content['permissions'])); } - $files[$i]['permissions'] = $permissions[$file['fileid']]; + $files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content); } //add a folder for any mountpoint in this directory and add the sizes of other mountpoints to the folders |