summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2022-01-31 15:53:28 +0100
committerVincent Petry (Rebase PR Action) <PVince81@users.noreply.github.com>2022-02-16 10:46:48 +0000
commit19d214294c0346962f071792e45c94eec778b5ed (patch)
treec8f2c97c38684ae27ee172f7a80ec93c1e620804 /lib
parent79f5c76812f06f9fc39e916a383c0036c298a2b2 (diff)
downloadnextcloud-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.php24
-rw-r--r--lib/private/Files/Mount/Manager.php13
-rw-r--r--lib/private/legacy/OC_User.php2
-rw-r--r--lib/private/legacy/OC_Util.php71
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;
}