* This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. */ namespace Test\Files\Node; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; use OC\Files\View; class File extends \PHPUnit_Framework_TestCase { private $user; public function setUp() { $this->user = new \OC\User\User('', new \OC_User_Dummy); } public function testDelete() { $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $root->expects($this->exactly(2)) ->method('emit') ->will($this->returnValue(true)); $root->expects($this->any()) ->method('getUser') ->will($this->returnValue($this->user)); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_ALL))); $view->expects($this->once()) ->method('unlink') ->with('/bar/foo') ->will($this->returnValue(true)); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->delete(); } public function testDeleteHooks() { $test = $this; $hooksRun = 0; /** * @param \OC\Files\Node\File $node */ $preListener = function ($node) use (&$test, &$hooksRun) { $test->assertInstanceOf('\OC\Files\Node\File', $node); $test->assertEquals('foo', $node->getInternalPath()); $test->assertEquals('/bar/foo', $node->getPath()); $test->assertEquals(1, $node->getId()); $hooksRun++; }; /** * @param \OC\Files\Node\File $node */ $postListener = function ($node) use (&$test, &$hooksRun) { $test->assertInstanceOf('\OC\Files\Node\NonExistingFile', $node); $test->assertEquals('foo', $node->getInternalPath()); $test->assertEquals('/bar/foo', $node->getPath()); $hooksRun++; }; /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = new \OC\Files\Node\Root($manager, $view, $this->user); $root->listen('\OC\Files', 'preDelete', $preListener); $root->listen('\OC\Files', 'postDelete', $postListener); $view->expects($this->any()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_ALL, 'fileid' => 1))); $view->expects($this->once()) ->method('unlink') ->with('/bar/foo') ->will($this->returnValue(true)); $view->expects($this->any()) ->method('resolvePath') ->with('/bar/foo') ->will($this->returnValue(array(null, 'foo'))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->delete(); $this->assertEquals(2, $hooksRun); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testDeleteNotPermitted() { $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $root->expects($this->any()) ->method('getUser') ->will($this->returnValue($this->user)); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_READ))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->delete(); } public function testGetContent() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = new \OC\Files\Node\Root($manager, $view, $this->user); $hook = function ($file) { throw new \Exception('Hooks are not supposed to be called'); }; $root->listen('\OC\Files', 'preWrite', $hook); $root->listen('\OC\Files', 'postWrite', $hook); $view->expects($this->once()) ->method('file_get_contents') ->with('/bar/foo') ->will($this->returnValue('bar')); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_READ))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $this->assertEquals('bar', $node->getContent()); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testGetContentNotPermitted() { $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $root->expects($this->any()) ->method('getUser') ->will($this->returnValue($this->user)); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => 0))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->getContent(); } public function testPutContent() { $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $root->expects($this->any()) ->method('getUser') ->will($this->returnValue($this->user)); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_ALL))); $view->expects($this->once()) ->method('file_put_contents') ->with('/bar/foo', 'bar') ->will($this->returnValue(true)); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->putContent('bar'); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testPutContentNotPermitted() { $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_READ))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->putContent('bar'); } public function testGetMimeType() { $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->once()) ->method('getMimeType') ->with('/bar/foo') ->will($this->returnValue('text/plain')); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $this->assertEquals('text/plain', $node->getMimeType()); } public function testFOpenRead() { $stream = fopen('php://memory', 'w+'); fwrite($stream, 'bar'); rewind($stream); /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = new \OC\Files\Node\Root($manager, $view, $this->user); $hook = function ($file) { throw new \Exception('Hooks are not supposed to be called'); }; $root->listen('\OC\Files', 'preWrite', $hook); $root->listen('\OC\Files', 'postWrite', $hook); $view->expects($this->once()) ->method('fopen') ->with('/bar/foo', 'r') ->will($this->returnValue($stream)); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_ALL))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $fh = $node->fopen('r'); $this->assertEquals($stream, $fh); $this->assertEquals('bar', fread($fh, 3)); } public function testFOpenWrite() { $stream = fopen('php://memory', 'w+'); /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = new \OC\Files\Node\Root($manager, new $view, $this->user); $hooksCalled = 0; $hook = function ($file) use (&$hooksCalled) { $hooksCalled++; }; $root->listen('\OC\Files', 'preWrite', $hook); $root->listen('\OC\Files', 'postWrite', $hook); $view->expects($this->once()) ->method('fopen') ->with('/bar/foo', 'w') ->will($this->returnValue($stream)); $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_ALL))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $fh = $node->fopen('w'); $this->assertEquals($stream, $fh); fwrite($fh, 'bar'); rewind($fh); $this->assertEquals('bar', fread($stream, 3)); $this->assertEquals(2, $hooksCalled); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testFOpenReadNotPermitted() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = new \OC\Files\Node\Root($manager, $view, $this->user); $hook = function ($file) { throw new \Exception('Hooks are not supposed to be called'); }; $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => 0))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->fopen('r'); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testFOpenReadWriteNoReadPermissions() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = new \OC\Files\Node\Root($manager, $view, $this->user); $hook = function () { throw new \Exception('Hooks are not supposed to be called'); }; $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_UPDATE))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->fopen('w'); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testFOpenReadWriteNoWritePermissions() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = new \OC\Files\Node\Root($manager, new $view, $this->user); $hook = function () { throw new \Exception('Hooks are not supposed to be called'); }; $view->expects($this->once()) ->method('getFileInfo') ->with('/bar/foo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_READ))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $node->fopen('w'); } public function testCopySameStorage() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->any()) ->method('copy') ->with('/bar/foo', '/bar/asd'); $view->expects($this->any()) ->method('getFileInfo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_ALL, 'fileid' => 3))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $parentNode = new \OC\Files\Node\Folder($root, $view, '/bar'); $newNode = new \OC\Files\Node\File($root, $view, '/bar/asd'); $root->expects($this->exactly(2)) ->method('get') ->will($this->returnValueMap(array( array('/bar/asd', $newNode), array('/bar', $parentNode) ))); $target = $node->copy('/bar/asd'); $this->assertInstanceOf('\OC\Files\Node\File', $target); $this->assertEquals(3, $target->getId()); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testCopyNotPermitted() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); /** * @var \OC\Files\Storage\Storage | \PHPUnit_Framework_MockObject_MockObject $storage */ $storage = $this->getMock('\OC\Files\Storage\Storage'); $root->expects($this->never()) ->method('getMount'); $storage->expects($this->never()) ->method('copy'); $view->expects($this->any()) ->method('getFileInfo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_READ, 'fileid' => 3))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $parentNode = new \OC\Files\Node\Folder($root, $view, '/bar'); $root->expects($this->once()) ->method('get') ->will($this->returnValueMap(array( array('/bar', $parentNode) ))); $node->copy('/bar/asd'); } /** * @expectedException \OCP\Files\NotFoundException */ public function testCopyNoParent() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->never()) ->method('copy'); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $root->expects($this->once()) ->method('get') ->with('/bar/asd') ->will($this->throwException(new NotFoundException())); $node->copy('/bar/asd/foo'); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testCopyParentIsFile() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->never()) ->method('copy'); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $parentNode = new \OC\Files\Node\File($root, $view, '/bar'); $root->expects($this->once()) ->method('get') ->will($this->returnValueMap(array( array('/bar', $parentNode) ))); $node->copy('/bar/asd'); } public function testMoveSameStorage() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->any()) ->method('rename') ->with('/bar/foo', '/bar/asd'); $view->expects($this->any()) ->method('getFileInfo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_ALL, 'fileid' => 1))); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $parentNode = new \OC\Files\Node\Folder($root, $view, '/bar'); $root->expects($this->any()) ->method('get') ->will($this->returnValueMap(array(array('/bar', $parentNode), array('/bar/asd', $node)))); $target = $node->move('/bar/asd'); $this->assertInstanceOf('\OC\Files\Node\File', $target); $this->assertEquals(1, $target->getId()); $this->assertEquals('/bar/asd', $node->getPath()); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testMoveNotPermitted() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->any()) ->method('getFileInfo') ->will($this->returnValue(array('permissions' => \OCP\PERMISSION_READ))); $view->expects($this->never()) ->method('rename'); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $parentNode = new \OC\Files\Node\Folder($root, $view, '/bar'); $root->expects($this->once()) ->method('get') ->with('/bar') ->will($this->returnValue($parentNode)); $node->move('/bar/asd'); } /** * @expectedException \OCP\Files\NotFoundException */ public function testMoveNoParent() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); /** * @var \OC\Files\Storage\Storage | \PHPUnit_Framework_MockObject_MockObject $storage */ $storage = $this->getMock('\OC\Files\Storage\Storage'); $storage->expects($this->never()) ->method('rename'); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $parentNode = new \OC\Files\Node\Folder($root, $view, '/bar'); $root->expects($this->once()) ->method('get') ->with('/bar') ->will($this->throwException(new NotFoundException())); $node->move('/bar/asd'); } /** * @expectedException \OCP\Files\NotPermittedException */ public function testMoveParentIsFile() { /** * @var \OC\Files\Mount\Manager $manager */ $manager = $this->getMock('\OC\Files\Mount\Manager'); /** * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject $view */ $view = $this->getMock('\OC\Files\View'); $root = $this->getMock('\OC\Files\Node\Root', array(), array($manager, $view, $this->user)); $view->expects($this->never()) ->method('rename'); $node = new \OC\Files\Node\File($root, $view, '/bar/foo'); $parentNode = new \OC\Files\Node\File($root, $view, '/bar'); $root->expects($this->once()) ->method('get') ->with('/bar') ->will($this->returnValue($parentNode)); $node->move('/bar/asd'); } } n value='backport/45765/master'>backport/45765/master Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/lib/Controller/DirectEditingViewController.php
blob: 75b6dfe739533fd366201e2aee42e8a701ac168e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
/**
 * @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
 *
 * @author Julius Härtl <jus@bitgrid.net>
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */

namespace OCA\Files\Controller;

use Exception;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\Response;
use OCP\DirectEditing\IManager;
use OCP\DirectEditing\RegisterDirectEditorEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\ILogger;
use OCP\IRequest;

class DirectEditingViewController extends Controller {

	/** @var IEventDispatcher */
	private $eventDispatcher;

	/** @var IManager */
	private $directEditingManager;

	/** @var ILogger */
	private $logger;

	public function __construct($appName, IRequest $request, IEventDispatcher $eventDispatcher, IManager $manager, ILogger $logger) {
		parent::__construct($appName, $request);

		$this->eventDispatcher = $eventDispatcher;
		$this->directEditingManager = $manager;
		$this->logger = $logger;
	}

	/**
	 * @PublicPage
	 * @NoCSRFRequired
	 *
	 * @param string $token
	 * @return Response
	 */
	public function edit(string $token): Response {
		$this->eventDispatcher->dispatchTyped(new RegisterDirectEditorEvent($this->directEditingManager));
		try {
			return $this->directEditingManager->edit($token);
		} catch (Exception $e) {
			$this->logger->logException($e);
			return new NotFoundResponse();
		}
	}
}