From 79f67424108ca0bb159f05370822c0d934dac3b2 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 9 Mar 2022 17:23:33 +0100 Subject: [PATCH] improve lazy UserFolder Signed-off-by: Robin Appelman --- lib/private/Files/Node/LazyUserFolder.php | 59 +++++++++++++++++++++++ lib/private/Files/Node/Root.php | 16 +++--- lib/private/Files/SetupManager.php | 2 +- 3 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 lib/private/Files/Node/LazyUserFolder.php diff --git a/lib/private/Files/Node/LazyUserFolder.php b/lib/private/Files/Node/LazyUserFolder.php new file mode 100644 index 00000000000..e4f45ad2962 --- /dev/null +++ b/lib/private/Files/Node/LazyUserFolder.php @@ -0,0 +1,59 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Files\Node; + + +use OCP\Constants; +use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; +use OCP\IUser; + +class LazyUserFolder extends LazyFolder { + private IRootFolder $rootFolder; + private IUser $user; + + public function __construct(IRootFolder $rootFolder, IUser $user) { + $this->rootFolder = $rootFolder; + $this->user = $user; + parent::__construct(function() use ($user) { + try { + return $this->rootFolder->get('/' . $user->getUID() . '/files'); + } catch (NotFoundException $e) { + if (!$this->rootFolder->nodeExists('/' . $user->getUID())) { + $this->rootFolder->newFolder('/' . $user->getUID()); + } + return $this->rootFolder->newFolder('/' . $user->getUID() . '/files'); + } + }, [ + 'path' => '/' . $user->getUID() . '/files', + 'permissions' => Constants::PERMISSION_ALL, + ]); + } + + public function get($path) { + return $this->rootFolder->get('/' . $this->user->getUID() . '/files/' . rtrim($path, '/')); + } + + +} diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php index e8159b23fec..6cb763e2bbf 100644 --- a/lib/private/Files/Node/Root.php +++ b/lib/private/Files/Node/Root.php @@ -381,19 +381,23 @@ class Root extends Folder implements IRootFolder { $userId = $userObject->getUID(); if (!$this->userFolderCache->hasKey($userId)) { - $folder = new LazyFolder(function () use ($userId) { + if ($this->mountManager->getSetupManager()->isSetupComplete($userObject)) { try { - return $this->get('/' . $userId . '/files'); + $folder = $this->get('/' . $userId . '/files'); + if ($folder instanceof \OCP\Files\Folder) { + return $folder; + } else { + throw new \Exception("User folder for $userId exists as a file"); + } } catch (NotFoundException $e) { if (!$this->nodeExists('/' . $userId)) { $this->newFolder('/' . $userId); } return $this->newFolder('/' . $userId . '/files'); } - }, [ - 'path' => '/' . $userId . '/files', - 'permissions' => Constants::PERMISSION_ALL, - ]); + } else { + $folder = new LazyUserFolder($this, $userObject); + } $this->userFolderCache->set($userId, $folder); } diff --git a/lib/private/Files/SetupManager.php b/lib/private/Files/SetupManager.php index 6e246aeb821..7336e40af8a 100644 --- a/lib/private/Files/SetupManager.php +++ b/lib/private/Files/SetupManager.php @@ -95,7 +95,7 @@ class SetupManager { return in_array($user->getUID(), $this->setupUsers, true); } - private function isSetupComplete(IUser $user): bool { + public function isSetupComplete(IUser $user): bool { return in_array($user->getUID(), $this->setupUsersComplete, true); } -- 2.39.5