From f6106b3cb8bf878c3fdb452c9dda08f1e2503152 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 2 Mar 2022 17:11:06 +0100 Subject: [PATCH] move logic to decide what to setup to setupmanager Signed-off-by: Robin Appelman --- lib/private/Files/Mount/Manager.php | 24 ++++---------- lib/private/Files/SetupManager.php | 48 ++++++++++++++++++--------- tests/lib/Files/Mount/ManagerTest.php | 4 +-- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index 7770b9a6c58d8..7b407c779e0fa 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -31,14 +31,13 @@ use OC\Cache\CappedMemoryCache; use OC\Files\Filesystem; use OC\Files\SetupManager; -use OC\Setup; use OCP\Diagnostics\IEventLogger; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Mount\IMountManager; use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; -use OCP\IUserSession; +use OCP\IUserManager; class Manager implements IMountManager { /** @var MountPoint[] */ @@ -50,12 +49,12 @@ class Manager implements IMountManager { public function __construct( IEventLogger $eventLogger, IMountProviderCollection $mountProviderCollection, - IUserSession $userSession, + IUserManager $userManager, IEventDispatcher $eventDispatcher ) { $this->pathCache = new CappedMemoryCache(); $this->inPathCache = new CappedMemoryCache(); - $this->setupManager = new SetupManager($eventLogger, $mountProviderCollection, $this, $userSession, $eventDispatcher); + $this->setupManager = new SetupManager($eventLogger, $mountProviderCollection, $this, $userManager, $eventDispatcher); } /** @@ -91,18 +90,6 @@ 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 - $this->setupManager->setupRoot(); - } elseif (strpos($path, '/files_external/uploads/') === 0) { - // for OC\Security\CertificateManager, we only setup the root bits, not the user bits - $this->setupManager->setupRoot(); - } else { - $this->setupManager->setupForCurrentUser(); - } - } - /** * Find the mount for $path * @@ -110,7 +97,7 @@ private function setupForFind(string $path) { * @return MountPoint|null */ public function find(string $path): ?MountPoint { - $this->setupForFind($path); + $this->setupManager->setupForPath($path); $path = Filesystem::normalizePath($path); if (isset($this->pathCache[$path])) { @@ -143,7 +130,8 @@ public function find(string $path): ?MountPoint { * @return MountPoint[] */ public function findIn(string $path): array { - $this->setupForFind($path); + + $this->setupManager->setupForPath($path); $path = $this->formatPath($path); if (isset($this->inPathCache[$path])) { diff --git a/lib/private/Files/SetupManager.php b/lib/private/Files/SetupManager.php index 80999a683306f..577131cecc7eb 100644 --- a/lib/private/Files/SetupManager.php +++ b/lib/private/Files/SetupManager.php @@ -43,14 +43,14 @@ use OCP\Files\Mount\IMountPoint; use OCP\Files\Storage\IStorage; use OCP\IUser; -use OCP\IUserSession; +use OCP\IUserManager; class SetupManager { private bool $rootSetup = false; private IEventLogger $eventLogger; private IMountProviderCollection $mountProviderCollection; private IMountManager $mountManager; - private IUserSession $userSession; + private IUserManager $userManager; private array $setupUsers = []; private IEventDispatcher $eventDispatcher; @@ -58,13 +58,13 @@ public function __construct( IEventLogger $eventLogger, IMountProviderCollection $mountProviderCollection, IMountManager $mountManager, - IUserSession $userSession, + IUserManager $userManager, IEventDispatcher $eventDispatcher ) { $this->eventLogger = $eventLogger; $this->mountProviderCollection = $mountProviderCollection; $this->mountManager = $mountManager; - $this->userSession = $userSession; + $this->userManager = $userManager; $this->eventDispatcher = $eventDispatcher; } @@ -138,16 +138,10 @@ private function setupBuiltinWrappers() { }); } - public function setupForCurrentUser() { - $user = $this->userSession->getUser(); - if ($user) { - $this->setupForUser($user); - } else { - $this->setupRoot(); - } - } - - public function setupForUser(IUser $user) { + /** + * Setup the full filesystem for the specified user + */ + public function setupForUser(IUser $user): void { $this->setupRoot(); if (in_array($user->getUID(), $this->setupUsers)) { @@ -172,7 +166,10 @@ public function setupForUser(IUser $user) { $this->eventLogger->end('setup_fs'); } - public function setupRoot() { + /** + * Set up the root filesystem + */ + public function setupRoot(): void { //setting up the filesystem twice can only lead to trouble if ($this->rootSetup) { return; @@ -197,6 +194,27 @@ public function setupRoot() { $this->eventLogger->end('setup_root_fs'); } + /** + * Set up the filesystem for the specified path + */ + public function setupForPath(string $path): void { + if (substr_count($path, '/') < 2 || strpos($path, '/appdata_' . \OC_Util::getInstanceId()) === 0 || strpos($path, '/files_external/') === 0) { + $this->setupRoot(); + return; + } else { + [, $userId] = explode('/', $path); + } + + $user = $this->userManager->get($userId); + + if (!$user) { + $this->setupRoot(); + return; + } + + $this->setupForUser($user); + } + public function tearDown() { $this->setupUsers = []; $this->rootSetup = false; diff --git a/tests/lib/Files/Mount/ManagerTest.php b/tests/lib/Files/Mount/ManagerTest.php index 3fd994edd56ba..159fffc7cb8b6 100644 --- a/tests/lib/Files/Mount/ManagerTest.php +++ b/tests/lib/Files/Mount/ManagerTest.php @@ -12,7 +12,7 @@ use OCP\Diagnostics\IEventLogger; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IMountProviderCollection; -use OCP\IUserSession; +use OCP\IUserManager; class LongId extends Temporary { public function getId() { @@ -31,7 +31,7 @@ protected function setUp(): void { $this->manager = new \OC\Files\Mount\Manager( $this->createMock(IEventLogger::class), $this->createMock(IMountProviderCollection::class), - $this->createMock(IUserSession::class), + $this->createMock(IUserManager::class), $this->createMock(IEventDispatcher::class), ); }