From e0a5f3b5707d505833d159652391fb84da88487c Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 23 May 2014 17:15:05 +0200 Subject: [PATCH 1/3] get permissions directly from share storage to avoid additional db calls --- apps/files_sharing/lib/permissions.php | 44 ++++++------------------ apps/files_sharing/lib/sharedstorage.php | 2 +- lib/private/files/cache/permissions.php | 14 ++++++++ 3 files changed, 26 insertions(+), 34 deletions(-) diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php index f32ebabe40d..d79d74f1738 100644 --- a/apps/files_sharing/lib/permissions.php +++ b/apps/files_sharing/lib/permissions.php @@ -27,25 +27,13 @@ class Shared_Permissions extends Permissions { * * @param int $fileId * @param string $user - * @return int (-1 if file no permissions set) + * @return int permissions */ public function get($fileId, $user) { - if ($fileId == -1) { - // if we ask for the mount point return -1 so that we can get the correct - // permissions by the path, with the root fileId we have no idea which share is meant - return -1; - } - $source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE, - null, true); - - $permission = -1; + $permissions = $this->storage->getPermissions(); - if ($source) { - $permission = $this->updatePermissions($source['permissions']); - } - - return $permission; + return $this->updatePermissions($permissions); } /** @@ -53,16 +41,7 @@ class Shared_Permissions extends Permissions { * @param string $user */ private function getFile($fileId, $user) { - if ($fileId == -1) { - return \OCP\PERMISSION_READ; - } - $source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE, - null, false); - if ($source) { - return $this->updatePermissions($source['permissions']); - } else { - return -1; - } + return $this->get($fileId, $user); } /** @@ -88,7 +67,7 @@ class Shared_Permissions extends Permissions { return array(); } foreach ($fileIds as $fileId) { - $filePermissions[$fileId] = self::get($fileId, $user); + $filePermissions[$fileId] = $this->get($fileId, $user); } return $filePermissions; } @@ -101,16 +80,15 @@ class Shared_Permissions extends Permissions { * @return int[] */ public function getDirectoryPermissions($parentId, $user) { - // Root of the Shared folder - if ($parentId === -1) { - return \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_PERMISSIONS); - } - $permissions = $this->getFile($parentId, $user); + + $fileCacheId = ($parentId === -1) ? $this->storage->getSourceId() : $parentId; + $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `parent` = ?'); - $result = $query->execute(array($parentId)); + $result = $query->execute(array($fileCacheId)); + $permissions = $this->get($parentId, $user); $filePermissions = array(); while ($row = $result->fetchRow()) { - $filePermissions[$row['fileid']] = $this->updatePermissions($permissions); + $filePermissions[$row['fileid']] = $permissions; } return $filePermissions; } diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index a7dd2b3afa1..6d661dfd8af 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -102,7 +102,7 @@ class Shared extends \OC\Files\Storage\Common { * @param string $target Shared target file path * @return int CRUDS permissions granted */ - public function getPermissions($target) { + public function getPermissions($target = '') { $permissions = $this->share['permissions']; // part file are always have delete permissions if (pathinfo($target, PATHINFO_EXTENSION) === 'part') { diff --git a/lib/private/files/cache/permissions.php b/lib/private/files/cache/permissions.php index eba18af3863..a2a614ca0b1 100644 --- a/lib/private/files/cache/permissions.php +++ b/lib/private/files/cache/permissions.php @@ -14,15 +14,29 @@ class Permissions { */ private $storageId; + /** + * @var \OC\Files\Storage\Storage $storage + */ + protected $storage; + /** * @param \OC\Files\Storage\Storage|string $storage */ public function __construct($storage) { if ($storage instanceof \OC\Files\Storage\Storage) { $this->storageId = $storage->getId(); + $this->storage = $storage; } else { $this->storageId = $storage; + $mountManager = \OC\Files\Filesystem::getMountManager(); + $mount = $mountManager->findByStorageId($this->storageId); + $firstMountPoint = reset($mount); + if ($firstMountPoint instanceof \OC\Files\Storage\Storage) { + $storage = $firstMountPoint->getStorage(); + $this->storage = $storage; + } } + } /** From 2a10e78c581d441ec0c15eeca30e4646b854ab2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 2 Jun 2014 18:53:01 +0200 Subject: [PATCH 2/3] no need to empty array in a special way --- apps/files_sharing/lib/permissions.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php index d79d74f1738..ca694d98ade 100644 --- a/apps/files_sharing/lib/permissions.php +++ b/apps/files_sharing/lib/permissions.php @@ -63,9 +63,7 @@ class Shared_Permissions extends Permissions { * @return int[] */ public function getMultiple($fileIds, $user) { - if (count($fileIds) === 0) { - return array(); - } + $filePermissions = array(); foreach ($fileIds as $fileId) { $filePermissions[$fileId] = $this->get($fileId, $user); } From 916f85937785f6580f201cdf95fb42f63457af94 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Mon, 2 Jun 2014 20:39:20 +0200 Subject: [PATCH 3/3] check if it is a share storage --- apps/files_sharing/lib/permissions.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php index ca694d98ade..2c4dce36332 100644 --- a/apps/files_sharing/lib/permissions.php +++ b/apps/files_sharing/lib/permissions.php @@ -79,7 +79,11 @@ class Shared_Permissions extends Permissions { */ public function getDirectoryPermissions($parentId, $user) { - $fileCacheId = ($parentId === -1) ? $this->storage->getSourceId() : $parentId; + if ($parentId === -1 && $this->storage->instanceOfStorage('\OC\Files\Storage\Shared')) { + $fileCacheId = $this->storage->getSourceId(); + } else { + $fileCacheId = $parentId; + } $query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `parent` = ?'); $result = $query->execute(array($fileCacheId));