From 16559e4a8abfef2623b2e6f0d6e1199eac3154c3 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 3 Jun 2016 13:35:42 +0200 Subject: add test for deleting ghost files over dav --- .../Connector/Sabre/RequestTest/DeleteTest.php | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php (limited to 'apps/dav') diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php new file mode 100644 index 00000000000..4f481cba557 --- /dev/null +++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php @@ -0,0 +1,59 @@ + + * @author Robin Appelman + * @author Thomas Müller + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\DAV\Tests\unit\Connector\Sabre\RequestTest; + +use OC\Connector\Sabre\Exception\FileLocked; +use OCP\AppFramework\Http; +use OCP\Lock\ILockingProvider; + +/** + * Class DeleteTest + * + * @group DB + * + * @package OCA\DAV\Tests\unit\Connector\Sabre\RequestTest + */ +class DeleteTest extends RequestTest { + public function testBasicUpload() { + $user = $this->getUniqueID(); + $view = $this->setupUser($user, 'pass'); + + $view->file_put_contents('foo.txt', 'asd'); + $mount = $view->getMount('foo.txt'); + $internalPath = $view->getAbsolutePath(); + + // create a ghost file + $mount->getStorage()->unlink($mount->getInternalPath($internalPath)); + + // cache entry still exists + $this->assertInstanceOf('\OCP\Files\FileInfo', $view->getFileInfo('foo.txt')); + + $response = $this->request($view, $user, 'pass', 'DELETE', '/foo.txt'); + + $this->assertEquals(Http::STATUS_NO_CONTENT, $response->getStatus()); + + // no longer in the cache + $this->assertFalse($view->getFileInfo('foo.txt')); + } +} -- cgit v1.2.3 From c4b80b86db78e9b020780a8d075abfa9db3a0d53 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Mon, 6 Jun 2016 17:01:27 +0200 Subject: Fix checkMove() implementation for dav v2 - fixes #24776 (#24971) --- apps/dav/lib/Connector/Sabre/FilesPlugin.php | 9 ++-- apps/dav/lib/Connector/Sabre/Node.php | 4 ++ .../tests/unit/Connector/Sabre/FilesPluginTest.php | 60 ++++++++++++++-------- 3 files changed, 46 insertions(+), 27 deletions(-) (limited to 'apps/dav') diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index a4e13709559..dc47416cca8 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -168,20 +168,19 @@ class FilesPlugin extends ServerPlugin { */ function checkMove($source, $destination) { $sourceNode = $this->tree->getNodeForPath($source); - if ($sourceNode instanceof FutureFile) { + if (!$sourceNode instanceof Node) { return; } list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($source); list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destination); if ($sourceDir !== $destinationDir) { - $sourceFileInfo = $this->fileView->getFileInfo($source); - - if ($sourceFileInfo === false) { + $sourceNodeFileInfo = $sourceNode->getFileInfo(); + if (is_null($sourceNodeFileInfo)) { throw new NotFound($source . ' does not exist'); } - if (!$sourceFileInfo->isDeletable()) { + if (!$sourceNodeFileInfo->isDeletable()) { throw new Forbidden($source . " cannot be deleted"); } } diff --git a/apps/dav/lib/Connector/Sabre/Node.php b/apps/dav/lib/Connector/Sabre/Node.php index 04640bbde4f..c41b5137fde 100644 --- a/apps/dav/lib/Connector/Sabre/Node.php +++ b/apps/dav/lib/Connector/Sabre/Node.php @@ -347,4 +347,8 @@ abstract class Node implements \Sabre\DAV\INode { public function changeLock($type) { $this->fileView->changeLock($this->path, $type); } + + public function getFileInfo() { + return $this->info; + } } diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php index 87fec17bf6b..80f284e470e 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php @@ -24,6 +24,7 @@ */ namespace OCA\DAV\Tests\unit\Connector\Sabre; +use OCA\DAV\Connector\Sabre\FilesPlugin; use OCP\Files\StorageNotAvailableException; use Sabre\DAV\PropFind; use Sabre\DAV\PropPatch; @@ -36,16 +37,16 @@ use Test\TestCase; * See the COPYING-README file. */ class FilesPluginTest extends TestCase { - const GETETAG_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME; - const FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME; - const INTERNAL_FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::INTERNAL_FILEID_PROPERTYNAME; - const SIZE_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::SIZE_PROPERTYNAME; - const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME; - const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME; - const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME; - const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME; - const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME; - const DATA_FINGERPRINT_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME; + const GETETAG_PROPERTYNAME = FilesPlugin::GETETAG_PROPERTYNAME; + const FILEID_PROPERTYNAME = FilesPlugin::FILEID_PROPERTYNAME; + const INTERNAL_FILEID_PROPERTYNAME = FilesPlugin::INTERNAL_FILEID_PROPERTYNAME; + const SIZE_PROPERTYNAME = FilesPlugin::SIZE_PROPERTYNAME; + const PERMISSIONS_PROPERTYNAME = FilesPlugin::PERMISSIONS_PROPERTYNAME; + const LASTMODIFIED_PROPERTYNAME = FilesPlugin::LASTMODIFIED_PROPERTYNAME; + const DOWNLOADURL_PROPERTYNAME = FilesPlugin::DOWNLOADURL_PROPERTYNAME; + const OWNER_ID_PROPERTYNAME = FilesPlugin::OWNER_ID_PROPERTYNAME; + const OWNER_DISPLAY_NAME_PROPERTYNAME = FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME; + const DATA_FINGERPRINT_PROPERTYNAME = FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME; /** * @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject @@ -58,7 +59,7 @@ class FilesPluginTest extends TestCase { private $tree; /** - * @var \OCA\DAV\Connector\Sabre\FilesPlugin + * @var FilesPlugin */ private $plugin; @@ -84,11 +85,11 @@ class FilesPluginTest extends TestCase { ->disableOriginalConstructor() ->getMock(); $this->config = $this->getMock('\OCP\IConfig'); - $this->config->method('getSystemValue') + $this->config->expects($this->any())->method('getSystemValue') ->with($this->equalTo('data-fingerprint'), $this->equalTo('')) ->willReturn('my_fingerprint'); - $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin( + $this->plugin = new FilesPlugin( $this->tree, $this->view, $this->config @@ -263,7 +264,7 @@ class FilesPluginTest extends TestCase { } public function testGetPublicPermissions() { - $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin( + $this->plugin = new FilesPlugin( $this->tree, $this->view, $this->config, @@ -331,7 +332,7 @@ class FilesPluginTest extends TestCase { $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() ->getMock(); - $node->method('getPath')->willReturn('/'); + $node->expects($this->any())->method('getPath')->willReturn('/'); $propFind = new PropFind( '/', @@ -432,11 +433,16 @@ class FilesPluginTest extends TestCase { ->method('isDeletable') ->willReturn(false); - $this->view->expects($this->once()) + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->once()) ->method('getFileInfo') - ->with('FolderA/test.txt') ->willReturn($fileInfoFolderATestTXT); + $this->tree->expects($this->once())->method('getNodeForPath') + ->willReturn($node); + $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); } @@ -448,11 +454,16 @@ class FilesPluginTest extends TestCase { ->method('isDeletable') ->willReturn(true); - $this->view->expects($this->once()) + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->once()) ->method('getFileInfo') - ->with('FolderA/test.txt') ->willReturn($fileInfoFolderATestTXT); + $this->tree->expects($this->once())->method('getNodeForPath') + ->willReturn($node); + $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); } @@ -461,10 +472,15 @@ class FilesPluginTest extends TestCase { * @expectedExceptionMessage FolderA/test.txt does not exist */ public function testMoveSrcNotExist() { - $this->view->expects($this->once()) + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->once()) ->method('getFileInfo') - ->with('FolderA/test.txt') - ->willReturn(false); + ->willReturn(null); + + $this->tree->expects($this->once())->method('getNodeForPath') + ->willReturn($node); $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); } -- cgit v1.2.3 From 9b5fd515efd26f63b333bbbfa60b5b46c707d773 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 1 Jun 2016 14:51:25 +0200 Subject: Better handling of forbidden files in dav --- apps/dav/lib/Connector/Sabre/Directory.php | 2 ++ apps/dav/lib/Connector/Sabre/ObjectTree.php | 2 ++ 2 files changed, 4 insertions(+) (limited to 'apps/dav') diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php index e7226b58196..ddab34605f3 100644 --- a/apps/dav/lib/Connector/Sabre/Directory.php +++ b/apps/dav/lib/Connector/Sabre/Directory.php @@ -196,6 +196,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); } catch (\OCP\Files\InvalidPathException $ex) { throw new InvalidPath($ex->getMessage()); + } catch (ForbiddenException $e) { + throw new \Sabre\DAV\Exception\Forbidden(); } } diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php index 599f3fdfd0e..9e7d876187d 100644 --- a/apps/dav/lib/Connector/Sabre/ObjectTree.php +++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php @@ -161,6 +161,8 @@ class ObjectTree extends \Sabre\DAV\Tree { throw new \Sabre\DAV\Exception\NotFound('Storage ' . $path . ' is invalid'); } catch (LockedException $e) { throw new \Sabre\DAV\Exception\Locked(); + } catch (ForbiddenException $e) { + throw new \Sabre\DAV\Exception\Forbidden(); } } -- cgit v1.2.3 From 66d853680ccc8f579a4b80c85376299b9b98b73b Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Wed, 8 Jun 2016 14:59:06 +0200 Subject: block webdav access if share is not readable --- apps/dav/appinfo/v1/publicwebdav.php | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'apps/dav') diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php index c6aaab2712f..c6c319aa36d 100644 --- a/apps/dav/appinfo/v1/publicwebdav.php +++ b/apps/dav/appinfo/v1/publicwebdav.php @@ -67,8 +67,13 @@ $server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, func $share = $authBackend->getShare(); $owner = $share->getShareOwner(); $isWritable = $share->getPermissions() & (\OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_CREATE); + $isReadable = $share->getPermissions() & \OCP\Constants::PERMISSION_READ; $fileId = $share->getNodeId(); + if (!$isReadable) { + return false; + } + if (!$isWritable) { \OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) { return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_SHARE)); -- cgit v1.2.3 From 51fd2602a77d8d885c53d24ebb8f72be62dc52ce Mon Sep 17 00:00:00 2001 From: blizzz Date: Thu, 9 Jun 2016 17:41:57 +0200 Subject: Revert "Downstream 2016-06-08" --- apps/dav/lib/Connector/Sabre/Directory.php | 2 - apps/dav/lib/Connector/Sabre/FilesPlugin.php | 9 ++-- apps/dav/lib/Connector/Sabre/Node.php | 4 -- apps/dav/lib/Connector/Sabre/ObjectTree.php | 2 - .../tests/unit/Connector/Sabre/FilesPluginTest.php | 60 ++++++++------------- .../Connector/Sabre/RequestTest/DeleteTest.php | 59 --------------------- apps/federatedfilesharing/l10n/ar.js | 6 --- apps/federatedfilesharing/l10n/ar.json | 4 -- apps/files/js/app.js | 3 -- apps/files/l10n/da.js | 6 --- apps/files/l10n/da.json | 6 --- apps/files/lib/Controller/ViewController.php | 61 +++++++++++----------- apps/files/templates/index.php | 1 - apps/files/tests/Controller/ViewControllerTest.php | 13 ++--- apps/files_external/l10n/pt_PT.js | 14 ++--- apps/files_external/l10n/pt_PT.json | 14 ++--- apps/files_external/lib/Lib/Storage/Google.php | 16 +----- apps/files_external/tests/Storage/GoogleTest.php | 9 ---- apps/files_sharing/lib/Cache.php | 2 +- apps/files_sharing/lib/sharedstorage.php | 18 ------- apps/systemtags/l10n/fr.js | 22 ++++---- apps/systemtags/l10n/fr.json | 22 ++++---- .../features/bootstrap/BasicStructure.php | 11 ---- .../features/bootstrap/FederationContext.php | 2 +- .../federation_features/federated.feature | 61 ---------------------- core/Application.php | 3 +- core/Command/Encryption/DecryptAll.php | 14 +---- core/Controller/TokenController.php | 36 ++++--------- core/Controller/TwoFactorChallengeController.php | 9 ---- core/Middleware/TwoFactorMiddleware.php | 5 -- core/css/styles.css | 4 -- core/templates/twofactorselectchallenge.php | 3 +- core/templates/twofactorshowchallenge.php | 1 - lib/l10n/ar.js | 39 -------------- lib/l10n/ar.json | 39 -------------- lib/l10n/ro.js | 5 -- lib/l10n/ro.json | 5 -- lib/private/AllConfig.php | 9 +--- lib/private/AppConfig.php | 2 +- .../Token/DefaultTokenCleanupJob.php | 1 - lib/private/Encryption/DecryptAll.php | 4 +- lib/private/Files/Cache/Scanner.php | 7 +-- lib/private/Files/Cache/Updater.php | 5 +- lib/private/Files/Storage/Common.php | 3 -- lib/private/Files/Storage/Local.php | 36 ++----------- lib/private/Files/View.php | 45 ++++++---------- lib/private/legacy/helper.php | 4 +- lib/public/IAppConfig.php | 2 +- lib/public/IConfig.php | 3 +- settings/js/users/users.js | 2 +- tests/Core/Controller/TokenControllerTest.php | 40 +++----------- .../TwoFactorChallengeControllerTest.php | 21 ++------ tests/lib/AllConfigTest.php | 19 ------- tests/lib/Encryption/DecryptAllTest.php | 35 +++++-------- tests/lib/Files/Storage/LocalTest.php | 31 ----------- tests/lib/Files/ViewTest.php | 51 +----------------- version.php | 4 +- 57 files changed, 171 insertions(+), 743 deletions(-) delete mode 100644 apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php delete mode 100644 apps/federatedfilesharing/l10n/ar.js delete mode 100644 apps/federatedfilesharing/l10n/ar.json (limited to 'apps/dav') diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php index ddab34605f3..e7226b58196 100644 --- a/apps/dav/lib/Connector/Sabre/Directory.php +++ b/apps/dav/lib/Connector/Sabre/Directory.php @@ -196,8 +196,6 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); } catch (\OCP\Files\InvalidPathException $ex) { throw new InvalidPath($ex->getMessage()); - } catch (ForbiddenException $e) { - throw new \Sabre\DAV\Exception\Forbidden(); } } diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index dc47416cca8..a4e13709559 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -168,19 +168,20 @@ class FilesPlugin extends ServerPlugin { */ function checkMove($source, $destination) { $sourceNode = $this->tree->getNodeForPath($source); - if (!$sourceNode instanceof Node) { + if ($sourceNode instanceof FutureFile) { return; } list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($source); list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destination); if ($sourceDir !== $destinationDir) { - $sourceNodeFileInfo = $sourceNode->getFileInfo(); - if (is_null($sourceNodeFileInfo)) { + $sourceFileInfo = $this->fileView->getFileInfo($source); + + if ($sourceFileInfo === false) { throw new NotFound($source . ' does not exist'); } - if (!$sourceNodeFileInfo->isDeletable()) { + if (!$sourceFileInfo->isDeletable()) { throw new Forbidden($source . " cannot be deleted"); } } diff --git a/apps/dav/lib/Connector/Sabre/Node.php b/apps/dav/lib/Connector/Sabre/Node.php index c41b5137fde..04640bbde4f 100644 --- a/apps/dav/lib/Connector/Sabre/Node.php +++ b/apps/dav/lib/Connector/Sabre/Node.php @@ -347,8 +347,4 @@ abstract class Node implements \Sabre\DAV\INode { public function changeLock($type) { $this->fileView->changeLock($this->path, $type); } - - public function getFileInfo() { - return $this->info; - } } diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php index 9e7d876187d..599f3fdfd0e 100644 --- a/apps/dav/lib/Connector/Sabre/ObjectTree.php +++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php @@ -161,8 +161,6 @@ class ObjectTree extends \Sabre\DAV\Tree { throw new \Sabre\DAV\Exception\NotFound('Storage ' . $path . ' is invalid'); } catch (LockedException $e) { throw new \Sabre\DAV\Exception\Locked(); - } catch (ForbiddenException $e) { - throw new \Sabre\DAV\Exception\Forbidden(); } } diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php index 80f284e470e..87fec17bf6b 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php @@ -24,7 +24,6 @@ */ namespace OCA\DAV\Tests\unit\Connector\Sabre; -use OCA\DAV\Connector\Sabre\FilesPlugin; use OCP\Files\StorageNotAvailableException; use Sabre\DAV\PropFind; use Sabre\DAV\PropPatch; @@ -37,16 +36,16 @@ use Test\TestCase; * See the COPYING-README file. */ class FilesPluginTest extends TestCase { - const GETETAG_PROPERTYNAME = FilesPlugin::GETETAG_PROPERTYNAME; - const FILEID_PROPERTYNAME = FilesPlugin::FILEID_PROPERTYNAME; - const INTERNAL_FILEID_PROPERTYNAME = FilesPlugin::INTERNAL_FILEID_PROPERTYNAME; - const SIZE_PROPERTYNAME = FilesPlugin::SIZE_PROPERTYNAME; - const PERMISSIONS_PROPERTYNAME = FilesPlugin::PERMISSIONS_PROPERTYNAME; - const LASTMODIFIED_PROPERTYNAME = FilesPlugin::LASTMODIFIED_PROPERTYNAME; - const DOWNLOADURL_PROPERTYNAME = FilesPlugin::DOWNLOADURL_PROPERTYNAME; - const OWNER_ID_PROPERTYNAME = FilesPlugin::OWNER_ID_PROPERTYNAME; - const OWNER_DISPLAY_NAME_PROPERTYNAME = FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME; - const DATA_FINGERPRINT_PROPERTYNAME = FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME; + const GETETAG_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME; + const FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME; + const INTERNAL_FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::INTERNAL_FILEID_PROPERTYNAME; + const SIZE_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::SIZE_PROPERTYNAME; + const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME; + const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME; + const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME; + const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME; + const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME; + const DATA_FINGERPRINT_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME; /** * @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject @@ -59,7 +58,7 @@ class FilesPluginTest extends TestCase { private $tree; /** - * @var FilesPlugin + * @var \OCA\DAV\Connector\Sabre\FilesPlugin */ private $plugin; @@ -85,11 +84,11 @@ class FilesPluginTest extends TestCase { ->disableOriginalConstructor() ->getMock(); $this->config = $this->getMock('\OCP\IConfig'); - $this->config->expects($this->any())->method('getSystemValue') + $this->config->method('getSystemValue') ->with($this->equalTo('data-fingerprint'), $this->equalTo('')) ->willReturn('my_fingerprint'); - $this->plugin = new FilesPlugin( + $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin( $this->tree, $this->view, $this->config @@ -264,7 +263,7 @@ class FilesPluginTest extends TestCase { } public function testGetPublicPermissions() { - $this->plugin = new FilesPlugin( + $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin( $this->tree, $this->view, $this->config, @@ -332,7 +331,7 @@ class FilesPluginTest extends TestCase { $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() ->getMock(); - $node->expects($this->any())->method('getPath')->willReturn('/'); + $node->method('getPath')->willReturn('/'); $propFind = new PropFind( '/', @@ -433,16 +432,11 @@ class FilesPluginTest extends TestCase { ->method('isDeletable') ->willReturn(false); - $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') - ->disableOriginalConstructor() - ->getMock(); - $node->expects($this->once()) + $this->view->expects($this->once()) ->method('getFileInfo') + ->with('FolderA/test.txt') ->willReturn($fileInfoFolderATestTXT); - $this->tree->expects($this->once())->method('getNodeForPath') - ->willReturn($node); - $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); } @@ -454,16 +448,11 @@ class FilesPluginTest extends TestCase { ->method('isDeletable') ->willReturn(true); - $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') - ->disableOriginalConstructor() - ->getMock(); - $node->expects($this->once()) + $this->view->expects($this->once()) ->method('getFileInfo') + ->with('FolderA/test.txt') ->willReturn($fileInfoFolderATestTXT); - $this->tree->expects($this->once())->method('getNodeForPath') - ->willReturn($node); - $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); } @@ -472,15 +461,10 @@ class FilesPluginTest extends TestCase { * @expectedExceptionMessage FolderA/test.txt does not exist */ public function testMoveSrcNotExist() { - $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Node') - ->disableOriginalConstructor() - ->getMock(); - $node->expects($this->once()) + $this->view->expects($this->once()) ->method('getFileInfo') - ->willReturn(null); - - $this->tree->expects($this->once())->method('getNodeForPath') - ->willReturn($node); + ->with('FolderA/test.txt') + ->willReturn(false); $this->plugin->checkMove('FolderA/test.txt', 'test.txt'); } diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php deleted file mode 100644 index 4f481cba557..00000000000 --- a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @author Robin Appelman - * @author Thomas Müller - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see - * - */ - -namespace OCA\DAV\Tests\unit\Connector\Sabre\RequestTest; - -use OC\Connector\Sabre\Exception\FileLocked; -use OCP\AppFramework\Http; -use OCP\Lock\ILockingProvider; - -/** - * Class DeleteTest - * - * @group DB - * - * @package OCA\DAV\Tests\unit\Connector\Sabre\RequestTest - */ -class DeleteTest extends RequestTest { - public function testBasicUpload() { - $user = $this->getUniqueID(); - $view = $this->setupUser($user, 'pass'); - - $view->file_put_contents('foo.txt', 'asd'); - $mount = $view->getMount('foo.txt'); - $internalPath = $view->getAbsolutePath(); - - // create a ghost file - $mount->getStorage()->unlink($mount->getInternalPath($internalPath)); - - // cache entry still exists - $this->assertInstanceOf('\OCP\Files\FileInfo', $view->getFileInfo('foo.txt')); - - $response = $this->request($view, $user, 'pass', 'DELETE', '/foo.txt'); - - $this->assertEquals(Http::STATUS_NO_CONTENT, $response->getStatus()); - - // no longer in the cache - $this->assertFalse($view->getFileInfo('foo.txt')); - } -} diff --git a/apps/federatedfilesharing/l10n/ar.js b/apps/federatedfilesharing/l10n/ar.js deleted file mode 100644 index 451663a7b6b..00000000000 --- a/apps/federatedfilesharing/l10n/ar.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "federatedfilesharing", - { - "Invalid Federated Cloud ID" : "معرّف السحابة المتحدة غير صالح" -}, -"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/federatedfilesharing/l10n/ar.json b/apps/federatedfilesharing/l10n/ar.json deleted file mode 100644 index 630ab95f64b..00000000000 --- a/apps/federatedfilesharing/l10n/ar.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Invalid Federated Cloud ID" : "معرّف السحابة المتحدة غير صالح" -},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" -} \ No newline at end of file diff --git a/apps/files/js/app.js b/apps/files/js/app.js index fbfa510e07e..7a3d78f9663 100644 --- a/apps/files/js/app.js +++ b/apps/files/js/app.js @@ -53,9 +53,6 @@ this.$showHiddenFiles = $('input#showhiddenfilesToggle'); var showHidden = $('#showHiddenFiles').val() === "1"; this.$showHiddenFiles.prop('checked', showHidden); - if ($('#fileNotFound').val() === "1") { - OC.Notification.showTemporary(t('files', 'File could not be found')); - } this._filesConfig = new OC.Backbone.Model({ showhidden: showHidden diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js index e585ccacc1c..e1013bcafbb 100644 --- a/apps/files/l10n/da.js +++ b/apps/files/l10n/da.js @@ -32,8 +32,6 @@ OC.L10N.register( "Could not get result from server." : "Kunne ikke hente resultat fra server.", "Uploading..." : "Uploader...", "..." : "...", - "Any moment now..." : "Når som helst...", - "Soon..." : "Snart...", "File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.", "Actions" : "Handlinger", "Download" : "Download", @@ -49,8 +47,6 @@ OC.L10N.register( "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren", "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - der findes allerede en fil med dette navn", "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"", - "{newName} already exists" : "{newName} eksistere allerede", - "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"", "No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'", "Name" : "Navn", "Size" : "Størrelse", @@ -72,7 +68,6 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Gjort til foretrukken", "Favorite" : "Foretrukken", - "Local link" : "Lokalt link", "Folder" : "Mappe", "New folder" : "Ny Mappe", "{newname} already exists" : "{newname} eksistere allerede", @@ -102,7 +97,6 @@ OC.L10N.register( "Save" : "Gem", "Missing permissions to edit from here." : "Rettighed mangler til at redigere på dette sted", "Settings" : "Indstillinger", - "Show hidden files" : "Vis skjulte filer", "WebDAV" : "WebDAV", "No files in here" : "Her er ingen filer", "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!", diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json index 499533d77ba..3162770cc40 100644 --- a/apps/files/l10n/da.json +++ b/apps/files/l10n/da.json @@ -30,8 +30,6 @@ "Could not get result from server." : "Kunne ikke hente resultat fra server.", "Uploading..." : "Uploader...", "..." : "...", - "Any moment now..." : "Når som helst...", - "Soon..." : "Snart...", "File upload is in progress. Leaving the page now will cancel the upload." : "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.", "Actions" : "Handlinger", "Download" : "Download", @@ -47,8 +45,6 @@ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren", "Could not move \"{file}\", target exists" : "Kunne ikke flytte \"{file}\" - der findes allerede en fil med dette navn", "Could not move \"{file}\"" : "Kunne ikke flytte \"{file}\"", - "{newName} already exists" : "{newName} eksistere allerede", - "Error deleting file \"{fileName}\"." : "Fejl under sletning af filen \"{fileName}\"", "No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'", "Name" : "Navn", "Size" : "Størrelse", @@ -70,7 +66,6 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Gjort til foretrukken", "Favorite" : "Foretrukken", - "Local link" : "Lokalt link", "Folder" : "Mappe", "New folder" : "Ny Mappe", "{newname} already exists" : "{newname} eksistere allerede", @@ -100,7 +95,6 @@ "Save" : "Gem", "Missing permissions to edit from here." : "Rettighed mangler til at redigere på dette sted", "Settings" : "Indstillinger", - "Show hidden files" : "Vis skjulte filer", "WebDAV" : "WebDAV", "No files in here" : "Her er ingen filer", "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!", diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index 18b6cf719c5..1b0903b41d3 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -27,9 +27,9 @@ namespace OCA\Files\Controller; use OC\AppFramework\Http\Request; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\ContentSecurityPolicy; +use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\TemplateResponse; -use OCP\Files\NotFoundException; use OCP\IConfig; use OCP\IL10N; use OCP\INavigationManager; @@ -37,6 +37,7 @@ use OCP\IRequest; use OCP\IURLGenerator; use OCP\IUserSession; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use OCP\AppFramework\Http\NotFoundResponse; use OCP\Files\Folder; use OCP\App\IAppManager; @@ -141,15 +142,11 @@ class ViewController extends Controller { * @param string $view * @param string $fileid * @return TemplateResponse + * @throws \OCP\Files\NotFoundException */ public function index($dir = '', $view = '', $fileid = null) { - $fileNotFound = false; if ($fileid !== null) { - try { - return $this->showFile($fileid); - } catch (NotFoundException $e) { - $fileNotFound = true; - } + return $this->showFile($fileid); } $nav = new \OCP\Template('files', 'appnavigation', ''); @@ -248,7 +245,6 @@ class ViewController extends Controller { $params['defaultFileSortingDirection'] = $this->config->getUserValue($user, 'files', 'file_sorting_direction', 'asc'); $showHidden = (bool) $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', false); $params['showHiddenFiles'] = $showHidden ? 1 : 0; - $params['fileNotFound'] = $fileNotFound ? 1 : 0; $params['appNavigation'] = $nav; $params['appContents'] = $contentItems; $this->navigationManager->setActiveEntry('files_index'); @@ -269,37 +265,40 @@ class ViewController extends Controller { * Redirects to the file list and highlight the given file id * * @param string $fileId file id to show - * @return RedirectResponse redirect response or not found response - * @throws \OCP\Files\NotFoundException + * @return Response redirect response or not found response * * @NoCSRFRequired * @NoAdminRequired */ public function showFile($fileId) { - $uid = $this->userSession->getUser()->getUID(); - $baseFolder = $this->rootFolder->get($uid . '/files/'); - $files = $baseFolder->getById($fileId); - $params = []; - - if (empty($files) && $this->appManager->isEnabledForUser('files_trashbin')) { - $baseFolder = $this->rootFolder->get($uid . '/files_trashbin/files/'); + try { + $uid = $this->userSession->getUser()->getUID(); + $baseFolder = $this->rootFolder->get($uid . '/files/'); $files = $baseFolder->getById($fileId); - $params['view'] = 'trashbin'; - } + $params = []; + + if (empty($files) && $this->appManager->isEnabledForUser('files_trashbin')) { + $baseFolder = $this->rootFolder->get($uid . '/files_trashbin/files/'); + $files = $baseFolder->getById($fileId); + $params['view'] = 'trashbin'; + } - if (!empty($files)) { - $file = current($files); - if ($file instanceof Folder) { - // set the full path to enter the folder - $params['dir'] = $baseFolder->getRelativePath($file->getPath()); - } else { - // set parent path as dir - $params['dir'] = $baseFolder->getRelativePath($file->getParent()->getPath()); - // and scroll to the entry - $params['scrollto'] = $file->getName(); + if (!empty($files)) { + $file = current($files); + if ($file instanceof Folder) { + // set the full path to enter the folder + $params['dir'] = $baseFolder->getRelativePath($file->getPath()); + } else { + // set parent path as dir + $params['dir'] = $baseFolder->getRelativePath($file->getParent()->getPath()); + // and scroll to the entry + $params['scrollto'] = $file->getName(); + } + return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', $params)); } - return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', $params)); + } catch (\OCP\Files\NotFoundException $e) { + return new NotFoundResponse(); } - throw new \OCP\Files\NotFoundException(); + return new NotFoundResponse(); } } diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index 42ce941a4a5..7281edd3aec 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -14,7 +14,6 @@ - diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php index 34c40ecea5c..049f44fc0af 100644 --- a/apps/files/tests/Controller/ViewControllerTest.php +++ b/apps/files/tests/Controller/ViewControllerTest.php @@ -26,7 +26,6 @@ namespace OCA\Files\Tests\Controller; use OCA\Files\Controller\ViewController; use OCP\AppFramework\Http; -use OCP\Files\NotFoundException; use OCP\IUser; use OCP\Template; use Test\TestCase; @@ -260,8 +259,7 @@ class ViewControllerTest extends TestCase { 'isPublic' => false, 'defaultFileSorting' => 'name', 'defaultFileSortingDirection' => 'asc', - 'showHiddenFiles' => 0, - 'fileNotFound' => 0, + 'showHiddenFiles' => false, 'mailNotificationEnabled' => 'no', 'mailPublicNotificationEnabled' => 'no', 'allowShareWithLink' => 'yes', @@ -412,14 +410,11 @@ class ViewControllerTest extends TestCase { ->with(123) ->will($this->returnValue([])); + $expected = new Http\NotFoundResponse(); if ($useShowFile) { - $this->setExpectedException('OCP\Files\NotFoundException'); - $this->viewController->showFile(123); + $this->assertEquals($expected, $this->viewController->showFile(123)); } else { - $response = $this->viewController->index('MyDir', 'MyView', '123'); - $this->assertInstanceOf('OCP\AppFramework\Http\TemplateResponse', $response); - $params = $response->getParams(); - $this->assertEquals(1, $params['fileNotFound']); + $this->assertEquals($expected, $this->viewController->index('/whatever', '', '123')); } } diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js index 68f183a36b3..9d3998d903b 100644 --- a/apps/files_external/l10n/pt_PT.js +++ b/apps/files_external/l10n/pt_PT.js @@ -7,13 +7,13 @@ OC.L10N.register( "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", "External storage" : "Armazenamento Externo", - "Dropbox App Configuration" : "Configuração da aplicação Dropbox", - "Google Drive App Configuration" : "Configuração da aplicação Google Drive", + "Dropbox App Configuration" : "Configuração da app Dropbox", + "Google Drive App Configuration" : "Configuração da app Google Drive", "Personal" : "Pessoal", "System" : "Sistema", "Grant access" : "Conceder acesso", - "Error configuring OAuth1" : "Erro ao configurar OAuth1", - "Error configuring OAuth2" : "Erro ao configurar OAuth2", + "Error configuring OAuth1" : "Erro de configuração OAuth1", + "Error configuring OAuth2" : "Erro de configuração OAuth2", "Generate keys" : "Gerar chaves", "Error generating key pair" : "Erro ao gerar chave par", "All users. Type to select user or group." : "Todos os utilizadores. Digite para selecionar o utilizador ou grupo.", @@ -27,14 +27,14 @@ OC.L10N.register( "Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}", "There was an error with message: " : "Houve um erro com a mensagem:", "External mount error" : "Erro de montagem externa", - "external-storage" : "armazenamento externo", + "external-storage" : "Armazenamento Externo", "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação", "Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}", "Username" : "Nome de utilizador", "Password" : "Palavra-passe", "Credentials saved" : "Credenciais guardadas", - "Credentials saving failed" : "Falha ao guardar as credenciais", + "Credentials saving failed" : "Falha ao salvar credenciais", "Credentials required" : "Credenciais necessárias", "Save" : "Guardar", "Storage with id \"%i\" not found" : "Não foi encontrado o armazenamento com a id. \"%i\"", @@ -49,7 +49,7 @@ OC.L10N.register( "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", "Storage with id \"%i\" is not user editable" : "Armazenamento com id \"%i\" não é editável pelo utilizador", - "Access key" : "Chave de acesso", + "Access key" : "Código de acesso", "Secret key" : "Código secreto", "Builtin" : "Integrado", "None" : "Nenhum", diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json index 93922c67762..fab0f05a830 100644 --- a/apps/files_external/l10n/pt_PT.json +++ b/apps/files_external/l10n/pt_PT.json @@ -5,13 +5,13 @@ "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", "External storage" : "Armazenamento Externo", - "Dropbox App Configuration" : "Configuração da aplicação Dropbox", - "Google Drive App Configuration" : "Configuração da aplicação Google Drive", + "Dropbox App Configuration" : "Configuração da app Dropbox", + "Google Drive App Configuration" : "Configuração da app Google Drive", "Personal" : "Pessoal", "System" : "Sistema", "Grant access" : "Conceder acesso", - "Error configuring OAuth1" : "Erro ao configurar OAuth1", - "Error configuring OAuth2" : "Erro ao configurar OAuth2", + "Error configuring OAuth1" : "Erro de configuração OAuth1", + "Error configuring OAuth2" : "Erro de configuração OAuth2", "Generate keys" : "Gerar chaves", "Error generating key pair" : "Erro ao gerar chave par", "All users. Type to select user or group." : "Todos os utilizadores. Digite para selecionar o utilizador ou grupo.", @@ -25,14 +25,14 @@ "Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}", "There was an error with message: " : "Houve um erro com a mensagem:", "External mount error" : "Erro de montagem externa", - "external-storage" : "armazenamento externo", + "external-storage" : "Armazenamento Externo", "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação", "Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}", "Username" : "Nome de utilizador", "Password" : "Palavra-passe", "Credentials saved" : "Credenciais guardadas", - "Credentials saving failed" : "Falha ao guardar as credenciais", + "Credentials saving failed" : "Falha ao salvar credenciais", "Credentials required" : "Credenciais necessárias", "Save" : "Guardar", "Storage with id \"%i\" not found" : "Não foi encontrado o armazenamento com a id. \"%i\"", @@ -47,7 +47,7 @@ "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", "Storage with id \"%i\" is not user editable" : "Armazenamento com id \"%i\" não é editável pelo utilizador", - "Access key" : "Chave de acesso", + "Access key" : "Código de acesso", "Secret key" : "Código secreto", "Builtin" : "Integrado", "None" : "Nenhum", diff --git a/apps/files_external/lib/Lib/Storage/Google.php b/apps/files_external/lib/Lib/Storage/Google.php index 49fde7d066f..2a1ff768e2c 100644 --- a/apps/files_external/lib/Lib/Storage/Google.php +++ b/apps/files_external/lib/Lib/Storage/Google.php @@ -97,9 +97,6 @@ class Google extends \OC\Files\Storage\Common { private function getDriveFile($path) { // Remove leading and trailing slashes $path = trim($path, '/'); - if ($path === '.') { - $path = ''; - } if (isset($this->driveFiles[$path])) { return $this->driveFiles[$path]; } else if ($path === '') { @@ -141,7 +138,7 @@ class Google extends \OC\Files\Storage\Common { if ($pos !== false) { $pathWithoutExt = substr($path, 0, $pos); $file = $this->getDriveFile($pathWithoutExt); - if ($file && $this->isGoogleDocFile($file)) { + if ($file) { // Switch cached Google_Service_Drive_DriveFile to the correct index unset($this->driveFiles[$pathWithoutExt]); $this->driveFiles[$path] = $file; @@ -211,17 +208,6 @@ class Google extends \OC\Files\Storage\Common { } } - /** - * Returns whether the given drive file is a Google Doc file - * - * @param \Google_Service_Drive_DriveFile - * - * @return true if the file is a Google Doc file, false otherwise - */ - private function isGoogleDocFile($file) { - return $this->getGoogleDocExtension($file->getMimeType()) !== ''; - } - public function mkdir($path) { if (!$this->is_dir($path)) { $parentFolder = $this->getDriveFile(dirname($path)); diff --git a/apps/files_external/tests/Storage/GoogleTest.php b/apps/files_external/tests/Storage/GoogleTest.php index eb19cc463b1..7684fec8429 100644 --- a/apps/files_external/tests/Storage/GoogleTest.php +++ b/apps/files_external/tests/Storage/GoogleTest.php @@ -60,13 +60,4 @@ class GoogleTest extends \Test\Files\Storage\Storage { parent::tearDown(); } - - public function testSameNameAsFolderWithExtension() { - $this->assertTrue($this->instance->mkdir('testsamename')); - $this->assertEquals(13, $this->instance->file_put_contents('testsamename.txt', 'some contents')); - $this->assertEquals('some contents', $this->instance->file_get_contents('testsamename.txt')); - $this->assertTrue($this->instance->is_dir('testsamename')); - $this->assertTrue($this->instance->unlink('testsamename.txt')); - $this->assertTrue($this->instance->rmdir('testsamename')); - } } diff --git a/apps/files_sharing/lib/Cache.php b/apps/files_sharing/lib/Cache.php index a0519cadbaa..82d885a8ef3 100644 --- a/apps/files_sharing/lib/Cache.php +++ b/apps/files_sharing/lib/Cache.php @@ -81,7 +81,7 @@ class Cache extends CacheJail { } protected function formatCacheEntry($entry) { - $path = isset($entry['path']) ? $entry['path'] : ''; + $path = $entry['path']; $entry = parent::formatCacheEntry($entry); $sharePermissions = $this->storage->getPermissions($path); if (isset($entry['permissions'])) { diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index b5b5e416884..965c4d36cad 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -415,22 +415,4 @@ class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage { return $this->sourceStorage; } - public function file_get_contents($path) { - $info = [ - 'target' => $this->getMountPoint() . '/' . $path, - 'source' => $this->getSourcePath($path), - ]; - \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_get_contents', $info); - return parent::file_get_contents($path); - } - - public function file_put_contents($path, $data) { - $info = [ - 'target' => $this->getMountPoint() . '/' . $path, - 'source' => $this->getSourcePath($path), - ]; - \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_put_contents', $info); - return parent::file_put_contents($path, $data); - } - } diff --git a/apps/systemtags/l10n/fr.js b/apps/systemtags/l10n/fr.js index 387bc45643c..93c7d364b24 100644 --- a/apps/systemtags/l10n/fr.js +++ b/apps/systemtags/l10n/fr.js @@ -7,20 +7,20 @@ OC.L10N.register( "Please select tags to filter by" : "Veuillez sélectionner les étiquettes par lesquelles filtrer", "No files found for the selected tags" : "Aucun fichier pour les étiquettes sélectionnées", "System tags for a file have been modified" : "Les étiquettes systèmes pour un fichier ont été modifiées", - "You assigned system tag %3$s" : "Vous avez attribué l'étiquette collaborative %3$s", + "You assigned system tag %3$s" : "Vous avez attribué l'étiquette système %3$s", "%1$s assigned system tag %3$s" : "%1$s a attribué l'étiquette système %3$s", - "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette collaborative %3$s", + "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette système %3$s", "%1$s unassigned system tag %3$s" : "%1$s a retiré l'étiquette système %3$s", - "You created system tag %2$s" : "Vous avez créé l'étiquette collaborative %2$s", + "You created system tag %2$s" : "Vous avez créé l'étiquette système %2$s", "%1$s created system tag %2$s" : "%1$s a créé l'étiquette système %2$s", - "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette collaborative %2$s", - "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette collaborative %2$s", - "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette collaborative %3$s en %2$s", - "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette collaborative %3$s en %2$s", - "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette collaborative %3$s à %2$s", - "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette collaborative %3$s à %2$s", - "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette collaborative %3$s à %2$s", - "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette collaborative %3$s à %2$s", + "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette système %2$s", + "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette système %2$s", + "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette système %3$s en %2$s", + "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette système %3$s en %2$s", + "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette système %3$s à %2$s", + "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette système %3$s à %2$s", + "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette système %3$s de %2$s", + "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette système %3$s à %2$s", "%s (restricted)" : "%s (restreint)", "%s (invisible)" : "%s (invisible)", "No files in here" : "Aucun fichier", diff --git a/apps/systemtags/l10n/fr.json b/apps/systemtags/l10n/fr.json index 66b4d246dac..94254c93ab0 100644 --- a/apps/systemtags/l10n/fr.json +++ b/apps/systemtags/l10n/fr.json @@ -5,20 +5,20 @@ "Please select tags to filter by" : "Veuillez sélectionner les étiquettes par lesquelles filtrer", "No files found for the selected tags" : "Aucun fichier pour les étiquettes sélectionnées", "System tags for a file have been modified" : "Les étiquettes systèmes pour un fichier ont été modifiées", - "You assigned system tag %3$s" : "Vous avez attribué l'étiquette collaborative %3$s", + "You assigned system tag %3$s" : "Vous avez attribué l'étiquette système %3$s", "%1$s assigned system tag %3$s" : "%1$s a attribué l'étiquette système %3$s", - "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette collaborative %3$s", + "You unassigned system tag %3$s" : "Vous avez retiré l'étiquette système %3$s", "%1$s unassigned system tag %3$s" : "%1$s a retiré l'étiquette système %3$s", - "You created system tag %2$s" : "Vous avez créé l'étiquette collaborative %2$s", + "You created system tag %2$s" : "Vous avez créé l'étiquette système %2$s", "%1$s created system tag %2$s" : "%1$s a créé l'étiquette système %2$s", - "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette collaborative %2$s", - "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette collaborative %2$s", - "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette collaborative %3$s en %2$s", - "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette collaborative %3$s en %2$s", - "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette collaborative %3$s à %2$s", - "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette collaborative %3$s à %2$s", - "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette collaborative %3$s à %2$s", - "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette collaborative %3$s à %2$s", + "You deleted system tag %2$s" : "Vous avez supprimé l'étiquette système %2$s", + "%1$s deleted system tag %2$s" : "%1$s a supprimé l'étiquette système %2$s", + "You updated system tag %3$s to %2$s" : "Vous avez renommé l'étiquette système %3$s en %2$s", + "%1$s updated system tag %3$s to %2$s" : "%1$s a renommé l'étiquette système %3$s en %2$s", + "You assigned system tag %3$s to %2$s" : "Vous avez attribué l'étiquette système %3$s à %2$s", + "%1$s assigned system tag %3$s to %2$s" : "%1$s a attribué l'étiquette système %3$s à %2$s", + "You unassigned system tag %3$s from %2$s" : "Vous avez retiré l'étiquette système %3$s de %2$s", + "%1$s unassigned system tag %3$s from %2$s" : "%1$s a retiré l'étiquette système %3$s à %2$s", "%s (restricted)" : "%s (restreint)", "%s (invisible)" : "%s (invisible)", "No files in here" : "Aucun fichier", diff --git a/build/integration/features/bootstrap/BasicStructure.php b/build/integration/features/bootstrap/BasicStructure.php index 9248b2cd252..b8fb516fada 100644 --- a/build/integration/features/bootstrap/BasicStructure.php +++ b/build/integration/features/bootstrap/BasicStructure.php @@ -260,17 +260,6 @@ trait BasicStructure { } } - /** - * @Given User :user modifies text of :filename with text :text - * @param string $user - * @param string $filename - * @param string $text - */ - public function modifyTextOfFile($user, $filename, $text) { - self::removeFile("../../data/$user/files", "$filename"); - file_put_contents("../../data/$user/files" . "$filename", "$text"); - } - /** * @BeforeSuite */ diff --git a/build/integration/features/bootstrap/FederationContext.php b/build/integration/features/bootstrap/FederationContext.php index 55f3a55da0d..2809c6974fa 100644 --- a/build/integration/features/bootstrap/FederationContext.php +++ b/build/integration/features/bootstrap/FederationContext.php @@ -12,7 +12,7 @@ require __DIR__ . '/../../vendor/autoload.php'; */ class FederationContext implements Context, SnippetAcceptingContext { - use WebDav; + use Sharing; /** * @Given /^User "([^"]*)" from server "(LOCAL|REMOTE)" shares "([^"]*)" with user "([^"]*)" from server "(LOCAL|REMOTE)"$/ diff --git a/build/integration/federation_features/federated.feature b/build/integration/federation_features/federated.feature index 8bf8e921b0f..acd1f91e908 100644 --- a/build/integration/federation_features/federated.feature +++ b/build/integration/federation_features/federated.feature @@ -120,67 +120,6 @@ Feature: federated | share_with | user2 | | share_with_displayname | user2 | - Scenario: Overwrite a federated shared file as recipient - Given Using server "REMOTE" - And user "user1" exists - And user "user2" exists - And Using server "LOCAL" - And user "user0" exists - And User "user0" from server "LOCAL" shares "/textfile0.txt" with user "user1" from server "REMOTE" - And User "user1" from server "REMOTE" accepts last pending share - And Using server "REMOTE" - And As an "user1" - And User "user1" modifies text of "/textfile0.txt" with text "BLABLABLA" - When User "user1" uploads file "../../data/user1/files/textfile0.txt" to "/textfile0 (2).txt" - And Downloading file "/textfile0 (2).txt" with range "bytes=0-8" - Then Downloaded content should be "BLABLABLA" - - Scenario: Overwrite a federated shared folder as recipient - Given Using server "REMOTE" - And user "user1" exists - And user "user2" exists - And Using server "LOCAL" - And user "user0" exists - And User "user0" from server "LOCAL" shares "/PARENT" with user "user1" from server "REMOTE" - And User "user1" from server "REMOTE" accepts last pending share - And Using server "REMOTE" - And As an "user1" - And User "user1" modifies text of "/textfile0.txt" with text "BLABLABLA" - When User "user1" uploads file "../../data/user1/files/textfile0.txt" to "/PARENT (2)/textfile0.txt" - And Downloading file "/PARENT (2)/textfile0.txt" with range "bytes=0-8" - Then Downloaded content should be "BLABLABLA" - - Scenario: Overwrite a federated shared file as recipient using old chunking - Given Using server "REMOTE" - And user "user1" exists - And user "user2" exists - And Using server "LOCAL" - And user "user0" exists - And User "user0" from server "LOCAL" shares "/textfile0.txt" with user "user1" from server "REMOTE" - And User "user1" from server "REMOTE" accepts last pending share - And Using server "REMOTE" - And As an "user1" - And user "user1" uploads chunk file "1" of "3" with "AAAAA" to "/textfile0 (2).txt" - And user "user1" uploads chunk file "2" of "3" with "BBBBB" to "/textfile0 (2).txt" - And user "user1" uploads chunk file "3" of "3" with "CCCCC" to "/textfile0 (2).txt" - When Downloading file "/textfile0 (2).txt" with range "bytes=0-4" - Then Downloaded content should be "AAAAA" - - Scenario: Overwrite a federated shared folder as recipient using old chunking - Given Using server "REMOTE" - And user "user1" exists - And user "user2" exists - And Using server "LOCAL" - And user "user0" exists - And User "user0" from server "LOCAL" shares "/PARENT" with user "user1" from server "REMOTE" - And User "user1" from server "REMOTE" accepts last pending share - And Using server "REMOTE" - And As an "user1" - And user "user1" uploads chunk file "1" of "3" with "AAAAA" to "/PARENT (2)/textfile0.txt" - And user "user1" uploads chunk file "2" of "3" with "BBBBB" to "/PARENT (2)/textfile0.txt" - And user "user1" uploads chunk file "3" of "3" with "CCCCC" to "/PARENT (2)/textfile0.txt" - When Downloading file "/PARENT (2)/textfile0.txt" with range "bytes=3-13" - Then Downloaded content should be "AABBBBBCCCC" diff --git a/core/Application.php b/core/Application.php index a87917b626a..25e2fa76273 100644 --- a/core/Application.php +++ b/core/Application.php @@ -120,8 +120,7 @@ class Application extends App { $c->query('AppName'), $c->query('Request'), $c->query('UserManager'), - $c->query('ServerContainer')->query('OC\Authentication\Token\IProvider'), - $c->query('TwoFactorAuthManager'), + $c->query('OC\Authentication\Token\DefaultTokenProvider'), $c->query('SecureRandom') ); }); diff --git a/core/Command/Encryption/DecryptAll.php b/core/Command/Encryption/DecryptAll.php index d060918a506..8d7d26f3d23 100644 --- a/core/Command/Encryption/DecryptAll.php +++ b/core/Command/Encryption/DecryptAll.php @@ -111,8 +111,7 @@ class DecryptAll extends Command { $this->addArgument( 'user', InputArgument::OPTIONAL, - 'user for which you want to decrypt all files (optional)', - '' + 'user for which you want to decrypt all files (optional)' ); } @@ -128,16 +127,8 @@ class DecryptAll extends Command { return; } - $uid = $input->getArgument('user'); - //FIXME WHEN https://github.com/owncloud/core/issues/24994 is fixed - if ($uid === null) { - $message = 'your ownCloud'; - } else { - $message = "$uid's account"; - } - $output->writeln("\n"); - $output->writeln("You are about to start to decrypt all files stored in $message."); + $output->writeln('You are about to start to decrypt all files stored in your ownCloud.'); $output->writeln('It will depend on the encryption module and your setup if this is possible.'); $output->writeln('Depending on the number and size of your files this can take some time'); $output->writeln('Please make sure that no user access his files during this process!'); @@ -149,7 +140,6 @@ class DecryptAll extends Command { $result = $this->decryptAll->decryptAll($input, $output, $user); if ($result === false) { $output->writeln(' aborted.'); - $output->writeln('Server side encryption remains enabled'); $this->config->setAppValue('core', 'encryption_enabled', 'yes'); } $this->resetSingleUserAndTrashbin(); diff --git a/core/Controller/TokenController.php b/core/Controller/TokenController.php index 13b1db9044a..42cc29bad10 100644 --- a/core/Controller/TokenController.php +++ b/core/Controller/TokenController.php @@ -1,5 +1,4 @@ * @@ -24,27 +23,22 @@ namespace OC\Core\Controller; use OC\AppFramework\Http; use OC\Authentication\Token\DefaultTokenProvider; -use OC\Authentication\Token\IProvider; use OC\Authentication\Token\IToken; -use OC\Authentication\TwoFactorAuth\Manager as TwoFactorAuthManager; -use OC\User\Manager as UserManager; -use OCA\User_LDAP\User\Manager; +use OC\User\Manager; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\Response; use OCP\IRequest; use OCP\Security\ISecureRandom; class TokenController extends Controller { - /** @var UserManager */ + /** @var Manager */ private $userManager; - /** @var IProvider */ + /** @var DefaultTokenProvider */ private $tokenProvider; - /** @var TwoFactorAuthManager */ - private $twoFactorAuthManager; - /** @var ISecureRandom */ private $secureRandom; @@ -55,12 +49,12 @@ class TokenController extends Controller { * @param DefaultTokenProvider $tokenProvider * @param ISecureRandom $secureRandom */ - public function __construct($appName, IRequest $request, UserManager $userManager, IProvider $tokenProvider, TwoFactorAuthManager $twoFactorAuthManager, ISecureRandom $secureRandom) { + public function __construct($appName, IRequest $request, Manager $userManager, DefaultTokenProvider $tokenProvider, + ISecureRandom $secureRandom) { parent::__construct($appName, $request); $this->userManager = $userManager; $this->tokenProvider = $tokenProvider; $this->secureRandom = $secureRandom; - $this->twoFactorAuthManager = $twoFactorAuthManager; } /** @@ -76,26 +70,18 @@ class TokenController extends Controller { */ public function generateToken($user, $password, $name = 'unknown client') { if (is_null($user) || is_null($password)) { - $response = new JSONResponse(); + $response = new Response(); $response->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY); return $response; } - $loginName = $user; - $user = $this->userManager->checkPassword($loginName, $password); - if ($user === false) { - $response = new JSONResponse(); + $loginResult = $this->userManager->checkPassword($user, $password); + if ($loginResult === false) { + $response = new Response(); $response->setStatus(Http::STATUS_UNAUTHORIZED); return $response; } - - if ($this->twoFactorAuthManager->isTwoFactorAuthenticated($user)) { - $resp = new JSONResponse(); - $resp->setStatus(Http::STATUS_UNAUTHORIZED); - return $resp; - } - $token = $this->secureRandom->generate(128); - $this->tokenProvider->generateToken($token, $user->getUID(), $loginName, $password, $name, IToken::PERMANENT_TOKEN); + $this->tokenProvider->generateToken($token, $loginResult->getUID(), $user, $password, $name, IToken::PERMANENT_TOKEN); return [ 'token' => $token, ]; diff --git a/core/Controller/TwoFactorChallengeController.php b/core/Controller/TwoFactorChallengeController.php index edaf3378cd8..499898de3bc 100644 --- a/core/Controller/TwoFactorChallengeController.php +++ b/core/Controller/TwoFactorChallengeController.php @@ -61,13 +61,6 @@ class TwoFactorChallengeController extends Controller { $this->urlGenerator = $urlGenerator; } - /** - * @return string - */ - protected function getLogoutAttribute() { - return \OC_User::getLogoutAttribute(); - } - /** * @NoAdminRequired * @NoCSRFRequired @@ -82,7 +75,6 @@ class TwoFactorChallengeController extends Controller { $data = [ 'providers' => $providers, 'redirect_url' => $redirect_url, - 'logout_attribute' => $this->getLogoutAttribute(), ]; return new TemplateResponse($this->appName, 'twofactorselectchallenge', $data, 'guest'); } @@ -114,7 +106,6 @@ class TwoFactorChallengeController extends Controller { $data = [ 'error' => $error, 'provider' => $provider, - 'logout_attribute' => $this->getLogoutAttribute(), 'template' => $tmpl->fetchPage(), ]; return new TemplateResponse($this->appName, 'twofactorshowchallenge', $data, 'guest'); diff --git a/core/Middleware/TwoFactorMiddleware.php b/core/Middleware/TwoFactorMiddleware.php index 0bad8a2c40f..aa82897ad46 100644 --- a/core/Middleware/TwoFactorMiddleware.php +++ b/core/Middleware/TwoFactorMiddleware.php @@ -82,11 +82,6 @@ class TwoFactorMiddleware extends Middleware { return; } - if ($controller instanceof \OC\Core\Controller\LoginController && $methodName === 'logout') { - // Don't block the logout page, to allow canceling the 2FA - return; - } - if ($this->userSession->isLoggedIn()) { $user = $this->userSession->getUser(); diff --git a/core/css/styles.css b/core/css/styles.css index 475c4fa3fb3..df9509baa19 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -38,10 +38,6 @@ body { display: inline-block; } -a.two-factor-cancel { - color: #fff; -} - .float-spinner { height: 32px; display: none; diff --git a/core/templates/twofactorselectchallenge.php b/core/templates/twofactorselectchallenge.php index 4209beac4e6..14d599aab3e 100644 --- a/core/templates/twofactorselectchallenge.php +++ b/core/templates/twofactorselectchallenge.php @@ -18,5 +18,4 @@ - ->t('Cancel login')) ?> + \ No newline at end of file diff --git a/core/templates/twofactorshowchallenge.php b/core/templates/twofactorshowchallenge.php index c5ee9aca4b4..66f5ed312ec 100644 --- a/core/templates/twofactorshowchallenge.php +++ b/core/templates/twofactorshowchallenge.php @@ -17,4 +17,3 @@ $template = $_['template']; t('An error occured while verifying the token')); ?> ->t('Cancel login')) ?> diff --git a/lib/l10n/ar.js b/lib/l10n/ar.js index a7a3e4e4c31..21a67883ac3 100644 --- a/lib/l10n/ar.js +++ b/lib/l10n/ar.js @@ -1,46 +1,18 @@ OC.L10N.register( "lib", { - "Cannot write into \"config\" directory!" : "الكتابة في مجلد \"config\" غير ممكنة!", - "This can usually be fixed by giving the webserver write access to the config directory" : "يمكن حل هذا عادة بإعطاء خادم الوب صلاحية الكتابة في مجلد config", - "See %s" : "أنظر %s", - "Sample configuration detected" : "تم اكتشاف إعدادات عيّنة", - "PHP %s or higher is required." : "إصدار PHP %s أو أحدث منه مطلوب.", - "PHP with a version lower than %s is required." : "PHP الإصدار %s أو أقل مطلوب.", - "%sbit or higher PHP required." : "مكتبات PHP ذات %s بت أو أعلى مطلوبة.", - "Following databases are supported: %s" : "قواعد البيانات التالية مدعومة: %s", - "The command line tool %s could not be found" : "لم يتم العثور على أداة سطر الأوامر %s", - "The library %s is not available." : "مكتبة %s غير متوفرة.", "Unknown filetype" : "نوع الملف غير معروف", "Invalid image" : "الصورة غير صالحة", "today" : "اليوم", "yesterday" : "يوم أمس", - "_%n day ago_::_%n days ago_" : ["قبل ساعات","قبل يوم","قبل يومين","قبل %n يوماً","قبل %n يوماً","قبل %n يوماً"], "last month" : "الشهر الماضي", - "_%n month ago_::_%n months ago_" : ["قبل عدة أيام","قبل شهر","قبل شهرين","قبل %n شهراً","قبل %n شهراً","قبل %n شهراً"], "last year" : "السنةالماضية", "seconds ago" : "منذ ثواني", - "Empty filename is not allowed" : "لا يسمح بأسماء فارغة للملفات", - "4-byte characters are not supported in file names" : "المحارف ذات 4 بايت غير مسموح بها في أسماء الملفات", - "File name is a reserved word" : "اسم الملف كلمة محجوزة", - "File name contains at least one invalid character" : "اسم الملف به ، على الأقل ، حرف غير صالح", - "File name is too long" : "اسم الملف طويل جداً", "App directory already exists" : "مجلد التطبيق موجود مسبقا", "Can't create app folder. Please fix permissions. %s" : "لا يمكن إنشاء مجلد التطبيق. يرجى تعديل الصلاحيات. %s", - "Archive does not contain a directory named %s" : "الأرشيف لا يحتوي مجلداً اسمه %s", "No source specified when installing app" : "لم يتم تحديد المصدر عن تثبيت البرنامج", - "No href specified when installing app from http" : "لم يتم تحديد href عند تثبيت التطبيق من http", - "No path specified when installing app from local file" : "لم يتم تحديد مسار عند تثبيت التطبيق من ملف محلّي", "Archives of type %s are not supported" : "الأرشيفات من نوع %s غير مدعومة", - "Failed to open archive when installing app" : "فشل فتح الأرشيف أثناء تثبيت التطبيق", "App does not provide an info.xml file" : "التطبيق لا يتوفر على ملف info.xml", - "App cannot be installed because appinfo file cannot be read." : "لا يمكن تثبيت التطبيق لأن ملف appinfo غير ممكنة قراءته.", - "Signature could not get checked. Please contact the app developer and check your admin screen." : "لم يتم التحقق من التوقيع. فضلاً اتصل بمطوّر التطبيق و تحقق من شاشة الإدارة في حسابك.", - "App can't be installed because of not allowed code in the App" : "لم يتم تثبيت التطبيق لوجود شفرة غير مسموح بها في التطبيق", - "App can't be installed because it is not compatible with this version of ownCloud" : "لم يتم تثبيت التطبيق لأنه غير متوافق مع هذا الإصدار من ownCloud", - "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "لم يتم تثبيت التطبيق لأن به علامة true التي لايسمح بها في التطبيقات غير المشحونة", - "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "لم يتم تثبيت التطبيق لأن الإصدار في info.xml مختلف عن الإصدار المذكور في متجر التطبيقات", - "%s enter the database username and name." : "%s أدخِل اسم قاعدة البيانات واسم مستخدمها.", "%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.", "%s enter the database name." : "%s ادخل اسم فاعدة البيانات", "%s you may not use dots in the database name" : "%s لا يسمح لك باستخدام نقطه (.) في اسم قاعدة البيانات", @@ -51,20 +23,9 @@ OC.L10N.register( "You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.", "Offending command was: \"%s\", name: %s, password: %s" : "الأمر المخالف كان : \"%s\", اسم المستخدم : %s, كلمة المرور: %s", "PostgreSQL username and/or password not valid" : "اسم المستخدم / أو كلمة المرور الخاصة بـPostgreSQL غير صحيحة", - "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "نظام ماك الإصدار X غير مدعوم و %s لن يعمل بشكل صحيح على هذه المنصة. استخدمه على مسؤوليتك!", - "For the best results, please consider using a GNU/Linux server instead." : "فضلاً ضع في الاعتبار استخدام نظام GNU/Linux بدل الأنظمة الأخرى للحصول على أفضل النتائج.", - "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "فضلاً إحذف إعداد open_basedir من ملف php.ini لديك أو حوّل إلى PHP إصدار 64 بت.", "Set an admin username." : "اعداد اسم مستخدم للمدير", "Set an admin password." : "اعداد كلمة مرور للمدير", - "Can't create or write into the data directory %s" : "لا يمكن الإنشاء أو الكتابة في مجلد البيانات %s", - "Invalid Federated Cloud ID" : "معرّف سحابة الاتحاد غير صالح", "%s shared »%s« with you" : "%s شارك »%s« معك", - "%s via %s" : "%s عبر %s", - "Sharing %s failed, because the file does not exist" : "فشلت مشاركة %s فالملف غير موجود", - "You are not allowed to share %s" : "أنت غير مسموح لك أن تشارك %s", - "Sharing %s failed, because you can not share with yourself" : "فشلت مشاركة %s لأنك لايمكنك المشاركة مع نفسك", - "Sharing %s failed, because the user %s does not exist" : "فشلت مشاركة %s لأن المستخدم %s غير موجود", - "Share type %s is not valid for %s" : "مشاركة النوع %s غير صالحة لـ %s", "Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"", "Apps" : "التطبيقات", "A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح", diff --git a/lib/l10n/ar.json b/lib/l10n/ar.json index 86284a03538..eb91606bb52 100644 --- a/lib/l10n/ar.json +++ b/lib/l10n/ar.json @@ -1,44 +1,16 @@ { "translations": { - "Cannot write into \"config\" directory!" : "الكتابة في مجلد \"config\" غير ممكنة!", - "This can usually be fixed by giving the webserver write access to the config directory" : "يمكن حل هذا عادة بإعطاء خادم الوب صلاحية الكتابة في مجلد config", - "See %s" : "أنظر %s", - "Sample configuration detected" : "تم اكتشاف إعدادات عيّنة", - "PHP %s or higher is required." : "إصدار PHP %s أو أحدث منه مطلوب.", - "PHP with a version lower than %s is required." : "PHP الإصدار %s أو أقل مطلوب.", - "%sbit or higher PHP required." : "مكتبات PHP ذات %s بت أو أعلى مطلوبة.", - "Following databases are supported: %s" : "قواعد البيانات التالية مدعومة: %s", - "The command line tool %s could not be found" : "لم يتم العثور على أداة سطر الأوامر %s", - "The library %s is not available." : "مكتبة %s غير متوفرة.", "Unknown filetype" : "نوع الملف غير معروف", "Invalid image" : "الصورة غير صالحة", "today" : "اليوم", "yesterday" : "يوم أمس", - "_%n day ago_::_%n days ago_" : ["قبل ساعات","قبل يوم","قبل يومين","قبل %n يوماً","قبل %n يوماً","قبل %n يوماً"], "last month" : "الشهر الماضي", - "_%n month ago_::_%n months ago_" : ["قبل عدة أيام","قبل شهر","قبل شهرين","قبل %n شهراً","قبل %n شهراً","قبل %n شهراً"], "last year" : "السنةالماضية", "seconds ago" : "منذ ثواني", - "Empty filename is not allowed" : "لا يسمح بأسماء فارغة للملفات", - "4-byte characters are not supported in file names" : "المحارف ذات 4 بايت غير مسموح بها في أسماء الملفات", - "File name is a reserved word" : "اسم الملف كلمة محجوزة", - "File name contains at least one invalid character" : "اسم الملف به ، على الأقل ، حرف غير صالح", - "File name is too long" : "اسم الملف طويل جداً", "App directory already exists" : "مجلد التطبيق موجود مسبقا", "Can't create app folder. Please fix permissions. %s" : "لا يمكن إنشاء مجلد التطبيق. يرجى تعديل الصلاحيات. %s", - "Archive does not contain a directory named %s" : "الأرشيف لا يحتوي مجلداً اسمه %s", "No source specified when installing app" : "لم يتم تحديد المصدر عن تثبيت البرنامج", - "No href specified when installing app from http" : "لم يتم تحديد href عند تثبيت التطبيق من http", - "No path specified when installing app from local file" : "لم يتم تحديد مسار عند تثبيت التطبيق من ملف محلّي", "Archives of type %s are not supported" : "الأرشيفات من نوع %s غير مدعومة", - "Failed to open archive when installing app" : "فشل فتح الأرشيف أثناء تثبيت التطبيق", "App does not provide an info.xml file" : "التطبيق لا يتوفر على ملف info.xml", - "App cannot be installed because appinfo file cannot be read." : "لا يمكن تثبيت التطبيق لأن ملف appinfo غير ممكنة قراءته.", - "Signature could not get checked. Please contact the app developer and check your admin screen." : "لم يتم التحقق من التوقيع. فضلاً اتصل بمطوّر التطبيق و تحقق من شاشة الإدارة في حسابك.", - "App can't be installed because of not allowed code in the App" : "لم يتم تثبيت التطبيق لوجود شفرة غير مسموح بها في التطبيق", - "App can't be installed because it is not compatible with this version of ownCloud" : "لم يتم تثبيت التطبيق لأنه غير متوافق مع هذا الإصدار من ownCloud", - "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "لم يتم تثبيت التطبيق لأن به علامة true التي لايسمح بها في التطبيقات غير المشحونة", - "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "لم يتم تثبيت التطبيق لأن الإصدار في info.xml مختلف عن الإصدار المذكور في متجر التطبيقات", - "%s enter the database username and name." : "%s أدخِل اسم قاعدة البيانات واسم مستخدمها.", "%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.", "%s enter the database name." : "%s ادخل اسم فاعدة البيانات", "%s you may not use dots in the database name" : "%s لا يسمح لك باستخدام نقطه (.) في اسم قاعدة البيانات", @@ -49,20 +21,9 @@ "You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.", "Offending command was: \"%s\", name: %s, password: %s" : "الأمر المخالف كان : \"%s\", اسم المستخدم : %s, كلمة المرور: %s", "PostgreSQL username and/or password not valid" : "اسم المستخدم / أو كلمة المرور الخاصة بـPostgreSQL غير صحيحة", - "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "نظام ماك الإصدار X غير مدعوم و %s لن يعمل بشكل صحيح على هذه المنصة. استخدمه على مسؤوليتك!", - "For the best results, please consider using a GNU/Linux server instead." : "فضلاً ضع في الاعتبار استخدام نظام GNU/Linux بدل الأنظمة الأخرى للحصول على أفضل النتائج.", - "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "فضلاً إحذف إعداد open_basedir من ملف php.ini لديك أو حوّل إلى PHP إصدار 64 بت.", "Set an admin username." : "اعداد اسم مستخدم للمدير", "Set an admin password." : "اعداد كلمة مرور للمدير", - "Can't create or write into the data directory %s" : "لا يمكن الإنشاء أو الكتابة في مجلد البيانات %s", - "Invalid Federated Cloud ID" : "معرّف سحابة الاتحاد غير صالح", "%s shared »%s« with you" : "%s شارك »%s« معك", - "%s via %s" : "%s عبر %s", - "Sharing %s failed, because the file does not exist" : "فشلت مشاركة %s فالملف غير موجود", - "You are not allowed to share %s" : "أنت غير مسموح لك أن تشارك %s", - "Sharing %s failed, because you can not share with yourself" : "فشلت مشاركة %s لأنك لايمكنك المشاركة مع نفسك", - "Sharing %s failed, because the user %s does not exist" : "فشلت مشاركة %s لأن المستخدم %s غير موجود", - "Share type %s is not valid for %s" : "مشاركة النوع %s غير صالحة لـ %s", "Could not find category \"%s\"" : "تعذر العثور على المجلد \"%s\"", "Apps" : "التطبيقات", "A valid username must be provided" : "يجب ادخال اسم مستخدم صحيح", diff --git a/lib/l10n/ro.js b/lib/l10n/ro.js index de13cd796d6..5c5b7844cf7 100644 --- a/lib/l10n/ro.js +++ b/lib/l10n/ro.js @@ -29,7 +29,6 @@ OC.L10N.register( "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulul cu id-ul %s nu există. Activează-l în setările tale de aplicație sau contactează-ți administratorul.", "Empty filename is not allowed" : "Nu este permis fișier fără nume", "Dot files are not allowed" : "Fișierele care încep cu caracterul punct nu sunt permise", - "4-byte characters are not supported in file names" : "Caracterele stocate în 4 octeți nu sunt suportate în denumirile fișierelor", "File name is a reserved word" : "Numele fișierului este un cuvânt rezervat", "File name contains at least one invalid character" : "Numele fișierului conține măcar un caracter invalid", "File name is too long" : "Numele fișierului este prea lung", @@ -37,8 +36,6 @@ OC.L10N.register( "Can't create app folder. Please fix permissions. %s" : "Nu se poate crea directorul de aplicație. Repară permisiunile. %s", "Archive does not contain a directory named %s" : "Arhiva nu conține vreun director cu numele %s", "No source specified when installing app" : "Nu a fost specificată vreo sursă la instalarea aplicației", - "No href specified when installing app from http" : "Nu s-a specificat adresa la instalarea aplicației dintr-o sursă de pe Internet", - "No path specified when installing app from local file" : "Nu s-a specificat vreo cale la instalarea aplicației de pe un fișier local", "Archives of type %s are not supported" : "Arhivele de tip %s nu sunt suportate", "Failed to open archive when installing app" : "Deschiderea arhivei a eșuat în timpul instalării aplicației", "App does not provide an info.xml file" : "Aplicația nu furnizează un fișier info.xml", @@ -54,12 +51,10 @@ OC.L10N.register( "DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"", "Offending command was: \"%s\"" : "Comanda cauză a fost: \"%s\"", "PostgreSQL username and/or password not valid" : "Nume utilizator și/sau parolă PostgreSQL greșită", - "For the best results, please consider using a GNU/Linux server instead." : "Pentru cele mai bune rezultate, ia în calcul folosirea unui server care rulează un sistem de operare GNU/Linux.", "Set an admin username." : "Setează un nume de administrator.", "Set an admin password." : "Setează o parolă de administrator.", "Invalid Federated Cloud ID" : "ID invalid cloud federalizat", "%s shared »%s« with you" : "%s Partajat »%s« cu tine de", - "%s via %s" : "%s via %s", "You are not allowed to share %s" : "Nu există permisiunea de partajare %s", "Sharing %s failed, because this item is already shared with %s" : "Partajarea %s a eșuat deoarece acest element este deja partajat cu %s", "Not allowed to create a federated share with the same user" : "Nu este permisă crearea unei partajări federalizate cu acelaşi utilizator", diff --git a/lib/l10n/ro.json b/lib/l10n/ro.json index 9149650a015..566f6d01123 100644 --- a/lib/l10n/ro.json +++ b/lib/l10n/ro.json @@ -27,7 +27,6 @@ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulul cu id-ul %s nu există. Activează-l în setările tale de aplicație sau contactează-ți administratorul.", "Empty filename is not allowed" : "Nu este permis fișier fără nume", "Dot files are not allowed" : "Fișierele care încep cu caracterul punct nu sunt permise", - "4-byte characters are not supported in file names" : "Caracterele stocate în 4 octeți nu sunt suportate în denumirile fișierelor", "File name is a reserved word" : "Numele fișierului este un cuvânt rezervat", "File name contains at least one invalid character" : "Numele fișierului conține măcar un caracter invalid", "File name is too long" : "Numele fișierului este prea lung", @@ -35,8 +34,6 @@ "Can't create app folder. Please fix permissions. %s" : "Nu se poate crea directorul de aplicație. Repară permisiunile. %s", "Archive does not contain a directory named %s" : "Arhiva nu conține vreun director cu numele %s", "No source specified when installing app" : "Nu a fost specificată vreo sursă la instalarea aplicației", - "No href specified when installing app from http" : "Nu s-a specificat adresa la instalarea aplicației dintr-o sursă de pe Internet", - "No path specified when installing app from local file" : "Nu s-a specificat vreo cale la instalarea aplicației de pe un fișier local", "Archives of type %s are not supported" : "Arhivele de tip %s nu sunt suportate", "Failed to open archive when installing app" : "Deschiderea arhivei a eșuat în timpul instalării aplicației", "App does not provide an info.xml file" : "Aplicația nu furnizează un fișier info.xml", @@ -52,12 +49,10 @@ "DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"", "Offending command was: \"%s\"" : "Comanda cauză a fost: \"%s\"", "PostgreSQL username and/or password not valid" : "Nume utilizator și/sau parolă PostgreSQL greșită", - "For the best results, please consider using a GNU/Linux server instead." : "Pentru cele mai bune rezultate, ia în calcul folosirea unui server care rulează un sistem de operare GNU/Linux.", "Set an admin username." : "Setează un nume de administrator.", "Set an admin password." : "Setează o parolă de administrator.", "Invalid Federated Cloud ID" : "ID invalid cloud federalizat", "%s shared »%s« with you" : "%s Partajat »%s« cu tine de", - "%s via %s" : "%s via %s", "You are not allowed to share %s" : "Nu există permisiunea de partajare %s", "Sharing %s failed, because this item is already shared with %s" : "Partajarea %s a eșuat deoarece acest element este deja partajat cu %s", "Not allowed to create a federated share with the same user" : "Nu este permisă crearea unei partajări federalizate cu acelaşi utilizator", diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php index e082cea3305..6e99e1ac268 100644 --- a/lib/private/AllConfig.php +++ b/lib/private/AllConfig.php @@ -154,7 +154,7 @@ class AllConfig implements \OCP\IConfig { * * @param string $appName the appName that we want to store the value under * @param string $key the key of the value, under which will be saved - * @param string|float|int $value the value that should be stored + * @param string $value the value that should be stored */ public function setAppValue($appName, $key, $value) { \OC::$server->getAppConfig()->setValue($appName, $key, $value); @@ -198,16 +198,11 @@ class AllConfig implements \OCP\IConfig { * @param string $userId the userId of the user that we want to store the value under * @param string $appName the appName that we want to store the value under * @param string $key the key under which the value is being stored - * @param string|float|int $value the value that you want to store + * @param string $value the value that you want to store * @param string $preCondition only update if the config value was previously the value passed as $preCondition * @throws \OCP\PreConditionNotMetException if a precondition is specified and is not met - * @throws \UnexpectedValueException when trying to store an unexpected value */ public function setUserValue($userId, $appName, $key, $value, $preCondition = null) { - if (!is_int($value) && !is_float($value) && !is_string($value)) { - throw new \UnexpectedValueException('Only integers, floats and strings are allowed as value'); - } - // TODO - FIXME $this->fixDIInit(); diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php index f84c8a41f17..24542152ffc 100644 --- a/lib/private/AppConfig.php +++ b/lib/private/AppConfig.php @@ -143,7 +143,7 @@ class AppConfig implements IAppConfig { * * @param string $app app * @param string $key key - * @param string|float|int $value value + * @param string $value value * @return bool True if the value was inserted or updated, false if the value was the same */ public function setValue($app, $key, $value) { diff --git a/lib/private/Authentication/Token/DefaultTokenCleanupJob.php b/lib/private/Authentication/Token/DefaultTokenCleanupJob.php index 7746d6be915..04b98c6c5a0 100644 --- a/lib/private/Authentication/Token/DefaultTokenCleanupJob.php +++ b/lib/private/Authentication/Token/DefaultTokenCleanupJob.php @@ -28,7 +28,6 @@ class DefaultTokenCleanupJob extends Job { protected function run($argument) { /* @var $provider DefaultTokenProvider */ - // TODO: add OC\Authentication\Token\IProvider::invalidateOldTokens and query interface $provider = OC::$server->query('OC\Authentication\Token\DefaultTokenProvider'); $provider->invalidateOldTokens(); } diff --git a/lib/private/Encryption/DecryptAll.php b/lib/private/Encryption/DecryptAll.php index 34a3e1bff91..8676bc09575 100644 --- a/lib/private/Encryption/DecryptAll.php +++ b/lib/private/Encryption/DecryptAll.php @@ -80,7 +80,7 @@ class DecryptAll { $this->input = $input; $this->output = $output; - if ($user !== '' && $this->userManager->userExists($user) === false) { + if (!empty($user) && $this->userManager->userExists($user) === false) { $this->output->writeln('User "' . $user . '" does not exist. Please check the username and try again'); return false; } @@ -141,7 +141,7 @@ class DecryptAll { $this->output->writeln("\n"); $userList = []; - if ($user === '') { + if (empty($user)) { $fetchUsersProgress = new ProgressBar($this->output); $fetchUsersProgress->setFormat(" %message% \n [%bar%]"); diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php index c17f9bfd51b..e6bd118d5a5 100644 --- a/lib/private/Files/Cache/Scanner.php +++ b/lib/private/Files/Cache/Scanner.php @@ -38,7 +38,6 @@ use OC\Files\Filesystem; use OC\Hooks\BasicEmitter; use OCP\Config; use OCP\Files\Cache\IScanner; -use OCP\Files\ForbiddenException; use OCP\Files\Storage\ILockingStorage; use OCP\Lock\ILockingProvider; @@ -141,11 +140,7 @@ class Scanner extends BasicEmitter implements IScanner { } } - try { - $data = $this->getData($file); - } catch (ForbiddenException $e) { - return null; - } + $data = $this->getData($file); if ($data) { diff --git a/lib/private/Files/Cache/Updater.php b/lib/private/Files/Cache/Updater.php index 4e17c4d778d..820941abae1 100644 --- a/lib/private/Files/Cache/Updater.php +++ b/lib/private/Files/Cache/Updater.php @@ -231,10 +231,7 @@ class Updater implements IUpdater { $parentId = $this->cache->getParentId($internalPath); $parent = dirname($internalPath); if ($parentId != -1) { - $mtime = $this->storage->filemtime($parent); - if ($mtime !== false) { - $this->cache->update($parentId, array('storage_mtime' => $mtime)); - } + $this->cache->update($parentId, array('storage_mtime' => $this->storage->filemtime($parent))); } } } diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php index 0c1b69108d4..cec6a42a2c0 100644 --- a/lib/private/Files/Storage/Common.php +++ b/lib/private/Files/Storage/Common.php @@ -643,9 +643,6 @@ abstract class Common implements Storage, ILockingStorage { $data = []; $data['mimetype'] = $this->getMimeType($path); $data['mtime'] = $this->filemtime($path); - if ($data['mtime'] === false) { - $data['mtime'] = time(); - } if ($data['mimetype'] == 'httpd/unix-directory') { $data['size'] = -1; //unknown } else { diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php index 005b5f9ab91..b07e26a3358 100644 --- a/lib/private/Files/Storage/Local.php +++ b/lib/private/Files/Storage/Local.php @@ -33,31 +33,20 @@ */ namespace OC\Files\Storage; - -use OCP\Files\ForbiddenException; - /** * for local filestore, we only have to map the paths */ class Local extends \OC\Files\Storage\Common { protected $datadir; - protected $dataDirLength; - - protected $allowSymlinks = false; - - protected $realDataDir; - public function __construct($arguments) { if (!isset($arguments['datadir']) || !is_string($arguments['datadir'])) { throw new \InvalidArgumentException('No data directory set for local storage'); } $this->datadir = $arguments['datadir']; - $this->realDataDir = rtrim(realpath($this->datadir), '/') . '/'; if (substr($this->datadir, -1) !== '/') { $this->datadir .= '/'; } - $this->dataDirLength = strlen($this->realDataDir); } public function __destruct() { @@ -168,7 +157,7 @@ class Local extends \OC\Files\Storage\Common { public function filemtime($path) { clearstatcache($this->getSourcePath($path)); - return $this->file_exists($path) ? filemtime($this->getSourcePath($path)) : false; + return filemtime($this->getSourcePath($path)); } public function touch($path, $mtime = null) { @@ -199,7 +188,7 @@ class Local extends \OC\Files\Storage\Common { return ''; } - $handle = fopen($fileName, 'rb'); + $handle = fopen($fileName,'rb'); $content = fread($handle, $fileSize); fclose($handle); return $content; @@ -348,27 +337,10 @@ class Local extends \OC\Files\Storage\Common { * * @param string $path * @return string - * @throws ForbiddenException */ public function getSourcePath($path) { $fullPath = $this->datadir . $path; - if ($this->allowSymlinks || $path === '') { - return $fullPath; - } - $pathToResolve = $fullPath; - $realPath = realpath($pathToResolve); - while ($realPath === false) { // for non existing files check the parent directory - $pathToResolve = dirname($pathToResolve); - $realPath = realpath($pathToResolve); - } - if ($realPath) { - $realPath = $realPath . '/'; - } - if (substr($realPath, 0, $this->dataDirLength) === $this->realDataDir) { - return $fullPath; - } else { - throw new ForbiddenException("Following symlinks is not allowed ('$fullPath' -> '$realPath' not inside '{$this->realDataDir}')", false); - } + return $fullPath; } /** @@ -405,7 +377,7 @@ class Local extends \OC\Files\Storage\Common { * @return bool */ public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) { - if ($sourceStorage->instanceOfStorage('\OC\Files\Storage\Local')) { + if($sourceStorage->instanceOfStorage('\OC\Files\Storage\Local')){ /** * @var \OC\Files\Storage\Local $sourceStorage */ diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index e9daa123470..f738542ea8c 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -337,17 +337,10 @@ class View { return $this->removeMount($mount, $absolutePath); } if ($this->is_dir($path)) { - $result = $this->basicOperation('rmdir', $path, array('delete')); + return $this->basicOperation('rmdir', $path, array('delete')); } else { - $result = false; - } - - if (!$result && !$this->file_exists($path)) { //clear ghost files from the cache on delete - $storage = $mount->getStorage(); - $internalPath = $mount->getInternalPath($absolutePath); - $storage->getUpdater()->remove($internalPath); + return false; } - return $result; } /** @@ -436,7 +429,7 @@ class View { /** * @param string $path - * @param int $from + * @param int $from * @param int $to * @return bool|mixed * @throws \OCP\Files\InvalidPathException @@ -448,18 +441,18 @@ class View { $handle = $this->fopen($path, 'rb'); if ($handle) { if (fseek($handle, $from) === 0) { - $chunkSize = 8192; // 8 kB chunks - $end = $to + 1; - while (!feof($handle) && ftell($handle) < $end) { - $len = $end - ftell($handle); - if ($len > $chunkSize) { - $len = $chunkSize; - } - echo fread($handle, $len); - flush(); + $chunkSize = 8192; // 8 kB chunks + $end = $to + 1; + while (!feof($handle) && ftell($handle) < $end) { + $len = $end-ftell($handle); + if ($len > $chunkSize) { + $len = $chunkSize; } - $size = ftell($handle) - $from; - return $size; + echo fread($handle, $len); + flush(); + } + $size = ftell($handle) - $from; + return $size; } throw new \OCP\Files\UnseekableException('fseek error'); @@ -686,15 +679,7 @@ class View { if ($mount and $mount->getInternalPath($absolutePath) === '') { return $this->removeMount($mount, $absolutePath); } - $result = $this->basicOperation('unlink', $path, array('delete')); - if (!$result && !$this->file_exists($path)) { //clear ghost files from the cache on delete - $storage = $mount->getStorage(); - $internalPath = $mount->getInternalPath($absolutePath); - $storage->getUpdater()->remove($internalPath); - return true; - } else { - return $result; - } + return $this->basicOperation('unlink', $path, array('delete')); } /** diff --git a/lib/private/legacy/helper.php b/lib/private/legacy/helper.php index 21fb3cbc5ab..f107d47faf7 100644 --- a/lib/private/legacy/helper.php +++ b/lib/private/legacy/helper.php @@ -206,9 +206,7 @@ class OC_Helper { foreach ($files as $fileInfo) { /** @var SplFileInfo $fileInfo */ - if ($fileInfo->isLink()) { - unlink($fileInfo->getPathname()); - } else if ($fileInfo->isDir()) { + if ($fileInfo->isDir()) { rmdir($fileInfo->getRealPath()); } else { unlink($fileInfo->getRealPath()); diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php index 22fcdbbb205..1406e8a56d6 100644 --- a/lib/public/IAppConfig.php +++ b/lib/public/IAppConfig.php @@ -88,7 +88,7 @@ interface IAppConfig { * sets a value in the appconfig * @param string $app app * @param string $key key - * @param string|float|int $value value + * @param string $value value * @deprecated 8.0.0 use method setAppValue of \OCP\IConfig * * Sets a value. If the key did not exist before it will be created. diff --git a/lib/public/IConfig.php b/lib/public/IConfig.php index 05158e9063e..9e5024545b3 100644 --- a/lib/public/IConfig.php +++ b/lib/public/IConfig.php @@ -104,7 +104,7 @@ interface IConfig { * Writes a new app wide value * * @param string $appName the appName that we want to store the value under - * @param string|float|int $key the key of the value, under which will be saved + * @param string $key the key of the value, under which will be saved * @param string $value the value that should be stored * @return void * @since 6.0.0 @@ -149,7 +149,6 @@ interface IConfig { * @param string $value the value that you want to store * @param string $preCondition only update if the config value was previously the value passed as $preCondition * @throws \OCP\PreConditionNotMetException if a precondition is specified and is not met - * @throws \UnexpectedValueException when trying to store an unexpected value * @since 6.0.0 - parameter $precondition was added in 8.0.0 */ public function setUserValue($userId, $appName, $key, $value, $preCondition = null); diff --git a/settings/js/users/users.js b/settings/js/users/users.js index e0fccbd9539..03f471bc3b4 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -14,7 +14,7 @@ var UserList = { availableGroups: [], offset: 0, usersToLoad: 10, //So many users will be loaded when user scrolls down - initialUsersToLoad: 50, //initial number of users to load + initialUsersToLoad: 250, //initial number of users to load currentGid: '', filter: '', diff --git a/tests/Core/Controller/TokenControllerTest.php b/tests/Core/Controller/TokenControllerTest.php index b6b54b14fad..386140a8a4f 100644 --- a/tests/Core/Controller/TokenControllerTest.php +++ b/tests/Core/Controller/TokenControllerTest.php @@ -23,9 +23,8 @@ namespace Tests\Core\Controller; use OC\AppFramework\Http; -use OC\Authentication\Token\IToken; use OC\Core\Controller\TokenController; -use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\Response; use Test\TestCase; class TokenControllerTest extends TestCase { @@ -35,7 +34,6 @@ class TokenControllerTest extends TestCase { private $request; private $userManager; private $tokenProvider; - private $twoFactorAuthManager; private $secureRandom; protected function setUp() { @@ -45,17 +43,17 @@ class TokenControllerTest extends TestCase { $this->userManager = $this->getMockBuilder('\OC\User\Manager') ->disableOriginalConstructor() ->getMock(); - $this->tokenProvider = $this->getMock('\OC\Authentication\Token\IProvider'); - $this->twoFactorAuthManager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager') + $this->tokenProvider = $this->getMockBuilder('\OC\Authentication\Token\DefaultTokenProvider') ->disableOriginalConstructor() ->getMock(); $this->secureRandom = $this->getMock('\OCP\Security\ISecureRandom'); - $this->tokenController = new TokenController('core', $this->request, $this->userManager, $this->tokenProvider, $this->twoFactorAuthManager, $this->secureRandom); + $this->tokenController = new TokenController('core', $this->request, $this->userManager, $this->tokenProvider, + $this->secureRandom); } public function testWithoutCredentials() { - $expected = new JSONResponse(); + $expected = new Response(); $expected->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY); $actual = $this->tokenController->generateToken(null, null); @@ -68,7 +66,7 @@ class TokenControllerTest extends TestCase { ->method('checkPassword') ->with('john', 'passme') ->will($this->returnValue(false)); - $expected = new JSONResponse(); + $expected = new Response(); $expected->setStatus(Http::STATUS_UNAUTHORIZED); $actual = $this->tokenController->generateToken('john', 'passme'); @@ -85,17 +83,13 @@ class TokenControllerTest extends TestCase { $user->expects($this->once()) ->method('getUID') ->will($this->returnValue('john')); - $this->twoFactorAuthManager->expects($this->once()) - ->method('isTwoFactorAuthenticated') - ->with($user) - ->will($this->returnValue(false)); $this->secureRandom->expects($this->once()) ->method('generate') ->with(128) ->will($this->returnValue('verysecurerandomtoken')); $this->tokenProvider->expects($this->once()) ->method('generateToken') - ->with('verysecurerandomtoken', 'john', 'john', '123456', 'unknown client', IToken::PERMANENT_TOKEN); + ->with('verysecurerandomtoken', 'john', 'john', '123456', 'unknown client', \OC\Authentication\Token\IToken::PERMANENT_TOKEN); $expected = [ 'token' => 'verysecurerandomtoken' ]; @@ -105,24 +99,4 @@ class TokenControllerTest extends TestCase { $this->assertEquals($expected, $actual); } - public function testWithValidCredentialsBut2faEnabled() { - $user = $this->getMock('\OCP\IUser'); - $this->userManager->expects($this->once()) - ->method('checkPassword') - ->with('john', '123456') - ->will($this->returnValue($user)); - $this->twoFactorAuthManager->expects($this->once()) - ->method('isTwoFactorAuthenticated') - ->with($user) - ->will($this->returnValue(true)); - $this->secureRandom->expects($this->never()) - ->method('generate'); - $expected = new JSONResponse(); - $expected->setStatus(Http::STATUS_UNAUTHORIZED); - - $actual = $this->tokenController->generateToken('john', '123456'); - - $this->assertEquals($expected, $actual); - } - } diff --git a/tests/Core/Controller/TwoFactorChallengeControllerTest.php b/tests/Core/Controller/TwoFactorChallengeControllerTest.php index 08d8dd1452c..2da6dcd52ac 100644 --- a/tests/Core/Controller/TwoFactorChallengeControllerTest.php +++ b/tests/Core/Controller/TwoFactorChallengeControllerTest.php @@ -33,7 +33,7 @@ class TwoFactorChallengeControllerTest extends TestCase { private $session; private $urlGenerator; - /** @var TwoFactorChallengeController|\PHPUnit_Framework_MockObject_MockObject */ + /** TwoFactorChallengeController */ private $controller; protected function setUp() { @@ -47,20 +47,9 @@ class TwoFactorChallengeControllerTest extends TestCase { $this->session = $this->getMock('\OCP\ISession'); $this->urlGenerator = $this->getMock('\OCP\IURLGenerator'); - $this->controller = $this->getMockBuilder('OC\Core\Controller\TwoFactorChallengeController') - ->setConstructorArgs([ - 'core', - $this->request, - $this->twoFactorManager, - $this->userSession, - $this->session, - $this->urlGenerator, - ]) - ->setMethods(['getLogoutAttribute']) - ->getMock(); - $this->controller->expects($this->any()) - ->method('getLogoutAttribute') - ->willReturn('logoutAttribute'); + $this->controller = new TwoFactorChallengeController( + 'core', $this->request, $this->twoFactorManager, $this->userSession, $this->session, $this->urlGenerator + ); } public function testSelectChallenge() { @@ -81,7 +70,6 @@ class TwoFactorChallengeControllerTest extends TestCase { $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorselectchallenge', [ 'providers' => $providers, 'redirect_url' => '/some/url', - 'logout_attribute' => 'logoutAttribute', ], 'guest'); $this->assertEquals($expected, $this->controller->selectChallenge('/some/url')); @@ -122,7 +110,6 @@ class TwoFactorChallengeControllerTest extends TestCase { $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorshowchallenge', [ 'error' => true, 'provider' => $provider, - 'logout_attribute' => 'logoutAttribute', 'template' => '', ], 'guest'); diff --git a/tests/lib/AllConfigTest.php b/tests/lib/AllConfigTest.php index 3d0a9cb0827..4f8b0658b80 100644 --- a/tests/lib/AllConfigTest.php +++ b/tests/lib/AllConfigTest.php @@ -123,25 +123,6 @@ class AllConfigTest extends \Test\TestCase { $config->deleteUserValue('userPreCond', 'appPreCond', 'keyPreCond'); } - public function dataSetUserValueUnexpectedValue() { - return [ - [true], - [false], - [null], - [new \stdClass()], - ]; - } - - /** - * @dataProvider dataSetUserValueUnexpectedValue - * @param mixed $value - * @expectedException \UnexpectedValueException - */ - public function testSetUserValueUnexpectedValue($value) { - $config = $this->getConfig(); - $config->setUserValue('userSetBool', 'appSetBool', 'keySetBool', $value); - } - /** * @expectedException \OCP\PreConditionNotMetException */ diff --git a/tests/lib/Encryption/DecryptAllTest.php b/tests/lib/Encryption/DecryptAllTest.php index d7cf2fb7baf..ffcbbc74a99 100644 --- a/tests/lib/Encryption/DecryptAllTest.php +++ b/tests/lib/Encryption/DecryptAllTest.php @@ -86,25 +86,13 @@ class DecryptAllTest extends TestCase { $this->invokePrivate($this->instance, 'output', [$this->outputInterface]); } - public function dataDecryptAll() { - return [ - [true, 'user1', true], - [false, 'user1', true], - [true, '0', true], - [false, '0', true], - [true, '', false], - ]; - } - /** - * @dataProvider dataDecryptAll + * @dataProvider dataTrueFalse * @param bool $prepareResult - * @param string $user - * @param bool $userExistsChecked */ - public function testDecryptAll($prepareResult, $user, $userExistsChecked) { + public function testDecryptAll($prepareResult, $user) { - if ($userExistsChecked) { + if (!empty($user)) { $this->userManager->expects($this->once())->method('userExists')->willReturn(true); } else { $this->userManager->expects($this->never())->method('userExists'); @@ -137,6 +125,15 @@ class DecryptAllTest extends TestCase { $instance->decryptAll($this->inputInterface, $this->outputInterface, $user); } + public function dataTrueFalse() { + return [ + [true, 'user1'], + [false, 'user1'], + [true, ''], + [true, null] + ]; + } + /** * test decrypt all call with a user who doesn't exists */ @@ -150,16 +147,8 @@ class DecryptAllTest extends TestCase { ); } - public function dataTrueFalse() { - return [ - [true], - [false], - ]; - } - /** * @dataProvider dataTrueFalse - * @param bool $success */ public function testPrepareEncryptionModules($success) { diff --git a/tests/lib/Files/Storage/LocalTest.php b/tests/lib/Files/Storage/LocalTest.php index cca4d6a6676..7b8ae6a24b2 100644 --- a/tests/lib/Files/Storage/LocalTest.php +++ b/tests/lib/Files/Storage/LocalTest.php @@ -84,36 +84,5 @@ class LocalTest extends Storage { public function testInvalidArgumentsNoArray() { new \OC\Files\Storage\Local(null); } - - /** - * @expectedException \OCP\Files\ForbiddenException - */ - public function testDisallowSymlinksOutsideDatadir() { - $subDir1 = $this->tmpDir . 'sub1'; - $subDir2 = $this->tmpDir . 'sub2'; - $sym = $this->tmpDir . 'sub1/sym'; - mkdir($subDir1); - mkdir($subDir2); - - symlink($subDir2, $sym); - - $storage = new \OC\Files\Storage\Local(['datadir' => $subDir1]); - - $storage->file_put_contents('sym/foo', 'bar'); - } - - public function testDisallowSymlinksInsideDatadir() { - $subDir1 = $this->tmpDir . 'sub1'; - $subDir2 = $this->tmpDir . 'sub1/sub2'; - $sym = $this->tmpDir . 'sub1/sym'; - mkdir($subDir1); - mkdir($subDir2); - - symlink($subDir2, $sym); - - $storage = new \OC\Files\Storage\Local(['datadir' => $subDir1]); - - $storage->file_put_contents('sym/foo', 'bar'); - } } diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php index 59b17b83958..2c27bb64a70 100644 --- a/tests/lib/Files/ViewTest.php +++ b/tests/lib/Files/ViewTest.php @@ -2417,7 +2417,7 @@ class ViewTest extends \Test\TestCase { $content = $view->getDirectoryContent('', $filter); - $files = array_map(function (FileInfo $info) { + $files = array_map(function(FileInfo $info) { return $info->getName(); }, $content); sort($files); @@ -2444,53 +2444,4 @@ class ViewTest extends \Test\TestCase { $data = $view->getFileInfo('.'); $this->assertEquals('', $data->getChecksum()); } - - public function testDeleteGhostFile() { - $storage = new Temporary(array()); - $scanner = $storage->getScanner(); - $cache = $storage->getCache(); - $storage->file_put_contents('foo.txt', 'bar'); - \OC\Files\Filesystem::mount($storage, array(), '/test/'); - $scanner->scan(''); - - $storage->unlink('foo.txt'); - - $this->assertTrue($cache->inCache('foo.txt')); - - $view = new \OC\Files\View('/test'); - $rootInfo = $view->getFileInfo(''); - $this->assertEquals(3, $rootInfo->getSize()); - $view->unlink('foo.txt'); - $newInfo = $view->getFileInfo(''); - - $this->assertFalse($cache->inCache('foo.txt')); - $this->assertNotEquals($rootInfo->getEtag(), $newInfo->getEtag()); - $this->assertEquals(0, $newInfo->getSize()); - } - - public function testDeleteGhostFolder() { - $storage = new Temporary(array()); - $scanner = $storage->getScanner(); - $cache = $storage->getCache(); - $storage->mkdir('foo'); - $storage->file_put_contents('foo/foo.txt', 'bar'); - \OC\Files\Filesystem::mount($storage, array(), '/test/'); - $scanner->scan(''); - - $storage->rmdir('foo'); - - $this->assertTrue($cache->inCache('foo')); - $this->assertTrue($cache->inCache('foo/foo.txt')); - - $view = new \OC\Files\View('/test'); - $rootInfo = $view->getFileInfo(''); - $this->assertEquals(3, $rootInfo->getSize()); - $view->rmdir('foo'); - $newInfo = $view->getFileInfo(''); - - $this->assertFalse($cache->inCache('foo')); - $this->assertFalse($cache->inCache('foo/foo.txt')); - $this->assertNotEquals($rootInfo->getEtag(), $newInfo->getEtag()); - $this->assertEquals(0, $newInfo->getSize()); - } } diff --git a/version.php b/version.php index 698636a2196..967f2690276 100644 --- a/version.php +++ b/version.php @@ -25,10 +25,10 @@ // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(9, 1, 0, 8); +$OC_Version = array(9, 1, 0, 7); // The human readable string -$OC_VersionString = '9.1.0 beta 2'; +$OC_VersionString = '9.1.0 beta 1'; $OC_VersionCanBeUpgradedFrom = array(9, 0); -- cgit v1.2.3 From 5f6944954bcbd356dd1fe11ac1698bc8178cb84e Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Tue, 28 Jun 2016 16:11:06 +0200 Subject: get only vcard which match both the address book id and the vcard uri --- apps/dav/lib/CardDAV/CardDavBackend.php | 2 +- apps/dav/tests/unit/CardDAV/CardDavBackendTest.php | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'apps/dav') diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 2ad9f4778c9..39f76a4b420 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -848,7 +848,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { $query = $this->db->getQueryBuilder(); $query->select('*')->from($this->dbCardsTable) ->where($query->expr()->eq('uri', $query->createNamedParameter($uri))) - ->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId))); + ->andWhere($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId))); $queryResult = $query->execute(); $contact = $queryResult->fetch(); $queryResult->closeCursor(); diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index 58a93befe68..9845d2d6909 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -606,6 +606,11 @@ class CardDavBackendTest extends TestCase { $this->assertSame(5489543, (int)$result['lastmodified']); $this->assertSame('etag0', $result['etag']); $this->assertSame(120, (int)$result['size']); + + // this shouldn't return any result because 'uri1' is in address book 1 + // see https://github.com/nextcloud/server/issues/229 + $result = $this->backend->getContact(0, 'uri1'); + $this->assertEmpty($result); } public function testGetContactFail() { -- cgit v1.2.3 From 3571207bd956de5dc8aece2ba879f31f3696fef6 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 30 Jun 2016 11:09:20 +0200 Subject: add some additonal permission checks to the webdav backend --- apps/dav/lib/Connector/Sabre/ObjectTree.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'apps/dav') diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php index 9e7d876187d..07052e30301 100644 --- a/apps/dav/lib/Connector/Sabre/ObjectTree.php +++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php @@ -71,7 +71,7 @@ class ObjectTree extends \Sabre\DAV\Tree { * is present. * * @param string $path chunk file path to convert - * + * * @return string path to real file */ private function resolveChunkFile($path) { @@ -196,6 +196,15 @@ class ObjectTree extends \Sabre\DAV\Tree { throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup'); } + $infoDestination = $this->fileView->getFileInfo(dirname($destinationPath)); + $infoSource = $this->fileView->getFileInfo($sourcePath); + $destinationPermission = $infoDestination && $infoDestination->isUpdateable(); + $sourcePermission = $infoSource && $infoSource->isDeletable(); + + if (!$destinationPermission || !$sourcePermission) { + throw new Forbidden(); + } + $targetNodeExists = $this->nodeExists($destinationPath); $sourceNode = $this->getNodeForPath($sourcePath); if ($sourceNode instanceof \Sabre\DAV\ICollection && $targetNodeExists) { @@ -273,6 +282,12 @@ class ObjectTree extends \Sabre\DAV\Tree { throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup'); } + + $info = $this->fileView->getFileInfo(dirname($destination)); + if ($info && !$info->isUpdateable()) { + throw new Forbidden(); + } + // this will trigger existence check $this->getNodeForPath($source); -- cgit v1.2.3 From 1e7f0f73410cf3b8a7fd52cade27de92bc5994c3 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Thu, 30 Jun 2016 13:17:53 +0200 Subject: Add required $message parameter --- apps/dav/lib/Connector/Sabre/ObjectTree.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'apps/dav') diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php index 07052e30301..100e5ec56a2 100644 --- a/apps/dav/lib/Connector/Sabre/ObjectTree.php +++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php @@ -202,7 +202,7 @@ class ObjectTree extends \Sabre\DAV\Tree { $sourcePermission = $infoSource && $infoSource->isDeletable(); if (!$destinationPermission || !$sourcePermission) { - throw new Forbidden(); + throw new Forbidden('No permissions to move object.'); } $targetNodeExists = $this->nodeExists($destinationPath); @@ -285,7 +285,7 @@ class ObjectTree extends \Sabre\DAV\Tree { $info = $this->fileView->getFileInfo(dirname($destination)); if ($info && !$info->isUpdateable()) { - throw new Forbidden(); + throw new Forbidden('No permissions to move object.'); } // this will trigger existence check -- cgit v1.2.3 From c771368c4e3e8fdac4ef95758f308f85d5a29edf Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Thu, 30 Jun 2016 13:19:50 +0200 Subject: Add proper throws PHP docs --- apps/dav/lib/Connector/Sabre/ObjectTree.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'apps/dav') diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php index 100e5ec56a2..8f5f7be2505 100644 --- a/apps/dav/lib/Connector/Sabre/ObjectTree.php +++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php @@ -186,9 +186,13 @@ class ObjectTree extends \Sabre\DAV\Tree { * * @param string $sourcePath The path to the file which should be moved * @param string $destinationPath The full destination path, so not just the destination parent node - * @throws \Sabre\DAV\Exception\BadRequest - * @throws \Sabre\DAV\Exception\ServiceUnavailable + * @throws FileLocked + * @throws Forbidden + * @throws InvalidPath * @throws \Sabre\DAV\Exception\Forbidden + * @throws \Sabre\DAV\Exception\Locked + * @throws \Sabre\DAV\Exception\NotFound + * @throws \Sabre\DAV\Exception\ServiceUnavailable * @return int */ public function move($sourcePath, $destinationPath) { @@ -274,6 +278,13 @@ class ObjectTree extends \Sabre\DAV\Tree { * * @param string $source * @param string $destination + * @throws FileLocked + * @throws Forbidden + * @throws InvalidPath + * @throws \Exception + * @throws \Sabre\DAV\Exception\Forbidden + * @throws \Sabre\DAV\Exception\Locked + * @throws \Sabre\DAV\Exception\NotFound * @throws \Sabre\DAV\Exception\ServiceUnavailable * @return void */ -- cgit v1.2.3 From 149218ead9c43d79e45ba19ea59cd4966a1e046b Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Thu, 30 Jun 2016 13:46:08 +0200 Subject: Fix tests --- .../tests/unit/Connector/Sabre/ObjectTreeTest.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'apps/dav') diff --git a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php index 4a5e43376c0..96d4357660e 100644 --- a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php @@ -35,6 +35,7 @@ class TestDoubleFileView extends \OC\Files\View { $this->updatables = $updatables; $this->deletables = $deletables; $this->canRename = $canRename; + $this->lockingProvider = \OC::$server->getLockingProvider(); } public function isUpdatable($path) { @@ -56,6 +57,11 @@ class TestDoubleFileView extends \OC\Files\View { public function getRelativePath($path) { return $path; } + + public function getFileInfo($path, $includeMountPoints = true) { + $objectTreeTest = new ObjectTreeTest(); + return $objectTreeTest->getFileInfoMock(); + } } /** @@ -67,6 +73,20 @@ class TestDoubleFileView extends \OC\Files\View { */ class ObjectTreeTest extends \Test\TestCase { + public function getFileInfoMock() { + $mock = $this->getMock('\OCP\Files\FileInfo'); + $mock + ->expects($this->any()) + ->method('isDeletable') + ->willReturn(true); + $mock + ->expects($this->any()) + ->method('isUpdateable') + ->willReturn(true); + + return $mock; + } + /** * @dataProvider moveFailedProvider * @expectedException \Sabre\DAV\Exception\Forbidden -- cgit v1.2.3 From 26e14529be942e3cc3c2bb2b388b155073daecb1 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 30 Jun 2016 13:50:31 +0200 Subject: fix error message --- apps/dav/lib/Connector/Sabre/ObjectTree.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apps/dav') diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php index 8f5f7be2505..d8c1d71e7f1 100644 --- a/apps/dav/lib/Connector/Sabre/ObjectTree.php +++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php @@ -296,7 +296,7 @@ class ObjectTree extends \Sabre\DAV\Tree { $info = $this->fileView->getFileInfo(dirname($destination)); if ($info && !$info->isUpdateable()) { - throw new Forbidden('No permissions to move object.'); + throw new Forbidden('No permissions to copy object.'); } // this will trigger existence check -- cgit v1.2.3 From 90b7f74da714209ee9c6a9a3243dacbaee2dc435 Mon Sep 17 00:00:00 2001 From: Thomas Pulzer Date: Mon, 4 Jul 2016 11:50:32 +0200 Subject: Changed name of default logfile from owncloud.log to nextcloud.log. --- apps/dav/tests/travis/caldav/script.sh | 2 +- apps/dav/tests/travis/carddav/script.sh | 2 +- build/integration/run.sh | 2 +- config/config.sample.php | 6 +++--- core/Command/Log/OwnCloud.php | 2 +- core/Command/Upgrade.php | 2 +- issue_template.md | 2 +- lib/base.php | 4 ++-- lib/private/Log/Owncloud.php | 4 ++-- tests/Core/Command/Log/OwnCloudTest.php | 4 ++-- tests/lib/TestCase.php | 2 +- tests/travis/install.sh | 6 +++--- 12 files changed, 19 insertions(+), 19 deletions(-) (limited to 'apps/dav') diff --git a/apps/dav/tests/travis/caldav/script.sh b/apps/dav/tests/travis/caldav/script.sh index 7259372567c..636235349c5 100644 --- a/apps/dav/tests/travis/caldav/script.sh +++ b/apps/dav/tests/travis/caldav/script.sh @@ -16,6 +16,6 @@ PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onf RESULT=$? -tail "$/../../../../../data-autotest/owncloud.log" +tail "$/../../../../../data-autotest/nextcloud.log" exit $RESULT diff --git a/apps/dav/tests/travis/carddav/script.sh b/apps/dav/tests/travis/carddav/script.sh index a8bd9f11b38..ecdc0f95863 100644 --- a/apps/dav/tests/travis/carddav/script.sh +++ b/apps/dav/tests/travis/carddav/script.sh @@ -17,6 +17,6 @@ PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onf RESULT=$? -tail "$/../../../../../data-autotest/owncloud.log" +tail "$/../../../../../data-autotest/nextcloud.log" exit $RESULT diff --git a/build/integration/run.sh b/build/integration/run.sh index 3725ba1af6f..2abceaa1fad 100755 --- a/build/integration/run.sh +++ b/build/integration/run.sh @@ -40,7 +40,7 @@ kill $PHPPID kill $PHPPID_FED if [ -z $HIDE_OC_LOGS ]; then - tail "../../data/owncloud.log" + tail "../../data/nextcloud.log" fi exit $RESULT diff --git a/config/config.sample.php b/config/config.sample.php index 512a5d05ba7..6285e096ba7 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -549,7 +549,7 @@ $CONFIG = array( */ /** - * By default the Nextcloud logs are sent to the ``owncloud.log`` file in the + * By default the Nextcloud logs are sent to the ``nextcloud.log`` file in the * default Nextcloud data directory. * If syslogging is desired, set this parameter to ``syslog``. * Setting this parameter to ``errorlog`` will use the PHP error_log function @@ -559,9 +559,9 @@ $CONFIG = array( /** * Log file path for the Nextcloud logging type. - * Defaults to ``[datadirectory]/owncloud.log`` + * Defaults to ``[datadirectory]/nextcloud.log`` */ -'logfile' => '/var/log/owncloud.log', +'logfile' => '/var/log/nextcloud.log', /** * Loglevel to start logging at. Valid values are: 0 = Debug, 1 = Info, 2 = diff --git a/core/Command/Log/OwnCloud.php b/core/Command/Log/OwnCloud.php index 7213f6726a2..b469f2064f7 100644 --- a/core/Command/Log/OwnCloud.php +++ b/core/Command/Log/OwnCloud.php @@ -95,7 +95,7 @@ class OwnCloud extends Command { $output->writeln('Log backend ownCloud: '.$enabledText); $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT.'/data'); - $defaultLogFile = rtrim($dataDir, '/').'/owncloud.log'; + $defaultLogFile = rtrim($dataDir, '/').'/nextcloud.log'; $output->writeln('Log file: '.$this->config->getSystemValue('logfile', $defaultLogFile)); $rotateSize = $this->config->getSystemValue('log_rotate_size', 0); diff --git a/core/Command/Upgrade.php b/core/Command/Upgrade.php index 61b2e59a353..3550271fb5b 100644 --- a/core/Command/Upgrade.php +++ b/core/Command/Upgrade.php @@ -300,7 +300,7 @@ class Upgrade extends Command { //Possible scenario: ownCloud core is updated but an app failed $output->writeln('ownCloud is in maintenance mode'); $output->write('Maybe an upgrade is already in process. Please check the ' - . 'logfile (data/owncloud.log). If you want to re-run the ' + . 'logfile (data/nextcloud.log). If you want to re-run the ' . 'upgrade procedure, remove the "maintenance mode" from ' . 'config.php and call this script again.' , true); diff --git a/issue_template.md b/issue_template.md index a17628377b1..b18401c5060 100644 --- a/issue_template.md +++ b/issue_template.md @@ -94,7 +94,7 @@ Eventually replace sensitive data as the name/IP-address of your LDAP server or Insert your webserver log here ``` -#### Nextcloud log (data/owncloud.log) +#### Nextcloud log (data/nextcloud.log) ``` Insert your Nextcloud log here ``` diff --git a/lib/base.php b/lib/base.php index 9e5304b1634..dde8e38218a 100644 --- a/lib/base.php +++ b/lib/base.php @@ -754,8 +754,8 @@ class OC { $systemConfig = \OC::$server->getSystemConfig(); if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !self::checkUpgrade(false)) { //don't try to do this before we are properly setup - //use custom logfile path if defined, otherwise use default of owncloud.log in data directory - \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/owncloud.log')); + //use custom logfile path if defined, otherwise use default of nextcloud.log in data directory + \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/nextcloud.log')); } } diff --git a/lib/private/Log/Owncloud.php b/lib/private/Log/Owncloud.php index 07106be22b1..d76145ebdd3 100644 --- a/lib/private/Log/Owncloud.php +++ b/lib/private/Log/Owncloud.php @@ -33,7 +33,7 @@ namespace OC\Log; /** * logging utilities * - * Log is saved at data/owncloud.log (on default) + * Log is saved at data/nextcloud.log (on default) */ class Owncloud { @@ -44,7 +44,7 @@ class Owncloud { */ public static function init() { $systemConfig = \OC::$server->getSystemConfig(); - $defaultLogFile = $systemConfig->getValue("datadirectory", \OC::$SERVERROOT.'/data').'/owncloud.log'; + $defaultLogFile = $systemConfig->getValue("datadirectory", \OC::$SERVERROOT.'/data').'/nextcloud.log'; self::$logFile = $systemConfig->getValue("logfile", $defaultLogFile); /** diff --git a/tests/Core/Command/Log/OwnCloudTest.php b/tests/Core/Command/Log/OwnCloudTest.php index 3cb05221c37..e0445a5cfda 100644 --- a/tests/Core/Command/Log/OwnCloudTest.php +++ b/tests/Core/Command/Log/OwnCloudTest.php @@ -101,7 +101,7 @@ class OwnCloudTest extends TestCase { ->will($this->returnValueMap([ ['log_type', 'owncloud', 'log_type_value'], ['datadirectory', \OC::$SERVERROOT.'/data', '/data/directory/'], - ['logfile', '/data/directory/owncloud.log', '/var/log/owncloud.log'], + ['logfile', '/data/directory/nextcloud.log', '/var/log/nextcloud.log'], ['log_rotate_size', 0, 5 * 1024 * 1024], ])); @@ -110,7 +110,7 @@ class OwnCloudTest extends TestCase { ->with('Log backend ownCloud: disabled'); $this->consoleOutput->expects($this->at(1)) ->method('writeln') - ->with('Log file: /var/log/owncloud.log'); + ->with('Log file: /var/log/nextcloud.log'); $this->consoleOutput->expects($this->at(2)) ->method('writeln') ->with('Rotate at: 5 MB'); diff --git a/tests/lib/TestCase.php b/tests/lib/TestCase.php index a1f65f8ac82..514cb6ea3a5 100644 --- a/tests/lib/TestCase.php +++ b/tests/lib/TestCase.php @@ -269,7 +269,7 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { */ static protected function tearDownAfterClassCleanStrayDataFiles($dataDir) { $knownEntries = array( - 'owncloud.log' => true, + 'nextcloud.log' => true, 'owncloud.db' => true, '.ocdata' => true, '..' => true, diff --git a/tests/travis/install.sh b/tests/travis/install.sh index fe7907f798c..180e0c634da 100755 --- a/tests/travis/install.sh +++ b/tests/travis/install.sh @@ -173,8 +173,8 @@ cat $BASEDIR/config/config.php echo "data directory:" ls -ll $DATADIR -echo "owncloud.log:" -[ -f "$DATADIR/owncloud.log" ] && cat $DATADIR/owncloud.log -[ -f "$BASEDIR/data/owncloud.log" ] && cat $BASEDIR/data/owncloud.log +echo "nextcloud.log:" +[ -f "$DATADIR/nextcloud.log" ] && cat $DATADIR/nextcloud.log +[ -f "$BASEDIR/data/nextcloud.log" ] && cat $BASEDIR/data/nextcloud.log cd $BASEDIR -- cgit v1.2.3