mirror of
https://github.com/nextcloud/server.git
synced 2026-06-09 00:32:29 -04:00
fix(Files): Handle getOwner() returning false
Signed-off-by: provokateurin <kate@provokateurin.de>
This commit is contained in:
parent
8ca6fcace7
commit
dc13f9cc1e
6 changed files with 60 additions and 18 deletions
|
|
@ -12,8 +12,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]
|
||||
|
|
@ -28,11 +27,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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,6 +49,10 @@ class LegacyVersionsBackend implements IVersionBackend, IDeletableVersionBackend
|
|||
|
||||
if ($storage->instanceOfStorage(ISharedStorage::class)) {
|
||||
$owner = $storage->getOwner('');
|
||||
if ($owner === false) {
|
||||
throw new NotFoundException('No owner for ' . $file->getPath());
|
||||
}
|
||||
|
||||
$user = $this->userManager->get($owner);
|
||||
|
||||
$fileId = $file->getId();
|
||||
|
|
|
|||
|
|
@ -253,7 +253,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);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ use OCP\ICache;
|
|||
use OCP\ICacheFactory;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\Server;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
/**
|
||||
|
|
@ -477,9 +478,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);
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,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;
|
||||
|
|
@ -1364,7 +1365,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);
|
||||
}
|
||||
|
|
@ -1450,7 +1451,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);
|
||||
|
|
@ -1527,7 +1533,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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1644,7 +1655,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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1663,7 +1679,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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1811,7 +1832,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,
|
||||
|
|
@ -1846,7 +1872,7 @@ class View {
|
|||
|
||||
// Short cut for read-only validation
|
||||
if ($readonly) {
|
||||
$validator = \OCP\Server::get(FilenameValidator::class);
|
||||
$validator = Server::get(FilenameValidator::class);
|
||||
if ($validator->isForbidden($fileName)) {
|
||||
$l = \OCP\Util::getL10N('lib');
|
||||
throw new InvalidPathException($l->t('Filename is a reserved word'));
|
||||
|
|
|
|||
|
|
@ -541,10 +541,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) ?? '';
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue