From db65eeb5800745fb91cc2056e097c5988155ba20 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Tue, 7 Jul 2015 18:38:58 +0200 Subject: [PATCH] only move real files to the trash bin --- apps/files_trashbin/lib/storage.php | 34 +++++++++++++++++++++++++-- apps/files_trashbin/tests/storage.php | 30 +++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/apps/files_trashbin/lib/storage.php b/apps/files_trashbin/lib/storage.php index 006971fb24..4185fc6aec 100644 --- a/apps/files_trashbin/lib/storage.php +++ b/apps/files_trashbin/lib/storage.php @@ -26,6 +26,7 @@ namespace OCA\Files_Trashbin; use OC\Files\Filesystem; use OC\Files\Storage\Wrapper\Wrapper; +use OCP\IUserManager; class Storage extends Wrapper { @@ -41,8 +42,12 @@ class Storage extends Wrapper { */ private static $disableTrash = false; - function __construct($parameters) { + /** @var IUserManager */ + private $userManager; + + function __construct($parameters, IUserManager $userManager = null) { $this->mountPoint = $parameters['mountPoint']; + $this->userManager = $userManager; parent::__construct($parameters); } @@ -100,6 +105,27 @@ class Storage extends Wrapper { return $this->doDelete($path, 'rmdir'); } + /** + * check if it is a file located in data/user/files only files in the + * 'files' directory should be moved to the trash + * + * @param $path + * @return bool + */ + protected function shouldMoveToTrash($path){ + $normalized = Filesystem::normalizePath($this->mountPoint . '/' . $path); + $parts = explode('/', $normalized); + if (count($parts) < 4) { + return false; + } + + if ($this->userManager->userExists($parts[1]) && $parts[2] == 'files') { + return true; + } + + return false; + } + /** * Run the delete operation with the given method * @@ -112,6 +138,7 @@ class Storage extends Wrapper { if (self::$disableTrash || !\OC_App::isEnabled('files_trashbin') || (pathinfo($path, PATHINFO_EXTENSION) === 'part') + || $this->shouldMoveToTrash($path) === false ) { return call_user_func_array([$this->storage, $method], [$path]); } @@ -144,7 +171,10 @@ class Storage extends Wrapper { */ public static function setupStorage() { \OC\Files\Filesystem::addStorageWrapper('oc_trashbin', function ($mountPoint, $storage) { - return new \OCA\Files_Trashbin\Storage(array('storage' => $storage, 'mountPoint' => $mountPoint)); + return new \OCA\Files_Trashbin\Storage( + array('storage' => $storage, 'mountPoint' => $mountPoint), + \OC::$server->getUserManager() + ); }, 1); } diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php index 637543683d..64540505d2 100644 --- a/apps/files_trashbin/tests/storage.php +++ b/apps/files_trashbin/tests/storage.php @@ -493,4 +493,34 @@ class Storage extends \Test\TestCase { $results = $this->rootView->getDirectoryContent($this->user . '/files_trashbin/files/'); $this->assertEquals(0, count($results)); } + + /** + * @dataProvider dataTestShouldMoveToTrash + */ + public function testShouldMoveToTrash($mountPoint, $path, $userExists, $expected) { + $tmpStorage = $this->getMockBuilder('\OC\Files\Storage\Temporary') + ->disableOriginalConstructor()->getMock(); + $userManager = $this->getMockBuilder('OCP\IUserManager') + ->disableOriginalConstructor()->getMock(); + $userManager->expects($this->any()) + ->method('userExists')->willReturn($userExists); + $storage = new \OCA\Files_Trashbin\Storage( + ['mountPoint' => $mountPoint, 'storage' => $tmpStorage], + $userManager + ); + + $this->assertSame($expected, + $this->invokePrivate($storage, 'shouldMoveToTrash', [$path]) + ); + + } + + public function dataTestShouldMoveToTrash() { + return [ + ['/schiesbn/', '/files/test.txt', true, true], + ['/schiesbn/', '/files/test.txt', false, false], + ['/schiesbn/', '/test.txt', true, false], + ['/schiesbn/', '/test.txt', false, false], + ]; + } }