mirror of
https://github.com/nextcloud/server.git
synced 2026-02-20 00:12:30 -05:00
fix: Use proper path when creating node instances
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
parent
85c9e75f33
commit
160bd75d0a
4 changed files with 32 additions and 7 deletions
|
|
@ -91,11 +91,13 @@ abstract class Node implements \Sabre\DAV\INode {
|
|||
if ($info instanceof Folder || $info instanceof File) {
|
||||
$this->node = $info;
|
||||
} else {
|
||||
// The Node API assumes that the view passed doesn't have a fake root
|
||||
$rootView = \OC::$server->get(View::class);
|
||||
$root = \OC::$server->get(IRootFolder::class);
|
||||
if ($info->getType() === FileInfo::TYPE_FOLDER) {
|
||||
$this->node = new Folder($root, $view, $this->path, $info);
|
||||
$this->node = new Folder($root, $rootView, $this->fileView->getAbsolutePath($this->path), $info);
|
||||
} else {
|
||||
$this->node = new File($root, $view, $this->path, $info);
|
||||
$this->node = new File($root, $rootView, $this->fileView->getAbsolutePath($this->path), $info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -107,10 +109,11 @@ abstract class Node implements \Sabre\DAV\INode {
|
|||
}
|
||||
$this->info = $info;
|
||||
$root = \OC::$server->get(IRootFolder::class);
|
||||
$rootView = \OC::$server->get(View::class);
|
||||
if ($this->info->getType() === FileInfo::TYPE_FOLDER) {
|
||||
$this->node = new Folder($root, $this->fileView, $this->path, $this->info);
|
||||
$this->node = new Folder($root, $rootView, $this->path, $this->info);
|
||||
} else {
|
||||
$this->node = new File($root, $this->fileView, $this->path, $this->info);
|
||||
$this->node = new File($root, $rootView, $this->path, $this->info);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,9 +29,12 @@
|
|||
namespace OCA\DAV\Tests\Unit\Connector\Sabre;
|
||||
|
||||
use OC\Files\FileInfo;
|
||||
use OC\Files\Filesystem;
|
||||
use OC\Files\Node\Node;
|
||||
use OC\Files\Storage\Wrapper\Quota;
|
||||
use OC\Files\View;
|
||||
use OCA\DAV\Connector\Sabre\Directory;
|
||||
use OCP\Constants;
|
||||
use OCP\Files\ForbiddenException;
|
||||
use OCP\Files\Mount\IMountPoint;
|
||||
use Test\Traits\UserTrait;
|
||||
|
|
@ -91,6 +94,10 @@ class DirectoryTest extends \Test\TestCase {
|
|||
->willReturn(Node::TYPE_FOLDER);
|
||||
$this->info->method('getName')
|
||||
->willReturn("folder");
|
||||
$this->info->method('getPath')
|
||||
->willReturn("/admin/files/folder");
|
||||
$this->info->method('getPermissions')
|
||||
->willReturn(Constants::PERMISSION_READ);
|
||||
}
|
||||
|
||||
private function getDir($path = '/') {
|
||||
|
|
@ -207,12 +214,21 @@ class DirectoryTest extends \Test\TestCase {
|
|||
|
||||
$this->view->expects($this->once())
|
||||
->method('getDirectoryContent')
|
||||
->with('')
|
||||
->willReturn([$info1, $info2]);
|
||||
|
||||
$this->view->expects($this->any())
|
||||
->method('getRelativePath')
|
||||
->willReturn('');
|
||||
->willReturnCallback(function($path) {
|
||||
return str_replace('/admin/files/', '', $path);
|
||||
});
|
||||
|
||||
$this->view->expects($this->any())
|
||||
->method('getAbsolutePath')
|
||||
->willReturnCallback(function($path) {
|
||||
return Filesystem::normalizePath('/admin/files' . $path);
|
||||
});
|
||||
|
||||
$this->overwriteService(View::class, $this->view);
|
||||
|
||||
$dir = new Directory($this->view, $this->info);
|
||||
$nodes = $dir->getChildren();
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ use OCP\Files\InvalidPathException;
|
|||
use OCP\Files\NotFoundException;
|
||||
use OCP\Files\NotPermittedException;
|
||||
use OCP\Lock\LockedException;
|
||||
use OCP\PreConditionNotMetException;
|
||||
use Symfony\Component\EventDispatcher\GenericEvent;
|
||||
|
||||
// FIXME: this class really should be abstract
|
||||
|
|
@ -52,7 +53,7 @@ class Node implements \OCP\Files\Node {
|
|||
protected $root;
|
||||
|
||||
/**
|
||||
* @var string $path
|
||||
* @var string $path Absolute path to the node (e.g. /admin/files/folder/file)
|
||||
*/
|
||||
protected $path;
|
||||
|
||||
|
|
@ -72,6 +73,9 @@ class Node implements \OCP\Files\Node {
|
|||
* @param FileInfo $fileInfo
|
||||
*/
|
||||
public function __construct($root, $view, $path, $fileInfo = null, ?Node $parent = null, bool $infoHasSubMountsIncluded = true) {
|
||||
if (Filesystem::normalizePath($view->getRoot()) !== '/') {
|
||||
throw new PreConditionNotMetException('The view passed to the node should not have any fake root set');
|
||||
}
|
||||
$this->view = $view;
|
||||
$this->root = $root;
|
||||
$this->path = $path;
|
||||
|
|
|
|||
|
|
@ -81,6 +81,8 @@ class FolderTest extends NodeTest {
|
|||
]);
|
||||
$view->method('getFileInfo')
|
||||
->willReturn($this->createMock(FileInfo::class));
|
||||
$view->method('getRelativePath')
|
||||
->willReturn('/bar/foo');
|
||||
|
||||
$node = new Folder($root, $view, '/bar/foo');
|
||||
$children = $node->getDirectoryListing();
|
||||
|
|
|
|||
Loading…
Reference in a new issue