]> source.dussan.org Git - nextcloud-server.git/commitdiff
mount shared mounts last
authorRobin Appelman <robin@icewind.nl>
Wed, 15 Feb 2017 14:00:21 +0000 (15:00 +0100)
committerRobin Appelman <robin@icewind.nl>
Wed, 22 Mar 2017 16:15:42 +0000 (17:15 +0100)
Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/private/Files/Config/MountProviderCollection.php
lib/private/Files/Filesystem.php

index a09f246e6b399a33970f5700dd54eb8bd7b19b84..f3252f0fd6520ee95f313a3182e5ed1246c7cbfa 100644 (file)
@@ -29,6 +29,7 @@ use OCP\Files\Config\IHomeMountProvider;
 use OCP\Files\Config\IMountProviderCollection;
 use OCP\Files\Config\IMountProvider;
 use OCP\Files\Config\IUserMountCache;
+use OCP\Files\Mount\IMountManager;
 use OCP\Files\Mount\IMountPoint;
 use OCP\Files\Storage\IStorageFactory;
 use OCP\IUser;
@@ -84,6 +85,37 @@ class MountProviderCollection implements IMountProviderCollection, Emitter {
                }, array());
        }
 
+       public function addMountForUser(IUser $user, IMountManager $mountManager) {
+               // shared mount provider gets to go last since it needs to know existing files
+               // to check for name collisions
+               $firstMounts = [];
+               $firstProviders = array_filter($this->providers, function (IMountProvider $provider) {
+                       return (get_class($provider) !== 'OCA\Files_Sharing\MountProvider');
+               });
+               $lastProviders = array_filter($this->providers, function (IMountProvider $provider) {
+                       return (get_class($provider) === 'OCA\Files_Sharing\MountProvider');
+               });
+               foreach ($firstProviders as $provider) {
+                       $mounts = $provider->getMountsForUser($user, $this->loader);
+                       if (is_array($mounts)) {
+                               $firstMounts = array_merge($firstMounts, $mounts);
+                       }
+               }
+               array_walk($firstMounts, [$mountManager, 'addMount']);
+
+               $lateMounts = [];
+               foreach ($lastProviders as $provider) {
+                       $mounts = $provider->getMountsForUser($user, $this->loader);
+                       if (is_array($mounts)) {
+                               $lateMounts = array_merge($lateMounts, $mounts);
+                       }
+               }
+
+               array_walk($lateMounts, [$mountManager, 'addMount']);
+
+               return array_merge($lateMounts, $firstMounts);
+       }
+
        /**
         * Get the configured home mount for this user
         *
@@ -110,6 +142,7 @@ class MountProviderCollection implements IMountProviderCollection, Emitter {
         */
        public function registerProvider(IMountProvider $provider) {
                $this->providers[] = $provider;
+
                $this->emit('\OC\Files\Config', 'registerMountProvider', [$provider]);
        }
 
index 51e494c372eeab25e6a91367ea3d1c0fefc716af..22b14e44074669d03eabd5555cc084616dd22e4f 100644 (file)
@@ -443,8 +443,7 @@ class Filesystem {
 
                        // Chance to mount for other storages
                        if ($userObject) {
-                               $mounts = $mountConfigManager->getMountsForUser($userObject);
-                               array_walk($mounts, array(self::$mounts, 'addMount'));
+                               $mounts = $mountConfigManager->addMountForUser($userObject, self::getMountManager());
                                $mounts[] = $homeMount;
                                $mountConfigManager->registerMounts($userObject, $mounts);
                        }