diff options
author | Robin Appelman <robin@icewind.nl> | 2024-11-25 17:30:32 +0100 |
---|---|---|
committer | backportbot[bot] <backportbot[bot]@users.noreply.github.com> | 2025-01-16 16:09:43 +0000 |
commit | 0c42de38f3b7e38c9e1fa20acdb3f381b3661a30 (patch) | |
tree | cb70d8f6a47f1e4639f27163e757b1b75fbc1838 | |
parent | 9f2b0f73d7765abc8e31391a19dd838dc2b213f0 (diff) | |
download | nextcloud-server-backport/49476/stable30.tar.gz nextcloud-server-backport/49476/stable30.zip |
perf: use more optimized way to get user storage info in ocs user info when possiblebackport/49476/stable30
Signed-off-by: Robin Appelman <robin@icewind.nl>
[skip ci]
5 files changed, 76 insertions, 31 deletions
diff --git a/apps/provisioning_api/lib/Controller/AUserData.php b/apps/provisioning_api/lib/Controller/AUserData.php index 65c793920af..3c6757df9ec 100644 --- a/apps/provisioning_api/lib/Controller/AUserData.php +++ b/apps/provisioning_api/lib/Controller/AUserData.php @@ -11,7 +11,6 @@ namespace OCA\Provisioning_API\Controller; use OC\Group\Manager as GroupManager; use OC\User\Backend; use OC\User\NoUserException; -use OC_Helper; use OCA\Provisioning_API\ResponseDefinitions; use OCP\Accounts\IAccountManager; use OCP\Accounts\PropertyDoesNotExistException; @@ -19,6 +18,8 @@ use OCP\AppFramework\Http; use OCP\AppFramework\OCS\OCSException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; +use OCP\Files\FileInfo; +use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; use OCP\Group\ISubAdmin; use OCP\IConfig; @@ -29,6 +30,7 @@ use OCP\IUserSession; use OCP\L10N\IFactory; use OCP\User\Backend\ISetDisplayNameBackend; use OCP\User\Backend\ISetPasswordBackend; +use OCP\Util; /** * @psalm-import-type Provisioning_APIUserDetails from ResponseDefinitions @@ -56,6 +58,7 @@ abstract class AUserData extends OCSController { protected IAccountManager $accountManager, protected ISubAdmin $subAdminManager, protected IFactory $l10nFactory, + protected IRootFolder $rootFolder, ) { parent::__construct($appName, $request); } @@ -119,7 +122,7 @@ abstract class AUserData extends OCSController { $data['lastLogin'] = $targetUserObject->getLastLogin() * 1000; $data['backend'] = $targetUserObject->getBackendClassName(); $data['subadmin'] = $this->getUserSubAdminGroupsData($targetUserObject->getUID()); - $data[self::USER_FIELD_QUOTA] = $this->fillStorageInfo($targetUserObject->getUID()); + $data[self::USER_FIELD_QUOTA] = $this->fillStorageInfo($targetUserObject); $managers = $this->getManagers($targetUserObject); $data[self::USER_FIELD_MANAGER] = empty($managers) ? '' : $managers[0]; @@ -242,34 +245,62 @@ abstract class AUserData extends OCSController { } /** - * @param string $userId + * @param IUser $user * @return Provisioning_APIUserDetailsQuota * @throws OCSException */ - protected function fillStorageInfo(string $userId): array { - try { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($userId); - $storage = OC_Helper::getStorageInfo('/', null, true, false); - $data = [ - 'free' => $storage['free'], - 'used' => $storage['used'], - 'total' => $storage['total'], - 'relative' => $storage['relative'], - self::USER_FIELD_QUOTA => $storage['quota'], - ]; - } catch (NotFoundException $ex) { - // User fs is not setup yet - $user = $this->userManager->get($userId); - if ($user === null) { - throw new OCSException('User does not exist', 101); + protected function fillStorageInfo(IUser $user): array { + $includeExternal = $this->config->getSystemValueBool('quota_include_external_storage'); + $userId = $user->getUID(); + + $quota = $user->getQuota(); + if ($quota === 'none') { + $quota = FileInfo::SPACE_UNLIMITED; + } else { + $quota = Util::computerFileSize($quota); + if ($quota === false) { + $quota = FileInfo::SPACE_UNLIMITED; } - $quota = $user->getQuota(); - if ($quota !== 'none') { - $quota = OC_Helper::computerFileSize($quota); + } + + try { + if ($includeExternal) { + \OC_Util::tearDownFS(); + \OC_Util::setupFS($user->getUID()); + $storage = \OC_Helper::getStorageInfo('/', null, true, false); + $data = [ + 'free' => $storage['free'], + 'used' => $storage['used'], + 'total' => $storage['total'], + 'relative' => $storage['relative'], + self::USER_FIELD_QUOTA => $storage['quota'], + ]; + } else { + $userFileInfo = $this->rootFolder->getUserFolder($userId)->getStorage()->getCache()->get(''); + $used = $userFileInfo->getSize(); + + if ($quota > 0) { + // prevent division by zero or error codes (negative values) + $relative = round(($used / $quota) * 10000) / 100; + $free = $quota - $used; + $total = $quota; + } else { + $relative = 0; + $free = FileInfo::SPACE_UNLIMITED; + $total = FileInfo::SPACE_UNLIMITED; + } + + $data = [ + 'free' => $free, + 'used' => $used, + 'total' => $total, + 'relative' => $relative, + self::USER_FIELD_QUOTA => $quota, + ]; } + } catch (NotFoundException $ex) { $data = [ - self::USER_FIELD_QUOTA => $quota !== false ? $quota : 'none', + self::USER_FIELD_QUOTA => $quota >= 0 ? $quota : 'none', 'used' => 0 ]; } catch (\Exception $e) { @@ -281,8 +312,6 @@ abstract class AUserData extends OCSController { 'exception' => $e, ] ); - /* In case the Exception left things in a bad state */ - \OC_Util::tearDownFS(); return []; } return $data; diff --git a/apps/provisioning_api/lib/Controller/GroupsController.php b/apps/provisioning_api/lib/Controller/GroupsController.php index f0712d12261..e6e7bc1829c 100644 --- a/apps/provisioning_api/lib/Controller/GroupsController.php +++ b/apps/provisioning_api/lib/Controller/GroupsController.php @@ -21,6 +21,7 @@ use OCP\AppFramework\OCS\OCSException; use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; +use OCP\Files\IRootFolder; use OCP\Group\ISubAdmin; use OCP\IConfig; use OCP\IGroup; @@ -59,7 +60,8 @@ class GroupsController extends AUserData { $userSession, $accountManager, $subAdminManager, - $l10nFactory + $l10nFactory, + $rootFolder, ); $this->logger = $logger; diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index 373e0990777..b8c26d7cc33 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -31,6 +31,7 @@ use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\IRootFolder; use OCP\Group\ISubAdmin; use OCP\HintException; use OCP\IConfig; @@ -66,6 +67,7 @@ class UsersController extends AUserData { IAccountManager $accountManager, ISubAdmin $subAdminManager, IFactory $l10nFactory, + IRootFolder $rootFolder, private IURLGenerator $urlGenerator, private LoggerInterface $logger, private NewUserMailHelper $newUserMailHelper, @@ -84,7 +86,8 @@ class UsersController extends AUserData { $userSession, $accountManager, $subAdminManager, - $l10nFactory + $l10nFactory, + $rootFolder, ); $this->l10n = $l10nFactory->get($appName); diff --git a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php index 9bbc548ffb3..4ed12cf1453 100644 --- a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php +++ b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php @@ -43,6 +43,8 @@ class GroupsControllerTest extends \Test\TestCase { /** @var GroupsController|\PHPUnit\Framework\MockObject\MockObject */ protected $api; + private IRootFolder $rootFolder; + protected function setUp(): void { parent::setUp(); @@ -56,6 +58,7 @@ class GroupsControllerTest extends \Test\TestCase { $this->subAdminManager = $this->createMock(ISubAdmin::class); $this->l10nFactory = $this->createMock(IFactory::class); $this->logger = $this->createMock(LoggerInterface::class); + $this->rootFolder = $this->createMock(IRootFolder::class); $this->groupManager ->method('getSubAdmin') @@ -72,6 +75,7 @@ class GroupsControllerTest extends \Test\TestCase { $this->accountManager, $this->subAdminManager, $this->l10nFactory, + $this->rootFolder, $this->logger ]) ->setMethods(['fillStorageInfo']) diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php index 2cb39141d74..cdbdb7ae245 100644 --- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php +++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php @@ -23,6 +23,7 @@ use OCP\Accounts\IAccountPropertyCollection; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCS\OCSException; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\IRootFolder; use OCP\Group\ISubAdmin; use OCP\IConfig; use OCP\IGroup; @@ -76,6 +77,7 @@ class UsersControllerTest extends TestCase { private $knownUserService; /** @var IEventDispatcher|MockObject */ private $eventDispatcher; + private IRootFolder $rootFolder; /** @var IPhoneNumberUtil */ private $phoneNumberUtil; @@ -98,6 +100,7 @@ class UsersControllerTest extends TestCase { $this->knownUserService = $this->createMock(KnownUserService::class); $this->eventDispatcher = $this->createMock(IEventDispatcher::class); $this->phoneNumberUtil = new PhoneNumberUtil(); + $this->rootFolder = $this->createMock(IRootFolder::class); $l10n = $this->createMock(IL10N::class); $l10n->method('t')->willReturnCallback(fn (string $txt, array $replacement = []) => sprintf($txt, ...$replacement)); @@ -114,6 +117,7 @@ class UsersControllerTest extends TestCase { $this->accountManager, $this->subAdminManager, $this->l10nFactory, + $this->rootFolder, $this->urlGenerator, $this->logger, $this->newUserMailHelper, @@ -508,6 +512,7 @@ class UsersControllerTest extends TestCase { $this->accountManager, $this->subAdminManager, $this->l10nFactory, + $this->rootFolder, $this->urlGenerator, $this->logger, $this->newUserMailHelper, @@ -1126,7 +1131,7 @@ class UsersControllerTest extends TestCase { $this->api ->expects($this->once()) ->method('fillStorageInfo') - ->with('UID') + ->with($targetUser) ->willReturn(['DummyValue']); $backend = $this->createMock(UserInterface::class); @@ -1252,7 +1257,7 @@ class UsersControllerTest extends TestCase { $this->api ->expects($this->once()) ->method('fillStorageInfo') - ->with('UID') + ->with($targetUser) ->willReturn(['DummyValue']); $backend = $this->createMock(UserInterface::class); @@ -1425,7 +1430,7 @@ class UsersControllerTest extends TestCase { $this->api ->expects($this->once()) ->method('fillStorageInfo') - ->with('UID') + ->with($targetUser) ->willReturn(['DummyValue']); $backend = $this->createMock(UserInterface::class); @@ -3780,6 +3785,7 @@ class UsersControllerTest extends TestCase { $this->accountManager, $this->subAdminManager, $this->l10nFactory, + $this->rootFolder, $this->urlGenerator, $this->logger, $this->newUserMailHelper, @@ -3868,6 +3874,7 @@ class UsersControllerTest extends TestCase { $this->accountManager, $this->subAdminManager, $this->l10nFactory, + $this->rootFolder, $this->urlGenerator, $this->logger, $this->newUserMailHelper, |