diff --git a/apps/files_sharing/lib/Cache.php b/apps/files_sharing/lib/Cache.php index b99a511312e4f..af8e722c609dc 100644 --- a/apps/files_sharing/lib/Cache.php +++ b/apps/files_sharing/lib/Cache.php @@ -41,6 +41,7 @@ use OCP\Files\StorageNotAvailableException; use OCP\ICacheFactory; use OCP\IUserManager; +use OCP\Share\IShare; /** * Metadata cache for shared files @@ -55,15 +56,22 @@ class Cache extends CacheJail { private ?string $ownerDisplayName = null; private $numericId; private DisplayNameCache $displayNameCache; + private IShare $share; /** * @param SharedStorage $storage */ - public function __construct($storage, ICacheEntry $sourceRootInfo, DisplayNameCache $displayNameCache) { + public function __construct( + $storage, + ICacheEntry $sourceRootInfo, + DisplayNameCache $displayNameCache, + IShare $share + ) { $this->storage = $storage; $this->sourceRootInfo = $sourceRootInfo; $this->numericId = $sourceRootInfo->getStorageId(); $this->displayNameCache = $displayNameCache; + $this->share = $share; parent::__construct( null, @@ -150,16 +158,20 @@ protected function formatCacheEntry($entry, $path = null) { try { if (isset($entry['permissions'])) { - $entry['permissions'] &= $this->storage->getShare()->getPermissions(); + $entry['permissions'] &= $this->share->getPermissions(); } else { $entry['permissions'] = $this->storage->getPermissions($entry['path']); } + + if ($this->share->getNodeId() === $entry['fileid']) { + $entry['name'] = basename($this->share->getTarget()); + } } catch (StorageNotAvailableException $e) { // thrown by FailedStorage e.g. when the sharer does not exist anymore // (IDE may say the exception is never thrown – false negative) $sharePermissions = 0; } - $entry['uid_owner'] = $this->storage->getOwner(''); + $entry['uid_owner'] = $this->share->getShareOwner(); $entry['displayname_owner'] = $this->getOwnerDisplayName(); if ($path === '') { $entry['is_share_mount_point'] = true; @@ -169,7 +181,7 @@ protected function formatCacheEntry($entry, $path = null) { private function getOwnerDisplayName() { if (!$this->ownerDisplayName) { - $uid = $this->storage->getOwner(''); + $uid = $this->share->getShareOwner(); $this->ownerDisplayName = $this->displayNameCache->getDisplayName($uid) ?? $uid; } return $this->ownerDisplayName; diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index 2c1ddf9af4ab7..9eaa849a7e31a 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -415,7 +415,8 @@ public function getCache($path = '', $storage = null) { $this->cache = new \OCA\Files_Sharing\Cache( $storage, $sourceRoot, - \OC::$server->get(DisplayNameCache::class) + \OC::$server->get(DisplayNameCache::class), + $this->getShare() ); return $this->cache; } diff --git a/apps/files_sharing/tests/CacheTest.php b/apps/files_sharing/tests/CacheTest.php index f4f64bc6a328e..50e5433d10f56 100644 --- a/apps/files_sharing/tests/CacheTest.php +++ b/apps/files_sharing/tests/CacheTest.php @@ -88,6 +88,7 @@ protected function setUp(): void { $this->view->file_put_contents('container/shareddir/subdir/another.txt', $textData); $this->view->file_put_contents('container/shareddir/subdir/another too.txt', $textData); $this->view->file_put_contents('container/shareddir/subdir/not a text file.xml', ''); + $this->view->file_put_contents('simplefile.txt', $textData); [$this->ownerStorage,] = $this->view->resolvePath(''); $this->ownerCache = $this->ownerStorage->getCache(); @@ -302,6 +303,42 @@ public function testGetFolderContentsInSubdir() { ); } + /** + * This covers a bug where the share owners name was propagated + * to the recipient in the recent files API response where the + * share recipient has a different target set + * + * https://github.com/nextcloud/server/issues/39879 + */ + public function testShareRenameOriginalFileInRecentResults() { + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1); + $node = $rootFolder->get('simplefile.txt'); + $share = $this->shareManager->newShare(); + $share->setNode($node) + ->setShareType(IShare::TYPE_USER) + ->setSharedWith(self::TEST_FILES_SHARING_API_USER3) + ->setSharedBy(self::TEST_FILES_SHARING_API_USER1) + ->setPermissions(\OCP\Constants::PERMISSION_READ); + $share = $this->shareManager->createShare($share); + $share->setStatus(IShare::STATUS_ACCEPTED); + $this->shareManager->updateShare($share); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $node->move(self::TEST_FILES_SHARING_API_USER1 . '/files/simplefile2.txt'); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER3); + $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER3); + $recents = $rootFolder->getRecent(10); + self::assertEquals([ + 'welcome.txt', + 'simplefile.txt' + ], array_map(function($node) { + return $node->getFileInfo()['name']; + }, $recents)); + } + public function testGetFolderContentsWhenSubSubdirShared() { self::loginHelper(self::TEST_FILES_SHARING_API_USER1);