diff options
author | provokateurin <kate@provokateurin.de> | 2024-09-16 16:00:46 +0200 |
---|---|---|
committer | backportbot[bot] <backportbot[bot]@users.noreply.github.com> | 2024-09-17 08:47:08 +0000 |
commit | b2ae0d3d0e3a7b355502d5e4812d40daa9a8d8df (patch) | |
tree | be21bdf58396c4fe3d3d892164680eee85e91478 | |
parent | 24c78783a3066020c090a5290b4e3e0fb3bd1c84 (diff) | |
download | nextcloud-server-backport/48094/stable29.tar.gz nextcloud-server-backport/48094/stable29.zip |
fix(Files): Handle getOwner() returning falsebackport/48094/stable29
Signed-off-by: provokateurin <kate@provokateurin.de>
[skip ci]
-rw-r--r-- | apps/dav/lib/Storage/PublicOwnerWrapper.php | 10 | ||||
-rw-r--r-- | apps/files_versions/lib/Versions/LegacyVersionsBackend.php | 4 | ||||
-rw-r--r-- | lib/private/Files/Node/Folder.php | 2 | ||||
-rw-r--r-- | lib/private/Files/Node/Root.php | 19 | ||||
-rw-r--r-- | lib/private/Files/View.php | 38 | ||||
-rw-r--r-- | lib/private/legacy/OC_Helper.php | 3 |
6 files changed, 59 insertions, 17 deletions
diff --git a/apps/dav/lib/Storage/PublicOwnerWrapper.php b/apps/dav/lib/Storage/PublicOwnerWrapper.php index ebb24350e7c..5c461146b97 100644 --- a/apps/dav/lib/Storage/PublicOwnerWrapper.php +++ b/apps/dav/lib/Storage/PublicOwnerWrapper.php @@ -29,8 +29,7 @@ use OC\Files\Storage\Wrapper\Wrapper; class PublicOwnerWrapper extends Wrapper { - /** @var string */ - private $owner; + private string $owner; /** * @param array $arguments ['storage' => $storage, 'owner' => $owner] @@ -45,11 +44,10 @@ class PublicOwnerWrapper extends Wrapper { public function getOwner($path): string|false { $owner = parent::getOwner($path); - - if ($owner === null || $owner === false) { - return $this->owner; + if ($owner !== false) { + return $owner; } - return $owner; + return $this->owner; } } diff --git a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php index deb8833c87b..819bc8690a7 100644 --- a/apps/files_versions/lib/Versions/LegacyVersionsBackend.php +++ b/apps/files_versions/lib/Versions/LegacyVersionsBackend.php @@ -68,6 +68,10 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend if ($storage->instanceOfStorage(SharedStorage::class)) { $owner = $storage->getOwner(''); + if ($owner === false) { + throw new NotFoundException('No owner for ' . $file->getPath()); + } + $user = $this->userManager->get($owner); $fileId = $file->getId(); diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php index 8ff2bb27ee2..6a11e1802c2 100644 --- a/lib/private/Files/Node/Folder.php +++ b/lib/private/Files/Node/Folder.php @@ -278,7 +278,7 @@ class Folder extends Node implements \OCP\Files\Folder { $owner = null; $ownerId = $storage->getOwner($cacheEntry['internalPath']); - if (!empty($ownerId)) { + if ($ownerId !== false) { // Cache the user manager (for performance) if ($this->userManager === null) { $this->userManager = \OCP\Server::get(IUserManager::class); diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php index 7c3ff1d2867..8dd57a07e91 100644 --- a/lib/private/Files/Node/Root.php +++ b/lib/private/Files/Node/Root.php @@ -53,6 +53,7 @@ use OCP\ICache; use OCP\ICacheFactory; use OCP\IUser; use OCP\IUserManager; +use OCP\Server; use Psr\Log\LoggerInterface; /** @@ -502,9 +503,23 @@ class Root extends Folder implements IRootFolder { $pathRelativeToMount = substr($internalPath, strlen($rootInternalPath)); $pathRelativeToMount = ltrim($pathRelativeToMount, '/'); $absolutePath = rtrim($mount->getMountPoint() . $pathRelativeToMount, '/'); + $storage = $mount->getStorage(); + if ($storage === null) { + return null; + } + $ownerId = $storage->getOwner($pathRelativeToMount); + if ($ownerId !== false) { + $owner = Server::get(IUserManager::class)->get($ownerId); + } else { + $owner = null; + } return $this->createNode($absolutePath, new FileInfo( - $absolutePath, $mount->getStorage(), $cacheEntry->getPath(), $cacheEntry, $mount, - \OC::$server->getUserManager()->get($mount->getStorage()->getOwner($pathRelativeToMount)) + $absolutePath, + $storage, + $cacheEntry->getPath(), + $cacheEntry, + $mount, + $owner, )); }, $mountsContainingFile); diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index 861167c536c..39dcff6340a 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -67,6 +67,7 @@ use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; use OCP\Files\ReservedWordException; use OCP\IUser; +use OCP\IUserManager; use OCP\Lock\ILockingProvider; use OCP\Lock\LockedException; use OCP\Server; @@ -1399,7 +1400,7 @@ class View { $ownerId = $storage->getOwner($internalPath); $owner = null; - if ($ownerId !== null && $ownerId !== false) { + if ($ownerId !== false) { // ownerId might be null if files are accessed with an access token without file system access $owner = $this->getUserObjectForOwner($ownerId); } @@ -1485,7 +1486,12 @@ class View { if ($sharingDisabled) { $content['permissions'] = $content['permissions'] & ~\OCP\Constants::PERMISSION_SHARE; } - $owner = $this->getUserObjectForOwner($storage->getOwner($content['path'])); + $ownerId = $storage->getOwner($content['path']); + if ($ownerId !== false) { + $owner = $this->getUserObjectForOwner($ownerId); + } else { + $owner = null; + } return new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content, $mount, $owner); }, $contents); $files = array_combine($fileNames, $fileInfos); @@ -1562,7 +1568,12 @@ class View { $rootEntry['permissions'] = $rootEntry['permissions'] & ~\OCP\Constants::PERMISSION_SHARE; } - $owner = $this->getUserObjectForOwner($subStorage->getOwner('')); + $ownerId = $subStorage->getOwner(''); + if ($ownerId !== false) { + $owner = $this->getUserObjectForOwner($ownerId); + } else { + $owner = null; + } $files[$rootEntry->getName()] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount, $owner); } } @@ -1679,7 +1690,12 @@ class View { $internalPath = $result['path']; $path = $mountPoint . $result['path']; $result['path'] = substr($mountPoint . $result['path'], $rootLength); - $owner = $userManager->get($storage->getOwner($internalPath)); + $ownerId = $storage->getOwner($internalPath); + if ($ownerId !== false) { + $owner = $userManager->get($ownerId); + } else { + $owner = null; + } $files[] = new FileInfo($path, $storage, $internalPath, $result, $mount, $owner); } } @@ -1698,7 +1714,12 @@ class View { $internalPath = $result['path']; $result['path'] = rtrim($relativeMountPoint . $result['path'], '/'); $path = rtrim($mountPoint . $internalPath, '/'); - $owner = $userManager->get($storage->getOwner($internalPath)); + $ownerId = $storage->getOwner($internalPath); + if ($ownerId !== false) { + $owner = $userManager->get($ownerId); + } else { + $owner = null; + } $files[] = new FileInfo($path, $storage, $internalPath, $result, $mount, $owner); } } @@ -1846,7 +1867,12 @@ class View { $mount = $this->getMount($path); $storage = $mount->getStorage(); $internalPath = $mount->getInternalPath($this->getAbsolutePath($path)); - $owner = \OC::$server->getUserManager()->get($storage->getOwner($internalPath)); + $ownerId = $storage->getOwner($internalPath); + if ($ownerId !== false) { + $owner = Server::get(IUserManager::class)->get($ownerId); + } else { + $owner = null; + } return new FileInfo( $this->getAbsolutePath($path), $storage, diff --git a/lib/private/legacy/OC_Helper.php b/lib/private/legacy/OC_Helper.php index 9a12bd50e0e..57736f78b8b 100644 --- a/lib/private/legacy/OC_Helper.php +++ b/lib/private/legacy/OC_Helper.php @@ -571,10 +571,9 @@ class OC_Helper { $relative = 0; } - /** @var string $ownerId */ $ownerId = $storage->getOwner($path); $ownerDisplayName = ''; - if ($ownerId) { + if ($ownerId !== false) { $ownerDisplayName = \OC::$server->getUserManager()->getDisplayName($ownerId) ?? ''; } |