From e5f0dded84a544f4ebd983ef8fb6d898df230575 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Mon, 29 Sep 2014 11:13:01 +0200 Subject: [PATCH] throw a exception if we can't handle the provided path --- apps/files_sharing/appinfo/app.php | 3 ++ apps/files_sharing/lib/exceptions.php | 32 ++++++++++++++++++++ apps/files_sharing/lib/sharedmount.php | 6 ++-- apps/files_sharing/tests/sharedmount.php | 37 ++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 apps/files_sharing/lib/exceptions.php diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index 543cae7b0c1..f2c454a9ae2 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -12,6 +12,9 @@ OC::$CLASSPATH['OCA\Files\Share\Api'] = 'files_sharing/lib/api.php'; OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php'; OC::$CLASSPATH['OCA\Files\Share\Proxy'] = 'files_sharing/lib/proxy.php'; +// Exceptions +OC::$CLASSPATH['OCA\Files_Sharing\Exceptions\BrokenPath'] = 'files_sharing/lib/exceptions.php'; + \OCP\App::registerAdmin('files_sharing', 'settings-admin'); \OCA\Files_Sharing\Helper::registerHooks(); diff --git a/apps/files_sharing/lib/exceptions.php b/apps/files_sharing/lib/exceptions.php new file mode 100644 index 00000000000..2a57a69a95f --- /dev/null +++ b/apps/files_sharing/lib/exceptions.php @@ -0,0 +1,32 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see . + * + */ + +namespace OCA\Files_Sharing\Exceptions; + +/** + * Expected path with a different root + * Possible Error Codes: + * 10 - Path not relative to data/ and point to the users file directory + + */ +class BrokenPath extends \Exception { +} diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php index 1717a4bd636..4ad2d4e6b3e 100644 --- a/apps/files_sharing/lib/sharedmount.php +++ b/apps/files_sharing/lib/sharedmount.php @@ -91,7 +91,7 @@ class SharedMount extends Mount implements MoveableMount { * @param string $path the absolute path * @return string e.g. turns '/admin/files/test.txt' into '/test.txt' */ - private function stripUserFilesPath($path) { + protected function stripUserFilesPath($path) { $trimmed = ltrim($path, '/'); $split = explode('/', $trimmed); @@ -99,8 +99,8 @@ class SharedMount extends Mount implements MoveableMount { if (count($split) < 3 || $split[1] !== 'files') { \OCP\Util::writeLog('file sharing', 'Can not strip userid and "files/" from path: ' . $path, - \OCP\Util::DEBUG); - return false; + \OCP\Util::ERROR); + throw new \OCA\Files_Sharing\Exceptions\BrokenPath('Path does not start with /user/files', 10); } // skip 'user' and 'files' diff --git a/apps/files_sharing/tests/sharedmount.php b/apps/files_sharing/tests/sharedmount.php index f8c65734184..ac910944f9f 100644 --- a/apps/files_sharing/tests/sharedmount.php +++ b/apps/files_sharing/tests/sharedmount.php @@ -194,4 +194,41 @@ class Test_Files_Sharing_Mount extends Test_Files_Sharing_Base { \OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup'); } + /** + * @dataProvider dataProviderTestStripUserFilesPath + * @param string $path + * @param string $expectedResult + * @param bool $exception if a exception is expected + */ + function testStripUserFilesPath($path, $expectedResult, $exception) { + $testClass = new DummyTestClassSharedMount(null, null); + try { + $result = $testClass->stripUserFilesPathDummy($path); + $this->assertSame($expectedResult, $result); + } catch (\Exception $e) { + if ($exception) { + $this->assertSame(10, $e->getCode()); + } else { + $this->assertTrue(false, "Exception catched, but expected: " . $expectedResult); + } + } + } + + function dataProviderTestStripUserFilesPath() { + return array( + array('/user/files/foo.txt', '/foo.txt', false), + array('/user/files/folder/foo.txt', '/folder/foo.txt', false), + array('/data/user/files/foo.txt', null, true), + array('/data/user/files/', null, true), + array('/files/foo.txt', null, true), + array('/foo.txt', null, true), + ); + } + +} + +class DummyTestClassSharedMount extends \OCA\Files_Sharing\SharedMount { + public function stripUserFilesPathDummy($path) { + return $this->stripUserFilesPath($path); + } } -- 2.39.5