]> source.dussan.org Git - nextcloud-server.git/commitdiff
limit the user when searching for a file by id if we know the user already 4428/head
authorRobin Appelman <robin@icewind.nl>
Fri, 21 Apr 2017 15:11:26 +0000 (17:11 +0200)
committerRobin Appelman <robin@icewind.nl>
Fri, 21 Apr 2017 15:11:26 +0000 (17:11 +0200)
Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/private/Files/Config/UserMountCache.php
lib/private/Files/Node/Folder.php
lib/public/Files/Config/IUserMountCache.php

index 423eb5c423dfbece0ed0f15c35ae17925911cff5..5cbdfaa9d823376c9a69efecdcdb15832eda9cc9 100644 (file)
@@ -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) {
index 9809c6b7d11488955bcb9d9b10618a528d288318..fcadbe27393ac9bedbb4e4e3f1c48a29d70bb7c8 100644 (file)
@@ -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 */
index c141d019c2fd4c31a8d86e08d032e9b894d84ea3..cf30d8fb431509db299770a3e004de9c5988492a 100644 (file)
@@ -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