]> source.dussan.org Git - nextcloud-server.git/commitdiff
Use a lazy user for the file owner when listing a directory 32118/head
authorRobin Appelman <robin@icewind.nl>
Fri, 22 Apr 2022 14:29:52 +0000 (16:29 +0200)
committerCarl Schwan <carl@carlschwan.eu>
Mon, 25 Apr 2022 12:59:29 +0000 (14:59 +0200)
Only getUID and getDisplayName are called on the file owner objects anyway
and we can get this information often without DB request

Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/Files/View.php
lib/private/User/LazyUser.php [new file with mode: 0644]

index 831f5229d4a64118e445f9413471490ec899e2ec..734d0277776f9d3adc09cd70619805b992224540 100644 (file)
@@ -1541,6 +1541,7 @@ return array(
     'OC\\User\\Backend' => $baseDir . '/lib/private/User/Backend.php',
     'OC\\User\\Database' => $baseDir . '/lib/private/User/Database.php',
     'OC\\User\\DisplayNameCache' => $baseDir . '/lib/private/User/DisplayNameCache.php',
+    'OC\\User\\LazyUser' => $baseDir . '/lib/private/User/LazyUser.php',
     'OC\\User\\LoginException' => $baseDir . '/lib/private/User/LoginException.php',
     'OC\\User\\Manager' => $baseDir . '/lib/private/User/Manager.php',
     'OC\\User\\NoUserException' => $baseDir . '/lib/private/User/NoUserException.php',
index 947193440132296501f33d17ec0421cf29578dd7..df04cca6fca4f1b0381dcde849a0bc39542ad826 100644 (file)
@@ -1570,6 +1570,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\User\\Backend' => __DIR__ . '/../../..' . '/lib/private/User/Backend.php',
         'OC\\User\\Database' => __DIR__ . '/../../..' . '/lib/private/User/Database.php',
         'OC\\User\\DisplayNameCache' => __DIR__ . '/../../..' . '/lib/private/User/DisplayNameCache.php',
+        'OC\\User\\LazyUser' => __DIR__ . '/../../..' . '/lib/private/User/LazyUser.php',
         'OC\\User\\LoginException' => __DIR__ . '/../../..' . '/lib/private/User/LoginException.php',
         'OC\\User\\Manager' => __DIR__ . '/../../..' . '/lib/private/User/Manager.php',
         'OC\\User\\NoUserException' => __DIR__ . '/../../..' . '/lib/private/User/NoUserException.php',
index 30dc5518be8730d5e3e367c696645db8059e3f4f..f7b91a4b233d97cd3180b7dfcc96041def615344 100644 (file)
@@ -49,6 +49,8 @@ namespace OC\Files;
 use Icewind\Streams\CallbackWrapper;
 use OC\Files\Mount\MoveableMount;
 use OC\Files\Storage\Storage;
+use OC\User\DisplayNameCache;
+use OC\User\LazyUser;
 use OC\User\User;
 use OCA\Files_Sharing\SharedMount;
 use OCP\Constants;
@@ -102,6 +104,8 @@ class View {
        /** @var \OCP\ILogger */
        private $logger;
 
+       private DisplayNameCache $displayNameCache;
+
        /**
         * @param string $root
         * @throws \Exception If $root contains an invalid path
@@ -118,6 +122,7 @@ class View {
                $this->lockingProvider = \OC::$server->getLockingProvider();
                $this->lockingEnabled = !($this->lockingProvider instanceof \OC\Lock\NoopLockingProvider);
                $this->userManager = \OC::$server->getUserManager();
+               $this->displayNameCache = \OC::$server->get(DisplayNameCache::class);
                $this->logger = \OC::$server->getLogger();
        }
 
@@ -1312,15 +1317,10 @@ class View {
 
        /**
         * @param string $ownerId
-        * @return \OC\User\User
+        * @return IUser
         */
-       private function getUserObjectForOwner($ownerId) {
-               $owner = $this->userManager->get($ownerId);
-               if ($owner instanceof IUser) {
-                       return $owner;
-               } else {
-                       return new User($ownerId, null, \OC::$server->getEventDispatcher());
-               }
+       private function getUserObjectForOwner(string $ownerId) {
+               return new LazyUser($ownerId, $this->displayNameCache, $this->userManager);
        }
 
        /**
diff --git a/lib/private/User/LazyUser.php b/lib/private/User/LazyUser.php
new file mode 100644 (file)
index 0000000..8b98b11
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2022 Robin Appelman <robin@icewind.nl>
+ *
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\User;
+
+use OCP\IUser;
+use OCP\IUserManager;
+
+class LazyUser implements IUser {
+       private ?IUser $user = null;
+       private DisplayNameCache $displayNameCache;
+       private string $uid;
+       private IUserManager $userManager;
+
+       public function __construct(string $uid, DisplayNameCache $displayNameCache, IUserManager $userManager) {
+               $this->displayNameCache = $displayNameCache;
+               $this->uid = $uid;
+               $this->userManager = $userManager;
+       }
+
+       private function getUser(): IUser {
+               if ($this->user === null) {
+                       $this->user = $this->userManager->get($this->uid);
+               }
+               /** @var IUser */
+               $user = $this->user;
+               return $user;
+       }
+
+       public function getUID() {
+               return $this->uid;
+       }
+
+       public function getDisplayName() {
+               return $this->displayNameCache->getDisplayName($this->uid);
+       }
+
+       public function setDisplayName($displayName) {
+               return $this->getUser()->setDisplayName($displayName);
+       }
+
+       public function getLastLogin() {
+               return $this->getUser()->getLastLogin();
+       }
+
+       public function updateLastLoginTimestamp() {
+               return $this->getUser()->updateLastLoginTimestamp();
+       }
+
+       public function delete() {
+               return $this->getUser()->delete();
+       }
+
+       public function setPassword($password, $recoveryPassword = null) {
+               return $this->getUser()->setPassword($password, $recoveryPassword);
+       }
+
+       public function getHome() {
+               return $this->getUser()->getHome();
+       }
+
+       public function getBackendClassName() {
+               return $this->getUser()->getBackendClassName();
+       }
+
+       public function getBackend() {
+               return $this->getUser()->getBackend();
+       }
+
+       public function canChangeAvatar() {
+               return $this->getUser()->canChangeAvatar();
+       }
+
+       public function canChangePassword() {
+               return $this->getUser()->canChangePassword();
+       }
+
+       public function canChangeDisplayName() {
+               return $this->getUser()->canChangeDisplayName();
+       }
+
+       public function isEnabled() {
+               return $this->getUser()->isEnabled();
+       }
+
+       public function setEnabled(bool $enabled = true) {
+               return $this->getUser()->setEnabled($enabled);
+       }
+
+       public function getEMailAddress() {
+               return $this->getUser()->getEMailAddress();
+       }
+
+       public function getSystemEMailAddress(): ?string {
+               return $this->getUser()->getSystemEMailAddress();
+       }
+
+       public function getPrimaryEMailAddress(): ?string {
+               return $this->getUser()->getPrimaryEMailAddress();
+       }
+
+       public function getAvatarImage($size) {
+               return $this->getUser()->getAvatarImage($size);
+       }
+
+       public function getCloudId() {
+               return $this->getUser()->getCloudId();
+       }
+
+       public function setEMailAddress($mailAddress) {
+               $this->getUser()->setEMailAddress($mailAddress);
+       }
+
+       public function setSystemEMailAddress(string $mailAddress): void {
+               $this->getUser()->setSystemEMailAddress($mailAddress);
+       }
+
+       public function setPrimaryEMailAddress(string $mailAddress): void {
+               $this->getUser()->setPrimaryEMailAddress($mailAddress);
+       }
+
+       public function getQuota() {
+               return $this->getUser()->getQuota();
+       }
+
+       public function setQuota($quota) {
+               $this->getUser()->setQuota($quota);
+       }
+}