From: Robin Appelman Date: Fri, 21 Apr 2017 15:11:26 +0000 (+0200) Subject: limit the user when searching for a file by id if we know the user already X-Git-Tag: v12.0.0beta1~105^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fpull%2F4428%2Fhead;p=nextcloud-server.git limit the user when searching for a file by id if we know the user already Signed-off-by: Robin Appelman --- diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 423eb5c423d..5cbdfaa9d82 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -220,15 +220,20 @@ class UserMountCache implements IUserMountCache { /** * @param int $numericStorageId + * @param string|null $user limit the results to a single user * @return CachedMountInfo[] */ - public function getMountsForStorageId($numericStorageId) { + public function getMountsForStorageId($numericStorageId, $user = null) { $builder = $this->connection->getQueryBuilder(); $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path') ->from('mounts', 'm') ->innerJoin('m', 'filecache', 'f' , $builder->expr()->eq('m.root_id', 'f.fileid')) ->where($builder->expr()->eq('storage_id', $builder->createPositionalParameter($numericStorageId, IQueryBuilder::PARAM_INT))); + if ($user) { + $query->andWhere($builder->expr()->eq('user_id', $builder->createPositionalParameter($user))); + } + $rows = $query->execute()->fetchAll(); return array_filter(array_map([$this, 'dbRowToMountInfo'], $rows)); @@ -278,16 +283,17 @@ class UserMountCache implements IUserMountCache { /** * @param int $fileId + * @param string|null $user optionally restrict the results to a single user * @return ICachedMountInfo[] * @since 9.0.0 */ - public function getMountsForFileId($fileId) { + public function getMountsForFileId($fileId, $user = null) { try { list($storageId, $internalPath) = $this->getCacheInfoFromFileId($fileId); } catch (NotFoundException $e) { return []; } - $mountsForStorage = $this->getMountsForStorageId($storageId); + $mountsForStorage = $this->getMountsForStorageId($storageId, $user); // filter mounts that are from the same storage but a different directory return array_filter($mountsForStorage, function (ICachedMountInfo $mount) use ($internalPath, $fileId) { diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php index 9809c6b7d11..fcadbe27393 100644 --- a/lib/private/Files/Node/Folder.php +++ b/lib/private/Files/Node/Folder.php @@ -280,7 +280,12 @@ class Folder extends Node implements \OCP\Files\Folder { */ public function getById($id) { $mountCache = $this->root->getUserMountCache(); - $mountsContainingFile = $mountCache->getMountsForFileId((int)$id); + if (strpos($this->getPath(), '/', 1) > 0) { + list(, $user) = explode('/', $this->getPath()); + } else { + $user = null; + } + $mountsContainingFile = $mountCache->getMountsForFileId((int)$id, $user); $mounts = $this->root->getMountsIn($this->path); $mounts[] = $this->root->getMount($this->path); /** @var IMountPoint[] $folderMounts */ diff --git a/lib/public/Files/Config/IUserMountCache.php b/lib/public/Files/Config/IUserMountCache.php index c141d019c2f..cf30d8fb431 100644 --- a/lib/public/Files/Config/IUserMountCache.php +++ b/lib/public/Files/Config/IUserMountCache.php @@ -53,10 +53,11 @@ interface IUserMountCache { * Get all cached mounts by storage * * @param int $numericStorageId + * @param string|null $user limit the results to a single user @since 12.0.0 * @return ICachedMountInfo[] * @since 9.0.0 */ - public function getMountsForStorageId($numericStorageId); + public function getMountsForStorageId($numericStorageId, $user = null); /** * Get all cached mounts by root @@ -71,10 +72,11 @@ interface IUserMountCache { * Get all cached mounts that contain a file * * @param int $fileId + * @param string|null $user optionally restrict the results to a single user @since 12.0.0 * @return ICachedMountInfo[] * @since 9.0.0 */ - public function getMountsForFileId($fileId); + public function getMountsForFileId($fileId, $user = null); /** * Remove all cached mounts for a user