]> source.dussan.org Git - nextcloud-server.git/commitdiff
enh(IMountManager): Add method to get MountPoint from CachedMountInfo 40482/head
authorJonas <jonas@freesources.org>
Mon, 25 Sep 2023 16:25:53 +0000 (18:25 +0200)
committerJonas <jonas@freesources.org>
Mon, 23 Oct 2023 18:50:24 +0000 (20:50 +0200)
Signed-off-by: Jonas <jonas@freesources.org>
apps/workflowengine/lib/Entity/File.php
apps/workflowengine/tests/ManagerTest.php
lib/private/Files/Config/UserMountCache.php
lib/private/Files/Mount/Manager.php
lib/public/Files/Mount/IMountManager.php

index 0f47928eb222a97a916b492bbfaa9df15c273077..1f0d3a005537d23cf5e6dd7e503ddd90d06557ff 100644 (file)
@@ -7,6 +7,7 @@ declare(strict_types=1);
  *
  * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
  * @author Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @author Jonas Meurer <jonas@freesources.org>
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -31,6 +32,7 @@ use OCP\EventDispatcher\Event;
 use OCP\EventDispatcher\GenericEvent;
 use OCP\Files\InvalidPathException;
 use OCP\Files\IRootFolder;
+use OCP\Files\Mount\IMountManager;
 use OCP\Files\Node;
 use OCP\Files\NotFoundException;
 use OCP\IL10N;
@@ -74,6 +76,8 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
        private $userManager;
        /** @var UserMountCache */
        private $userMountCache;
+       /** @var IMountManager */
+       private $mountManager;
 
        public function __construct(
                IL10N $l10n,
@@ -82,7 +86,8 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
                IUserSession $userSession,
                ISystemTagManager $tagManager,
                IUserManager $userManager,
-               UserMountCache $userMountCache
+               UserMountCache $userMountCache,
+               IMountManager $mountManager
        ) {
                $this->l10n = $l10n;
                $this->urlGenerator = $urlGenerator;
@@ -91,6 +96,7 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
                $this->tagManager = $tagManager;
                $this->userManager = $userManager;
                $this->userMountCache = $userMountCache;
+               $this->mountManager = $mountManager;
        }
 
        public function getName(): string {
@@ -143,10 +149,10 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
                                $fileId = $node->getId();
                        }
 
-                       $mounts = $this->userMountCache->getMountsForFileId($fileId, $uid);
-                       foreach ($mounts as $mount) {
-                               $userFolder = $this->root->getUserFolder($uid);
-                               if (!empty($userFolder->getById($fileId))) {
+                       $mountInfos = $this->userMountCache->getMountsForFileId($fileId, $uid);
+                       foreach ($mountInfos as $mountInfo) {
+                               $mount = $this->mountManager->getMountFromMountInfo($mountInfo);
+                               if ($mount && $mount->getStorage() && !empty($mount->getStorage()->getCache()->get($fileId))) {
                                        return true;
                                }
                        }
index 7d25bdc1e5b6ef3ee081af04d5630f07fa832ec6..a484a828492cb0f2e3bd166731206a134423612e 100644 (file)
@@ -35,6 +35,7 @@ use OCP\AppFramework\QueryException;
 use OCP\EventDispatcher\IEventDispatcher;
 use OCP\Files\Events\Node\NodeCreatedEvent;
 use OCP\Files\IRootFolder;
+use OCP\Files\Mount\IMountManager;
 use OCP\ICache;
 use OCP\ICacheFactory;
 use OCP\IConfig;
@@ -408,6 +409,7 @@ class ManagerTest extends TestCase {
                                                        $this->createMock(ISystemTagManager::class),
                                                        $this->createMock(IUserManager::class),
                                                        $this->createMock(UserMountCache::class),
+                                                       $this->createMock(IMountManager::class),
                                                ])
                                                ->setMethodsExcept(['getEvents'])
                                                ->getMock();
index 8a6b818d4134d50bc2eb4123ac4306903d6c2048..7502d65d0445cdbc0a737d391ff02b967f5debc9 100644 (file)
@@ -463,7 +463,7 @@ class UserMountCache implements IUserMountCache {
                }, $mounts);
                $mounts = array_combine($mountPoints, $mounts);
 
-               $current = $path;
+               $current = rtrim($path, '/');
                // walk up the directory tree until we find a path that has a mountpoint set
                // the loop will return if a mountpoint is found or break if none are found
                while (true) {
index 805cce658a678577541a7cddb6496c70f5aacde9..e623211cc7abecd016480c36e460a8851efbe8e4 100644 (file)
@@ -10,6 +10,7 @@ declare(strict_types=1);
  * @author Robin Appelman <robin@icewind.nl>
  * @author Robin McCorkell <robin@mccorkell.me.uk>
  * @author Roeland Jago Douma <roeland@famdouma.nl>
+ * @author Jonas <jonas@freesources.org>
  *
  * @license AGPL-3.0
  *
@@ -33,6 +34,7 @@ use OCP\Cache\CappedMemoryCache;
 use OC\Files\Filesystem;
 use OC\Files\SetupManager;
 use OC\Files\SetupManagerFactory;
+use OCP\Files\Config\ICachedMountInfo;
 use OCP\Files\Mount\IMountManager;
 use OCP\Files\Mount\IMountPoint;
 use OCP\Files\NotFoundException;
@@ -226,4 +228,21 @@ class Manager implements IMountManager {
                        });
                }
        }
+
+       /**
+        * Return the mount matching a cached mount info (or mount file info)
+        *
+        * @param ICachedMountInfo $info
+        *
+        * @return IMountPoint|null
+        */
+       public function getMountFromMountInfo(ICachedMountInfo $info): ?IMountPoint {
+               $this->setupManager->setupForPath($info->getMountPoint());
+               foreach ($this->mounts as $mount) {
+                       if ($mount->getMountPoint() === $info->getMountPoint()) {
+                               return $mount;
+                       }
+               }
+               return null;
+       }
 }
index a55e5758199d0956d8419d4f1d8fb47f25091af5..df2cc4c62091b04ee03a0e2b0f23cfbd05712283 100644 (file)
@@ -26,6 +26,8 @@ declare(strict_types=1);
  */
 namespace OCP\Files\Mount;
 
+use OCP\Files\Config\ICachedMountInfo;
+
 /**
  * Interface IMountManager
  *
@@ -106,4 +108,14 @@ interface IMountManager {
         * @since 8.2.0
         */
        public function findByNumericId(int $id): array;
+
+       /**
+        * Return the mount matching a cached mount info (or mount file info)
+        *
+        * @param ICachedMountInfo $info
+        *
+        * @return IMountPoint|null
+        * @since 28.0.0
+        */
+       public function getMountFromMountInfo(ICachedMountInfo $info): ?IMountPoint;
 }