only setup part of the filesystem for appdata requests

Signed-off-by: Robin Appelman <robin@icewind.nl>
pull/30942/head
Robin Appelman 4 years ago
parent 17e7a7ba17
commit 0217949715
No known key found for this signature in database
GPG Key ID: 42B69D8A64526EFB
  1. 24
      lib/private/Files/Filesystem.php
  2. 13
      lib/private/Files/Mount/Manager.php
  3. 2
      lib/private/legacy/OC_User.php
  4. 71
      lib/private/legacy/OC_Util.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 {

@ -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])) {

@ -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;

@ -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;
}

Loading…
Cancel
Save