diff options
author | Robin Appelman <robin@icewind.nl> | 2022-01-31 15:53:28 +0100 |
---|---|---|
committer | Vincent Petry (Rebase PR Action) <PVince81@users.noreply.github.com> | 2022-02-16 10:46:48 +0000 |
commit | 19d214294c0346962f071792e45c94eec778b5ed (patch) | |
tree | c8f2c97c38684ae27ee172f7a80ec93c1e620804 /lib | |
parent | 79f5c76812f06f9fc39e916a383c0036c298a2b2 (diff) | |
download | nextcloud-server-19d214294c0346962f071792e45c94eec778b5ed.tar.gz nextcloud-server-19d214294c0346962f071792e45c94eec778b5ed.zip |
only setup part of the filesystem for appdata requests
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/Files/Filesystem.php | 24 | ||||
-rw-r--r-- | lib/private/Files/Mount/Manager.php | 13 | ||||
-rw-r--r-- | lib/private/legacy/OC_User.php | 2 | ||||
-rw-r--r-- | lib/private/legacy/OC_Util.php | 71 |
4 files changed, 61 insertions, 49 deletions
diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php index a9b1b87c8e7..1914d94b56e 100644 --- a/lib/private/Files/Filesystem.php +++ b/lib/private/Files/Filesystem.php @@ -240,9 +240,7 @@ class Filesystem { * @return \OC\Files\Mount\Manager */ public static function getMountManager($user = '') { - if (!self::$mounts) { - \OC_Util::setupFS($user); - } + self::initMountManager(); return self::$mounts; } @@ -292,10 +290,7 @@ class Filesystem { * @return \OC\Files\Storage\Storage|null */ public static function getStorage($mountPoint) { - if (!self::$mounts) { - \OC_Util::setupFS(); - } - $mount = self::$mounts->find($mountPoint); + $mount = self::getMountManager()->find($mountPoint); return $mount->getStorage(); } @@ -304,10 +299,7 @@ class Filesystem { * @return Mount\MountPoint[] */ public static function getMountByStorageId($id) { - if (!self::$mounts) { - \OC_Util::setupFS(); - } - return self::$mounts->findByStorageId($id); + return self::getMountManager()->findByStorageId($id); } /** @@ -315,10 +307,7 @@ class Filesystem { * @return Mount\MountPoint[] */ public static function getMountByNumericId($id) { - if (!self::$mounts) { - \OC_Util::setupFS(); - } - return self::$mounts->findByNumericId($id); + return self::getMountManager()->findByNumericId($id); } /** @@ -328,10 +317,7 @@ class Filesystem { * @return array an array consisting of the storage and the internal path */ public static function resolvePath($path) { - if (!self::$mounts) { - \OC_Util::setupFS(); - } - $mount = self::$mounts->find($path); + $mount = self::getMountManager()->find($path); if ($mount) { return [$mount->getStorage(), rtrim($mount->getInternalPath($path), '/')]; } else { diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index d9abab8997a..8c6f1acceec 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -81,6 +81,15 @@ class Manager implements IMountManager { $this->inPathCache->clear(); } + private function setupForFind(string $path) { + if (strpos($path, '/appdata_' . \OC_Util::getInstanceId()) === 0) { + // for appdata, we only setup the root bits, not the user bits + \OC_Util::setupRootFS(); + } else { + \OC_Util::setupFS(); + } + } + /** * Find the mount for $path * @@ -88,7 +97,7 @@ class Manager implements IMountManager { * @return MountPoint|null */ public function find(string $path) { - \OC_Util::setupFS(); + $this->setupForFind($path); $path = Filesystem::normalizePath($path); if (isset($this->pathCache[$path])) { @@ -121,7 +130,7 @@ class Manager implements IMountManager { * @return MountPoint[] */ public function findIn(string $path): array { - \OC_Util::setupFS(); + $this->setupForFind($path); $path = $this->formatPath($path); if (isset($this->inPathCache[$path])) { diff --git a/lib/private/legacy/OC_User.php b/lib/private/legacy/OC_User.php index 27c4f6b2857..bc47359dafc 100644 --- a/lib/private/legacy/OC_User.php +++ b/lib/private/legacy/OC_User.php @@ -323,7 +323,7 @@ class OC_User { /** * get the user id of the user currently logged in. * - * @return string|bool uid or false + * @return string|false uid or false */ public static function getUser() { $uid = \OC::$server->getSession() ? \OC::$server->getSession()->get('user_id') : null; diff --git a/lib/private/legacy/OC_Util.php b/lib/private/legacy/OC_Util.php index 6c9a37e1999..a45e1c64372 100644 --- a/lib/private/legacy/OC_Util.php +++ b/lib/private/legacy/OC_Util.php @@ -81,6 +81,7 @@ class OC_Util { public static $styles = []; public static $headers = []; private static $rootMounted = false; + private static $rootFsSetup = false; private static $fsSetup = false; /** @var array Local cache of version.php */ @@ -186,30 +187,18 @@ class OC_Util { * @suppress PhanDeprecatedFunction * @suppress PhanAccessMethodInternal */ - public static function setupFS($user = '') { + public static function setupRootFS(string $user = '') { //setting up the filesystem twice can only lead to trouble - if (self::$fsSetup) { + if (self::$rootFsSetup) { return false; } - \OC::$server->getEventLogger()->start('setup_fs', 'Setup filesystem'); - - // If we are not forced to load a specific user we load the one that is logged in - if ($user === null) { - $user = ''; - } elseif ($user == "" && \OC::$server->getUserSession()->isLoggedIn()) { - $user = OC_User::getUser(); - } + \OC::$server->getEventLogger()->start('setup_root_fs', 'Setup root filesystem'); // load all filesystem apps before, so no setup-hook gets lost OC_App::loadApps(['filesystem']); - // the filesystem will finish when $user is not empty, - // mark fs setup here to avoid doing the setup from loading - // OC_Filesystem - if ($user != '') { - self::$fsSetup = true; - } + self::$rootFsSetup = true; \OC\Files\Filesystem::initMountManager(); @@ -277,10 +266,10 @@ class OC_Util { return new \OC\Files\Storage\Wrapper\PermissionsMask([ 'storage' => $storage, 'mask' => \OCP\Constants::PERMISSION_ALL & ~( - \OCP\Constants::PERMISSION_UPDATE | - \OCP\Constants::PERMISSION_CREATE | - \OCP\Constants::PERMISSION_DELETE - ), + \OCP\Constants::PERMISSION_UPDATE | + \OCP\Constants::PERMISSION_CREATE | + \OCP\Constants::PERMISSION_DELETE + ), ]); } return $storage; @@ -313,19 +302,46 @@ class OC_Util { $mountManager->addMount($rootMountProvider); } - if ($user != '' && !\OC::$server->getUserManager()->userExists($user)) { - \OC::$server->getEventLogger()->end('setup_fs'); + \OC::$server->getEventLogger()->end('setup_root_fs'); + + return true; + } + + /** + * Can be set up + * + * @param string $user + * @return boolean + * @description configure the initial filesystem based on the configuration + * @suppress PhanDeprecatedFunction + * @suppress PhanAccessMethodInternal + */ + public static function setupFS($user = '') { + self::setupRootFS($user); + + if (self::$fsSetup) { return false; } - //if we aren't logged in, there is no use to set up the filesystem - if ($user != "") { - $userDir = '/' . $user . '/files'; + self::$fsSetup = true; + + \OC::$server->getEventLogger()->start('setup_fs', 'Setup filesystem'); + + // If we are not forced to load a specific user we load the one that is logged in + if ($user === '') { + $userObject = \OC::$server->get(\OCP\IUserSession::class)->getUser(); + } else { + $userObject = \OC::$server->get(\OCP\IUserManager::class)->get($user); + } + + //if we aren't logged in, or the user doesn't exist, there is no use to set up the filesystem + if ($userObject) { + $userDir = '/' . $userObject->getUID() . '/files'; //jail the user into his "home" directory - \OC\Files\Filesystem::init($user, $userDir); + \OC\Files\Filesystem::init($userObject->getUID(), $userDir); - OC_Hook::emit('OC_Filesystem', 'setup', ['user' => $user, 'user_dir' => $userDir]); + OC_Hook::emit('OC_Filesystem', 'setup', ['user' => $userObject->getUID(), 'user_dir' => $userDir]); } \OC::$server->getEventLogger()->end('setup_fs'); return true; @@ -484,6 +500,7 @@ class OC_Util { \OC\Files\Filesystem::tearDown(); \OC::$server->getRootFolder()->clearCache(); self::$fsSetup = false; + self::$rootFsSetup = false; self::$rootMounted = false; } |