aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2024-11-25 17:30:32 +0100
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2025-01-16 16:09:43 +0000
commit0c42de38f3b7e38c9e1fa20acdb3f381b3661a30 (patch)
treecb70d8f6a47f1e4639f27163e757b1b75fbc1838
parent9f2b0f73d7765abc8e31391a19dd838dc2b213f0 (diff)
downloadnextcloud-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]
-rw-r--r--apps/provisioning_api/lib/Controller/AUserData.php81
-rw-r--r--apps/provisioning_api/lib/Controller/GroupsController.php4
-rw-r--r--apps/provisioning_api/lib/Controller/UsersController.php5
-rw-r--r--apps/provisioning_api/tests/Controller/GroupsControllerTest.php4
-rw-r--r--apps/provisioning_api/tests/Controller/UsersControllerTest.php13
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,