]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix initMountPoints to set usersSetup earlier 2007/head
authorVincent Petry <pvince81@owncloud.com>
Tue, 18 Oct 2016 09:35:54 +0000 (11:35 +0200)
committerRoeland Jago Douma <roeland@famdouma.nl>
Thu, 3 Nov 2016 19:45:40 +0000 (20:45 +0100)
This is needed because in some cases like LDAP, the user manager itself
might trigger avatar updates which would internally also call
initMountPoints with the same user. This could cause the same user to
be setup twice, and in some sharing situations could cause recursive
deduplication of shares by adding "(2)" every time.

lib/private/Files/Filesystem.php

index d2662af527a69b256f4cf339aca364a19a7e0687..55cf38bbdc92c4d66d9148c5288d40f58726edc9 100644 (file)
@@ -395,26 +395,36 @@ class Filesystem {
                        throw new \OC\User\NoUserException('Attempted to initialize mount points for null user and no user in session');
                }
 
+               if (isset(self::$usersSetup[$user])) {
+                       return;
+               }
+
+               self::$usersSetup[$user] = true;
+
                $userManager = \OC::$server->getUserManager();
                $userObject = $userManager->get($user);
 
                if (is_null($userObject)) {
                        \OCP\Util::writeLog('files', ' Backends provided no user object for ' . $user, \OCP\Util::ERROR);
+                       // reset flag, this will make it possible to rethrow the exception if called again
+                       unset(self::$usersSetup[$user]);
                        throw new \OC\User\NoUserException('Backends provided no user object for ' . $user);
                }
 
+               $realUid = $userObject->getUID();
                // workaround in case of different casings
-               if ($user !== $userObject->getUID()) {
+               if ($user !== $realUid) {
                        $stack = json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 50));
-                       \OCP\Util::writeLog('files', 'initMountPoints() called with wrong user casing. This could be a bug. Expected: "' . $userObject->getUID() . '" got "' . $user . '". Stack: ' . $stack, \OCP\Util::WARN);
-               }
-               $user = $userObject->getUID();
+                       \OCP\Util::writeLog('files', 'initMountPoints() called with wrong user casing. This could be a bug. Expected: "' . $realUid . '" got "' . $user . '". Stack: ' . $stack, \OCP\Util::WARN);
+                       $user = $realUid;
 
-               if (isset(self::$usersSetup[$user])) {
-                       return;
-               }
+                       // again with the correct casing
+                       if (isset(self::$usersSetup[$user])) {
+                               return;
+                       }
 
-               self::$usersSetup[$user] = true;
+                       self::$usersSetup[$user] = true;
+               }
 
                /** @var \OC\Files\Config\MountProviderCollection $mountConfigManager */
                $mountConfigManager = \OC::$server->getMountProviderCollection();