From e0a5f3b5707d505833d159652391fb84da88487c Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 23 May 2014 17:15:05 +0200 Subject: [PATCH] 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; + } } + } /** -- 2.39.5