Merge pull request #36774 from nextcloud/bugfix/noid/sabre-nodes

fix: always use proper path on node api when calling the view
This commit is contained in:
Simon L 2023-04-18 04:11:44 +02:00 committed by GitHub
commit 855e7a2efb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 102 additions and 135 deletions

View file

@ -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);
}
}

View file

@ -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();

View file

@ -86,9 +86,11 @@ class FileSearchBackendTest extends TestCase {
->disableOriginalConstructor()
->getMock();
$this->view = $this->getMockBuilder(View::class)
->disableOriginalConstructor()
->getMock();
$this->view = $this->createMock(View::class);
$this->view->expects($this->any())
->method('getRoot')
->willReturn('');
$this->view->expects($this->any())
->method('getRelativePath')

View file

@ -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;

View file

@ -185,7 +185,7 @@ class FileTest extends NodeTest {
$root = new \OC\Files\Node\Root(
$this->manager,
new $this->view,
$this->view,
$this->user,
$this->userMountCache,
$this->logger,
@ -277,7 +277,7 @@ class FileTest extends NodeTest {
$root = new \OC\Files\Node\Root(
$this->manager,
new $this->view,
$this->view,
$this->user,
$this->userMountCache,
$this->logger,

View file

@ -23,7 +23,6 @@ use OC\Files\Search\SearchOrder;
use OC\Files\Search\SearchQuery;
use OC\Files\Storage\Temporary;
use OC\Files\Storage\Wrapper\Jail;
use OC\Files\View;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\NotFoundException;
@ -40,6 +39,9 @@ use OCP\Files\Storage;
*/
class FolderTest extends NodeTest {
protected function createTestNode($root, $view, $path, array $data = [], $internalPath = '', $storage = null) {
$view->expects($this->any())
->method('getRoot')
->willReturn('');
if ($data || $internalPath || $storage) {
return new Folder($root, $view, $path, $this->getFileInfo($data, $internalPath, $storage));
} else {
@ -64,25 +66,26 @@ class FolderTest extends NodeTest {
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->setConstructorArgs([$manager, $this->view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
$root->expects($this->any())
->method('getUser')
->willReturn($this->user);
$view->expects($this->any())
$this->view->expects($this->any())
->method('getDirectoryContent')
->with('/bar/foo')
->willReturn([
new FileInfo('/bar/foo/asd', null, 'foo/asd', ['fileid' => 2, 'path' => '/bar/foo/asd', 'name' => 'asd', 'size' => 100, 'mtime' => 50, 'mimetype' => 'text/plain'], null),
new FileInfo('/bar/foo/qwerty', null, 'foo/qwerty', ['fileid' => 3, 'path' => '/bar/foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'httpd/unix-directory'], null),
]);
$view->method('getFileInfo')
$this->view->method('getFileInfo')
->willReturn($this->createMock(FileInfo::class));
$this->view->method('getRelativePath')
->willReturn('/bar/foo');
$node = new Folder($root, $view, '/bar/foo');
$node = new Folder($root, $this->view, '/bar/foo');
$children = $node->getDirectoryListing();
$this->assertEquals(2, count($children));
$this->assertInstanceOf('\OC\Files\Node\File', $children[0]);
@ -95,10 +98,7 @@ class FolderTest extends NodeTest {
public function testGet() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -117,10 +117,7 @@ class FolderTest extends NodeTest {
public function testNodeExists() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -140,10 +137,7 @@ class FolderTest extends NodeTest {
public function testNodeExistsNotExists() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -161,10 +155,7 @@ class FolderTest extends NodeTest {
public function testNewFolder() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -188,10 +179,7 @@ class FolderTest extends NodeTest {
public function testNewFolderDeepParent() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -218,10 +206,7 @@ class FolderTest extends NodeTest {
$this->expectException(\OCP\Files\NotPermittedException::class);
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -238,10 +223,7 @@ class FolderTest extends NodeTest {
public function testNewFile() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -268,10 +250,7 @@ class FolderTest extends NodeTest {
$this->expectException(\OCP\Files\NotPermittedException::class);
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -288,10 +267,7 @@ class FolderTest extends NodeTest {
public function testGetFreeSpace() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -308,10 +284,7 @@ class FolderTest extends NodeTest {
public function testSearch() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -351,10 +324,7 @@ class FolderTest extends NodeTest {
public function testSearchInRoot() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setMethods(['getUser', 'getMountsIn', 'getMount'])
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
@ -395,10 +365,7 @@ class FolderTest extends NodeTest {
public function testSearchInStorageRoot() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -438,10 +405,7 @@ class FolderTest extends NodeTest {
public function testSearchSubStorages() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();
@ -498,21 +462,18 @@ class FolderTest extends NodeTest {
}
public function testIsSubNode() {
$file = new Node(null, null, '/foo/bar');
$folder = new Folder(null, null, '/foo');
$file = new Node(null, $this->view, '/foo/bar');
$folder = new Folder(null, $this->view, '/foo');
$this->assertTrue($folder->isSubNode($file));
$this->assertFalse($folder->isSubNode($folder));
$file = new Node(null, null, '/foobar');
$file = new Node(null, $this->view, '/foobar');
$this->assertFalse($folder->isSubNode($file));
}
public function testGetById() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setMethods(['getMountsIn', 'getMount'])
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
@ -559,10 +520,7 @@ class FolderTest extends NodeTest {
public function testGetByIdMountRoot() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setMethods(['getMountsIn', 'getMount'])
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
@ -605,10 +563,7 @@ class FolderTest extends NodeTest {
public function testGetByIdOutsideFolder() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setMethods(['getMountsIn', 'getMount'])
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
@ -650,10 +605,7 @@ class FolderTest extends NodeTest {
public function testGetByIdMultipleStorages() {
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setMethods(['getMountsIn', 'getMount'])
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
@ -715,10 +667,7 @@ class FolderTest extends NodeTest {
public function testGetUniqueName($name, $existingFiles, $expected) {
$manager = $this->createMock(Manager::class);
$folderPath = '/bar/foo';
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setMethods(['getUser', 'getMountsIn', 'getMount'])
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
@ -742,10 +691,7 @@ class FolderTest extends NodeTest {
public function testRecent(): void {
$manager = $this->createMock(Manager::class);
$folderPath = '/bar/foo';
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
/** @var \PHPUnit\Framework\MockObject\MockObject|\OC\Files\Node\Root $root */
$root = $this->getMockBuilder(Root::class)
->setMethods(['getUser', 'getMountsIn', 'getMount'])
@ -810,10 +756,7 @@ class FolderTest extends NodeTest {
public function testRecentFolder() {
$manager = $this->createMock(Manager::class);
$folderPath = '/bar/foo';
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
/** @var \PHPUnit\Framework\MockObject\MockObject|\OC\Files\Node\Root $root */
$root = $this->getMockBuilder(Root::class)
->setMethods(['getUser', 'getMountsIn', 'getMount'])
@ -877,10 +820,7 @@ class FolderTest extends NodeTest {
public function testRecentJail() {
$manager = $this->createMock(Manager::class);
$folderPath = '/bar/foo';
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
/** @var \PHPUnit\Framework\MockObject\MockObject|\OC\Files\Node\Root $root */
$root = $this->getMockBuilder(Root::class)
->setMethods(['getUser', 'getMountsIn', 'getMount'])
@ -966,10 +906,7 @@ class FolderTest extends NodeTest {
}
$manager = $this->createMock(Manager::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->createMock(View::class);
$view = $this->getRootViewMock();
$root = $this->getMockBuilder(Root::class)
->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
->getMock();

View file

@ -54,6 +54,9 @@ abstract class NodeTest extends \Test\TestCase {
$this->view = $this->getMockBuilder(View::class)
->disableOriginalConstructor()
->getMock();
$this->view->expects($this->any())
->method('getRoot')
->willReturn('');
$this->userMountCache = $this->getMockBuilder('\OCP\Files\Config\IUserMountCache')
->disableOriginalConstructor()
->getMock();
@ -65,6 +68,17 @@ abstract class NodeTest extends \Test\TestCase {
->getMock();
}
/**
* @return \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
protected function getRootViewMock() {
$view = $this->createMock(View::class);
$view->expects($this->any())
->method('getRoot')
->willReturn('');
return $view;
}
/**
* @param IRootFolder $root
* @param View $view

View file

@ -52,6 +52,17 @@ class RootTest extends \Test\TestCase {
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
}
/**
* @return \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
protected function getRootViewMock() {
$view = $this->createMock(View::class);
$view->expects($this->any())
->method('getRoot')
->willReturn('');
return $view;
}
protected function getFileInfo($data) {
return new FileInfo('', null, '', $data, null);
}
@ -63,12 +74,7 @@ class RootTest extends \Test\TestCase {
$storage = $this->getMockBuilder('\OC\Files\Storage\Storage')
->disableOriginalConstructor()
->getMock();
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->getMockBuilder(View::class)
->disableOriginalConstructor()
->getMock();
$view = $this->getRootViewMock();
$root = new \OC\Files\Node\Root(
$this->manager,
$view,
@ -100,12 +106,7 @@ class RootTest extends \Test\TestCase {
$storage = $this->getMockBuilder('\OC\Files\Storage\Storage')
->disableOriginalConstructor()
->getMock();
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->getMockBuilder(View::class)
->disableOriginalConstructor()
->getMock();
$view = $this->getRootViewMock();
$root = new \OC\Files\Node\Root(
$this->manager,
$view,
@ -129,12 +130,7 @@ class RootTest extends \Test\TestCase {
public function testGetInvalidPath() {
$this->expectException(\OCP\Files\NotPermittedException::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->getMockBuilder(View::class)
->disableOriginalConstructor()
->getMock();
$view = $this->getRootViewMock();
$root = new \OC\Files\Node\Root(
$this->manager,
$view,
@ -152,12 +148,7 @@ class RootTest extends \Test\TestCase {
public function testGetNoStorages() {
$this->expectException(\OCP\Files\NotFoundException::class);
/**
* @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
*/
$view = $this->getMockBuilder(View::class)
->disableOriginalConstructor()
->getMock();
$view = $this->getRootViewMock();
$root = new \OC\Files\Node\Root(
$this->manager,
$view,
@ -174,7 +165,7 @@ class RootTest extends \Test\TestCase {
public function testGetUserFolder() {
$root = new \OC\Files\Node\Root(
$this->manager,
$this->createMock(View::class),
$this->getRootViewMock(),
$this->user,
$this->userMountCache,
$this->logger,
@ -215,7 +206,7 @@ class RootTest extends \Test\TestCase {
$root = new \OC\Files\Node\Root(
$this->createMock(Manager::class),
$this->createMock(View::class),
$this->getRootViewMock(),
null,
$this->userMountCache,
$this->logger,