fix: try to find non-recursive share source

instead of always picking the first one, try to find one that won't blow up

Signed-off-by: Robin Appelman <robin@icewind.nl>
pull/46881/head
Robin Appelman 2024-07-30 15:32:07 +07:00
parent 0705b6af4a
commit 7343da4a9c
No known key found for this signature in database
GPG Key ID: 42B69D8A64526EFB
1 changed files with 18 additions and 6 deletions

@ -145,18 +145,30 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto
$rootFolder = \OC::$server->get(IRootFolder::class);
$this->ownerUserFolder = $rootFolder->getUserFolder($this->superShare->getShareOwner());
$sourceId = $this->superShare->getNodeId();
$ownerNode = $this->ownerUserFolder->getFirstNodeById($sourceId);
if (!$ownerNode) {
$ownerNodes = $this->ownerUserFolder->getById($sourceId);
if (count($ownerNodes) === 0) {
$this->storage = new FailedStorage(['exception' => new NotFoundException("File by id $sourceId not found")]);
$this->cache = new FailedCache();
$this->rootPath = '';
} else {
$this->nonMaskedStorage = $ownerNode->getStorage();
if ($this->nonMaskedStorage instanceof Wrapper && $this->nonMaskedStorage->isWrapperOf($this)) {
foreach ($ownerNodes as $ownerNode) {
$nonMaskedStorage = $ownerNode->getStorage();
// check if potential source node would lead to a recursive share setup
if ($nonMaskedStorage instanceof Wrapper && $nonMaskedStorage->isWrapperOf($this)) {
continue;
}
$this->nonMaskedStorage = $nonMaskedStorage;
$this->sourcePath = $ownerNode->getPath();
$this->rootPath = $ownerNode->getInternalPath();
$this->cache = null;
break;
}
if (!$this->nonMaskedStorage) {
// all potential source nodes would have been recursive
throw new \Exception('recursive share detected');
}
$this->sourcePath = $ownerNode->getPath();
$this->rootPath = $ownerNode->getInternalPath();
$this->storage = new PermissionsMask([
'storage' => $this->nonMaskedStorage,
'mask' => $this->superShare->getPermissions(),