Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
only setup part of the filesystem for appdata requests
Signed-off-by: Robin Appelman <[email protected]>
  • Loading branch information
icewind1991 authored and PVince81 committed Feb 16, 2022
commit 19d214294c0346962f071792e45c94eec778b5ed
24 changes: 5 additions & 19 deletions lib/private/Files/Filesystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,9 +240,7 @@ public static function getLoader() {
* @return \OC\Files\Mount\Manager
*/
public static function getMountManager($user = '') {
if (!self::$mounts) {
\OC_Util::setupFS($user);
}
self::initMountManager();
return self::$mounts;
}

Expand Down Expand Up @@ -292,10 +290,7 @@ public static function getMountPoints($path) {
* @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();
}

Expand All @@ -304,21 +299,15 @@ public static function getStorage($mountPoint) {
* @return Mount\MountPoint[]
*/
public static function getMountByStorageId($id) {
if (!self::$mounts) {
\OC_Util::setupFS();
}
return self::$mounts->findByStorageId($id);
return self::getMountManager()->findByStorageId($id);
}

/**
* @param int $id
* @return Mount\MountPoint[]
*/
public static function getMountByNumericId($id) {
if (!self::$mounts) {
\OC_Util::setupFS();
}
return self::$mounts->findByNumericId($id);
return self::getMountManager()->findByNumericId($id);
}

/**
Expand All @@ -328,10 +317,7 @@ public static function getMountByNumericId($id) {
* @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 {
Expand Down
13 changes: 11 additions & 2 deletions lib/private/Files/Mount/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,23 @@ public function moveMount(string $mountPoint, string $target) {
$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
*
* @param string $path
* @return MountPoint|null
*/
public function find(string $path) {
\OC_Util::setupFS();
$this->setupForFind($path);
$path = Filesystem::normalizePath($path);

if (isset($this->pathCache[$path])) {
Expand Down Expand Up @@ -121,7 +130,7 @@ public function find(string $path) {
* @return MountPoint[]
*/
public function findIn(string $path): array {
\OC_Util::setupFS();
$this->setupForFind($path);
$path = $this->formatPath($path);

if (isset($this->inPathCache[$path])) {
Expand Down
2 changes: 1 addition & 1 deletion lib/private/legacy/OC_User.php
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ public static function isAdminUser($uid) {
/**
* 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;
Expand Down
71 changes: 44 additions & 27 deletions lib/private/legacy/OC_Util.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -186,30 +187,18 @@ private static function initObjectStoreMultibucketRootFS($config) {
* @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();

Expand Down Expand Up @@ -277,10 +266,10 @@ public static function setupFS($user = '') {
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;
Expand Down Expand Up @@ -313,19 +302,46 @@ public static function setupFS($user = '') {
$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;
Expand Down Expand Up @@ -484,6 +500,7 @@ public static function tearDownFS() {
\OC\Files\Filesystem::tearDown();
\OC::$server->getRootFolder()->clearCache();
self::$fsSetup = false;
self::$rootFsSetup = false;
self::$rootMounted = false;
}

Expand Down