]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix: `OCP\Files\Node\Folder::search` was not setting the owner 46379/head
authorFerdinand Thiessen <opensource@fthiessen.de>
Tue, 9 Jul 2024 16:33:45 +0000 (18:33 +0200)
committerFerdinand Thiessen <opensource@fthiessen.de>
Thu, 11 Jul 2024 13:46:44 +0000 (15:46 +0200)
The owner was not set on the file info causing e.g. webdav searches to never return the known owner.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
lib/private/Files/Node/Folder.php
tests/lib/Files/Node/FolderTest.php

index 7ae55d046b9ea37fbf5716e939f91e3c21ecd34c..79daa63d7b3c72bd568fd1db2b0ab95fbcd2da7a 100644 (file)
@@ -12,6 +12,7 @@ use OC\Files\Search\SearchComparison;
 use OC\Files\Search\SearchOrder;
 use OC\Files\Search\SearchQuery;
 use OC\Files\Utils\PathHelper;
+use OC\User\LazyUser;
 use OCP\Files\Cache\ICacheEntry;
 use OCP\Files\FileInfo;
 use OCP\Files\Mount\IMountPoint;
@@ -26,6 +27,9 @@ use OCP\Files\Search\ISearchQuery;
 use OCP\IUserManager;
 
 class Folder extends Node implements \OCP\Files\Folder {
+
+       private ?IUserManager $userManager = null;
+
        /**
         * Creates a Folder that represents a non-existing path
         *
@@ -245,7 +249,26 @@ class Folder extends Node implements \OCP\Files\Folder {
                $cacheEntry['internalPath'] = $cacheEntry['path'];
                $cacheEntry['path'] = rtrim($appendRoot . $cacheEntry->getPath(), '/');
                $subPath = $cacheEntry['path'] !== '' ? '/' . $cacheEntry['path'] : '';
-               return new \OC\Files\FileInfo($this->path . $subPath, $mount->getStorage(), $cacheEntry['internalPath'], $cacheEntry, $mount);
+               $storage = $mount->getStorage();
+
+               $owner = null;
+               $ownerId = $storage->getOwner($cacheEntry['internalPath']);
+               if (!empty($ownerId)) {
+                       // Cache the user manager (for performance)
+                       if ($this->userManager === null) {
+                               $this->userManager = \OCP\Server::get(IUserManager::class);
+                       }
+                       $owner = new LazyUser($ownerId, $this->userManager);
+               }
+
+               return new \OC\Files\FileInfo(
+                       $this->path . $subPath,
+                       $storage,
+                       $cacheEntry['internalPath'],
+                       $cacheEntry,
+                       $mount,
+                       $owner,
+               );
        }
 
        /**
index 546c9f84a1a305d50be5d5ac4d501267cb2adef2..46fda6c3a766537afa6b5c0bcdd3a5765feef24a 100644 (file)
@@ -29,6 +29,7 @@ use OCP\Files\NotFoundException;
 use OCP\Files\Search\ISearchComparison;
 use OCP\Files\Search\ISearchOrder;
 use OCP\Files\Storage;
+use PHPUnit\Framework\MockObject\MockObject;
 
 /**
  * Class FolderTest
@@ -290,7 +291,7 @@ class FolderTest extends NodeTest {
                        ->getMock();
                $root->method('getUser')
                        ->willReturn($this->user);
-               /** @var Storage\IStorage $storage */
+               /** @var Storage\IStorage&MockObject $storage */
                $storage = $this->createMock(Storage\IStorage::class);
                $storage->method('getId')->willReturn('test::1');
                $cache = new Cache($storage);
@@ -298,10 +299,17 @@ class FolderTest extends NodeTest {
                $storage->method('getCache')
                        ->willReturn($cache);
 
+               $storage->expects($this->atLeastOnce())
+                       ->method('getOwner')
+                       ->with('qwerty')
+                       ->willReturn(false);
+
                $mount = $this->createMock(IMountPoint::class);
-               $mount->method('getStorage')
+               $mount->expects($this->atLeastOnce())
+                       ->method('getStorage')
                        ->willReturn($storage);
-               $mount->method('getInternalPath')
+               $mount->expects($this->atLeastOnce())
+                       ->method('getInternalPath')
                        ->willReturn('foo');
 
                $cache->insert('foo', ['size' => 200, 'mtime' => 55, 'mimetype' => ICacheEntry::DIRECTORY_MIMETYPE]);