From cf0d163a32204442a6345bad8853f7eaaa033a61 Mon Sep 17 00:00:00 2001 From: michag86 Date: Mon, 7 Dec 2015 09:48:54 +0100 Subject: [PATCH 001/194] reset mailadress/displayname on blur --- settings/js/users/users.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/settings/js/users/users.js b/settings/js/users/users.js index aeecac7b24..68dca44051 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -694,6 +694,8 @@ $(document).ready(function () { } } ); + var displayName = $input.val(); + $tr.data('displayname', displayName); $input.blur(); } else { $input.blur(); @@ -701,8 +703,7 @@ $(document).ready(function () { } }) .blur(function () { - var displayName = $input.val(); - $tr.data('displayname', displayName); + var displayName = $tr.data('displayname'); $input.replaceWith('' + escapeHTML(displayName) + ''); $td.find('img').show(); }); @@ -721,6 +722,7 @@ $(document).ready(function () { .keypress(function (event) { if (event.keyCode === 13) { if ($(this).val().length > 0) { + $tr.data('mailAddress', $input.val()); $input.blur(); $.ajax({ type: 'PUT', @@ -740,7 +742,7 @@ $(document).ready(function () { } }) .blur(function () { - var mailAddress = $input.val(); + var mailAddress = $tr.data('mailAddress'); var $span = $('').text(mailAddress); $tr.data('mailAddress', mailAddress); $input.replaceWith($span); From d155c8e5fe500459884876046ccab5b2f28a4b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 7 Dec 2015 12:00:31 +0100 Subject: [PATCH 002/194] Add unix_socket support for mysql during initial installation - fixes #20210 --- lib/private/setup/mysql.php | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php index f2d2b15cd9..e8b88eb348 100644 --- a/lib/private/setup/mysql.php +++ b/lib/private/setup/mysql.php @@ -89,15 +89,28 @@ class MySQL extends AbstractDatabase { * @throws \OC\DatabaseSetupException */ private function connect() { - $type = 'mysql'; + $connectionParams = array( - 'host' => $this->dbHost, - 'user' => $this->dbUser, - 'password' => $this->dbPassword, - 'tablePrefix' => $this->tablePrefix, + 'host' => $this->dbHost, + 'user' => $this->dbUser, + 'password' => $this->dbPassword, + 'tablePrefix' => $this->tablePrefix, ); + + // adding port support + if (strpos($this->dbHost, ':')) { + // Host variable may carry a port or socket. + list($host, $portOrSocket) = explode(':', $this->dbHost, 2); + if (ctype_digit($portOrSocket)) { + $connectionParams['port'] = $portOrSocket; + } else { + $connectionParams['unix_socket'] = $portOrSocket; + } + $connectionParams['host'] = $host; + } + $cf = new ConnectionFactory(); - return $cf->getConnection($type, $connectionParams); + return $cf->getConnection('mysql', $connectionParams); } /** From 952f1f3e603740eb724ab27919ca83b2ce804474 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Mon, 7 Dec 2015 15:14:49 +0100 Subject: [PATCH 003/194] ensure multiselect always receives an array when setting its value, fixes #18734 --- apps/user_ldap/js/wizard/wizardTabGeneric.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/js/wizard/wizardTabGeneric.js b/apps/user_ldap/js/wizard/wizardTabGeneric.js index 60e7cd2ad9..8940a8468a 100644 --- a/apps/user_ldap/js/wizard/wizardTabGeneric.js +++ b/apps/user_ldap/js/wizard/wizardTabGeneric.js @@ -198,9 +198,13 @@ OCA = OCA || {}; return; } - // deal with text area + // special cases: deal with text area and multiselect if ($element.is('textarea') && $.isArray(value)) { value = value.join("\n"); + } else if($element.hasClass(this.multiSelectPluginClass)) { + if(!_.isArray(value)) { + value = value.split("\n"); + } } if ($element.is('span')) { From eec4f82cf06fa6136017ebd5082b2aa289d9ad11 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 7 Dec 2015 16:15:37 +0100 Subject: [PATCH 004/194] Dont set the string storage id to the numeric storage id for personal mounts --- apps/files_external/lib/personalmount.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/files_external/lib/personalmount.php b/apps/files_external/lib/personalmount.php index 26f68ba32d..f81dee5be1 100644 --- a/apps/files_external/lib/personalmount.php +++ b/apps/files_external/lib/personalmount.php @@ -35,7 +35,7 @@ class PersonalMount extends MountPoint implements MoveableMount { protected $storagesService; /** @var int */ - protected $storageId; + protected $numericStorageId; /** * @param UserStoragesService $storagesService @@ -57,7 +57,7 @@ class PersonalMount extends MountPoint implements MoveableMount { ) { parent::__construct($storage, $mountpoint, $arguments, $loader, $mountOptions); $this->storagesService = $storagesService; - $this->storageId = $storageId; + $this->numericStorageId = $storageId; } /** @@ -67,7 +67,7 @@ class PersonalMount extends MountPoint implements MoveableMount { * @return bool */ public function moveMount($target) { - $storage = $this->storagesService->getStorage($this->storageId); + $storage = $this->storagesService->getStorage($this->numericStorageId); // remove "/$user/files" prefix $targetParts = explode('/', trim($target, '/'), 3); $storage->setMountPoint($targetParts[2]); @@ -82,7 +82,7 @@ class PersonalMount extends MountPoint implements MoveableMount { * @return bool */ public function removeMount() { - $this->storagesService->removeStorage($this->storageId); + $this->storagesService->removeStorage($this->numericStorageId); return true; } } From d38949f4232d6bbbba8ce42cb22784e5c2c63472 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 7 Dec 2015 13:24:16 +0100 Subject: [PATCH 005/194] Update parent when moving share into recieved share Fixes #20769 When I receive a share and move a share of myself into that share (which is allowed currently) I effectively hand over ownership of the files I move. So we need to update the share I move to have as a parent the share I move it into. Else our mounting system gets confused. --- apps/files_sharing/lib/updater.php | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php index 26044cc1c8..2d165a5df0 100644 --- a/apps/files_sharing/lib/updater.php +++ b/apps/files_sharing/lib/updater.php @@ -58,6 +58,47 @@ class Shared_Updater { */ static public function renameHook($params) { self::renameChildren($params['oldpath'], $params['newpath']); + self::moveShareToShare($params['newpath']); + } + + /** + * Fix for https://github.com/owncloud/core/issues/20769 + * + * The owner is allowed to move their files (if they are shared) into a receiving folder + * In this case we need to update the parent of the moved share. Since they are + * effectively handing over ownership of the file the rest of the code needs to know + * they need to build up the reshare tree. + * + * @param string $path + */ + static private function moveShareToShare($path) { + $userFolder = \OC::$server->getUserFolder(); + $src = $userFolder->get($path); + + $type = $src instanceof \OCP\Files\File ? 'file' : 'folder'; + $shares = \OCP\Share::getItemShared($type, $src->getId()); + + // If the path we move is not a share we don't care + if (empty($shares)) { + return; + } + + // Check if the destination is inside a share + $mountManager = \OC::$server->getMountManager(); + $dstMount = $mountManager->find($src->getPath()); + if (!($dstMount instanceof \OCA\Files_Sharing\SharedMount)) { + return; + } + + $parenShare = $dstMount->getShare(); + + foreach ($shares as $share) { + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $qb->update('share') + ->set('parent', $qb->createNamedParameter($parenShare['id'])) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($share['id']))) + ->execute(); + } } /** From 780d80d7c369c9f3068406d69387126a78936ee5 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 7 Dec 2015 16:38:49 +0100 Subject: [PATCH 006/194] The ajax code path unshares a link share when updating the password In order to not mess up existing shares if the password gets verified we should first fire this validation. --- lib/private/share/share.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 70f9a6e892..8a8da038f3 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -764,6 +764,11 @@ class Share extends Constants { $updateExistingShare = false; if (\OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_links', 'yes') == 'yes') { + // IF the password is changed via the old ajax endpoint verify it before deleting the old share + if ($passwordChanged === true) { + self::verifyPassword($shareWith); + } + // when updating a link share // FIXME Don't delete link if we update it if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_LINK, null, From 3bce1b20feb9525e7e2214c576f125077ffb112d Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 8 Dec 2015 08:10:55 +0100 Subject: [PATCH 007/194] Add DirectorySlash to dynamic .htaccess write When `DirectorySlash off` is set then Apache will not lookup folders anymore. This is required for example when we use the rewrite directives on an existing path such as `/core/search`. By default Apache would load `/core/search/` instead `/core/search` so the redirect would fail here. This leads however to the problem that URLs such as `localhost/owncloud` would not load anymore while `localhost/owncloud/` would. This has caused problems such as https://github.com/owncloud/core/pull/21015 With this change we add the `DirectorySlash off` directive only when the `.htaccess` is writable to the dynamic part of it. This would also make `localhost/owncloud` work again as it would trigger the 404 directive which triggers the redirect in base.php. --- .htaccess | 3 --- lib/private/setup.php | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.htaccess b/.htaccess index 230f6ae330..05d142348b 100644 --- a/.htaccess +++ b/.htaccess @@ -50,9 +50,6 @@ # Rewrite rules for `front_controller_active` Options -MultiViews - - DirectorySlash off - RewriteRule ^core/js/oc.js$ index.php/core/js/oc.js [PT,E=PATH_INFO:$1] RewriteRule ^core/preview.png$ index.php/core/preview.png [PT,E=PATH_INFO:$1] RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff)$ diff --git a/lib/private/setup.php b/lib/private/setup.php index 814d78679e..869a87fbf1 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -439,6 +439,9 @@ class Setup { $content.="\n RewriteBase ".$webRoot; $content .= "\n "; $content .= "\n SetEnv front_controller_active true"; + $content .= "\n "; + $content .= "\n DirectorySlash off"; + $content .= "\n "; $content.="\n "; $content.="\n"; From 235094ab5492990ed4790e5d475beedf3528705a Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 1 Dec 2015 17:04:11 +0100 Subject: [PATCH 008/194] Remove version check out of .htaccess This can now be achieved using the new code signing. --- .htaccess | 1 - lib/private/setup.php | 20 -------------------- 2 files changed, 21 deletions(-) diff --git a/.htaccess b/.htaccess index 230f6ae330..9dc2983a64 100644 --- a/.htaccess +++ b/.htaccess @@ -1,4 +1,3 @@ -# Version: 9.0.0 diff --git a/lib/private/setup.php b/lib/private/setup.php index 814d78679e..33a9fe4446 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -394,33 +394,13 @@ class Setup { return \OC::$SERVERROOT.'/.htaccess'; } - /** - * Checks if the .htaccess contains the current version parameter - * - * @return bool - */ - private function isCurrentHtaccess() { - $version = \OC_Util::getVersion(); - unset($version[3]); - - return !strpos( - file_get_contents($this->pathToHtaccess()), - 'Version: '.implode('.', $version) - ) === false; - } - /** * Append the correct ErrorDocument path for Apache hosts - * - * @throws \OC\HintException If .htaccess does not include the current version */ public static function updateHtaccess() { $setupHelper = new \OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults(), \OC::$server->getLogger(), \OC::$server->getSecureRandom()); - if(!$setupHelper->isCurrentHtaccess()) { - throw new \OC\HintException('.htaccess file has the wrong version. Please upload the correct version. Maybe you forgot to replace it after updating?'); - } $htaccessContent = file_get_contents($setupHelper->pathToHtaccess()); $content = ''; From 0a89073c475632a296b7315d96894503a78bbf43 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 1 Dec 2015 17:06:48 +0100 Subject: [PATCH 009/194] Run .htaccess updates in any case This is the same what we also do in updater.php and thus this aligns the code. Makes the code paths more consistent. --- lib/private/setup.php | 8 +++----- tests/lib/setup.php | 13 ------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/lib/private/setup.php b/lib/private/setup.php index 33a9fe4446..4a555b3e41 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -369,11 +369,9 @@ class Setup { // out that this is indeed an ownCloud data directory file_put_contents($config->getSystemValue('datadirectory', \OC::$SERVERROOT.'/data').'/.ocdata', ''); - // Update htaccess files for apache hosts - if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { - self::updateHtaccess(); - self::protectDataDirectory(); - } + // Update .htaccess files + Setup::updateHtaccess(); + Setup::protectDataDirectory(); //try to write logtimezone if (date_default_timezone_get()) { diff --git a/tests/lib/setup.php b/tests/lib/setup.php index 72c8452005..bc78c14008 100644 --- a/tests/lib/setup.php +++ b/tests/lib/setup.php @@ -130,17 +130,4 @@ class Test_OC_Setup extends \Test\TestCase { ->will($this->returnValue('NotAnArray')); $this->setupClass->getSupportedDatabases(); } - - /** - * This is actual more an integration test whether the version parameter in the .htaccess - * was updated as well when the version has been incremented. - * If it hasn't this test will fail. - */ - public function testHtaccessIsCurrent() { - $result = self::invokePrivate( - $this->setupClass, - 'isCurrentHtaccess' - ); - $this->assertTrue($result); - } } From 8903afec2687e762238d161ef9d986be9a1786a3 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 8 Dec 2015 08:17:04 +0100 Subject: [PATCH 010/194] Don't write directives from CLI --- lib/private/setup.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/private/setup.php b/lib/private/setup.php index 4a555b3e41..97d01c5010 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -396,6 +396,11 @@ class Setup { * Append the correct ErrorDocument path for Apache hosts */ public static function updateHtaccess() { + // From CLI we don't know the defined web root. Thus we can't write any + // directives into the .htaccess file. + if(\OC::$CLI) { + return; + } $setupHelper = new \OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults(), \OC::$server->getLogger(), \OC::$server->getSecureRandom()); From e241d2631672836d7a512cd890b14d7523fbc756 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 8 Dec 2015 11:32:18 +0100 Subject: [PATCH 011/194] Compute share permissions in the view The share permissions are now computed in the View/FileInfo instead of storing them directly/permanently on the storage --- apps/files/tests/controller/apicontrollertest.php | 9 ++++++--- lib/private/files/fileinfo.php | 8 +++++++- lib/private/files/storage/common.php | 4 ---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/files/tests/controller/apicontrollertest.php b/apps/files/tests/controller/apicontrollertest.php index fb728d5eff..bc66e4641b 100644 --- a/apps/files/tests/controller/apicontrollertest.php +++ b/apps/files/tests/controller/apicontrollertest.php @@ -92,6 +92,7 @@ class ApiControllerTest extends TestCase { [ 'mtime' => 55, 'mimetype' => 'application/pdf', + 'permissions' => 31, 'size' => 1234, 'etag' => 'MyEtag', ], @@ -111,7 +112,7 @@ class ApiControllerTest extends TestCase { 'parentId' => null, 'mtime' => 55000, 'name' => 'root.txt', - 'permissions' => null, + 'permissions' => 31, 'mimetype' => 'application/pdf', 'size' => 1234, 'type' => 'file', @@ -139,6 +140,7 @@ class ApiControllerTest extends TestCase { [ 'mtime' => 55, 'mimetype' => 'application/pdf', + 'permissions' => 31, 'size' => 1234, 'etag' => 'MyEtag', ], @@ -155,6 +157,7 @@ class ApiControllerTest extends TestCase { [ 'mtime' => 999, 'mimetype' => 'application/binary', + 'permissions' => 31, 'size' => 9876, 'etag' => 'SubEtag', ], @@ -174,7 +177,7 @@ class ApiControllerTest extends TestCase { 'parentId' => null, 'mtime' => 55000, 'name' => 'root.txt', - 'permissions' => null, + 'permissions' => 31, 'mimetype' => 'application/pdf', 'size' => 1234, 'type' => 'file', @@ -191,7 +194,7 @@ class ApiControllerTest extends TestCase { 'parentId' => null, 'mtime' => 999000, 'name' => 'root.txt', - 'permissions' => null, + 'permissions' => 31, 'mimetype' => 'application/binary', 'size' => 9876, 'type' => 'file', diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php index 5b5e869700..0525c25960 100644 --- a/lib/private/files/fileinfo.php +++ b/lib/private/files/fileinfo.php @@ -100,6 +100,8 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { return $this->getType(); } else if ($offset === 'etag') { return $this->getEtag(); + } elseif ($offset === 'permissions') { + return $this->getPermissions(); } elseif (isset($this->data[$offset])) { return $this->data[$offset]; } else { @@ -193,7 +195,11 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { * @return int */ public function getPermissions() { - return $this->data['permissions']; + $perms = $this->data['permissions']; + if (\OCP\Util::isSharingDisabledForUser()) { + $perms = $perms & ~\OCP\Constants::PERMISSION_SHARE; + } + return $perms; } /** diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php index 0cd67e343f..b06543d0a6 100644 --- a/lib/private/files/storage/common.php +++ b/lib/private/files/storage/common.php @@ -141,10 +141,6 @@ abstract class Common implements Storage { } public function isSharable($path) { - if (\OCP\Util::isSharingDisabledForUser()) { - return false; - } - return $this->isReadable($path); } From 6e4006d1397817f83c2dd3cafc4d697ac1e6a2a7 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 8 Dec 2015 13:02:57 +0100 Subject: [PATCH 012/194] Add reshare permission checks Added in isSharable() in incoming remote share. Added in isSharable() in regular incoming share. Added in FileInfo to make sure the proper attributes are returned to the clients. --- apps/files_sharing/lib/external/storage.php | 8 ++++++++ apps/files_sharing/lib/sharedstorage.php | 2 +- lib/private/files/fileinfo.php | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php index 2a0d827e06..36ff4f0c22 100644 --- a/apps/files_sharing/lib/external/storage.php +++ b/apps/files_sharing/lib/external/storage.php @@ -265,4 +265,12 @@ class Storage extends DAV implements ISharedStorage { list(, $remote) = explode('://', $this->remote, 2); return $this->remoteUser . '@' . $remote; } + + public function isSharable($path) { + if (\OCP\Util::isSharingDisabledForUser() || !\OC\Share\Share::isResharingAllowed()) { + return false; + } + return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_SHARE); + } + } diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index cda3f564d5..38f79762dc 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -257,7 +257,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { } public function isSharable($path) { - if (\OCP\Util::isSharingDisabledForUser()) { + if (\OCP\Util::isSharingDisabledForUser() || !\OC\Share\Share::isResharingAllowed()) { return false; } return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_SHARE); diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php index 0525c25960..5ed65cd379 100644 --- a/lib/private/files/fileinfo.php +++ b/lib/private/files/fileinfo.php @@ -196,7 +196,7 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { */ public function getPermissions() { $perms = $this->data['permissions']; - if (\OCP\Util::isSharingDisabledForUser()) { + if (\OCP\Util::isSharingDisabledForUser() || ($this->isShared() && !\OC\Share\Share::isResharingAllowed())) { $perms = $perms & ~\OCP\Constants::PERMISSION_SHARE; } return $perms; From 7c45eaa70bf8113b56bdc01abe89735fe8107856 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 2 Sep 2015 16:49:34 +0200 Subject: [PATCH 013/194] Add type description Allows IDEs and static code analyzers. Would have saved me some minutes today :) --- lib/private/appframework/app.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/private/appframework/app.php b/lib/private/appframework/app.php index 0188d221be..5cad32bbd0 100644 --- a/lib/private/appframework/app.php +++ b/lib/private/appframework/app.php @@ -26,6 +26,7 @@ namespace OC\AppFramework; +use OC\AppFramework\Http\Dispatcher; use OC_App; use OC\AppFramework\DependencyInjection\DIContainer; use OCP\AppFramework\QueryException; @@ -97,6 +98,7 @@ class App { } // initialize the dispatcher and run all the middleware before the controller + /** @var Dispatcher $dispatcher */ $dispatcher = $container['Dispatcher']; list( From 28e9bc115615aab6c951fb846b8bd28aa517331e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 8 Dec 2015 16:33:39 +0100 Subject: [PATCH 014/194] Fix more unit tests to pass a mock storage instead of null to FileInfo --- apps/dav/tests/unit/connector/sabre/file.php | 44 ++++++++++++-------- tests/lib/files/node/file.php | 10 ++++- tests/lib/files/node/folder.php | 10 ++++- tests/lib/files/node/node.php | 10 ++++- 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/apps/dav/tests/unit/connector/sabre/file.php b/apps/dav/tests/unit/connector/sabre/file.php index 2a6cf46ef1..ad4c1d29ed 100644 --- a/apps/dav/tests/unit/connector/sabre/file.php +++ b/apps/dav/tests/unit/connector/sabre/file.php @@ -48,6 +48,14 @@ class File extends \Test\TestCase { parent::tearDown(); } + private function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + /** * @param string $string */ @@ -149,7 +157,7 @@ class File extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnArgument(0)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -209,7 +217,7 @@ class File extends \Test\TestCase { $_SERVER['HTTP_OC_CHUNKED'] = true; - $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-0', null, null, [ + $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-0', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -219,7 +227,7 @@ class File extends \Test\TestCase { $this->assertNull($file->put('test data one')); $file->releaseLock(ILockingProvider::LOCK_SHARED); - $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-1', null, null, [ + $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-1', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -261,7 +269,7 @@ class File extends \Test\TestCase { $info = new \OC\Files\FileInfo( $viewRoot . '/' . ltrim($path, '/'), - null, + $this->getMockStorage(), null, ['permissions' => \OCP\Constants::PERMISSION_ALL], null @@ -450,7 +458,7 @@ class File extends \Test\TestCase { $_SERVER['CONTENT_LENGTH'] = 123456; $_SERVER['REQUEST_METHOD'] = 'PUT'; - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -483,7 +491,7 @@ class File extends \Test\TestCase { // simulate situation where the target file is locked $view->lockFile('/test.txt', ILockingProvider::LOCK_EXCLUSIVE); - $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -518,7 +526,7 @@ class File extends \Test\TestCase { $_SERVER['HTTP_OC_CHUNKED'] = true; - $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-0', null, null, [ + $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-0', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -526,7 +534,7 @@ class File extends \Test\TestCase { $this->assertNull($file->put('test data one')); $file->releaseLock(ILockingProvider::LOCK_SHARED); - $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-1', null, null, [ + $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-1', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -555,7 +563,7 @@ class File extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnArgument(0)); - $info = new \OC\Files\FileInfo('/*', null, null, array( + $info = new \OC\Files\FileInfo('/*', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -591,7 +599,7 @@ class File extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnArgument(0)); - $info = new \OC\Files\FileInfo('/*', null, null, array( + $info = new \OC\Files\FileInfo('/*', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -618,7 +626,7 @@ class File extends \Test\TestCase { $_SERVER['CONTENT_LENGTH'] = 12345; $_SERVER['REQUEST_METHOD'] = 'PUT'; - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -654,7 +662,7 @@ class File extends \Test\TestCase { ->method('unlink') ->will($this->returnValue(true)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -672,7 +680,7 @@ class File extends \Test\TestCase { $view = $this->getMock('\OC\Files\View', array()); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => 0 ), null); @@ -695,7 +703,7 @@ class File extends \Test\TestCase { ->method('unlink') ->will($this->returnValue(false)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -718,7 +726,7 @@ class File extends \Test\TestCase { ->method('unlink') ->willThrowException(new ForbiddenException('', true)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -753,7 +761,7 @@ class File extends \Test\TestCase { $path = 'test-locking.txt'; $info = new \OC\Files\FileInfo( '/' . $this->user . '/files/' . $path, - null, + $this->getMockStorage(), null, ['permissions' => \OCP\Constants::PERMISSION_ALL], null @@ -865,7 +873,7 @@ class File extends \Test\TestCase { ->method('fopen') ->will($this->returnValue(false)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -883,7 +891,7 @@ class File extends \Test\TestCase { ->method('fopen') ->willThrowException(new ForbiddenException('', true)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); diff --git a/tests/lib/files/node/file.php b/tests/lib/files/node/file.php index d0072949c7..ccc777c499 100644 --- a/tests/lib/files/node/file.php +++ b/tests/lib/files/node/file.php @@ -21,8 +21,16 @@ class File extends \Test\TestCase { $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } + protected function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + protected function getFileInfo($data) { - return new FileInfo('', null, '', $data, null); + return new FileInfo('', $this->getMockStorage(), '', $data, null); } public function testDelete() { diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php index d95e1b5d2b..09bf32561e 100644 --- a/tests/lib/files/node/folder.php +++ b/tests/lib/files/node/folder.php @@ -31,8 +31,16 @@ class Folder extends \Test\TestCase { $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } + protected function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + protected function getFileInfo($data) { - return new FileInfo('', null, '', $data, null); + return new FileInfo('', $this->getMockStorage(), '', $data, null); } public function testDelete() { diff --git a/tests/lib/files/node/node.php b/tests/lib/files/node/node.php index afcf4cbaba..a1693b034f 100644 --- a/tests/lib/files/node/node.php +++ b/tests/lib/files/node/node.php @@ -18,8 +18,16 @@ class Node extends \Test\TestCase { $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } + protected function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + protected function getFileInfo($data) { - return new FileInfo('', null, '', $data, null); + return new FileInfo('', $this->getMockStorage(), '', $data, null); } public function testStat() { From d0cca6c3aded2aaa35e5b2caab46ff49676eecbd Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 8 Dec 2015 16:48:33 +0100 Subject: [PATCH 015/194] Add explicit check for groups excluded from sharing Since isSharable() doesn't do the check for groups excluded from sharing, adding an explicit check in the sharing code. --- lib/private/share/share.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 8899df2563..e62bdebc08 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -635,7 +635,7 @@ class Share extends Constants { throw new \Exception($message_t); } // verify that the user has share permission - if (!\OC\Files\Filesystem::isSharable($path)) { + if (!\OC\Files\Filesystem::isSharable($path) || \OCP\Util::isSharingDisabledForUser()) { $message = 'You are not allowed to share %s'; $message_t = $l->t('You are not allowed to share %s', [$path]); \OCP\Util::writeLog('OCP\Share', sprintf($message, $path), \OCP\Util::DEBUG); From 8c1afb8fb9206e04ce03e8927170a8469cce6c51 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 8 Dec 2015 18:01:44 +0100 Subject: [PATCH 016/194] Add tests --- .../tests/personalmounttest.php | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 apps/files_external/tests/personalmounttest.php diff --git a/apps/files_external/tests/personalmounttest.php b/apps/files_external/tests/personalmounttest.php new file mode 100644 index 0000000000..b56d69aa9b --- /dev/null +++ b/apps/files_external/tests/personalmounttest.php @@ -0,0 +1,50 @@ + + * + * @copyright Copyright (c) 2015, 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\Files_external\Tests; + +use OC\Files\Mount\Manager; +use OCA\Files_External\Lib\PersonalMount; +use Test\TestCase; + +class PersonalMountTest extends TestCase { + public function testFindByStorageId() { + /** @var \OCA\Files_External\Service\UserStoragesService $storageService */ + $storageService = $this->getMockBuilder('\OCA\Files_External\Service\UserStoragesService') + ->disableOriginalConstructor() + ->getMock(); + + $storage = $this->getMockBuilder('\OC\Files\Storage\Storage') + ->disableOriginalConstructor() + ->getMock(); + + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('dummy')); + + $mount = new PersonalMount($storageService, 10, $storage, '/foo'); + + $mountManager = new Manager(); + $mountManager->addMount($mount); + + $this->assertEquals([$mount], $mountManager->findByStorageId('dummy')); + } +} From 11e98e2de6f0dd20c5a1b8a09d1497ce078a9392 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 9 Dec 2015 06:50:47 +0100 Subject: [PATCH 017/194] Fix PHPDoc and check if path does exists Mutes another security warning of some static scanners. --- lib/private/console/application.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/private/console/application.php b/lib/private/console/application.php index 55c817d497..c46e6d60de 100644 --- a/lib/private/console/application.php +++ b/lib/private/console/application.php @@ -48,16 +48,20 @@ class Application { /** * @param OutputInterface $output + * @throws \Exception */ public function loadCommands(OutputInterface $output) { // $application is required to be defined in the register_command scripts $application = $this->application; - require_once \OC::$SERVERROOT . '/core/register_command.php'; + require_once __DIR__ . '/../../../core/register_command.php'; if ($this->config->getSystemValue('installed', false)) { if (!\OCP\Util::needUpgrade()) { OC_App::loadApps(); foreach (\OC::$server->getAppManager()->getInstalledApps() as $app) { $appPath = \OC_App::getAppPath($app); + if($appPath === false) { + continue; + } \OC::$loader->addValidRoot($appPath); $file = $appPath . '/appinfo/register_command.php'; if (file_exists($file)) { @@ -85,6 +89,11 @@ class Application { } } + /** + * Sets whether to automatically exit after a command execution or not. + * + * @param bool $boolean Whether to automatically exit after a command execution or not + */ public function setAutoExit($boolean) { $this->application->setAutoExit($boolean); } From 61da3d530d489525fc0a6dd9575dc9ab37f1bc44 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 9 Dec 2015 07:32:19 +0100 Subject: [PATCH 018/194] Verify return type Can also be null. Silences another security warning... --- lib/private/files/view.php | 2 +- lib/private/preview.php | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 6abefff419..b8b1b8a50d 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -1253,7 +1253,7 @@ class View { * @param boolean|string $includeMountPoints true to add mountpoint sizes, * 'ext' to add only ext storage mount point sizes. Defaults to true. * defaults to true - * @return \OC\Files\FileInfo|bool False if file does not exist + * @return \OC\Files\FileInfo|false False if file does not exist */ public function getFileInfo($path, $includeMountPoints = true) { $this->assertPathLength($path); diff --git a/lib/private/preview.php b/lib/private/preview.php index b2accdfd00..38c043030f 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -1250,7 +1250,7 @@ class Preview { * @param array $args * @param string $prefix */ - public static function prepare_delete($args, $prefix = '') { + public static function prepare_delete(array $args, $prefix = '') { $path = $args['path']; if (substr($path, 0, 1) === '/') { $path = substr($path, 1); @@ -1259,7 +1259,11 @@ class Preview { $view = new \OC\Files\View('/' . \OC_User::getUser() . '/' . $prefix); $absPath = Files\Filesystem::normalizePath($view->getAbsolutePath($path)); - self::addPathToDeleteFileMapper($absPath, $view->getFileInfo($path)); + $fileInfo = $view->getFileInfo($path); + if($fileInfo === false) { + return; + } + self::addPathToDeleteFileMapper($absPath, $fileInfo); if ($view->is_dir($path)) { $children = self::getAllChildren($view, $path); self::$deleteChildrenMapper[$absPath] = $children; From dda9525c4be9f04fd2869b78ff0612c2f57f4e56 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Wed, 9 Dec 2015 01:55:14 -0500 Subject: [PATCH 019/194] [tx-robot] updated from transifex --- apps/files/l10n/mk.js | 1 + apps/files/l10n/mk.json | 1 + apps/files_external/l10n/cs_CZ.js | 8 +++++++ apps/files_external/l10n/cs_CZ.json | 8 +++++++ apps/files_external/l10n/fi_FI.js | 3 +++ apps/files_external/l10n/fi_FI.json | 3 +++ apps/files_external/l10n/it.js | 9 ++++++++ apps/files_external/l10n/it.json | 9 ++++++++ apps/files_external/l10n/sq.js | 8 +++++++ apps/files_external/l10n/sq.json | 8 +++++++ apps/files_sharing/l10n/mk.js | 35 ++++++++++++++++++++++++++++- apps/files_sharing/l10n/mk.json | 35 ++++++++++++++++++++++++++++- apps/files_trashbin/l10n/mk.js | 1 + apps/files_trashbin/l10n/mk.json | 1 + core/l10n/cs_CZ.js | 1 + core/l10n/cs_CZ.json | 1 + core/l10n/fi_FI.js | 1 + core/l10n/fi_FI.json | 1 + core/l10n/it.js | 1 + core/l10n/it.json | 1 + core/l10n/pt_BR.js | 2 ++ core/l10n/pt_BR.json | 2 ++ core/l10n/sq.js | 1 + core/l10n/sq.json | 1 + core/l10n/th_TH.js | 1 + core/l10n/th_TH.json | 1 + lib/l10n/th_TH.js | 2 ++ lib/l10n/th_TH.json | 2 ++ settings/l10n/mk.js | 32 +++++++++++++++++++++++--- settings/l10n/mk.json | 32 +++++++++++++++++++++++--- 30 files changed, 204 insertions(+), 8 deletions(-) diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index 92616a372a..7a387afee6 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -54,6 +54,7 @@ OC.L10N.register( "Settings" : "Подесувања", "WebDAV" : "WebDAV", "Cancel upload" : "Откажи прикачување", + "No entries found in this folder" : "Нема ништо во оваа папка", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index 147707256c..acf8f546d7 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -52,6 +52,7 @@ "Settings" : "Подесувања", "WebDAV" : "WebDAV", "Cancel upload" : "Откажи прикачување", + "No entries found in this folder" : "Нема ништо во оваа папка", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js index 94c8194e32..13ca22abcc 100644 --- a/apps/files_external/l10n/cs_CZ.js +++ b/apps/files_external/l10n/cs_CZ.js @@ -36,6 +36,14 @@ OC.L10N.register( "(group)" : "(skupina)", "Admin defined" : "Nastaveno administrátorem", "Saved" : "Uloženo", + "Empty response from the server" : "Prázdná odpověď serveru", + "Couldn't access. Please logout and login to activate this mount point" : "Nelze připojit. Pro aktivaci tohoto přípojného bodu se prosím odhlašte a znovu přihlašte", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Nelze obdržet informaci z ownCloud serveru: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Nelze obdržet seznam vzdálených přípojných bodů: {type}", + "There was an error with message: " : "Došlo k chybě s tímto hlášením:", + "External mount error" : "Chyba vzdáleného úložiště", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Nelze obdržet seznam síťových úložišť systému Windows: prázdná odpověď serveru", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Některá z nastavených vzdálených úložišť nejsou připojena. Pro více informací prosím klikněte na červenou šipku(y)", "Access key" : "Přístupový klíč", "Secret key" : "Tajný klíč", "Builtin" : "Zabudované", diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json index 4adba2f4d0..bfcd3a30f4 100644 --- a/apps/files_external/l10n/cs_CZ.json +++ b/apps/files_external/l10n/cs_CZ.json @@ -34,6 +34,14 @@ "(group)" : "(skupina)", "Admin defined" : "Nastaveno administrátorem", "Saved" : "Uloženo", + "Empty response from the server" : "Prázdná odpověď serveru", + "Couldn't access. Please logout and login to activate this mount point" : "Nelze připojit. Pro aktivaci tohoto přípojného bodu se prosím odhlašte a znovu přihlašte", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Nelze obdržet informaci z ownCloud serveru: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Nelze obdržet seznam vzdálených přípojných bodů: {type}", + "There was an error with message: " : "Došlo k chybě s tímto hlášením:", + "External mount error" : "Chyba vzdáleného úložiště", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Nelze obdržet seznam síťových úložišť systému Windows: prázdná odpověď serveru", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Některá z nastavených vzdálených úložišť nejsou připojena. Pro více informací prosím klikněte na červenou šipku(y)", "Access key" : "Přístupový klíč", "Secret key" : "Tajný klíč", "Builtin" : "Zabudované", diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js index b56ad195ce..c358a2b326 100644 --- a/apps/files_external/l10n/fi_FI.js +++ b/apps/files_external/l10n/fi_FI.js @@ -25,6 +25,8 @@ OC.L10N.register( "(group)" : "(ryhmä)", "Admin defined" : "Ylläpitäjän määrittämä", "Saved" : "Tallennettu", + "Empty response from the server" : "Tyhjä vastaus palvelimelta", + "There was an error with message: " : "Tapahtui virhe viestillä:", "Builtin" : "Sisäänrakennettu", "None" : "Ei mitään", "OAuth1" : "OAuth1", @@ -39,6 +41,7 @@ OC.L10N.register( "Rackspace" : "Rackspace", "API key" : "API-avain", "Username and password" : "Käyttäjätunnus ja salasana", + "Session credentials" : "Istunnon tunnistetiedot", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json index 9ff2748b7f..4e72d861d6 100644 --- a/apps/files_external/l10n/fi_FI.json +++ b/apps/files_external/l10n/fi_FI.json @@ -23,6 +23,8 @@ "(group)" : "(ryhmä)", "Admin defined" : "Ylläpitäjän määrittämä", "Saved" : "Tallennettu", + "Empty response from the server" : "Tyhjä vastaus palvelimelta", + "There was an error with message: " : "Tapahtui virhe viestillä:", "Builtin" : "Sisäänrakennettu", "None" : "Ei mitään", "OAuth1" : "OAuth1", @@ -37,6 +39,7 @@ "Rackspace" : "Rackspace", "API key" : "API-avain", "Username and password" : "Käyttäjätunnus ja salasana", + "Session credentials" : "Istunnon tunnistetiedot", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js index daca1d3a89..85fb70cf1a 100644 --- a/apps/files_external/l10n/it.js +++ b/apps/files_external/l10n/it.js @@ -36,6 +36,15 @@ OC.L10N.register( "(group)" : "(gruppo)", "Admin defined" : "Definito dall'amministratore", "Saved" : "Salvato", + "Empty response from the server" : "Risposta vuota dal server", + "Couldn't access. Please logout and login to activate this mount point" : "Impossibile accedere. Termina la sessione e accedi nuovamente per attivare questo punto di mount", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossibile ottenere le informazioni dal server ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossibile ottenere l'elenco dei punti di mount esterni: {type}", + "There was an error with message: " : "Si è verificato un errore con il messaggio:", + "External mount error" : "Errore di mount esterno", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossibile ottenere l'elenco dei punti di mount delle unità di rete Windows: risposta vuota dal server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alcuni dei punti di mount esterni configurati non sono connessi. Fai clic sulle righe rosse per ulteriori informazioni", "Access key" : "Chiave di accesso", "Secret key" : "Chiave segreta", "Builtin" : "Integrata", diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json index 67f7fe3595..08da52362d 100644 --- a/apps/files_external/l10n/it.json +++ b/apps/files_external/l10n/it.json @@ -34,6 +34,15 @@ "(group)" : "(gruppo)", "Admin defined" : "Definito dall'amministratore", "Saved" : "Salvato", + "Empty response from the server" : "Risposta vuota dal server", + "Couldn't access. Please logout and login to activate this mount point" : "Impossibile accedere. Termina la sessione e accedi nuovamente per attivare questo punto di mount", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossibile ottenere le informazioni dal server ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossibile ottenere l'elenco dei punti di mount esterni: {type}", + "There was an error with message: " : "Si è verificato un errore con il messaggio:", + "External mount error" : "Errore di mount esterno", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossibile ottenere l'elenco dei punti di mount delle unità di rete Windows: risposta vuota dal server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alcuni dei punti di mount esterni configurati non sono connessi. Fai clic sulle righe rosse per ulteriori informazioni", "Access key" : "Chiave di accesso", "Secret key" : "Chiave segreta", "Builtin" : "Integrata", diff --git a/apps/files_external/l10n/sq.js b/apps/files_external/l10n/sq.js index a708bca92d..3e2de744b1 100644 --- a/apps/files_external/l10n/sq.js +++ b/apps/files_external/l10n/sq.js @@ -36,6 +36,14 @@ OC.L10N.register( "(group)" : "(grup)", "Admin defined" : "Përcaktuar nga përgjegjësi", "Saved" : "U ruajt", + "Empty response from the server" : "Përgjigje e zbrazët prej shërbyesit", + "Couldn't access. Please logout and login to activate this mount point" : "S’fut dot. Ju lutemi, dilni dhe hyni që të aktivizohet kjo pikë montimi", + "Couldn't get the information from the ownCloud server: {code} {type}" : "S’u morën dot të dhëna nga shërbyesi ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "S’u mor dot lista e pikave të jashtme të montimit: {type}", + "There was an error with message: " : "Pati një gabim me këtë mesazh:", + "External mount error" : "Gabim i jashtëm montimi", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "S’u mor dot lista e pikave të montimit Windows network drive: përgjigje e zbrazët nga shërbyesi", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Disa nga pikat e jashtme të formësuara të montimit s’janë të lidhura. Ju lutemi, klikoni në shigjetën(at) e kuqe për më tepër të dhëna", "Access key" : "Kyç hyrjesh", "Secret key" : "Kyç i fshehtë", "Builtin" : "I brendshëm", diff --git a/apps/files_external/l10n/sq.json b/apps/files_external/l10n/sq.json index 655a419c38..f184caf061 100644 --- a/apps/files_external/l10n/sq.json +++ b/apps/files_external/l10n/sq.json @@ -34,6 +34,14 @@ "(group)" : "(grup)", "Admin defined" : "Përcaktuar nga përgjegjësi", "Saved" : "U ruajt", + "Empty response from the server" : "Përgjigje e zbrazët prej shërbyesit", + "Couldn't access. Please logout and login to activate this mount point" : "S’fut dot. Ju lutemi, dilni dhe hyni që të aktivizohet kjo pikë montimi", + "Couldn't get the information from the ownCloud server: {code} {type}" : "S’u morën dot të dhëna nga shërbyesi ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "S’u mor dot lista e pikave të jashtme të montimit: {type}", + "There was an error with message: " : "Pati një gabim me këtë mesazh:", + "External mount error" : "Gabim i jashtëm montimi", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "S’u mor dot lista e pikave të montimit Windows network drive: përgjigje e zbrazët nga shërbyesi", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Disa nga pikat e jashtme të formësuara të montimit s’janë të lidhura. Ju lutemi, klikoni në shigjetën(at) e kuqe për më tepër të dhëna", "Access key" : "Kyç hyrjesh", "Secret key" : "Kyç i fshehtë", "Builtin" : "I brendshëm", diff --git a/apps/files_sharing/l10n/mk.js b/apps/files_sharing/l10n/mk.js index a5de7fb5c0..5be22894b9 100644 --- a/apps/files_sharing/l10n/mk.js +++ b/apps/files_sharing/l10n/mk.js @@ -1,20 +1,44 @@ OC.L10N.register( "files_sharing", { + "Server to server sharing is not enabled on this server" : "Не е овозможено споделувањето од сервер на сервер на вашиот сервер", + "Invalid or untrusted SSL certificate" : "SSL сертификат кој е невалиден или недоверлив", + "Could not authenticate to remote share, password might be wrong" : "Не можам да се автентицирам на оддалеченото споделевање, веројатно лозинката не е исправна", + "Storage not valid" : "Сториџот не е валиден", + "Couldn't add remote share" : "Не можам да додадам оддалечено споделување", "Shared with you" : "Споделено со тебе", "Shared with others" : "Сподели со останатите", "Shared by link" : "Споделено со врска", + "Nothing shared with you yet" : "Сеуште ништо не е споделено со вас", + "Nothing shared yet" : "Уште ништо не е споделено", + "No shared links" : "Нема споделени врски/линкови", + "Remote share" : "Оддалечено споделување", + "Remote share password" : "Лозинка за оддалечаното споделување", "Cancel" : "Откажи", + "Add remote share" : "Додади оддалечно споделување", + "You can upload into this folder" : "Можете да прикачите во оваа папка", + "Invalid ownCloud url" : "Неисправен ownCloud url", "Shared by" : "Споделено од", "Sharing" : "Споделување", "A file or folder has been shared" : "Датотека или фолдер беше споделен", "You shared %1$s with %2$s" : "Вие споделивте %1$s со %2$s", "You shared %1$s with group %2$s" : "Вие споделивте %1$s со групата %2$s", "%2$s shared %1$s with you" : "%2$s споделено %1$s со вас", + "Downloaded via public link" : "Преземи преку јавен линк", + "Shared with %2$s" : "Споделено со %2$s", + "Shared with group %2$s" : "Споделено со група %2$s", + "Shared with %3$s by %2$s" : "Споделено со %3$s од %2$s", + "Shared with group %3$s by %2$s" : "Споделено со група %3$s од %2$s", + "Shared via link by %2$s" : "Споделено со врска/линк од %2$s", + "Shared by %2$s" : "Споделено од %2$s", + "Shared via public link" : "Споделено со јавна врска/линк", "Shares" : "Споделувања", + "Accept" : "Прифати", + "Decline" : "Одбиј", "This share is password-protected" : "Ова споделување е заштитено со лозинка", "The password is wrong. Try again." : "Лозинката е грешна. Обиди се повторно.", "Password" : "Лозинка", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Share time" : "Сподели време", "Sorry, this link doesn’t seem to work anymore." : "Извенете, но овој линк изгледа дека повеќе не функционира.", @@ -23,8 +47,17 @@ OC.L10N.register( "the link expired" : "времетраењето на линкот е изминато", "sharing is disabled" : "споделувањето не е дозволено", "For more info, please ask the person who sent this link." : "За повеќе информации, прашајте го лицето кое ви ја испратила врската.", + "Add to your ownCloud" : "Додади во вашиот ownCloud", "Download" : "Преземи", "Download %s" : "Преземи %s", - "Direct link" : "Директна врска" + "Direct link" : "Директна врска", + "Federated Cloud Sharing" : "Федерирано клауд споделување", + "Open documentation" : "Отвори ја документацијата", + "Federated Cloud" : "Федериран клауд", + "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:", + "Share it:" : "Сподели го:", + "Add to your website" : "Додади на твојот веб сајт", + "Share with me via ownCloud" : "Сподели со мене преку ownCloud", + "HTML Code:" : "HTML код:" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/files_sharing/l10n/mk.json b/apps/files_sharing/l10n/mk.json index ad7eff6078..40bcf9f8bd 100644 --- a/apps/files_sharing/l10n/mk.json +++ b/apps/files_sharing/l10n/mk.json @@ -1,18 +1,42 @@ { "translations": { + "Server to server sharing is not enabled on this server" : "Не е овозможено споделувањето од сервер на сервер на вашиот сервер", + "Invalid or untrusted SSL certificate" : "SSL сертификат кој е невалиден или недоверлив", + "Could not authenticate to remote share, password might be wrong" : "Не можам да се автентицирам на оддалеченото споделевање, веројатно лозинката не е исправна", + "Storage not valid" : "Сториџот не е валиден", + "Couldn't add remote share" : "Не можам да додадам оддалечено споделување", "Shared with you" : "Споделено со тебе", "Shared with others" : "Сподели со останатите", "Shared by link" : "Споделено со врска", + "Nothing shared with you yet" : "Сеуште ништо не е споделено со вас", + "Nothing shared yet" : "Уште ништо не е споделено", + "No shared links" : "Нема споделени врски/линкови", + "Remote share" : "Оддалечено споделување", + "Remote share password" : "Лозинка за оддалечаното споделување", "Cancel" : "Откажи", + "Add remote share" : "Додади оддалечно споделување", + "You can upload into this folder" : "Можете да прикачите во оваа папка", + "Invalid ownCloud url" : "Неисправен ownCloud url", "Shared by" : "Споделено од", "Sharing" : "Споделување", "A file or folder has been shared" : "Датотека или фолдер беше споделен", "You shared %1$s with %2$s" : "Вие споделивте %1$s со %2$s", "You shared %1$s with group %2$s" : "Вие споделивте %1$s со групата %2$s", "%2$s shared %1$s with you" : "%2$s споделено %1$s со вас", + "Downloaded via public link" : "Преземи преку јавен линк", + "Shared with %2$s" : "Споделено со %2$s", + "Shared with group %2$s" : "Споделено со група %2$s", + "Shared with %3$s by %2$s" : "Споделено со %3$s од %2$s", + "Shared with group %3$s by %2$s" : "Споделено со група %3$s од %2$s", + "Shared via link by %2$s" : "Споделено со врска/линк од %2$s", + "Shared by %2$s" : "Споделено од %2$s", + "Shared via public link" : "Споделено со јавна врска/линк", "Shares" : "Споделувања", + "Accept" : "Прифати", + "Decline" : "Одбиј", "This share is password-protected" : "Ова споделување е заштитено со лозинка", "The password is wrong. Try again." : "Лозинката е грешна. Обиди се повторно.", "Password" : "Лозинка", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Share time" : "Сподели време", "Sorry, this link doesn’t seem to work anymore." : "Извенете, но овој линк изгледа дека повеќе не функционира.", @@ -21,8 +45,17 @@ "the link expired" : "времетраењето на линкот е изминато", "sharing is disabled" : "споделувањето не е дозволено", "For more info, please ask the person who sent this link." : "За повеќе информации, прашајте го лицето кое ви ја испратила врската.", + "Add to your ownCloud" : "Додади во вашиот ownCloud", "Download" : "Преземи", "Download %s" : "Преземи %s", - "Direct link" : "Директна врска" + "Direct link" : "Директна врска", + "Federated Cloud Sharing" : "Федерирано клауд споделување", + "Open documentation" : "Отвори ја документацијата", + "Federated Cloud" : "Федериран клауд", + "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:", + "Share it:" : "Сподели го:", + "Add to your website" : "Додади на твојот веб сајт", + "Share with me via ownCloud" : "Сподели со мене преку ownCloud", + "HTML Code:" : "HTML код:" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" } \ No newline at end of file diff --git a/apps/files_trashbin/l10n/mk.js b/apps/files_trashbin/l10n/mk.js index 6acb933aa8..8a4b16c52d 100644 --- a/apps/files_trashbin/l10n/mk.js +++ b/apps/files_trashbin/l10n/mk.js @@ -9,6 +9,7 @@ OC.L10N.register( "Delete permanently" : "Трајно избришани", "Error" : "Грешка", "restored" : "повратени", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Deleted" : "Избришан" }, diff --git a/apps/files_trashbin/l10n/mk.json b/apps/files_trashbin/l10n/mk.json index a9948f49ff..2ec0b3c950 100644 --- a/apps/files_trashbin/l10n/mk.json +++ b/apps/files_trashbin/l10n/mk.json @@ -7,6 +7,7 @@ "Delete permanently" : "Трајно избришани", "Error" : "Грешка", "restored" : "повратени", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Deleted" : "Избришан" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js index 94fe048939..c9c8ca08eb 100644 --- a/core/l10n/cs_CZ.js +++ b/core/l10n/cs_CZ.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.", "Log in" : "Přihlásit", "Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?", + "Wrong password." : "Chybné heslo.", "Stay logged in" : "Neodhlašovat", "Alternative Logins" : "Alternativní přihlášení", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json index 08c93b6388..4fa79ebec9 100644 --- a/core/l10n/cs_CZ.json +++ b/core/l10n/cs_CZ.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.", "Log in" : "Přihlásit", "Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?", + "Wrong password." : "Chybné heslo.", "Stay logged in" : "Neodhlašovat", "Alternative Logins" : "Alternativní přihlášení", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js index f167292ec1..5291a0d1c2 100644 --- a/core/l10n/fi_FI.js +++ b/core/l10n/fi_FI.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Yritä uudestaan tai ota yhteys ylläpitäjään.", "Log in" : "Kirjaudu sisään", "Wrong password. Reset it?" : "Väärä salasana. Haluatko palauttaa salasanan?", + "Wrong password." : "Väärä salasana.", "Stay logged in" : "Pysy sisäänkirjautuneena", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json index d98473c9f5..b531256106 100644 --- a/core/l10n/fi_FI.json +++ b/core/l10n/fi_FI.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Yritä uudestaan tai ota yhteys ylläpitäjään.", "Log in" : "Kirjaudu sisään", "Wrong password. Reset it?" : "Väärä salasana. Haluatko palauttaa salasanan?", + "Wrong password." : "Väärä salasana.", "Stay logged in" : "Pysy sisäänkirjautuneena", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", diff --git a/core/l10n/it.js b/core/l10n/it.js index c6cfb7d78d..dd472ea641 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Prova ancora o contatta il tuo amministratore.", "Log in" : "Accedi", "Wrong password. Reset it?" : "Password errata. Vuoi reimpostarla?", + "Wrong password." : "Password errata.", "Stay logged in" : "Rimani collegato", "Alternative Logins" : "Accessi alternativi", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", diff --git a/core/l10n/it.json b/core/l10n/it.json index 4f3bc17231..37d17409e9 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Prova ancora o contatta il tuo amministratore.", "Log in" : "Accedi", "Wrong password. Reset it?" : "Password errata. Vuoi reimpostarla?", + "Wrong password." : "Password errata.", "Stay logged in" : "Rimani collegato", "Alternative Logins" : "Accessi alternativi", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index 23963477f5..a1f0e287b7 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -191,6 +191,7 @@ OC.L10N.register( "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", "%s password reset" : "%s redefinir senha", "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", "New password" : "Nova senha", @@ -265,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Por favor tente novamente ou faça contato com o seu administrador.", "Log in" : "Entrar", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", + "Wrong password." : "Senha errada", "Stay logged in" : "Permaneça logado", "Alternative Logins" : "Logins Alternativos", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index 966ec44994..fd3c4f6ac2 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -189,6 +189,7 @@ "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", "%s password reset" : "%s redefinir senha", "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", "New password" : "Nova senha", @@ -263,6 +264,7 @@ "Please try again or contact your administrator." : "Por favor tente novamente ou faça contato com o seu administrador.", "Log in" : "Entrar", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", + "Wrong password." : "Senha errada", "Stay logged in" : "Permaneça logado", "Alternative Logins" : "Logins Alternativos", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", diff --git a/core/l10n/sq.js b/core/l10n/sq.js index 4f88093c46..7a0175d6ba 100644 --- a/core/l10n/sq.js +++ b/core/l10n/sq.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj.", "Log in" : "Hyni", "Wrong password. Reset it?" : "Fjalëkalim i gabuar. Të ricaktohet?", + "Wrong password." : "Fjalëkalim i gabuar.", "Stay logged in" : "Qëndro i futur", "Alternative Logins" : "Hyrje Alternative", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", diff --git a/core/l10n/sq.json b/core/l10n/sq.json index 748e0221e9..ebe75040d5 100644 --- a/core/l10n/sq.json +++ b/core/l10n/sq.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj.", "Log in" : "Hyni", "Wrong password. Reset it?" : "Fjalëkalim i gabuar. Të ricaktohet?", + "Wrong password." : "Fjalëkalim i gabuar.", "Stay logged in" : "Qëndro i futur", "Alternative Logins" : "Hyrje Alternative", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js index 33816cc707..cdf411f24d 100644 --- a/core/l10n/th_TH.js +++ b/core/l10n/th_TH.js @@ -191,6 +191,7 @@ OC.L10N.register( "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", "%s password reset" : "%s ตั้งรหัสผ่านใหม่", "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", "New password" : "รหัสผ่านใหม่", diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json index aa2dbc993d..2564a58ff8 100644 --- a/core/l10n/th_TH.json +++ b/core/l10n/th_TH.json @@ -189,6 +189,7 @@ "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", "%s password reset" : "%s ตั้งรหัสผ่านใหม่", "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", "New password" : "รหัสผ่านใหม่", diff --git a/lib/l10n/th_TH.js b/lib/l10n/th_TH.js index 4da409b7d8..da84e9758c 100644 --- a/lib/l10n/th_TH.js +++ b/lib/l10n/th_TH.js @@ -147,6 +147,8 @@ OC.L10N.register( "Data directory (%s) is invalid" : "ไดเรกทอรีข้อมูล (%s) ไม่ถูกต้อง", "Please check that the data directory contains a file \".ocdata\" in its root." : "กรุณาตรวจสอบว่าไดเรกทอรีข้อมูลมีแฟ้ม \".ocdata\" อยู่ในราก", "Could not obtain lock type %d on \"%s\"." : "ไม่สามารถรับล็อคชนิด %d บน \"%s\"", + "Storage unauthorized. %s" : "การจัดเก็บข้อมูลไม่ได้รับอนุญาต %s", + "Storage incomplete configuration. %s" : "การตั้งค่าการจัดเก็บข้อมูลไม่สำเร็จ %s", "Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/th_TH.json b/lib/l10n/th_TH.json index a21802be63..8a951a1468 100644 --- a/lib/l10n/th_TH.json +++ b/lib/l10n/th_TH.json @@ -145,6 +145,8 @@ "Data directory (%s) is invalid" : "ไดเรกทอรีข้อมูล (%s) ไม่ถูกต้อง", "Please check that the data directory contains a file \".ocdata\" in its root." : "กรุณาตรวจสอบว่าไดเรกทอรีข้อมูลมีแฟ้ม \".ocdata\" อยู่ในราก", "Could not obtain lock type %d on \"%s\"." : "ไม่สามารถรับล็อคชนิด %d บน \"%s\"", + "Storage unauthorized. %s" : "การจัดเก็บข้อมูลไม่ได้รับอนุญาต %s", + "Storage incomplete configuration. %s" : "การตั้งค่าการจัดเก็บข้อมูลไม่สำเร็จ %s", "Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/mk.js b/settings/l10n/mk.js index 65e9d4c09a..29d21c8f40 100644 --- a/settings/l10n/mk.js +++ b/settings/l10n/mk.js @@ -10,12 +10,10 @@ OC.L10N.register( "Log" : "Записник", "Tips & tricks" : "Совети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка во автентикација", - "Your full name has been changed." : "Вашето целосно име е променето.", - "Unable to change full name" : "Не можам да го променам целото име", "Couldn't remove app." : "Не можам да ја отстранам апликацијата.", "Language changed" : "Јазикот е сменет", "Invalid request" : "Неправилно барање", + "Authentication error" : "Грешка во автентикација", "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", @@ -28,6 +26,7 @@ OC.L10N.register( "Unable to change password" : "Вашата лозинка неможе да се смени", "Enabled" : "Овозможен", "Not enabled" : "Не е овозможено", + "Federated Cloud Sharing" : "Федерирано клауд споделување", "A problem occurred, please check your log files (Error: %s)" : "Се случи грешка, ве молам проверете ги вашите датотеки за логови (Грешка: %s)", "Migration Completed" : "Миграцијата заврши", "Group already exists." : "Групата веќе постои.", @@ -38,9 +37,24 @@ OC.L10N.register( "test email settings" : "провери ги нагодувањата за електронска пошта", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Се случи грешка при праќање на порака. Ве молам проверете ги вашите подесувања. (Error: %s)", "Email sent" : "Е-порака пратена", + "Invalid mail address" : "Неправилна електронска адреса/пошта", + "A user with that name already exists." : "Корисник со ова име веќе постои.", + "Unable to create user." : "Неможе да додадам корисник.", + "Your %s account was created" : "Вашата %s сметка е креирана", + "Unable to delete user." : "Неможам да избришам корисник", + "Forbidden" : "Забрането", + "Invalid user" : "Неправилен корисник", + "Unable to change mail address" : "Не можам да ја променам електронската адреса/пошта", "Email saved" : "Електронската пошта е снимена", + "Your full name has been changed." : "Вашето целосно име е променето.", + "Unable to change full name" : "Не можам да го променам целото име", + "Migration started …" : "Миграцијата е започнаа ...", "Sending..." : "Испраќам...", + "Official" : "Официјален", + "Approved" : "Одобрен", + "Experimental" : "Експериментален", "All" : "Сите", + "No apps found for your version" : "За вашата верзија не се пронајдени апликации", "Please wait...." : "Ве молам почекајте ...", "Error while disabling app" : "Грешка при исклучувањето на апликацијата", "Disable" : "Оневозможи", @@ -49,23 +63,34 @@ OC.L10N.register( "Updating...." : "Надградувам ...", "Error while updating app" : "Грешка додека ја надградувам апликацијата", "Updated" : "Надграден", + "Uninstalling ...." : "Деинсталирам ...", + "Error while uninstalling app" : "Грешка при деинсталација на апликацијата", + "Uninstall" : "Деинсталирај", + "App update" : "Надградба на апликацијата", + "An error occurred: {message}" : "Се случи грешка: {message}", "Select a profile picture" : "Одбери фотографија за профилот", "Very weak password" : "Многу слаба лозинка", "Weak password" : "Слаба лозинка", "So-so password" : "Така така лозинка", "Good password" : "Добра лозинка", "Strong password" : "Јака лозинка", + "Valid until {date}" : "Валидно до {date}", "Delete" : "Избриши", "Groups" : "Групи", + "Unable to delete {objName}" : "Не можам да избришам {objName}", "Error creating group" : "Грешка при креирање на група", "A valid group name must be provided" : "Мора да се обезбеди валидно име на група", "undo" : "врати", + "no group" : "нема група", "never" : "никогаш", + "deleted {userName}" : "избришан {userName}", "add group" : "додади група", "A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ", "Error creating user" : "Грешка при креирање на корисникот", "A valid password must be provided" : "Мора да се обезбеди валидна лозинка", "__language_name__" : "__language_name__", + "Sync clients" : "Клиенти за синхронизација", + "Personal info" : "Лични податоци", "SSL root certificates" : "SSL root сертификати", "Info, warnings, errors and fatal issues" : "Информации, предупредувања, грешки и фатални работи", "Warnings, errors and fatal issues" : "Предупредувања, грешки и фатални работи", @@ -77,6 +102,7 @@ OC.L10N.register( "NT LAN Manager" : "NT LAN Менаџер", "SSL" : "SSL", "TLS" : "TLS", + "Open documentation" : "Отвори ја документацијата", "Allow apps to use the Share API" : "Дозволете апликациите да го користат API-то за споделување", "Allow users to share via link" : "Допушти корисниците да споделуваат со линкови", "Enforce password protection" : "Наметни заштита на лозинка", diff --git a/settings/l10n/mk.json b/settings/l10n/mk.json index 607808c736..b3dc7a8cee 100644 --- a/settings/l10n/mk.json +++ b/settings/l10n/mk.json @@ -8,12 +8,10 @@ "Log" : "Записник", "Tips & tricks" : "Совети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка во автентикација", - "Your full name has been changed." : "Вашето целосно име е променето.", - "Unable to change full name" : "Не можам да го променам целото име", "Couldn't remove app." : "Не можам да ја отстранам апликацијата.", "Language changed" : "Јазикот е сменет", "Invalid request" : "Неправилно барање", + "Authentication error" : "Грешка во автентикација", "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", @@ -26,6 +24,7 @@ "Unable to change password" : "Вашата лозинка неможе да се смени", "Enabled" : "Овозможен", "Not enabled" : "Не е овозможено", + "Federated Cloud Sharing" : "Федерирано клауд споделување", "A problem occurred, please check your log files (Error: %s)" : "Се случи грешка, ве молам проверете ги вашите датотеки за логови (Грешка: %s)", "Migration Completed" : "Миграцијата заврши", "Group already exists." : "Групата веќе постои.", @@ -36,9 +35,24 @@ "test email settings" : "провери ги нагодувањата за електронска пошта", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Се случи грешка при праќање на порака. Ве молам проверете ги вашите подесувања. (Error: %s)", "Email sent" : "Е-порака пратена", + "Invalid mail address" : "Неправилна електронска адреса/пошта", + "A user with that name already exists." : "Корисник со ова име веќе постои.", + "Unable to create user." : "Неможе да додадам корисник.", + "Your %s account was created" : "Вашата %s сметка е креирана", + "Unable to delete user." : "Неможам да избришам корисник", + "Forbidden" : "Забрането", + "Invalid user" : "Неправилен корисник", + "Unable to change mail address" : "Не можам да ја променам електронската адреса/пошта", "Email saved" : "Електронската пошта е снимена", + "Your full name has been changed." : "Вашето целосно име е променето.", + "Unable to change full name" : "Не можам да го променам целото име", + "Migration started …" : "Миграцијата е започнаа ...", "Sending..." : "Испраќам...", + "Official" : "Официјален", + "Approved" : "Одобрен", + "Experimental" : "Експериментален", "All" : "Сите", + "No apps found for your version" : "За вашата верзија не се пронајдени апликации", "Please wait...." : "Ве молам почекајте ...", "Error while disabling app" : "Грешка при исклучувањето на апликацијата", "Disable" : "Оневозможи", @@ -47,23 +61,34 @@ "Updating...." : "Надградувам ...", "Error while updating app" : "Грешка додека ја надградувам апликацијата", "Updated" : "Надграден", + "Uninstalling ...." : "Деинсталирам ...", + "Error while uninstalling app" : "Грешка при деинсталација на апликацијата", + "Uninstall" : "Деинсталирај", + "App update" : "Надградба на апликацијата", + "An error occurred: {message}" : "Се случи грешка: {message}", "Select a profile picture" : "Одбери фотографија за профилот", "Very weak password" : "Многу слаба лозинка", "Weak password" : "Слаба лозинка", "So-so password" : "Така така лозинка", "Good password" : "Добра лозинка", "Strong password" : "Јака лозинка", + "Valid until {date}" : "Валидно до {date}", "Delete" : "Избриши", "Groups" : "Групи", + "Unable to delete {objName}" : "Не можам да избришам {objName}", "Error creating group" : "Грешка при креирање на група", "A valid group name must be provided" : "Мора да се обезбеди валидно име на група", "undo" : "врати", + "no group" : "нема група", "never" : "никогаш", + "deleted {userName}" : "избришан {userName}", "add group" : "додади група", "A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ", "Error creating user" : "Грешка при креирање на корисникот", "A valid password must be provided" : "Мора да се обезбеди валидна лозинка", "__language_name__" : "__language_name__", + "Sync clients" : "Клиенти за синхронизација", + "Personal info" : "Лични податоци", "SSL root certificates" : "SSL root сертификати", "Info, warnings, errors and fatal issues" : "Информации, предупредувања, грешки и фатални работи", "Warnings, errors and fatal issues" : "Предупредувања, грешки и фатални работи", @@ -75,6 +100,7 @@ "NT LAN Manager" : "NT LAN Менаџер", "SSL" : "SSL", "TLS" : "TLS", + "Open documentation" : "Отвори ја документацијата", "Allow apps to use the Share API" : "Дозволете апликациите да го користат API-то за споделување", "Allow users to share via link" : "Допушти корисниците да споделуваат со линкови", "Enforce password protection" : "Наметни заштита на лозинка", From 025f021fd4e908e9304bda26a9f25d887d25108d Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 9 Dec 2015 07:53:09 +0100 Subject: [PATCH 020/194] Remove dead code Silences two other security warnings, also I cleaned up the PHPDoc a little bit. --- apps/files_external/lib/config.php | 58 ++++-------------------------- 1 file changed, 6 insertions(+), 52 deletions(-) diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 7a869847a6..f29e08dad2 100644 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -90,6 +90,7 @@ class OC_Mount_Config { $userStoragesService->setUser($user); foreach ($userGlobalStoragesService->getStorages() as $storage) { + /** @var \OCA\Files_external\Lib\StorageConfig $storage */ $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint(); $mountEntry = self::prepareMountPointEntry($storage, false); foreach ($mountEntry['options'] as &$option) { @@ -266,26 +267,6 @@ class OC_Mount_Config { return array(); } - /** - * Write the mount points to the config file - * - * @param string|null $user If not null, personal for $user, otherwise system - * @param array $data Mount points - */ - public static function writeData($user, $data) { - if (isset($user)) { - $file = \OC::$server->getUserManager()->get($user)->getHome() . '/mount.json'; - } else { - $config = \OC::$server->getConfig(); - $datadir = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/'); - $file = $config->getSystemValue('mount_file', $datadir . '/mount.json'); - } - - $content = json_encode($data, JSON_PRETTY_PRINT); - @file_put_contents($file, $content); - @chmod($file, 0640); - } - /** * Get backend dependency message * TODO: move into AppFramework along with templates @@ -396,40 +377,10 @@ class OC_Mount_Config { return $cipher->decrypt($binaryPassword); } - /** - * Merges mount points - * - * @param array $data Existing mount points - * @param array $mountPoint New mount point - * @param string $mountType - * @return array - */ - private static function mergeMountPoints($data, $mountPoint, $mountType) { - $applicable = key($mountPoint); - $mountPath = key($mountPoint[$applicable]); - if (isset($data[$mountType])) { - if (isset($data[$mountType][$applicable])) { - // Merge priorities - if (isset($data[$mountType][$applicable][$mountPath]) - && isset($data[$mountType][$applicable][$mountPath]['priority']) - && !isset($mountPoint[$applicable][$mountPath]['priority']) - ) { - $mountPoint[$applicable][$mountPath]['priority'] - = $data[$mountType][$applicable][$mountPath]['priority']; - } - $data[$mountType][$applicable] - = array_merge($data[$mountType][$applicable], $mountPoint[$applicable]); - } else { - $data[$mountType] = array_merge($data[$mountType], $mountPoint); - } - } else { - $data[$mountType] = $mountPoint; - } - return $data; - } - /** * Returns the encryption cipher + * + * @return AES */ private static function getCipher() { $cipher = new AES(AES::MODE_CBC); @@ -441,6 +392,9 @@ class OC_Mount_Config { * Computes a hash based on the given configuration. * This is mostly used to find out whether configurations * are the same. + * + * @param array $config + * @return string */ public static function makeConfigHash($config) { $data = json_encode( From b50987165e8be87dacee4715f8548cb8fcde84b7 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 9 Dec 2015 08:54:11 +0100 Subject: [PATCH 021/194] Add support for read only config dir We already support the `config_is_read_only` for the config file itself. However not for the whole directory (which is a bug). This unifies the check in the checkServer routine with the one in base.php. Now one can enable a read only config folder so that ownCloud is not allowed to overwrite it's own source code. To test this set the whole config folder to read only, clear your session, refresh, see it fails, add the new code, refresh, see it works. Also verify that setup still works fine. (obviously setup does not work with a read only config Also verify that setup still works fine. (obviously setup does not work with a read only config)) Fixes https://github.com/owncloud/core/issues/14455 --- lib/private/util.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/private/util.php b/lib/private/util.php index eb188b649e..9016dc5975 100644 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -642,13 +642,15 @@ class OC_Util { } // Check if config folder is writable. - if (!is_writable(OC::$configDir) or !is_readable(OC::$configDir)) { - $errors[] = array( - 'error' => $l->t('Cannot write into "config" directory'), - 'hint' => $l->t('This can usually be fixed by ' - . '%sgiving the webserver write access to the config directory%s.', - array('', '')) - ); + if(!OC_Helper::isReadOnlyConfigEnabled()) { + if (!is_writable(OC::$configDir) or !is_readable(OC::$configDir)) { + $errors[] = array( + 'error' => $l->t('Cannot write into "config" directory'), + 'hint' => $l->t('This can usually be fixed by ' + . '%sgiving the webserver write access to the config directory%s.', + array('', '')) + ); + } } // Check if there is a writable install folder. From 5c0be3b565035f173b611f82e0b7ba6bd386b2e0 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 9 Dec 2015 09:43:23 +0100 Subject: [PATCH 022/194] Fix the last insert id test by changing to an autoincrement table --- .../lib/db/querybuilder/querybuildertest.php | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/lib/db/querybuilder/querybuildertest.php b/tests/lib/db/querybuilder/querybuildertest.php index c8e029d9e4..de8f84ac34 100644 --- a/tests/lib/db/querybuilder/querybuildertest.php +++ b/tests/lib/db/querybuilder/querybuildertest.php @@ -1124,11 +1124,12 @@ class QueryBuilderTest extends \Test\TestCase { $this->assertTrue(true); } - $qB->insert('appconfig') + $qB->insert('properties') ->values([ - 'appid' => $qB->expr()->literal('testFirstResult'), - 'configkey' => $qB->expr()->literal('testing' . 50), - 'configvalue' => $qB->expr()->literal(100 - 50), + 'userid' => $qB->expr()->literal('testFirstResult'), + 'propertypath' => $qB->expr()->literal('testing'), + 'propertyname' => $qB->expr()->literal('testing'), + 'propertyvalue' => $qB->expr()->literal('testing'), ]) ->execute(); @@ -1136,7 +1137,18 @@ class QueryBuilderTest extends \Test\TestCase { $this->assertNotNull($actual); $this->assertInternalType('int', $actual); - $this->assertEquals($this->connection->lastInsertId('*PREFIX*appconfig'), $actual); + $this->assertEquals($this->connection->lastInsertId('*PREFIX*properties'), $actual); + + $qB->delete('properties') + ->where($qB->expr()->eq('userid', $qB->expr()->literal('testFirstResult'))) + ->execute(); + + try { + $qB->getLastInsertId(); + $this->fail('getLastInsertId() should throw an exception, when being called after delete()'); + } catch (\BadMethodCallException $e) { + $this->assertTrue(true); + } } public function dataGetTableName() { From d39b018893c3ed9c85724cbaa7b7e2077d80800f Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Wed, 9 Dec 2015 10:49:54 +0100 Subject: [PATCH 023/194] Allow occ install on OS X - same behaviour as web setup --- core/command/maintenance/install.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/command/maintenance/install.php b/core/command/maintenance/install.php index b0235c518e..d4ef72c9fc 100644 --- a/core/command/maintenance/install.php +++ b/core/command/maintenance/install.php @@ -68,7 +68,12 @@ class Install extends Command { $errors = $sysInfo['errors']; if (count($errors) > 0) { $this->printErrors($output, $errors); - return 1; + + // ignore the OS X setup warning + if(count($errors) !== 1 || + (string)($errors[0]['error']) !== 'Mac OS X is not supported and ownCloud will not work properly on this platform. Use it at your own risk! ') { + return 1; + } } // validate user input From bef6344b277186e37cd02a4af74f270d97435d40 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 9 Dec 2015 11:09:02 +0100 Subject: [PATCH 024/194] Do not quote the table name for lastInsertId() --- lib/private/db/querybuilder/querybuilder.php | 28 +++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/private/db/querybuilder/querybuilder.php b/lib/private/db/querybuilder/querybuilder.php index 741da4efc2..a4cbb5abd7 100644 --- a/lib/private/db/querybuilder/querybuilder.php +++ b/lib/private/db/querybuilder/querybuilder.php @@ -40,6 +40,9 @@ class QueryBuilder implements IQueryBuilder { /** @var bool */ private $automaticTablePrefix = true; + /** @var string */ + protected $lastInsertedTable; + /** * Initializes a new QueryBuilder. * @@ -445,6 +448,8 @@ class QueryBuilder implements IQueryBuilder { $this->getTableName($insert) ); + $this->lastInsertedTable = $insert; + return $this; } @@ -1051,10 +1056,10 @@ class QueryBuilder implements IQueryBuilder { * @throws \BadMethodCallException When being called before an insert query has been run. */ public function getLastInsertId() { - $from = $this->getQueryPart('from'); - - if ($this->getType() === \Doctrine\DBAL\Query\QueryBuilder::INSERT && !empty($from)) { - return (int) $this->connection->lastInsertId($from['table']); + if ($this->getType() === \Doctrine\DBAL\Query\QueryBuilder::INSERT && $this->lastInsertedTable) { + // lastInsertId() needs the prefix but no quotes + $table = $this->prefixTableName($this->lastInsertedTable); + return (int) $this->connection->lastInsertId($table); } throw new \BadMethodCallException('Invalid call to getLastInsertId without using insert() before.'); @@ -1067,11 +1072,22 @@ class QueryBuilder implements IQueryBuilder { * @return string */ public function getTableName($table) { + $table = $this->prefixTableName($table); + return $this->helper->quoteColumnName($table); + } + + /** + * Returns the table name with database prefix as needed by the implementation + * + * @param string $table + * @return string + */ + protected function prefixTableName($table) { if ($this->automaticTablePrefix === false || strpos($table, '*PREFIX*') === 0) { - return $this->helper->quoteColumnName($table); + return $table; } - return $this->helper->quoteColumnName('*PREFIX*' . $table); + return '*PREFIX*' . $table; } /** From b59285d0d04a409a699aae85a0caaf7ff8c74393 Mon Sep 17 00:00:00 2001 From: Victor Dubiniuk Date: Tue, 8 Dec 2015 01:24:28 +0300 Subject: [PATCH 025/194] Add occ command to get app path --- core/command/app/getpath.php | 62 ++++++++++++++++++++++++++++++++++++ core/register_command.php | 1 + 2 files changed, 63 insertions(+) create mode 100644 core/command/app/getpath.php diff --git a/core/command/app/getpath.php b/core/command/app/getpath.php new file mode 100644 index 0000000000..7cfa01d48a --- /dev/null +++ b/core/command/app/getpath.php @@ -0,0 +1,62 @@ + + * + * @copyright Copyright (c) 2015, 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 OC\Core\Command\App; + +use OC\Core\Command\Base; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class GetPath extends Base { + protected function configure() { + parent::configure(); + + $this + ->setName('app:getpath') + ->setDescription('Get an absolute path to the app directory') + ->addArgument( + 'app', + InputArgument::REQUIRED, + 'Name of the app' + ) + ; + } + + /** + * Executes the current command. + * + * @param InputInterface $input An InputInterface instance + * @param OutputInterface $output An OutputInterface instance + * @return null|int null or 0 if everything went fine, or an error code + */ + protected function execute(InputInterface $input, OutputInterface $output) { + $appName = $input->getArgument('app'); + $path = \OC_App::getAppPath($appName); + if ($path !== false) { + $output->writeln($path); + return 0; + } + + // App not found, exit with non-zero + return 1; + } +} diff --git a/core/register_command.php b/core/register_command.php index 16dda55878..83e92a7e21 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -44,6 +44,7 @@ $application->add(new \OC\Core\Command\Integrity\SignCore( if (\OC::$server->getConfig()->getSystemValue('installed', false)) { $application->add(new OC\Core\Command\App\Disable()); $application->add(new OC\Core\Command\App\Enable()); + $application->add(new OC\Core\Command\App\GetPath()); $application->add(new OC\Core\Command\App\ListApps()); $application->add(new OC\Core\Command\Background\Cron(\OC::$server->getConfig())); From e3b47e80f7581b62010e840f8b03bbdc621f80b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 9 Dec 2015 12:09:45 +0100 Subject: [PATCH 026/194] script shall exit with error in case the start file has issues - fixes #20798 --- autotest-external.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/autotest-external.sh b/autotest-external.sh index 86fb796627..6128f68136 100755 --- a/autotest-external.sh +++ b/autotest-external.sh @@ -193,7 +193,8 @@ EOF echo "name: $name" # execute start file - if ./$FILES_EXTERNAL_BACKEND_ENV_PATH/$startFile; then + ./$FILES_EXTERNAL_BACKEND_ENV_PATH/$startFile + if [ $? -eq 0 ]; then # getting backend to test from filename # it's the part between the dots startSomething.TestToRun.sh testToRun=`echo $startFile | cut -d '-' -f 2` @@ -209,6 +210,8 @@ EOF "$PHPUNIT" --configuration phpunit-autotest-external.xml --log-junit "autotest-external-results-$1-$name.xml" "$FILES_EXTERNAL_BACKEND_PATH/$testToRun.php" RESULT=$? fi + else + DOEXIT=1 fi # calculate stop file @@ -218,6 +221,10 @@ EOF # execute stop file if existant ./$FILES_EXTERNAL_BACKEND_ENV_PATH/$stopFile fi + if [ "$DOEXIT" ]; then + echo "Error during start file execution ... terminating" + exit $DOEXIT + fi done; } From bb02488cc2b25d9dbf0dde536e24ffa2d6a04ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 9 Dec 2015 12:10:12 +0100 Subject: [PATCH 027/194] remove deprecated strict setting --- tests/phpunit-autotest-external.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/phpunit-autotest-external.xml b/tests/phpunit-autotest-external.xml index b9402bfa57..31d2e395a0 100644 --- a/tests/phpunit-autotest-external.xml +++ b/tests/phpunit-autotest-external.xml @@ -1,6 +1,5 @@ Date: Wed, 9 Dec 2015 12:18:51 +0100 Subject: [PATCH 028/194] Use default timeout on connection test --- apps/files_external/tests/env/start-smb-windows.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_external/tests/env/start-smb-windows.sh b/apps/files_external/tests/env/start-smb-windows.sh index 9453b4eb3e..a23c879dd9 100755 --- a/apps/files_external/tests/env/start-smb-windows.sh +++ b/apps/files_external/tests/env/start-smb-windows.sh @@ -19,7 +19,7 @@ user=smb-test password=!owncloud123 host=WIN-9GTFAS08C15 -if ! "$thisFolder"/env/wait-for-connection ${host} 445 0; then +if ! "$thisFolder"/env/wait-for-connection ${host} 445; then echo "[ERROR] Server not reachable" >&2 exit 1 fi From 2ce2de0ae523e91b90c39a91fdcc975f06a7674a Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Mon, 23 Nov 2015 23:53:55 +0100 Subject: [PATCH 029/194] add icommentsmanger and icomment implementation register CommentsManager service, allow override, document in config.sample.php don't insert autoincrement ids in tests, because of dislikes from oracle and pgsql specify timezone in null date only accepts strings for ID parameter that can be converted to int replace forgotten hardcoded IDs in tests react on deleted users react on file deletion Postgresql compatibility lastInsertId needs *PREFIX* with the table name do not listen for file deletion, because it is not reliable (trashbin, external storages) add runtime cache for comments --- config/config.sample.php | 13 + lib/private/comments/comment.php | 350 +++++++++++ lib/private/comments/manager.php | 566 ++++++++++++++++++ lib/private/comments/managerfactory.php | 24 + lib/private/server.php | 11 + lib/public/comments/icomment.php | 19 +- lib/public/comments/icommentsmanager.php | 22 +- .../comments/icommentsmanagerfactory.php | 22 + tests/lib/comments/comment.php | 102 ++++ tests/lib/comments/fakefactory.php | 22 + tests/lib/comments/manager.php | 560 +++++++++++++++++ tests/lib/server.php | 1 + 12 files changed, 1706 insertions(+), 6 deletions(-) create mode 100644 lib/private/comments/comment.php create mode 100644 lib/private/comments/manager.php create mode 100644 lib/private/comments/managerfactory.php create mode 100644 lib/public/comments/icommentsmanagerfactory.php create mode 100644 tests/lib/comments/comment.php create mode 100644 tests/lib/comments/fakefactory.php create mode 100644 tests/lib/comments/manager.php diff --git a/config/config.sample.php b/config/config.sample.php index c3abe3a2b8..9b10792944 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -814,6 +814,19 @@ $CONFIG = array( */ 'enforce_home_folder_naming_rule' => true, +/** + * Comments + * + * Global settings for the Comments infrastructure + */ + +/** + * Replaces the default Comments Manager Factory. This can be utilized if an + * own or 3rdParty CommentsManager should be used that – for instance – uses the + * filesystem instead of the database to keep the comments. + */ +'comments.managerFactory' => '\OC\Comments\ManagerFactory', + /** * Maintenance * diff --git a/lib/private/comments/comment.php b/lib/private/comments/comment.php new file mode 100644 index 0000000000..2e9e4bd3d8 --- /dev/null +++ b/lib/private/comments/comment.php @@ -0,0 +1,350 @@ + '', + 'parentId' => '0', + 'topmostParentId' => '0', + 'childrenCount' => '0', + 'message' => '', + 'verb' => '', + 'actorType' => '', + 'actorId' => '', + 'objectType' => '', + 'objectId' => '', + 'creationDT' => null, + 'latestChildDT' => null, + ]; + + /** + * Comment constructor. + * + * @param [] $data optional, array with keys according to column names from + * the comments database scheme + */ + public function __construct(array $data = null) { + if(is_array($data)) { + $this->fromArray($data); + } + } + + /** + * returns the ID of the comment + * + * It may return an empty string, if the comment was not stored. + * It is expected that the concrete Comment implementation gives an ID + * by itself (e.g. after saving). + * + * @return string + * @since 9.0.0 + */ + public function getId() { + return $this->data['id']; + } + + /** + * sets the ID of the comment and returns itself + * + * It is only allowed to set the ID only, if the current id is an empty + * string (which means it is not stored in a database, storage or whatever + * the concrete implementation does), or vice versa. Changing a given ID is + * not permitted and must result in an IllegalIDChangeException. + * + * @param string $id + * @return IComment + * @throws IllegalIDChangeException + * @since 9.0.0 + */ + public function setId($id) { + if(!is_string($id)) { + throw new \InvalidArgumentException('String expected.'); + } + + if($this->data['id'] === '' || ($this->data['id'] !== '' && $id === '')) { + $this->data['id'] = $id; + return $this; + } + + throw new IllegalIDChangeException('Not allowed to assign a new ID to an already saved comment.'); + } + + /** + * returns the parent ID of the comment + * + * @return string + * @since 9.0.0 + */ + public function getParentId() { + return $this->data['parentId']; + } + + /** + * sets the parent ID and returns itself + * + * @param string $parentId + * @return IComment + * @since 9.0.0 + */ + public function setParentId($parentId) { + if(!is_string($parentId)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['parentId'] = $parentId; + return $this; + } + + /** + * returns the topmost parent ID of the comment + * + * @return string + * @since 9.0.0 + */ + public function getTopmostParentId() { + return $this->data['topmostParentId']; + } + + + /** + * sets the topmost parent ID and returns itself + * + * @param string $id + * @return IComment + * @since 9.0.0 + */ + public function setTopmostParentId($id) { + if(!is_string($id)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['topmostParentId'] = $id; + return $this; + } + + /** + * returns the number of children + * + * @return int + * @since 9.0.0 + */ + public function getChildrenCount() { + return $this->data['childrenCount']; + } + + /** + * sets the number of children + * + * @param int $count + * @return IComment + * @since 9.0.0 + */ + public function setChildrenCount($count) { + if(!is_int($count)) { + throw new \InvalidArgumentException('Integer expected.'); + } + $this->data['childrenCount'] = $count; + return $this; + } + + /** + * returns the message of the comment + * + * @return string + * @since 9.0.0 + */ + public function getMessage() { + return $this->data['message']; + } + + /** + * sets the message of the comment and returns itself + * + * @param string $message + * @return IComment + * @since 9.0.0 + */ + public function setMessage($message) { + if(!is_string($message)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['message'] = $message; + return $this; + } + + /** + * returns the verb of the comment + * + * @return string + * @since 9.0.0 + */ + public function getVerb() { + return $this->data['verb']; + } + + /** + * sets the verb of the comment, e.g. 'comment' or 'like' + * + * @param string $verb + * @return IComment + * @since 9.0.0 + */ + public function setVerb($verb) { + if(!is_string($verb)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['verb'] = $verb; + return $this; + } + + /** + * returns the actor type + * + * @return string + * @since 9.0.0 + */ + public function getActorType() { + return $this->data['actorType']; + } + + /** + * returns the actor ID + * + * @return string + * @since 9.0.0 + */ + public function getActorId() { + return $this->data['actorId']; + } + + /** + * sets (overwrites) the actor type and id + * + * @param string $actorType e.g. 'user' + * @param string $actorId e.g. 'zombie234' + * @return IComment + * @since 9.0.0 + */ + public function setActor($actorType, $actorId) { + if(!is_string($actorType) || !is_string($actorId)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['actorType'] = $actorType; + $this->data['actorId'] = $actorId; + return $this; + } + + /** + * returns the creation date of the comment. + * + * If not explicitly set, it shall default to the time of initialization. + * + * @return \DateTime + * @since 9.0.0 + */ + public function getCreationDateTime() { + return $this->data['creationDT']; + } + + /** + * sets the creation date of the comment and returns itself + * + * @param \DateTime $timestamp + * @return IComment + * @since 9.0.0 + */ + public function setCreationDateTime(\DateTime $timestamp) { + $this->data['creationDT'] = $timestamp; + return $this; + } + + /** + * returns the timestamp of the most recent child + * + * @return int + * @since 9.0.0 + */ + public function getLatestChildDateTime() { + return $this->data['latestChildDT']; + } + + /** + * sets the date of the most recent child + * + * @param \DateTime $dateTime + * @return IComment + * @since 9.0.0 + */ + public function setLatestChildDateTime(\DateTime $dateTime = null) { + $this->data['latestChildDT'] = $dateTime; + return $this; + } + + /** + * returns the object type the comment is attached to + * + * @return string + * @since 9.0.0 + */ + public function getObjectType() { + return $this->data['objectType']; + } + + /** + * returns the object id the comment is attached to + * + * @return string + * @since 9.0.0 + */ + public function getObjectId() { + return $this->data['objectId']; + } + + /** + * sets (overwrites) the object of the comment + * + * @param string $objectType e.g. 'file' + * @param string $objectId e.g. '16435' + * @return IComment + * @since 9.0.0 + */ + public function setObject($objectType, $objectId) { + if(!is_string($objectType) || !is_string($objectId)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['objectType'] = $objectType; + $this->data['objectId'] = $objectId; + return $this; + } + + /** + * sets the comment data based on an array with keys as taken from the + * database. + * + * @param [] $data + * @return IComment + */ + protected function fromArray($data) { + foreach(array_keys($data) as $key) { + // translate DB keys to internal setter names + $setter = 'set' . str_replace('_', '', ucwords($key,'_')); + $setter = str_replace('Timestamp', 'DateTime', $setter); + + if(method_exists($this, $setter)) { + $this->$setter($data[$key]); + } + } + + foreach(['actor', 'object'] as $role) { + if(isset($data[$role . '_type']) && isset($data[$role . '_id'])) { + $setter = 'set' . ucfirst($role); + $this->$setter($data[$role . '_type'], $data[$role . '_id']); + } + } + + return $this; + } +} diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php new file mode 100644 index 0000000000..78b2b71c8d --- /dev/null +++ b/lib/private/comments/manager.php @@ -0,0 +1,566 @@ +dbConn = $dbConn; + $this->logger = $logger; + $userManager->listen('\OC\User', 'postDelete', function($user) { + /** @var \OCP\IUser $user */ + $this->deleteReferencesOfActor('user', $user->getUid()); + }); + } + + /** + * converts data base data into PHP native, proper types as defined by + * IComment interface. + * + * @param array $data + * @return array + */ + protected function normalizeDatabaseData(array $data) { + $data['id'] = strval($data['id']); + $data['parent_id'] = strval($data['parent_id']); + $data['topmost_parent_id'] = strval($data['topmost_parent_id']); + $data['creation_timestamp'] = new \DateTime($data['creation_timestamp']); + $data['latest_child_timestamp'] = new \DateTime($data['latest_child_timestamp']); + $data['children_count'] = intval($data['children_count']); + return $data; + } + + /** + * prepares a comment for an insert or update operation after making sure + * all necessary fields have a value assigned. + * + * @param IComment $comment + * @return IComment + * @throws \UnexpectedValueException + */ + protected function prepareCommentForDatabaseWrite(IComment $comment) { + if( empty($comment->getActorType()) + || empty($comment->getActorId()) + || empty($comment->getObjectType()) + || empty($comment->getObjectId()) + || empty($comment->getVerb()) + ) { + throw new \UnexpectedValueException('Actor, Object and Verb information must be provided for saving'); + } + + if($comment->getId() === '') { + $comment->setChildrenCount(0); + $comment->setLatestChildDateTime(new \DateTime('0000-00-00 00:00:00', new \DateTimeZone('UTC'))); + $comment->setLatestChildDateTime(null); + } + + if(is_null($comment->getCreationDateTime())) { + $comment->setCreationDateTime(new \DateTime()); + } + + if($comment->getParentId() !== '0') { + $comment->setTopmostParentId($this->determineTopmostParentId($comment->getParentId())); + } else { + $comment->setTopmostParentId('0'); + } + + $this->cache($comment); + + return $comment; + } + + /** + * returns the topmost parent id of a given comment identified by ID + * + * @param string $id + * @return string + * @throws NotFoundException + */ + protected function determineTopmostParentId($id) { + $comment = $this->get($id); + if($comment->getParentId() === '0') { + return $comment->getId(); + } else { + return $this->determineTopmostParentId($comment->getId()); + } + } + + /** + * updates child information of a comment + * + * @param string $id + * @param \DateTime $cDateTime the date time of the most recent child + * @throws NotFoundException + */ + protected function updateChildrenInformation($id, \DateTime $cDateTime) { + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select($qb->createFunction('COUNT(`id`)')) + ->from('comments') + ->where($qb->expr()->eq('parent_id', $qb->createParameter('id'))) + ->setParameter('id', $id); + + $resultStatement = $query->execute(); + $data = $resultStatement->fetch(\PDO::FETCH_NUM); + $resultStatement->closeCursor(); + $children = intval($data[0]); + + $comment = $this->get($id); + $comment->setChildrenCount($children); + $comment->setLatestChildDateTime($cDateTime); + $this->save($comment); + } + + /** + * Tests whether actor or object type and id parameters are acceptable. + * Throws exception if not. + * + * @param string $role + * @param string $type + * @param string $id + * @throws \InvalidArgumentException + */ + protected function checkRoleParameters($role, $type, $id) { + if( + !is_string($type) || empty($type) + || !is_string($id) || empty($id) + ) { + throw new \InvalidArgumentException($role . ' parameters must be string and not empty'); + } + } + + /** + * run-time caches a comment + * + * @param IComment $comment + */ + protected function cache(IComment $comment) { + $id = $comment->getId(); + if(empty($id)) { + return; + } + $this->commentsCache[strval($id)] = $comment; + } + + /** + * removes an entry from the comments run time cache + * + * @param mixed $id the comment's id + */ + protected function uncache($id) { + $id = strval($id); + if (isset($this->commentsCache[$id])) { + unset($this->commentsCache[$id]); + } + } + + /** + * returns a comment instance + * + * @param string $id the ID of the comment + * @return IComment + * @throws NotFoundException + * @throws \InvalidArgumentException + * @since 9.0.0 + */ + public function get($id) { + if(intval($id) === 0) { + throw new \InvalidArgumentException('IDs must be translatable to a number in this implementation.'); + } + + if(isset($this->commentsCache[$id])) { + return $this->commentsCache[$id]; + } + + $qb = $this->dbConn->getQueryBuilder(); + $resultStatement = $qb->select('*') + ->from('comments') + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $id, \PDO::PARAM_INT) + ->execute(); + + $data = $resultStatement->fetch(); + $resultStatement->closeCursor(); + if(!$data) { + throw new NotFoundException(); + } + + $comment = new Comment($this->normalizeDatabaseData($data)); + $this->cache($comment); + return $comment; + } + + /** + * returns the comment specified by the id and all it's child comments. + * At this point of time, we do only support one level depth. + * + * @param string $id + * @param int $limit max number of entries to return, 0 returns all + * @param int $offset the start entry + * @return array + * @since 9.0.0 + * + * The return array looks like this + * [ + * 'comment' => IComment, // root comment + * 'replies' => + * [ + * 0 => + * [ + * 'comment' => IComment, + * 'replies' => [] + * ] + * 1 => + * [ + * 'comment' => IComment, + * 'replies'=> [] + * ], + * … + * ] + * ] + */ + public function getTree($id, $limit = 0, $offset = 0) { + $tree = []; + $tree['comment'] = $this->get($id); + $tree['replies'] = []; + + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select('*') + ->from('comments') + ->where($qb->expr()->eq('topmost_parent_id', $qb->createParameter('id'))) + ->orderBy('creation_timestamp', 'DESC') + ->setParameter('id', $id); + + if($limit > 0) { + $query->setMaxResults($limit); + } + if($offset > 0) { + $query->setFirstResult($offset); + } + + $resultStatement = $query->execute(); + while($data = $resultStatement->fetch()) { + $comment = new Comment($this->normalizeDatabaseData($data)); + $this->cache($comment); + $tree['replies'][] = [ + 'comment' => $comment, + 'replies' => [] + ]; + } + $resultStatement->closeCursor(); + + return $tree; + } + + /** + * returns comments for a specific object (e.g. a file). + * + * The sort order is always newest to oldest. + * + * @param string $objectType the object type, e.g. 'files' + * @param string $objectId the id of the object + * @param int $limit optional, number of maximum comments to be returned. if + * not specified, all comments are returned. + * @param int $offset optional, starting point + * @param \DateTime $notOlderThan optional, timestamp of the oldest comments + * that may be returned + * @return IComment[] + * @since 9.0.0 + */ + public function getForObject( + $objectType, + $objectId, + $limit = 0, + $offset = 0, + \DateTime $notOlderThan = null + ) { + $comments = []; + + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select('*') + ->from('comments') + ->where($qb->expr()->eq('object_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('id'))) + ->orderBy('creation_timestamp', 'DESC') + ->setParameter('type', $objectType) + ->setParameter('id', $objectId); + + if($limit > 0) { + $query->setMaxResults($limit); + } + if($offset > 0) { + $query->setFirstResult($offset); + } + if(!is_null($notOlderThan)) { + $query + ->andWhere($qb->expr()->gt('creation_timestamp', $qb->createParameter('notOlderThan'))) + ->setParameter('notOlderThan', $notOlderThan, 'datetime'); + } + + $resultStatement = $query->execute(); + while($data = $resultStatement->fetch()) { + $comment = new Comment($this->normalizeDatabaseData($data)); + $this->cache($comment); + $comments[] = $comment; + } + $resultStatement->closeCursor(); + + return $comments; + } + + /** + * @param $objectType string the object type, e.g. 'files' + * @param $objectId string the id of the object + * @return Int + * @since 9.0.0 + */ + public function getNumberOfCommentsForObject($objectType, $objectId) { + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select($qb->createFunction('COUNT(`id`)')) + ->from('comments') + ->where($qb->expr()->eq('object_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('id'))) + ->setParameter('type', $objectType) + ->setParameter('id', $objectId); + + $resultStatement = $query->execute(); + $data = $resultStatement->fetch(\PDO::FETCH_NUM); + $resultStatement->closeCursor(); + return intval($data[0]); + } + + /** + * creates a new comment and returns it. At this point of time, it is not + * saved in the used data storage. Use save() after setting other fields + * of the comment (e.g. message or verb). + * + * @param string $actorType the actor type (e.g. 'user') + * @param string $actorId a user id + * @param string $objectType the object type the comment is attached to + * @param string $objectId the object id the comment is attached to + * @return IComment + * @throws \InvalidArgumentException + * @since 9.0.0 + */ + public function create($actorType, $actorId, $objectType, $objectId) { + if( + !is_string($actorType) || empty($actorType) + || !is_string($actorId) || empty($actorId) + || !is_string($objectType) || empty($objectType) + || !is_string($objectId) || empty($objectId) + ) { + // unsure whether it's a good place to enforce it here, since the + // comment instance can be manipulated anyway. + throw new \InvalidArgumentException('All arguments must be non-empty strings'); + } + $comment = new Comment(); + $comment + ->setActor($actorType, $actorId) + ->setObject($objectType, $objectId); + return $comment; + } + + /** + * permanently deletes the comment specified by the ID + * + * When the comment has child comments, their parent ID will be changed to + * the parent ID of the item that is to be deleted. + * + * @param string $id + * @return bool + * @throws \InvalidArgumentException + * @since 9.0.0 + */ + public function delete($id) { + if(!is_string($id)) { + throw new \InvalidArgumentException('Parameter must be string'); + } + + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->delete('comments') + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $id); + + try { + $affectedRows = $query->execute(); + $this->uncache($id); + } catch (DriverException $e) { + $this->logger->logException($e, ['app' => 'core_comments']); + return false; + } + return ($affectedRows > 0); + } + + /** + * saves the comment permanently and returns it + * + * if the supplied comment has an empty ID, a new entry comment will be + * saved and the instance updated with the new ID. + * + * Otherwise, an existing comment will be updated. + * + * Throws NotFoundException when a comment that is to be updated does not + * exist anymore at this point of time. + * + * @param IComment &$comment + * @return bool + * @throws NotFoundException + * @since 9.0.0 + */ + public function save(IComment &$comment) { + $comment = $this->prepareCommentForDatabaseWrite($comment); + if($comment->getId() === '') { + $result = $this->insert($comment); + } else { + $result = $this->update($comment); + } + + if($result && !empty($comment->getParentId())) { + $this->updateChildrenInformation( + $comment->getParentId(), + $comment->getCreationDateTime() + ); + $this->cache($comment); + } + + return $result; + } + + /** + * inserts the provided comment in the database + * + * @param IComment $comment + * @return bool + */ + protected function insert(IComment &$comment) { + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->insert('comments') + ->values([ + 'parent_id' => $qb->createNamedParameter($comment->getParentId()), + 'topmost_parent_id' => $qb->createNamedParameter($comment->getTopmostParentId()), + 'children_count' => $qb->createNamedParameter($comment->getChildrenCount()), + 'actor_type' => $qb->createNamedParameter($comment->getActorType()), + 'actor_id' => $qb->createNamedParameter($comment->getActorId()), + 'message' => $qb->createNamedParameter($comment->getMessage()), + 'verb' => $qb->createNamedParameter($comment->getVerb()), + 'creation_timestamp' => $qb->createNamedParameter($comment->getCreationDateTime(), 'datetime'), + 'latest_child_timestamp' => $qb->createNamedParameter($comment->getLatestChildDateTime(), 'datetime'), + 'object_type' => $qb->createNamedParameter($comment->getObjectType()), + 'object_id' => $qb->createNamedParameter($comment->getObjectId()), + ]) + ->execute(); + + if ($affectedRows > 0) { + $comment->setId(strval($this->dbConn->lastInsertId('*PREFIX*comments'))); + } + + return $affectedRows > 0; + } + + /** + * updates a Comment data row + * + * @param IComment $comment + * @return bool + * @throws NotFoundException + */ + protected function update(IComment $comment) { + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->update('comments') + ->set('parent_id', $qb->createNamedParameter($comment->getParentId())) + ->set('topmost_parent_id', $qb->createNamedParameter($comment->getTopmostParentId())) + ->set('children_count', $qb->createNamedParameter($comment->getChildrenCount())) + ->set('actor_type', $qb->createNamedParameter($comment->getActorType())) + ->set('actor_id', $qb->createNamedParameter($comment->getActorId())) + ->set('message', $qb->createNamedParameter($comment->getMessage())) + ->set('verb', $qb->createNamedParameter($comment->getVerb())) + ->set('creation_timestamp', $qb->createNamedParameter($comment->getCreationDateTime(), 'datetime')) + ->set('latest_child_timestamp', $qb->createNamedParameter($comment->getLatestChildDateTime(), 'datetime')) + ->set('object_type', $qb->createNamedParameter($comment->getObjectType())) + ->set('object_id', $qb->createNamedParameter($comment->getObjectId())) + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $comment->getId()) + ->execute(); + + if($affectedRows === 0) { + throw new NotFoundException('Comment to update does ceased to exist'); + } + + return $affectedRows > 0; + } + + /** + * removes references to specific actor (e.g. on user delete) of a comment. + * The comment itself must not get lost/deleted. + * + * @param string $actorType the actor type (e.g. 'user') + * @param string $actorId a user id + * @return boolean + * @since 9.0.0 + */ + public function deleteReferencesOfActor($actorType, $actorId) { + $this->checkRoleParameters('Actor', $actorType, $actorId); + + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->update('comments') + ->set('actor_type', $qb->createNamedParameter(ICommentsManager::DELETED_USER)) + ->set('actor_id', $qb->createNamedParameter(ICommentsManager::DELETED_USER)) + ->where($qb->expr()->eq('actor_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('actor_id', $qb->createParameter('id'))) + ->setParameter('type', $actorType) + ->setParameter('id', $actorId) + ->execute(); + + $this->commentsCache = []; + + return is_int($affectedRows); + } + + /** + * deletes all comments made of a specific object (e.g. on file delete) + * + * @param string $objectType the object type (e.g. 'file') + * @param string $objectId e.g. the file id + * @return boolean + * @since 9.0.0 + */ + public function deleteCommentsAtObject($objectType, $objectId) { + $this->checkRoleParameters('Object', $objectType, $objectId); + + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->delete('comments') + ->where($qb->expr()->eq('object_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('id'))) + ->setParameter('type', $objectType) + ->setParameter('id', $objectId) + ->execute(); + + $this->commentsCache = []; + + return is_int($affectedRows); + } +} diff --git a/lib/private/comments/managerfactory.php b/lib/private/comments/managerfactory.php new file mode 100644 index 0000000000..71d73571b1 --- /dev/null +++ b/lib/private/comments/managerfactory.php @@ -0,0 +1,24 @@ +getDatabaseConnection(), + \oc::$server->getUserManager(), + \oc::$server->getLogger() + ); + } +} diff --git a/lib/private/server.php b/lib/private/server.php index 6692e6f6bb..ecac18d6a9 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -528,6 +528,13 @@ class Server extends SimpleContainer implements IServerContainer { }); return $manager; }); + $this->registerService('CommentsManager', function(Server $c) { + $config = $c->getConfig(); + $factoryClass = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); + /** @var \OCP\Comments\ICommentsManagerFactory $factory */ + $factory = new $factoryClass(); + return $factory->getManager(); + }); $this->registerService('EventDispatcher', function() { return new EventDispatcher(); }); @@ -1121,6 +1128,10 @@ class Server extends SimpleContainer implements IServerContainer { return $this->query('NotificationManager'); } + public function getCommentsManager() { + return $this->query('CommentsManager'); + } + /** * @return \OC\IntegrityCheck\Checker */ diff --git a/lib/public/comments/icomment.php b/lib/public/comments/icomment.php index c8f407624a..8cfc504fc3 100644 --- a/lib/public/comments/icomment.php +++ b/lib/public/comments/icomment.php @@ -49,13 +49,30 @@ interface IComment { /** * sets the parent ID and returns itself - * * @param string $parentId * @return IComment * @since 9.0.0 */ public function setParentId($parentId); + /** + * returns the topmost parent ID of the comment + * + * @return string + * @since 9.0.0 + */ + public function getTopmostParentId(); + + + /** + * sets the topmost parent ID and returns itself + * + * @param string $id + * @return IComment + * @since 9.0.0 + */ + public function setTopmostParentId($id); + /** * returns the number of children * diff --git a/lib/public/comments/icommentsmanager.php b/lib/public/comments/icommentsmanager.php index ebf7a34bf2..f6883224d6 100644 --- a/lib/public/comments/icommentsmanager.php +++ b/lib/public/comments/icommentsmanager.php @@ -12,6 +12,17 @@ namespace OCP\Comments; */ interface ICommentsManager { + /** + * @const DELETED_USER type and id for a user that has been deleted + * @see deleteReferencesOfActor + * @since 9.0.0 + * + * To be used as replacement for user type actors in deleteReferencesOfActor(). + * + * User interfaces shall show "Deleted user" as display name, if needed. + */ + const DELETED_USER = 'deleted_user'; + /** * returns a comment instance * @@ -28,7 +39,7 @@ interface ICommentsManager { * @param string $id * @param int $limit max number of entries to return, 0 returns all * @param int $offset the start entry - * @return [] + * @return array * @since 9.0.0 * * The return array looks like this @@ -73,7 +84,6 @@ interface ICommentsManager { * @param \DateTime $notOlderThan optional, timestamp of the oldest comments * that may be returned * @return IComment[] - * @throws NotFoundException in case the requested type or id is not present * @since 9.0.0 */ public function getForObject( @@ -88,7 +98,6 @@ interface ICommentsManager { * @param $objectType string the object type, e.g. 'files' * @param $objectId string the id of the object * @return Int - * @throws NotFoundException in case the requested type or id is not present * @since 9.0.0 */ public function getNumberOfCommentsForObject($objectType, $objectId); @@ -130,17 +139,20 @@ interface ICommentsManager { * Throws NotFoundException when a comment that is to be updated does not * exist anymore at this point of time. * - * @param IComment + * @param IComment &$comment * @return bool * @throws NotFoundException * @since 9.0.0 */ - public function save(&$comment); + public function save(IComment &$comment); /** * removes references to specific actor (e.g. on user delete) of a comment. * The comment itself must not get lost/deleted. * + * A 'user' type actor (type and id) should get replaced by the + * value of the DELETED_USER constant of this interface. + * * @param string $actorType the actor type (e.g. 'user') * @param string $actorId a user id * @return boolean diff --git a/lib/public/comments/icommentsmanagerfactory.php b/lib/public/comments/icommentsmanagerfactory.php new file mode 100644 index 0000000000..7bfb79aae0 --- /dev/null +++ b/lib/public/comments/icommentsmanagerfactory.php @@ -0,0 +1,22 @@ + 'user', 'id' => 'alice']; + $creationDT = new \DateTime(); + $latestChildDT = new \DateTime('yesterday'); + $object = ['type' => 'file', 'id' => 'file64']; + + $comment + ->setId($id) + ->setParentId($parentId) + ->setChildrenCount($childrenCount) + ->setMessage($message) + ->setVerb($verb) + ->setActor($actor['type'], $actor['id']) + ->setCreationDateTime($creationDT) + ->setLatestChildDateTime($latestChildDT) + ->setObject($object['type'], $object['id']); + + $this->assertSame($id, $comment->getId()); + $this->assertSame($parentId, $comment->getParentId()); + $this->assertSame($childrenCount, $comment->getChildrenCount()); + $this->assertSame($message, $comment->getMessage()); + $this->assertSame($verb, $comment->getVerb()); + $this->assertSame($actor['type'], $comment->getActorType()); + $this->assertSame($actor['id'], $comment->getActorId()); + $this->assertSame($creationDT, $comment->getCreationDateTime()); + $this->assertSame($latestChildDT, $comment->getLatestChildDateTime()); + $this->assertSame($object['type'], $comment->getObjectType()); + $this->assertSame($object['id'], $comment->getObjectId()); + } + + public function testSetIdIllegalInput() { + $comment = new \OC\Comments\Comment(); + + $this->setExpectedException('\OCP\Comments\IllegalIDChangeException'); + $comment->setId('c23'); + $comment->setId('c17'); + } + + public function testResetId() { + $comment = new \OC\Comments\Comment(); + $comment->setId('c23'); + $comment->setId(''); + } + + public function simpleSetterProvider() { + return [ + ['Id'], + ['ParentId'], + ['Message'], + ['Verb'], + ['ChildrenCount'], + ]; + } + + /** + * @dataProvider simpleSetterProvider + */ + public function testSimpleSetterInvalidInput($field) { + $comment = new \OC\Comments\Comment(); + $setter = 'set' . $field; + + $this->setExpectedException('InvalidArgumentException'); + // we have no field that is supposed to accept a Bool + $comment->$setter(true); + } + + public function roleSetterProvider() { + return [ + ['Actor', true, true], + ['Actor', 'user', true], + ['Actor', true, 'alice'], + ['Object', true, true], + ['Object', 'file', true], + ['Object', true, 'file64'], + ]; + } + + /** + * @dataProvider roleSetterProvider + */ + public function testSetRoleInvalidInput($role, $type, $id){ + $comment = new \OC\Comments\Comment(); + $setter = 'set' . $role; + $this->setExpectedException('InvalidArgumentException'); + $comment->$setter($type, $id); + } + + + +} diff --git a/tests/lib/comments/fakefactory.php b/tests/lib/comments/fakefactory.php new file mode 100644 index 0000000000..202b02f641 --- /dev/null +++ b/tests/lib/comments/fakefactory.php @@ -0,0 +1,22 @@ +markTestSkipped(); + } + + public function getManager() { + return $this->getMock('\OCP\Comments\ICommentsManager'); + } +} diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php new file mode 100644 index 0000000000..610dfe51a4 --- /dev/null +++ b/tests/lib/comments/manager.php @@ -0,0 +1,560 @@ +getDatabaseConnection()->getDatabasePlatform()->getTruncateTableSQL('`*PREFIX*comments`'); + \oc::$server->getDatabaseConnection()->prepare($sql)->execute(); + } + + protected function addDatabaseEntry($parentId, $topmostParentId, $creationDT = null, $latestChildDT = null) { + if(is_null($creationDT)) { + $creationDT = new \DateTime(); + } + if(is_null($latestChildDT)) { + $latestChildDT = new \DateTime('yesterday'); + } + + $qb = \oc::$server->getDatabaseConnection()->getQueryBuilder(); + $qb + ->insert('comments') + ->values([ + 'parent_id' => $qb->createNamedParameter($parentId), + 'topmost_parent_id' => $qb->createNamedParameter($topmostParentId), + 'children_count' => $qb->createNamedParameter(2), + 'actor_type' => $qb->createNamedParameter('user'), + 'actor_id' => $qb->createNamedParameter('alice'), + 'message' => $qb->createNamedParameter('nice one'), + 'verb' => $qb->createNamedParameter('comment'), + 'creation_timestamp' => $qb->createNamedParameter($creationDT, 'datetime'), + 'latest_child_timestamp' => $qb->createNamedParameter($latestChildDT, 'datetime'), + 'object_type' => $qb->createNamedParameter('file'), + 'object_id' => $qb->createNamedParameter('file64'), + ]) + ->execute(); + + return \oc::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments'); + } + + protected function getManager() { + $factory = new \OC\Comments\ManagerFactory(); + return $factory->getManager(); + } + + public function testGetCommentNotFound() { + $manager = $this->getManager(); + $this->setExpectedException('\OCP\Comments\NotFoundException'); + $manager->get('22'); + } + + public function testGetCommentNotFoundInvalidInput() { + $manager = $this->getManager(); + $this->setExpectedException('\InvalidArgumentException'); + $manager->get('unexisting22'); + } + + public function testGetComment() { + $manager = $this->getManager(); + + $creationDT = new \DateTime(); + $latestChildDT = new \DateTime('yesterday'); + + $qb = \oc::$server->getDatabaseConnection()->getQueryBuilder(); + $qb + ->insert('comments') + ->values([ + 'parent_id' => $qb->createNamedParameter('2'), + 'topmost_parent_id' => $qb->createNamedParameter('1'), + 'children_count' => $qb->createNamedParameter(2), + 'actor_type' => $qb->createNamedParameter('user'), + 'actor_id' => $qb->createNamedParameter('alice'), + 'message' => $qb->createNamedParameter('nice one'), + 'verb' => $qb->createNamedParameter('comment'), + 'creation_timestamp' => $qb->createNamedParameter($creationDT, 'datetime'), + 'latest_child_timestamp' => $qb->createNamedParameter($latestChildDT, 'datetime'), + 'object_type' => $qb->createNamedParameter('file'), + 'object_id' => $qb->createNamedParameter('file64'), + ]) + ->execute(); + + $id = strval(\oc::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments')); + + $comment = $manager->get($id); + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getId(), $id); + $this->assertSame($comment->getParentId(), '2'); + $this->assertSame($comment->getTopmostParentId(), '1'); + $this->assertSame($comment->getChildrenCount(), 2); + $this->assertSame($comment->getActorType(), 'user'); + $this->assertSame($comment->getActorId(), 'alice'); + $this->assertSame($comment->getMessage(), 'nice one'); + $this->assertSame($comment->getVerb(), 'comment'); + $this->assertSame($comment->getObjectType(), 'file'); + $this->assertSame($comment->getObjectId(), 'file64'); + $this->assertEquals($comment->getCreationDateTime(), $creationDT); + $this->assertEquals($comment->getLatestChildDateTime(), $latestChildDT); + } + + public function testGetTreeNotFound() { + $manager = $this->getManager(); + $this->setExpectedException('\OCP\Comments\NotFoundException'); + $manager->getTree('22'); + } + + public function testGetTreeNotFoundInvalidIpnut() { + $manager = $this->getManager(); + $this->setExpectedException('\InvalidArgumentException'); + $manager->getTree('unexisting22'); + } + + public function testGetTree() { + $headId = $this->addDatabaseEntry(0, 0); + + $this->addDatabaseEntry($headId, $headId, new \DateTime('-3 hours')); + $this->addDatabaseEntry($headId, $headId, new \DateTime('-2 hours')); + $id = $this->addDatabaseEntry($headId, $headId, new \DateTime('-1 hour')); + + $manager = $this->getManager(); + $tree = $manager->getTree($headId); + + // Verifying the root comment + $this->assertTrue(isset($tree['comment'])); + $this->assertTrue($tree['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($tree['comment']->getId(), strval($headId)); + $this->assertTrue(isset($tree['replies'])); + $this->assertSame(count($tree['replies']), 3); + + // one level deep + foreach($tree['replies'] as $reply) { + $this->assertTrue($reply['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($reply['comment']->getId(), strval($id)); + $this->assertSame(count($reply['replies']), 0); + $id--; + } + } + + public function testGetTreeNoReplies() { + $id = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + $tree = $manager->getTree($id); + + // Verifying the root comment + $this->assertTrue(isset($tree['comment'])); + $this->assertTrue($tree['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($tree['comment']->getId(), strval($id)); + $this->assertTrue(isset($tree['replies'])); + $this->assertSame(count($tree['replies']), 0); + + // one level deep + foreach($tree['replies'] as $reply) { + throw new \Exception('This ain`t happen'); + } + } + + public function testGetTreeWithLimitAndOffset() { + $headId = $this->addDatabaseEntry(0, 0); + + $this->addDatabaseEntry($headId, $headId, new \DateTime('-3 hours')); + $this->addDatabaseEntry($headId, $headId, new \DateTime('-2 hours')); + $this->addDatabaseEntry($headId, $headId, new \DateTime('-1 hour')); + $idToVerify = $this->addDatabaseEntry($headId, $headId, new \DateTime()); + + $manager = $this->getManager(); + + for ($offset = 0; $offset < 3; $offset += 2) { + $tree = $manager->getTree(strval($headId), 2, $offset); + + // Verifying the root comment + $this->assertTrue(isset($tree['comment'])); + $this->assertTrue($tree['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($tree['comment']->getId(), strval($headId)); + $this->assertTrue(isset($tree['replies'])); + $this->assertSame(count($tree['replies']), 2); + + // one level deep + foreach ($tree['replies'] as $reply) { + $this->assertTrue($reply['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($reply['comment']->getId(), strval($idToVerify)); + $this->assertSame(count($reply['replies']), 0); + $idToVerify--; + } + } + } + + public function testGetForObject() { + $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + $comments = $manager->getForObject('file', 'file64'); + + $this->assertTrue(is_array($comments)); + $this->assertSame(count($comments), 1); + $this->assertTrue($comments[0] instanceof \OCP\Comments\IComment); + $this->assertSame($comments[0]->getMessage(), 'nice one'); + } + + public function testGetForObjectWithLimitAndOffset() { + $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-5 hours')); + $this->addDatabaseEntry(1, 1, new \DateTime('-4 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-1 hours')); + $idToVerify = $this->addDatabaseEntry(3, 1, new \DateTime()); + + $manager = $this->getManager(); + $offset = 0; + do { + $comments = $manager->getForObject('file', 'file64', 3, $offset); + + $this->assertTrue(is_array($comments)); + foreach($comments as $comment) { + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getMessage(), 'nice one'); + $this->assertSame($comment->getId(), strval($idToVerify)); + $idToVerify--; + } + $offset += 3; + } while(count($comments) > 0); + } + + public function testGetForObjectWithDateTimeConstraint() { + $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-5 hours')); + $id1 = $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); + $id2 = $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); + + $manager = $this->getManager(); + $comments = $manager->getForObject('file', 'file64', 0, 0, new \DateTime('-4 hours')); + + $this->assertSame(count($comments), 2); + $this->assertSame($comments[0]->getId(), strval($id2)); + $this->assertSame($comments[1]->getId(), strval($id1)); + } + + public function testGetForObjectWithLimitAndOffsetAndDateTimeConstraint() { + $this->addDatabaseEntry(0, 0, new \DateTime('-7 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); + $this->addDatabaseEntry(1, 1, new \DateTime('-5 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-1 hours')); + $idToVerify = $this->addDatabaseEntry(3, 1, new \DateTime()); + + $manager = $this->getManager(); + $offset = 0; + do { + $comments = $manager->getForObject('file', 'file64', 3, $offset, new \DateTime('-4 hours')); + + $this->assertTrue(is_array($comments)); + foreach($comments as $comment) { + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getMessage(), 'nice one'); + $this->assertSame($comment->getId(), strval($idToVerify)); + $this->assertTrue(intval($comment->getId()) >= 4); + $idToVerify--; + } + $offset += 3; + } while(count($comments) > 0); + } + + public function testGetNumberOfCommentsForObject() { + for($i = 1; $i < 5; $i++) { + $this->addDatabaseEntry(0, 0); + } + + $manager = $this->getManager(); + + $amount = $manager->getNumberOfCommentsForObject('untype', '00'); + $this->assertSame($amount, 0); + + $amount = $manager->getNumberOfCommentsForObject('file', 'file64'); + $this->assertSame($amount, 4); + } + + public function invalidCreateArgsProvider() { + return [ + ['', 'aId-1', 'oType-1', 'oId-1'], + ['aType-1', '', 'oType-1', 'oId-1'], + ['aType-1', 'aId-1', '', 'oId-1'], + ['aType-1', 'aId-1', 'oType-1', ''], + [1, 'aId-1', 'oType-1', 'oId-1'], + ['aType-1', 1, 'oType-1', 'oId-1'], + ['aType-1', 'aId-1', 1, 'oId-1'], + ['aType-1', 'aId-1', 'oType-1', 1], + ]; + } + + /** + * @dataProvider invalidCreateArgsProvider + */ + public function testCreateCommentInvalidArguments($aType, $aId, $oType, $oId) { + $manager = $this->getManager(); + $this->setExpectedException('\InvalidArgumentException'); + $manager->create($aType, $aId, $oType, $oId); + } + + public function testCreateComment() { + $actorType = 'bot'; + $actorId = 'bob'; + $objectType = 'weather'; + $objectId = 'bielefeld'; + + $comment = $this->getManager()->create($actorType, $actorId, $objectType, $objectId); + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getActorType(), $actorType); + $this->assertSame($comment->getActorId(), $actorId); + $this->assertSame($comment->getObjectType(), $objectType); + $this->assertSame($comment->getObjectId(), $objectId); + } + + public function testDelete() { + $manager = $this->getManager(); + + $done = $manager->delete('404'); + $this->assertFalse($done); + + $done = $manager->delete('%'); + $this->assertFalse($done); + + $done = $manager->delete(''); + $this->assertFalse($done); + + $id = strval($this->addDatabaseEntry(0, 0)); + $comment = $manager->get($id); + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $done = $manager->delete($id); + $this->assertTrue($done); + $this->setExpectedException('\OCP\Comments\NotFoundException'); + $manager->get($id); + } + + public function testSaveNew() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setMessage('very beautiful, I am impressed!') + ->setVerb('comment'); + + $saveSuccessful = $manager->save($comment); + $this->assertTrue($saveSuccessful); + $this->assertTrue($comment->getId() !== ''); + $this->assertTrue($comment->getId() !== '0'); + $this->assertTrue(!is_null($comment->getCreationDateTime())); + + $loadedComment = $manager->get($comment->getId()); + $this->assertSame($comment->getMessage(), $loadedComment->getMessage()); + $this->assertEquals($comment->getCreationDateTime(), $loadedComment->getCreationDateTime()); + } + + public function testSaveUpdate() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setMessage('very beautiful, I am impressed!') + ->setVerb('comment'); + + $manager->save($comment); + + $comment->setMessage('very beautiful, I am really so much impressed!'); + $manager->save($comment); + + $loadedComment = $manager->get($comment->getId()); + $this->assertSame($comment->getMessage(), $loadedComment->getMessage()); + } + + public function testSaveUpdateException() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setMessage('very beautiful, I am impressed!') + ->setVerb('comment'); + + $manager->save($comment); + + $manager->delete($comment->getId()); + $comment->setMessage('very beautiful, I am really so much impressed!'); + $this->setExpectedException('\OCP\Comments\NotFoundException'); + $manager->save($comment); + } + + public function testSaveIncomplete() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment->setMessage('from no one to nothing'); + $this->setExpectedException('\UnexpectedValueException'); + $manager->save($comment); + } + + public function testSaveAsChild() { + $id = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + + for($i = 0; $i < 3; $i++) { + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setParentId(strval($id)) + ->setMessage('full ack') + ->setVerb('comment') + // setting the creation time avoids using sleep() while making sure to test with different timestamps + ->setCreationDateTime(new \DateTime('+' . $i . ' minutes')); + + $manager->save($comment); + + $this->assertSame($comment->getTopmostParentId(), strval($id)); + $parentComment = $manager->get(strval($id)); + $this->assertSame($parentComment->getChildrenCount(), $i + 1); + $this->assertEquals($parentComment->getLatestChildDateTime(), $comment->getCreationDateTime()); + } + } + + public function invalidActorArgsProvider() { + return + [ + ['', ''], + [1, 'alice'], + ['user', 1], + ]; + } + + /** + * @dataProvider invalidActorArgsProvider + */ + public function testDeleteReferencesOfActorInvalidInput($type, $id) { + $manager = $this->getManager(); + $this->setExpectedException('\InvalidArgumentException'); + $manager->deleteReferencesOfActor($type, $id); + } + + public function testDeleteReferencesOfActor() { + $ids = []; + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + + // just to make sure they are really set, with correct actor data + $comment = $manager->get(strval($ids[1])); + $this->assertSame($comment->getActorType(), 'user'); + $this->assertSame($comment->getActorId(), 'alice'); + + $wasSuccessful = $manager->deleteReferencesOfActor('user', 'alice'); + $this->assertTrue($wasSuccessful); + + foreach($ids as $id) { + $comment = $manager->get(strval($id)); + $this->assertSame($comment->getActorType(), ICommentsManager::DELETED_USER); + $this->assertSame($comment->getActorId(), ICommentsManager::DELETED_USER); + } + + // actor info is gone from DB, but when database interaction is alright, + // we still expect to get true back + $wasSuccessful = $manager->deleteReferencesOfActor('user', 'alice'); + $this->assertTrue($wasSuccessful); + } + + public function testDeleteReferencesOfActorWithUserManagement() { + $user = \oc::$server->getUserManager()->createUser('xenia', '123456'); + $this->assertTrue($user instanceof \OCP\IUser); + + $manager = $this->getManager(); + $comment = $manager->create('user', $user->getUID(), 'file', 'file64'); + $comment + ->setMessage('Most important comment I ever left on the Internet.') + ->setVerb('comment'); + $status = $manager->save($comment); + $this->assertTrue($status); + + $commentID = $comment->getId(); + $user->delete(); + + $comment =$manager->get($commentID); + $this->assertSame($comment->getActorType(), \OCP\Comments\ICommentsManager::DELETED_USER); + $this->assertSame($comment->getActorId(), \OCP\Comments\ICommentsManager::DELETED_USER); + } + + public function invalidObjectArgsProvider() { + return + [ + ['', ''], + [1, 'file64'], + ['file', 1], + ]; + } + + /** + * @dataProvider invalidObjectArgsProvider + */ + public function testDeleteCommentsAtObjectInvalidInput($type, $id) { + $manager = $this->getManager(); + $this->setExpectedException('\InvalidArgumentException'); + $manager->deleteCommentsAtObject($type, $id); + } + + public function testDeleteCommentsAtObject() { + $ids = []; + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + + // just to make sure they are really set, with correct actor data + $comment = $manager->get(strval($ids[1])); + $this->assertSame($comment->getObjectType(), 'file'); + $this->assertSame($comment->getObjectId(), 'file64'); + + $wasSuccessful = $manager->deleteCommentsAtObject('file', 'file64'); + $this->assertTrue($wasSuccessful); + + $verified = 0; + foreach($ids as $id) { + try { + $manager->get(strval($id)); + } catch (\OCP\Comments\NotFoundException $e) { + $verified++; + } + } + $this->assertSame($verified, 3); + + // actor info is gone from DB, but when database interaction is alright, + // we still expect to get true back + $wasSuccessful = $manager->deleteCommentsAtObject('file', 'file64'); + $this->assertTrue($wasSuccessful); + } + + public function testOverwriteDefaultManager() { + $config = \oc::$server->getConfig(); + $defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); + + $managerMock = $this->getMock('\OCP\Comments\ICommentsManager'); + + $config->setSystemValue('comments.managerFactory', 'Test_Comments_FakeFactory'); + $manager = \oc::$server->getCommentsManager(); + $this->assertEquals($managerMock, $manager); + + $config->setSystemValue('comments.managerFactory', $defaultManagerFactory); + } + +} diff --git a/tests/lib/server.php b/tests/lib/server.php index b72bef8203..0bee19822d 100644 --- a/tests/lib/server.php +++ b/tests/lib/server.php @@ -61,6 +61,7 @@ class Server extends \Test\TestCase { ['CapabilitiesManager', '\OC\CapabilitiesManager'], ['ContactsManager', '\OC\ContactsManager'], ['ContactsManager', '\OCP\Contacts\IManager'], + ['CommentsManager', '\OCP\Comments\ICommentsManager'], ['Crypto', '\OC\Security\Crypto'], ['Crypto', '\OCP\Security\ICrypto'], ['CryptoWrapper', '\OC\Session\CryptoWrapper'], From e3dbc3d40ccd9874dadb32b59633cb159afddc48 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 3 Dec 2015 16:35:57 +0100 Subject: [PATCH 030/194] different strategy in cleaning up after user was deleted we do not listen to deletion hooks anymore, because there is no guarantee that they will be heard - requires that something fetches the CommentsManager first. Instead, in the user deletion routine the clean up method will be called directly. Same way as it happens for files, group memberships, config values. --- lib/private/comments/manager.php | 5 ----- lib/private/comments/managerfactory.php | 1 - lib/private/server.php | 3 +++ lib/private/user/user.php | 2 ++ tests/lib/comments/fakefactory.php | 19 +++++++++++++------ tests/lib/comments/manager.php | 19 +++---------------- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php index 78b2b71c8d..bb0782c77f 100644 --- a/lib/private/comments/manager.php +++ b/lib/private/comments/manager.php @@ -23,15 +23,10 @@ class Manager implements ICommentsManager { public function __construct( IDBConnection $dbConn, - Emitter $userManager, ILogger $logger ) { $this->dbConn = $dbConn; $this->logger = $logger; - $userManager->listen('\OC\User', 'postDelete', function($user) { - /** @var \OCP\IUser $user */ - $this->deleteReferencesOfActor('user', $user->getUid()); - }); } /** diff --git a/lib/private/comments/managerfactory.php b/lib/private/comments/managerfactory.php index 71d73571b1..0c9fce3e64 100644 --- a/lib/private/comments/managerfactory.php +++ b/lib/private/comments/managerfactory.php @@ -17,7 +17,6 @@ class ManagerFactory implements ICommentsManagerFactory { public function getManager() { return new Manager( \oc::$server->getDatabaseConnection(), - \oc::$server->getUserManager(), \oc::$server->getLogger() ); } diff --git a/lib/private/server.php b/lib/private/server.php index ecac18d6a9..8439500706 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -1128,6 +1128,9 @@ class Server extends SimpleContainer implements IServerContainer { return $this->query('NotificationManager'); } + /** + * @return \OCP\Comments\ICommentsManager + */ public function getCommentsManager() { return $this->query('CommentsManager'); } diff --git a/lib/private/user/user.php b/lib/private/user/user.php index d827097ee3..6c89dd06f7 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -189,6 +189,8 @@ class User implements IUser { // Delete the users entry in the storage table \OC\Files\Cache\Storage::remove('home::' . $this->uid); + + \OC::$server->getCommentsManager()->deleteReferencesOfActor('user', $this->uid); } if ($this->emitter) { diff --git a/tests/lib/comments/fakefactory.php b/tests/lib/comments/fakefactory.php index 202b02f641..cd85a4f34c 100644 --- a/tests/lib/comments/fakefactory.php +++ b/tests/lib/comments/fakefactory.php @@ -10,13 +10,20 @@ */ class Test_Comments_FakeFactory extends Test\TestCase implements \OCP\Comments\ICommentsManagerFactory { - public function testNothing() { - // If there would not be at least one test, phpunit would scream failure - // So we have one and skip it. - $this->markTestSkipped(); - } - public function getManager() { return $this->getMock('\OCP\Comments\ICommentsManager'); } + + public function testOverwriteDefaultManager() { + $config = \oc::$server->getConfig(); + $defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); + + $managerMock = $this->getMock('\OCP\Comments\ICommentsManager'); + + $config->setSystemValue('comments.managerFactory', 'Test_Comments_FakeFactory'); + $manager = \oc::$server->getCommentsManager(); + $this->assertEquals($managerMock, $manager); + + $config->setSystemValue('comments.managerFactory', $defaultManagerFactory); + } } diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php index 610dfe51a4..35a1c8a2af 100644 --- a/tests/lib/comments/manager.php +++ b/tests/lib/comments/manager.php @@ -475,10 +475,10 @@ class Test_Comments_Manager extends Test\TestCase } public function testDeleteReferencesOfActorWithUserManagement() { - $user = \oc::$server->getUserManager()->createUser('xenia', '123456'); + $user = \OC::$server->getUserManager()->createUser('xenia', '123456'); $this->assertTrue($user instanceof \OCP\IUser); - $manager = $this->getManager(); + $manager = \OC::$server->getCommentsManager(); $comment = $manager->create('user', $user->getUID(), 'file', 'file64'); $comment ->setMessage('Most important comment I ever left on the Internet.') @@ -489,7 +489,7 @@ class Test_Comments_Manager extends Test\TestCase $commentID = $comment->getId(); $user->delete(); - $comment =$manager->get($commentID); + $comment = $manager->get($commentID); $this->assertSame($comment->getActorType(), \OCP\Comments\ICommentsManager::DELETED_USER); $this->assertSame($comment->getActorId(), \OCP\Comments\ICommentsManager::DELETED_USER); } @@ -544,17 +544,4 @@ class Test_Comments_Manager extends Test\TestCase $this->assertTrue($wasSuccessful); } - public function testOverwriteDefaultManager() { - $config = \oc::$server->getConfig(); - $defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); - - $managerMock = $this->getMock('\OCP\Comments\ICommentsManager'); - - $config->setSystemValue('comments.managerFactory', 'Test_Comments_FakeFactory'); - $manager = \oc::$server->getCommentsManager(); - $this->assertEquals($managerMock, $manager); - - $config->setSystemValue('comments.managerFactory', $defaultManagerFactory); - } - } From 4273689e9f37adadef2d514714fadcc38582b87c Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 3 Dec 2015 17:13:18 +0100 Subject: [PATCH 031/194] fix usage of empty --- lib/private/comments/manager.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php index bb0782c77f..12b90a063d 100644 --- a/lib/private/comments/manager.php +++ b/lib/private/comments/manager.php @@ -55,11 +55,11 @@ class Manager implements ICommentsManager { * @throws \UnexpectedValueException */ protected function prepareCommentForDatabaseWrite(IComment $comment) { - if( empty($comment->getActorType()) - || empty($comment->getActorId()) - || empty($comment->getObjectType()) - || empty($comment->getObjectId()) - || empty($comment->getVerb()) + if( !$comment->getActorType() + || !$comment->getActorId() + || !$comment->getObjectType() + || !$comment->getObjectId() + || !$comment->getVerb() ) { throw new \UnexpectedValueException('Actor, Object and Verb information must be provided for saving'); } @@ -430,7 +430,7 @@ class Manager implements ICommentsManager { $result = $this->update($comment); } - if($result && !empty($comment->getParentId())) { + if($result && !!$comment->getParentId()) { $this->updateChildrenInformation( $comment->getParentId(), $comment->getCreationDateTime() From 9dc417183077752080799db8d5962ba5147fed29 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 3 Dec 2015 17:16:51 +0100 Subject: [PATCH 032/194] parameter checks for setting actor and object to happen only in one place --- lib/private/comments/comment.php | 10 ++++++++-- lib/private/comments/manager.php | 11 ----------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/lib/private/comments/comment.php b/lib/private/comments/comment.php index 2e9e4bd3d8..8efd7d5613 100644 --- a/lib/private/comments/comment.php +++ b/lib/private/comments/comment.php @@ -229,7 +229,10 @@ class Comment implements IComment { * @since 9.0.0 */ public function setActor($actorType, $actorId) { - if(!is_string($actorType) || !is_string($actorId)) { + if( + !is_string($actorType) || empty($actorType) + || !is_string($actorId) || empty($actorId) + ) { throw new \InvalidArgumentException('String expected.'); } $this->data['actorType'] = $actorType; @@ -312,7 +315,10 @@ class Comment implements IComment { * @since 9.0.0 */ public function setObject($objectType, $objectId) { - if(!is_string($objectType) || !is_string($objectId)) { + if( + !is_string($objectType) || empty($objectType) + || !is_string($objectId) || empty($objectId) + ) { throw new \InvalidArgumentException('String expected.'); } $this->data['objectType'] = $objectType; diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php index 12b90a063d..184e37eb12 100644 --- a/lib/private/comments/manager.php +++ b/lib/private/comments/manager.php @@ -354,20 +354,9 @@ class Manager implements ICommentsManager { * @param string $objectType the object type the comment is attached to * @param string $objectId the object id the comment is attached to * @return IComment - * @throws \InvalidArgumentException * @since 9.0.0 */ public function create($actorType, $actorId, $objectType, $objectId) { - if( - !is_string($actorType) || empty($actorType) - || !is_string($actorId) || empty($actorId) - || !is_string($objectType) || empty($objectType) - || !is_string($objectId) || empty($objectId) - ) { - // unsure whether it's a good place to enforce it here, since the - // comment instance can be manipulated anyway. - throw new \InvalidArgumentException('All arguments must be non-empty strings'); - } $comment = new Comment(); $comment ->setActor($actorType, $actorId) From 9a440c06b0da6d46417bda3fd6c84d42b69bb328 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 3 Dec 2015 17:19:40 +0100 Subject: [PATCH 033/194] OC not oc --- lib/private/comments/managerfactory.php | 4 ++-- tests/lib/comments/fakefactory.php | 4 ++-- tests/lib/comments/manager.php | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/private/comments/managerfactory.php b/lib/private/comments/managerfactory.php index 0c9fce3e64..41978d0cf4 100644 --- a/lib/private/comments/managerfactory.php +++ b/lib/private/comments/managerfactory.php @@ -16,8 +16,8 @@ class ManagerFactory implements ICommentsManagerFactory { */ public function getManager() { return new Manager( - \oc::$server->getDatabaseConnection(), - \oc::$server->getLogger() + \OC::$server->getDatabaseConnection(), + \OC::$server->getLogger() ); } } diff --git a/tests/lib/comments/fakefactory.php b/tests/lib/comments/fakefactory.php index cd85a4f34c..15b267b721 100644 --- a/tests/lib/comments/fakefactory.php +++ b/tests/lib/comments/fakefactory.php @@ -15,13 +15,13 @@ class Test_Comments_FakeFactory extends Test\TestCase implements \OCP\Comments\I } public function testOverwriteDefaultManager() { - $config = \oc::$server->getConfig(); + $config = \OC::$server->getConfig(); $defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); $managerMock = $this->getMock('\OCP\Comments\ICommentsManager'); $config->setSystemValue('comments.managerFactory', 'Test_Comments_FakeFactory'); - $manager = \oc::$server->getCommentsManager(); + $manager = \OC::$server->getCommentsManager(); $this->assertEquals($managerMock, $manager); $config->setSystemValue('comments.managerFactory', $defaultManagerFactory); diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php index 35a1c8a2af..3543393308 100644 --- a/tests/lib/comments/manager.php +++ b/tests/lib/comments/manager.php @@ -13,8 +13,8 @@ class Test_Comments_Manager extends Test\TestCase public function setUp() { parent::setUp(); - $sql = \oc::$server->getDatabaseConnection()->getDatabasePlatform()->getTruncateTableSQL('`*PREFIX*comments`'); - \oc::$server->getDatabaseConnection()->prepare($sql)->execute(); + $sql = \OC::$server->getDatabaseConnection()->getDatabasePlatform()->getTruncateTableSQL('`*PREFIX*comments`'); + \OC::$server->getDatabaseConnection()->prepare($sql)->execute(); } protected function addDatabaseEntry($parentId, $topmostParentId, $creationDT = null, $latestChildDT = null) { @@ -25,7 +25,7 @@ class Test_Comments_Manager extends Test\TestCase $latestChildDT = new \DateTime('yesterday'); } - $qb = \oc::$server->getDatabaseConnection()->getQueryBuilder(); + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); $qb ->insert('comments') ->values([ @@ -43,7 +43,7 @@ class Test_Comments_Manager extends Test\TestCase ]) ->execute(); - return \oc::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments'); + return \OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments'); } protected function getManager() { @@ -69,7 +69,7 @@ class Test_Comments_Manager extends Test\TestCase $creationDT = new \DateTime(); $latestChildDT = new \DateTime('yesterday'); - $qb = \oc::$server->getDatabaseConnection()->getQueryBuilder(); + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); $qb ->insert('comments') ->values([ @@ -87,7 +87,7 @@ class Test_Comments_Manager extends Test\TestCase ]) ->execute(); - $id = strval(\oc::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments')); + $id = strval(\OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments')); $comment = $manager->get($id); $this->assertTrue($comment instanceof \OCP\Comments\IComment); From b44a33f68ff705752c55a8572ce7d445336b9080 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 3 Dec 2015 17:20:40 +0100 Subject: [PATCH 034/194] fix php doc --- lib/public/comments/icomment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/public/comments/icomment.php b/lib/public/comments/icomment.php index 8cfc504fc3..7924ec8d5f 100644 --- a/lib/public/comments/icomment.php +++ b/lib/public/comments/icomment.php @@ -5,7 +5,7 @@ namespace OCP\Comments; /** * Interface IComment * - * This class represents a comment and offers methods for modification. + * This class represents a comment * * @package OCP\Comments * @since 9.0.0 From d3692c32837a54198f8f8a00713d93dd64db8e61 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 3 Dec 2015 17:23:22 +0100 Subject: [PATCH 035/194] namespaces for tests --- tests/lib/comments/comment.php | 6 +++++- tests/lib/comments/fakefactory.php | 13 ++++++------- tests/lib/comments/manager.php | 5 ++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tests/lib/comments/comment.php b/tests/lib/comments/comment.php index 790aca4296..f00dfd527f 100644 --- a/tests/lib/comments/comment.php +++ b/tests/lib/comments/comment.php @@ -1,6 +1,10 @@ getMock('\OCP\Comments\ICommentsManager'); @@ -20,7 +19,7 @@ class Test_Comments_FakeFactory extends Test\TestCase implements \OCP\Comments\I $managerMock = $this->getMock('\OCP\Comments\ICommentsManager'); - $config->setSystemValue('comments.managerFactory', 'Test_Comments_FakeFactory'); + $config->setSystemValue('comments.managerFactory', '\Test\Comments\Test_Comments_FakeFactory'); $manager = \OC::$server->getCommentsManager(); $this->assertEquals($managerMock, $manager); diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php index 3543393308..d5c415c250 100644 --- a/tests/lib/comments/manager.php +++ b/tests/lib/comments/manager.php @@ -1,13 +1,16 @@ Date: Thu, 3 Dec 2015 21:53:58 +0100 Subject: [PATCH 036/194] rework test about overwriting default comments manager --- tests/lib/comments/fakefactory.php | 21 +++---------------- tests/lib/comments/fakemanager.php | 33 ++++++++++++++++++++++++++++++ tests/lib/server.php | 12 +++++++++++ 3 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 tests/lib/comments/fakemanager.php diff --git a/tests/lib/comments/fakefactory.php b/tests/lib/comments/fakefactory.php index 0fa68e4cb0..837bcb1058 100644 --- a/tests/lib/comments/fakefactory.php +++ b/tests/lib/comments/fakefactory.php @@ -2,27 +2,12 @@ namespace Test\Comments; -use Test\TestCase; - /** - * Class Test_Comments_FakeFactory + * Class FakeFactory */ -class Test_Comments_FakeFactory extends TestCase implements \OCP\Comments\ICommentsManagerFactory { +class FakeFactory implements \OCP\Comments\ICommentsManagerFactory { public function getManager() { - return $this->getMock('\OCP\Comments\ICommentsManager'); - } - - public function testOverwriteDefaultManager() { - $config = \OC::$server->getConfig(); - $defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); - - $managerMock = $this->getMock('\OCP\Comments\ICommentsManager'); - - $config->setSystemValue('comments.managerFactory', '\Test\Comments\Test_Comments_FakeFactory'); - $manager = \OC::$server->getCommentsManager(); - $this->assertEquals($managerMock, $manager); - - $config->setSystemValue('comments.managerFactory', $defaultManagerFactory); + return new FakeManager(); } } diff --git a/tests/lib/comments/fakemanager.php b/tests/lib/comments/fakemanager.php new file mode 100644 index 0000000000..a3cd9c0c06 --- /dev/null +++ b/tests/lib/comments/fakemanager.php @@ -0,0 +1,33 @@ +assertInstanceOf('\OC_EventSource', $this->server->createEventSource(), 'service returned by "createEventSource" did not return the right class'); $this->assertInstanceOf('\OCP\IEventSource', $this->server->createEventSource(), 'service returned by "createEventSource" did not return the right class'); } + + public function testOverwriteDefaultCommentsManager() { + $config = $this->server->getConfig(); + $defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); + + $config->setSystemValue('comments.managerFactory', '\Test\Comments\FakeFactory'); + + $manager = $this->server->getCommentsManager(); + $this->assertInstanceOf('\OCP\Comments\ICommentsManager', $manager); + + $config->setSystemValue('comments.managerFactory', $defaultManagerFactory); + } } From f9081303b1a2b1a255ec4e869b18d118977f324f Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 4 Dec 2015 10:57:31 +0100 Subject: [PATCH 037/194] fix phpdoc --- lib/public/comments/icommentsmanagerfactory.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/public/comments/icommentsmanagerfactory.php b/lib/public/comments/icommentsmanagerfactory.php index 7bfb79aae0..6718dd39ba 100644 --- a/lib/public/comments/icommentsmanagerfactory.php +++ b/lib/public/comments/icommentsmanagerfactory.php @@ -3,9 +3,10 @@ namespace OCP\Comments; /** - * Interface IComment + * Interface ICommentsManagerFactory * - * This class represents a comment and offers methods for modification. + * This class is responsible for instantiating and returning an ICommentsManager + * instance. * * @package OCP\Comments * @since 9.0.0 From 0c1c0295717f0e75aa725d1c6699a68151f2c758 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 4 Dec 2015 11:13:39 +0100 Subject: [PATCH 038/194] hardening, add some checks for whitespace-only strings --- lib/private/comments/comment.php | 29 +++++++++++++++-------------- tests/lib/comments/comment.php | 18 ++++++++++-------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/lib/private/comments/comment.php b/lib/private/comments/comment.php index 8efd7d5613..15d721d099 100644 --- a/lib/private/comments/comment.php +++ b/lib/private/comments/comment.php @@ -66,6 +66,7 @@ class Comment implements IComment { throw new \InvalidArgumentException('String expected.'); } + $id = trim($id); if($this->data['id'] === '' || ($this->data['id'] !== '' && $id === '')) { $this->data['id'] = $id; return $this; @@ -95,7 +96,7 @@ class Comment implements IComment { if(!is_string($parentId)) { throw new \InvalidArgumentException('String expected.'); } - $this->data['parentId'] = $parentId; + $this->data['parentId'] = trim($parentId); return $this; } @@ -121,7 +122,7 @@ class Comment implements IComment { if(!is_string($id)) { throw new \InvalidArgumentException('String expected.'); } - $this->data['topmostParentId'] = $id; + $this->data['topmostParentId'] = trim($id); return $this; } @@ -171,7 +172,7 @@ class Comment implements IComment { if(!is_string($message)) { throw new \InvalidArgumentException('String expected.'); } - $this->data['message'] = $message; + $this->data['message'] = trim($message); return $this; } @@ -193,10 +194,10 @@ class Comment implements IComment { * @since 9.0.0 */ public function setVerb($verb) { - if(!is_string($verb)) { - throw new \InvalidArgumentException('String expected.'); + if(!is_string($verb) || empty(trim($verb))) { + throw new \InvalidArgumentException('Non-empty String expected.'); } - $this->data['verb'] = $verb; + $this->data['verb'] = trim($verb); return $this; } @@ -230,13 +231,13 @@ class Comment implements IComment { */ public function setActor($actorType, $actorId) { if( - !is_string($actorType) || empty($actorType) - || !is_string($actorId) || empty($actorId) + !is_string($actorType) || empty(trim($actorType)) + || !is_string($actorId) || empty(trim($actorId)) ) { throw new \InvalidArgumentException('String expected.'); } - $this->data['actorType'] = $actorType; - $this->data['actorId'] = $actorId; + $this->data['actorType'] = trim($actorType); + $this->data['actorId'] = trim($actorId); return $this; } @@ -316,13 +317,13 @@ class Comment implements IComment { */ public function setObject($objectType, $objectId) { if( - !is_string($objectType) || empty($objectType) - || !is_string($objectId) || empty($objectId) + !is_string($objectType) || empty(trim($objectType)) + || !is_string($objectId) || empty(trim($objectId)) ) { throw new \InvalidArgumentException('String expected.'); } - $this->data['objectType'] = $objectType; - $this->data['objectId'] = $objectId; + $this->data['objectType'] = trim($objectType); + $this->data['objectId'] = trim($objectId); return $this; } diff --git a/tests/lib/comments/comment.php b/tests/lib/comments/comment.php index f00dfd527f..c6a8f118dd 100644 --- a/tests/lib/comments/comment.php +++ b/tests/lib/comments/comment.php @@ -60,24 +60,24 @@ class Test_Comments_Comment extends TestCase public function simpleSetterProvider() { return [ - ['Id'], - ['ParentId'], - ['Message'], - ['Verb'], - ['ChildrenCount'], + ['Id', true], + ['ParentId', true], + ['Message', true], + ['Verb', true], + ['Verb', ''], + ['ChildrenCount', true], ]; } /** * @dataProvider simpleSetterProvider */ - public function testSimpleSetterInvalidInput($field) { + public function testSimpleSetterInvalidInput($field, $input) { $comment = new \OC\Comments\Comment(); $setter = 'set' . $field; $this->setExpectedException('InvalidArgumentException'); - // we have no field that is supposed to accept a Bool - $comment->$setter(true); + $comment->$setter($input); } public function roleSetterProvider() { @@ -85,9 +85,11 @@ class Test_Comments_Comment extends TestCase ['Actor', true, true], ['Actor', 'user', true], ['Actor', true, 'alice'], + ['Actor', ' ', ' '], ['Object', true, true], ['Object', 'file', true], ['Object', true, 'file64'], + ['Object', ' ', ' '], ]; } From dec1f1d24a9bcb710ca75b83d90251f1fe53967e Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 8 Dec 2015 14:57:55 +0100 Subject: [PATCH 039/194] anounce CommentsManager getter in public server interface --- lib/public/iservercontainer.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 7cb2672254..267e5dc4d3 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -471,6 +471,12 @@ interface IServerContainer { */ public function getNotificationManager(); + /** + * @return \OCP\Comments\ICommentsManager + * @since 9.0.0 + */ + public function getCommentsManager(); + /** * Returns the system-tag manager * From 249dc4490f55c0a40ec8af0800bbce146b6e5eac Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 8 Dec 2015 14:58:18 +0100 Subject: [PATCH 040/194] improve PHP doc and remove superflous by reference indicator --- lib/private/comments/manager.php | 10 +++++----- lib/public/comments/icommentsmanager.php | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php index 184e37eb12..a2b55c4ffd 100644 --- a/lib/private/comments/manager.php +++ b/lib/private/comments/manager.php @@ -51,7 +51,8 @@ class Manager implements ICommentsManager { * all necessary fields have a value assigned. * * @param IComment $comment - * @return IComment + * @return IComment returns the same updated IComment instance as provided + * by parameter for convenience * @throws \UnexpectedValueException */ protected function prepareCommentForDatabaseWrite(IComment $comment) { @@ -406,14 +407,13 @@ class Manager implements ICommentsManager { * Throws NotFoundException when a comment that is to be updated does not * exist anymore at this point of time. * - * @param IComment &$comment + * @param IComment $comment * @return bool * @throws NotFoundException * @since 9.0.0 */ - public function save(IComment &$comment) { - $comment = $this->prepareCommentForDatabaseWrite($comment); - if($comment->getId() === '') { + public function save(IComment $comment) { + if($this->prepareCommentForDatabaseWrite($comment)->getId() === '') { $result = $this->insert($comment); } else { $result = $this->update($comment); diff --git a/lib/public/comments/icommentsmanager.php b/lib/public/comments/icommentsmanager.php index f6883224d6..7626ffd635 100644 --- a/lib/public/comments/icommentsmanager.php +++ b/lib/public/comments/icommentsmanager.php @@ -139,12 +139,12 @@ interface ICommentsManager { * Throws NotFoundException when a comment that is to be updated does not * exist anymore at this point of time. * - * @param IComment &$comment + * @param IComment $comment * @return bool * @throws NotFoundException * @since 9.0.0 */ - public function save(IComment &$comment); + public function save(IComment $comment); /** * removes references to specific actor (e.g. on user delete) of a comment. From 8e298f51f84f0cca7f3ae51fa095bcabd06e8cdd Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 9 Dec 2015 14:38:01 +0100 Subject: [PATCH 041/194] adjust test's fakemanager to interface change --- tests/lib/comments/fakemanager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lib/comments/fakemanager.php b/tests/lib/comments/fakemanager.php index a3cd9c0c06..e5cf58dda4 100644 --- a/tests/lib/comments/fakemanager.php +++ b/tests/lib/comments/fakemanager.php @@ -25,7 +25,7 @@ class FakeManager implements \OCP\Comments\ICommentsManager { public function delete($id) {} - public function save(\OCP\Comments\IComment &$comment) {} + public function save(\OCP\Comments\IComment $comment) {} public function deleteReferencesOfActor($actorType, $actorId) {} From 0a80bf55739ef9d30cfef376377f5c54dd5a9a9c Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 9 Dec 2015 14:39:12 +0100 Subject: [PATCH 042/194] Add interface for memcache backends that support setting ttl on exisiting keys --- lib/private/memcache/redis.php | 8 ++++++-- lib/public/imemcachettl.php | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 lib/public/imemcachettl.php diff --git a/lib/private/memcache/redis.php b/lib/private/memcache/redis.php index 83be662eab..68b62e7534 100644 --- a/lib/private/memcache/redis.php +++ b/lib/private/memcache/redis.php @@ -25,9 +25,9 @@ namespace OC\Memcache; -use OCP\IMemcache; +use OCP\IMemcacheTTL; -class Redis extends Cache implements IMemcache { +class Redis extends Cache implements IMemcacheTTL { /** * @var \Redis $cache */ @@ -195,6 +195,10 @@ class Redis extends Cache implements IMemcache { return false; } + public function setTTL($key, $ttl) { + self::$cache->expire($this->getNamespace() . $key, $ttl); + } + static public function isAvailable() { return extension_loaded('redis') && version_compare(phpversion('redis'), '2.2.5', '>='); diff --git a/lib/public/imemcachettl.php b/lib/public/imemcachettl.php new file mode 100644 index 0000000000..aae26accb4 --- /dev/null +++ b/lib/public/imemcachettl.php @@ -0,0 +1,37 @@ + + * + * @copyright Copyright (c) 2015, 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 OCP; + +/** + * Interface for memcache backends that support setting ttl after the value is set + * + * @since 9.0.0 + */ +interface IMemcacheTTL extends IMemcache { + /** + * Set the ttl for an existing value + * + * @param string $key + * @param int $ttl time to live in seconds + */ + public function setTTL($key, $ttl); +} From 693a3c353ef88df2372426d4d1ea9f6527a59d62 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 9 Dec 2015 14:41:15 +0100 Subject: [PATCH 043/194] ttl for memcache locking backends that support it --- lib/private/lock/abstractlockingprovider.php | 2 ++ lib/private/lock/dblockingprovider.php | 2 -- lib/private/lock/memcachelockingprovider.php | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/private/lock/abstractlockingprovider.php b/lib/private/lock/abstractlockingprovider.php index c7a29380ef..db5f1c72dd 100644 --- a/lib/private/lock/abstractlockingprovider.php +++ b/lib/private/lock/abstractlockingprovider.php @@ -28,6 +28,8 @@ use OCP\Lock\ILockingProvider; * to release any left over locks at the end of the request */ abstract class AbstractLockingProvider implements ILockingProvider { + const TTL = 3600; // how long until we clear stray locks in seconds + protected $acquiredLocks = [ 'shared' => [], 'exclusive' => [] diff --git a/lib/private/lock/dblockingprovider.php b/lib/private/lock/dblockingprovider.php index 90657e6725..b3a12bb9a0 100644 --- a/lib/private/lock/dblockingprovider.php +++ b/lib/private/lock/dblockingprovider.php @@ -51,8 +51,6 @@ class DBLockingProvider extends AbstractLockingProvider { private $sharedLocks = []; - const TTL = 3600; // how long until we clear stray locks in seconds - /** * Check if we have an open shared lock for a path * diff --git a/lib/private/lock/memcachelockingprovider.php b/lib/private/lock/memcachelockingprovider.php index e4158dcdfd..af95200d15 100644 --- a/lib/private/lock/memcachelockingprovider.php +++ b/lib/private/lock/memcachelockingprovider.php @@ -21,6 +21,7 @@ namespace OC\Lock; +use OCP\IMemcacheTTL; use OCP\Lock\LockedException; use OCP\IMemcache; @@ -37,6 +38,12 @@ class MemcacheLockingProvider extends AbstractLockingProvider { $this->memcache = $memcache; } + private function setTTL($path) { + if ($this->memcache instanceof IMemcacheTTL) { + $this->memcache->setTTL($path, self::TTL); + } + } + /** * @param string $path * @param int $type self::LOCK_SHARED or self::LOCK_EXCLUSIVE @@ -69,6 +76,7 @@ class MemcacheLockingProvider extends AbstractLockingProvider { throw new LockedException($path); } } + $this->setTTL($path); $this->markAcquire($path, $type); } @@ -106,6 +114,7 @@ class MemcacheLockingProvider extends AbstractLockingProvider { throw new LockedException($path); } } + $this->setTTL($path); $this->markChange($path, $targetType); } } From e41f7b005db6b03d2ab29f37dbbeac3ba892e5fe Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 9 Dec 2015 14:45:08 +0100 Subject: [PATCH 044/194] add since --- lib/public/imemcachettl.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/public/imemcachettl.php b/lib/public/imemcachettl.php index aae26accb4..a4a7a53054 100644 --- a/lib/public/imemcachettl.php +++ b/lib/public/imemcachettl.php @@ -32,6 +32,7 @@ interface IMemcacheTTL extends IMemcache { * * @param string $key * @param int $ttl time to live in seconds + * @since 9.0.0 */ public function setTTL($key, $ttl); } From e191953942fe6b32917c5e01f27879db87e369ce Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 9 Dec 2015 14:13:05 +0100 Subject: [PATCH 045/194] Remove all locks after ttl from the db --- lib/private/lock/dblockingprovider.php | 6 +++--- tests/lib/lock/dblockingprovider.php | 8 +------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/private/lock/dblockingprovider.php b/lib/private/lock/dblockingprovider.php index 90657e6725..8d6ab52737 100644 --- a/lib/private/lock/dblockingprovider.php +++ b/lib/private/lock/dblockingprovider.php @@ -235,10 +235,10 @@ class DBLockingProvider extends AbstractLockingProvider { /** * cleanup empty locks */ - public function cleanEmptyLocks() { + public function cleanExpiredLocks() { $expire = $this->timeFactory->getTime(); $this->connection->executeUpdate( - 'DELETE FROM `*PREFIX*file_locks` WHERE `lock` = 0 AND `ttl` < ?', + 'DELETE FROM `*PREFIX*file_locks` WHERE `ttl` < ?', [$expire] ); } @@ -262,7 +262,7 @@ class DBLockingProvider extends AbstractLockingProvider { public function __destruct() { try { - $this->cleanEmptyLocks(); + $this->cleanExpiredLocks(); } catch (\Exception $e) { // If the table is missing, the clean up was successful if ($this->connection->tableExists('file_locks')) { diff --git a/tests/lib/lock/dblockingprovider.php b/tests/lib/lock/dblockingprovider.php index d679b1ea67..2032110f4f 100644 --- a/tests/lib/lock/dblockingprovider.php +++ b/tests/lib/lock/dblockingprovider.php @@ -85,13 +85,7 @@ class DBLockingProvider extends LockingProvider { $this->assertEquals(3, $this->getLockEntryCount()); - $this->instance->cleanEmptyLocks(); - - $this->assertEquals(3, $this->getLockEntryCount()); - - $this->instance->releaseAll(); - - $this->instance->cleanEmptyLocks(); + $this->instance->cleanExpiredLocks(); $this->assertEquals(2, $this->getLockEntryCount()); } From d5238b3d3cbac01e3660a5e3250deccc87c59d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 9 Dec 2015 15:15:10 +0100 Subject: [PATCH 046/194] Don't load commands of apps when in maintenance mode - fixes #20939 --- lib/private/console/application.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/private/console/application.php b/lib/private/console/application.php index c46e6d60de..e6d8677b72 100644 --- a/lib/private/console/application.php +++ b/lib/private/console/application.php @@ -55,7 +55,12 @@ class Application { $application = $this->application; require_once __DIR__ . '/../../../core/register_command.php'; if ($this->config->getSystemValue('installed', false)) { - if (!\OCP\Util::needUpgrade()) { + if (\OCP\Util::needUpgrade()) { + $output->writeln("ownCloud or one of the apps require upgrade - only a limited number of commands are available"); + $output->writeln("You may use your browser or the occ upgrade command to do the upgrade"); + } elseif ($this->config->getSystemValue('maintenance', false)) { + $output->writeln("ownCloud is in maintenance mode - no app have been loaded"); + } else { OC_App::loadApps(); foreach (\OC::$server->getAppManager()->getInstalledApps() as $app) { $appPath = \OC_App::getAppPath($app); @@ -68,9 +73,6 @@ class Application { require $file; } } - } else { - $output->writeln("ownCloud or one of the apps require upgrade - only a limited number of commands are available"); - $output->writeln("You may use your browser or the occ upgrade command to do the upgrade"); } } else { $output->writeln("ownCloud is not installed - only a limited number of commands are available"); From ce3adb8121462e183e2762e8437dd51b2a624d4f Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 9 Dec 2015 15:38:49 +0100 Subject: [PATCH 047/194] Let doctrine generate index names --- apps/files_external/appinfo/database.xml | 6 ------ apps/files_external/appinfo/info.xml | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/files_external/appinfo/database.xml b/apps/files_external/appinfo/database.xml index 27918bf981..2c3615a4d4 100644 --- a/apps/files_external/appinfo/database.xml +++ b/apps/files_external/appinfo/database.xml @@ -80,14 +80,12 @@ 64 - mount_id_app_index mount_id ascending - applicable_value_index type ascending @@ -98,7 +96,6 @@ - applicable_value_mount_index true type @@ -147,14 +144,12 @@ - config_mount_id mount_id ascending - config_mount_key true mount_id @@ -199,7 +194,6 @@ - option_mount_id mount_id ascending diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml index f6d583d0a5..355d9feb4b 100644 --- a/apps/files_external/appinfo/info.xml +++ b/apps/files_external/appinfo/info.xml @@ -14,7 +14,7 @@ admin-external-storage false - 0.5.0 + 0.5.1 From 5cf376ccb7c71a57177363742d32f53ef9ee42ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 9 Dec 2015 14:10:46 +0100 Subject: [PATCH 048/194] Looks like ceph requires more time to come up .... Use sed - not replace apply btrfs hack --- apps/files_external/tests/env/entrypoint.sh | 274 ++++++++++++++++++ .../tests/env/start-swift-ceph.sh | 13 +- 2 files changed, 283 insertions(+), 4 deletions(-) create mode 100755 apps/files_external/tests/env/entrypoint.sh diff --git a/apps/files_external/tests/env/entrypoint.sh b/apps/files_external/tests/env/entrypoint.sh new file mode 100755 index 0000000000..6dd6ef23fb --- /dev/null +++ b/apps/files_external/tests/env/entrypoint.sh @@ -0,0 +1,274 @@ +#!/bin/bash +set -e + +: ${CLUSTER:=ceph} +: ${RGW_NAME:=$(hostname -s)} +: ${MON_NAME:=$(hostname -s)} +: ${RGW_CIVETWEB_PORT:=80} +: ${OSD_SIZE:=100} + +: ${KEYSTONE_ADMIN_TOKEN:=admin} +: ${KEYSTONE_ADMIN_PORT:=35357} +: ${KEYSTONE_PUBLIC_PORT:=5001} + +: ${KEYSTONE_SERVICE:=${CLUSTER}} +: ${KEYSTONE_ENDPOINT_REGION:=region} + +: ${KEYSTONE_ADMIN_USER:=admin} +: ${KEYSTONE_ADMIN_TENANT:=admin} +: ${KEYSTONE_ADMIN_PASS:=admin} + +ip_address=$(head -n1 /etc/hosts | cut -d" " -f1) +: ${MON_IP:=${ip_address}} +subnet=$(ip route | grep "src ${ip_address}" | cut -d" " -f1) +: ${CEPH_NETWORK:=${subnet}} + +####### +# MON # +####### + +if [ ! -n "$CEPH_NETWORK" ]; then + echo "ERROR- CEPH_NETWORK must be defined as the name of the network for the OSDs" + exit 1 +fi + +if [ ! -n "$MON_IP" ]; then + echo "ERROR- MON_IP must be defined as the IP address of the monitor" + exit 1 +fi + +# bootstrap MON +if [ ! -e /etc/ceph/ceph.conf ]; then + fsid=$(uuidgen) + cat </etc/ceph/${CLUSTER}.conf +[global] +fsid = $fsid +mon initial members = ${MON_NAME} +mon host = ${MON_IP} +auth cluster required = cephx +auth service required = cephx +auth client required = cephx +osd crush chooseleaf type = 0 +osd journal size = 100 +osd pool default pg num = 8 +osd pool default pgp num = 8 +osd pool default size = 1 +public network = ${CEPH_NETWORK} +cluster network = ${CEPH_NETWORK} +debug ms = 1 + +[mon] +debug mon = 20 +debug paxos = 20 +debug auth = 20 + +[osd] +debug osd = 20 +debug filestore = 20 +debug journal = 20 +debug monc = 20 + +[mds] +debug mds = 20 +debug mds balancer = 20 +debug mds log = 20 +debug mds migrator = 20 + +[client.radosgw.gateway] +rgw keystone url = http://${MON_IP}:${KEYSTONE_ADMIN_PORT} +rgw keystone admin token = ${KEYSTONE_ADMIN_TOKEN} +rgw keystone accepted roles = _member_ +ENDHERE + + # Generate administrator key + ceph-authtool /etc/ceph/${CLUSTER}.client.admin.keyring --create-keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow' + + # Generate the mon. key + ceph-authtool /etc/ceph/${CLUSTER}.mon.keyring --create-keyring --gen-key -n mon. --cap mon 'allow *' + + # Generate initial monitor map + monmaptool --create --add ${MON_NAME} ${MON_IP} --fsid ${fsid} /etc/ceph/monmap +fi + +# If we don't have a monitor keyring, this is a new monitor +if [ ! -e /var/lib/ceph/mon/${CLUSTER}-${MON_NAME}/keyring ]; then + + if [ ! -e /etc/ceph/${CLUSTER}.client.admin.keyring ]; then + echo "ERROR- /etc/ceph/${CLUSTER}.client.admin.keyring must exist; get it from your existing mon" + exit 2 + fi + + if [ ! -e /etc/ceph/${CLUSTER}.mon.keyring ]; then + echo "ERROR- /etc/ceph/${CLUSTER}.mon.keyring must exist. You can extract it from your current monitor by running 'ceph auth get mon. -o /tmp/${CLUSTER}.mon.keyring'" + exit 3 + fi + + if [ ! -e /etc/ceph/monmap ]; then + echo "ERROR- /etc/ceph/monmap must exist. You can extract it from your current monitor by running 'ceph mon getmap -o /tmp/monmap'" + exit 4 + fi + + # Import the client.admin keyring and the monitor keyring into a new, temporary one + ceph-authtool /tmp/${CLUSTER}.mon.keyring --create-keyring --import-keyring /etc/ceph/${CLUSTER}.client.admin.keyring + ceph-authtool /tmp/${CLUSTER}.mon.keyring --import-keyring /etc/ceph/${CLUSTER}.mon.keyring + + # Make the monitor directory + mkdir -p /var/lib/ceph/mon/${CLUSTER}-${MON_NAME} + + # Prepare the monitor daemon's directory with the map and keyring + ceph-mon --mkfs -i ${MON_NAME} --monmap /etc/ceph/monmap --keyring /tmp/${CLUSTER}.mon.keyring + + # Clean up the temporary key + rm /tmp/${CLUSTER}.mon.keyring +fi + +# start MON +ceph-mon -i ${MON_NAME} --public-addr ${MON_IP}:6789 + +# change replica size +ceph osd pool set rbd size 1 + + +####### +# OSD # +####### + +if [ ! -e /var/lib/ceph/osd/${CLUSTER}-0/keyring ]; then + # bootstrap OSD + mkdir -p /var/lib/ceph/osd/${CLUSTER}-0 + # skip btrfs HACK if btrfs is already in place + if [ "$(stat -f /var/lib/ceph/osd/${CLUSTER}-0 2>/dev/null | grep btrfs | wc -l)" == "0" ]; then + # HACK create btrfs loopback device + echo "creating osd storage image" + dd if=/dev/zero of=/tmp/osddata bs=1M count=${OSD_SIZE} + mkfs.btrfs /tmp/osddata + echo "mounting via loopback" + mount -o loop /tmp/osddata /var/lib/ceph/osd/${CLUSTER}-0 + echo "now mounted:" + mount + # end HACK + fi + echo "creating osd" + ceph osd create + echo "creating osd filesystem" + ceph-osd -i 0 --mkfs + echo "creating osd keyring" + ceph auth get-or-create osd.0 osd 'allow *' mon 'allow profile osd' -o /var/lib/ceph/osd/${CLUSTER}-0/keyring + echo "configuring osd crush" + ceph osd crush add 0 1 root=default host=$(hostname -s) + echo "adding osd keyring" + ceph-osd -i 0 -k /var/lib/ceph/osd/${CLUSTER}-0/keyring +fi + +# start OSD +echo "starting osd" +ceph-osd --cluster=${CLUSTER} -i 0 + +#sleep 10 + +####### +# MDS # +####### + +if [ ! -e /var/lib/ceph/mds/${CLUSTER}-0/keyring ]; then + # create ceph filesystem + echo "creating osd pool" + ceph osd pool create cephfs_data 8 + echo "creating osd pool metadata" + ceph osd pool create cephfs_metadata 8 + echo "creating cephfs" + ceph fs new cephfs cephfs_metadata cephfs_data + + # bootstrap MDS + mkdir -p /var/lib/ceph/mds/${CLUSTER}-0 + echo "creating mds auth" + ceph auth get-or-create mds.0 mds 'allow' osd 'allow *' mon 'allow profile mds' > /var/lib/ceph/mds/${CLUSTER}-0/keyring +fi + +# start MDS +echo "starting mds" +ceph-mds --cluster=${CLUSTER} -i 0 + +#sleep 10 + + +####### +# RGW # +####### + +if [ ! -e /var/lib/ceph/radosgw/${RGW_NAME}/keyring ]; then + # bootstrap RGW + mkdir -p /var/lib/ceph/radosgw/${RGW_NAME} + echo "creating rgw auth" + ceph auth get-or-create client.radosgw.gateway osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/${RGW_NAME}/keyring +fi + +# start RGW +echo "starting rgw" +radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway -k /var/lib/ceph/radosgw/${RGW_NAME}/keyring --rgw-socket-path="" --rgw-frontends="civetweb port=${RGW_CIVETWEB_PORT}" + + +####### +# API # +####### + +# start ceph-rest-api +echo "starting rest api" +ceph-rest-api -n client.admin & + +############ +# Keystone # +############ + +if [ ! -e /etc/keystone/${CLUSTER}.conf ]; then + cat < /etc/keystone/${CLUSTER}.conf +[DEFAULT] +admin_token=${KEYSTONE_ADMIN_TOKEN} +admin_port=${KEYSTONE_ADMIN_PORT} +public_port=${KEYSTONE_PUBLIC_PORT} + +[database] +connection = sqlite:////var/lib/keystone/keystone.db +ENDHERE + + # start Keystone + echo "starting keystone" + keystone-all --config-file /etc/keystone/${CLUSTER}.conf & + + # wait until up + while ! nc ${MON_IP} ${KEYSTONE_ADMIN_PORT} > $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift echo -n "Waiting for ceph initialization" -if ! "$thisFolder"/env/wait-for-connection ${host} 80 60; then - echo "[ERROR] Waited 60 seconds, no response" >&2 +if ! "$thisFolder"/env/wait-for-connection ${host} 80 600; then + echo "[ERROR] Waited 600 seconds, no response" >&2 + docker logs $container exit 1 fi sleep 1 From 6af6febad05a4619a6482536c1bddd2fe1925148 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 9 Dec 2015 16:25:31 +0100 Subject: [PATCH 049/194] php < 5.5 compatible --- lib/private/comments/comment.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/private/comments/comment.php b/lib/private/comments/comment.php index 15d721d099..219e7ec8e4 100644 --- a/lib/private/comments/comment.php +++ b/lib/private/comments/comment.php @@ -194,7 +194,7 @@ class Comment implements IComment { * @since 9.0.0 */ public function setVerb($verb) { - if(!is_string($verb) || empty(trim($verb))) { + if(!is_string($verb) || !trim($verb)) { throw new \InvalidArgumentException('Non-empty String expected.'); } $this->data['verb'] = trim($verb); @@ -231,8 +231,8 @@ class Comment implements IComment { */ public function setActor($actorType, $actorId) { if( - !is_string($actorType) || empty(trim($actorType)) - || !is_string($actorId) || empty(trim($actorId)) + !is_string($actorType) || !trim($actorType) + || !is_string($actorId) || !trim($actorId) ) { throw new \InvalidArgumentException('String expected.'); } @@ -317,8 +317,8 @@ class Comment implements IComment { */ public function setObject($objectType, $objectId) { if( - !is_string($objectType) || empty(trim($objectType)) - || !is_string($objectId) || empty(trim($objectId)) + !is_string($objectType) || !trim($objectType) + || !is_string($objectId) || !trim($objectId) ) { throw new \InvalidArgumentException('String expected.'); } From 55a2715eff10e730c8104acc09b122893160cadd Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 9 Dec 2015 16:25:42 +0100 Subject: [PATCH 050/194] remove unused use statement --- lib/private/comments/manager.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php index a2b55c4ffd..05f981f244 100644 --- a/lib/private/comments/manager.php +++ b/lib/private/comments/manager.php @@ -3,7 +3,6 @@ namespace OC\Comments; use Doctrine\DBAL\Exception\DriverException; -use OC\Hooks\Emitter; use OCP\Comments\IComment; use OCP\Comments\ICommentsManager; use OCP\Comments\NotFoundException; From fdd06ba1f81d07e4597beb0b5b17f44c296b5921 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 9 Dec 2015 16:33:34 +0100 Subject: [PATCH 051/194] use getLastInsertId from query builder for convenience --- lib/private/comments/manager.php | 2 +- tests/lib/comments/manager.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php index 05f981f244..09e59f2837 100644 --- a/lib/private/comments/manager.php +++ b/lib/private/comments/manager.php @@ -455,7 +455,7 @@ class Manager implements ICommentsManager { ->execute(); if ($affectedRows > 0) { - $comment->setId(strval($this->dbConn->lastInsertId('*PREFIX*comments'))); + $comment->setId(strval($qb->getLastInsertId())); } return $affectedRows > 0; diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php index d5c415c250..c8d65c951e 100644 --- a/tests/lib/comments/manager.php +++ b/tests/lib/comments/manager.php @@ -46,7 +46,7 @@ class Test_Comments_Manager extends TestCase ]) ->execute(); - return \OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments'); + return $qb->getLastInsertId(); } protected function getManager() { @@ -90,7 +90,7 @@ class Test_Comments_Manager extends TestCase ]) ->execute(); - $id = strval(\OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*comments')); + $id = strval($qb->getLastInsertId()); $comment = $manager->get($id); $this->assertTrue($comment instanceof \OCP\Comments\IComment); From 81d763be4224adeb5676c620d76b3e4ec407187f Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 9 Dec 2015 16:55:07 +0100 Subject: [PATCH 052/194] use expectedException annotation, not via method call, for consistency --- tests/lib/comments/comment.php | 8 +++++--- tests/lib/comments/manager.php | 34 ++++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/tests/lib/comments/comment.php b/tests/lib/comments/comment.php index c6a8f118dd..ae7e913eaa 100644 --- a/tests/lib/comments/comment.php +++ b/tests/lib/comments/comment.php @@ -44,10 +44,12 @@ class Test_Comments_Comment extends TestCase $this->assertSame($object['id'], $comment->getObjectId()); } + /** + * @expectedException \OCP\Comments\IllegalIDChangeException + */ public function testSetIdIllegalInput() { $comment = new \OC\Comments\Comment(); - $this->setExpectedException('\OCP\Comments\IllegalIDChangeException'); $comment->setId('c23'); $comment->setId('c17'); } @@ -71,12 +73,12 @@ class Test_Comments_Comment extends TestCase /** * @dataProvider simpleSetterProvider + * @expectedException \InvalidArgumentException */ public function testSimpleSetterInvalidInput($field, $input) { $comment = new \OC\Comments\Comment(); $setter = 'set' . $field; - $this->setExpectedException('InvalidArgumentException'); $comment->$setter($input); } @@ -95,11 +97,11 @@ class Test_Comments_Comment extends TestCase /** * @dataProvider roleSetterProvider + * @expectedException \InvalidArgumentException */ public function testSetRoleInvalidInput($role, $type, $id){ $comment = new \OC\Comments\Comment(); $setter = 'set' . $role; - $this->setExpectedException('InvalidArgumentException'); $comment->$setter($type, $id); } diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php index c8d65c951e..248de68325 100644 --- a/tests/lib/comments/manager.php +++ b/tests/lib/comments/manager.php @@ -54,15 +54,19 @@ class Test_Comments_Manager extends TestCase return $factory->getManager(); } + /** + * @expectedException \OCP\Comments\NotFoundException + */ public function testGetCommentNotFound() { $manager = $this->getManager(); - $this->setExpectedException('\OCP\Comments\NotFoundException'); $manager->get('22'); } + /** + * @expectedException \InvalidArgumentException + */ public function testGetCommentNotFoundInvalidInput() { $manager = $this->getManager(); - $this->setExpectedException('\InvalidArgumentException'); $manager->get('unexisting22'); } @@ -108,15 +112,19 @@ class Test_Comments_Manager extends TestCase $this->assertEquals($comment->getLatestChildDateTime(), $latestChildDT); } + /** + * @expectedException \OCP\Comments\NotFoundException + */ public function testGetTreeNotFound() { $manager = $this->getManager(); - $this->setExpectedException('\OCP\Comments\NotFoundException'); $manager->getTree('22'); } + /** + * @expectedException \InvalidArgumentException + */ public function testGetTreeNotFoundInvalidIpnut() { $manager = $this->getManager(); - $this->setExpectedException('\InvalidArgumentException'); $manager->getTree('unexisting22'); } @@ -301,10 +309,10 @@ class Test_Comments_Manager extends TestCase /** * @dataProvider invalidCreateArgsProvider + * @expectedException \InvalidArgumentException */ public function testCreateCommentInvalidArguments($aType, $aId, $oType, $oId) { $manager = $this->getManager(); - $this->setExpectedException('\InvalidArgumentException'); $manager->create($aType, $aId, $oType, $oId); } @@ -322,6 +330,9 @@ class Test_Comments_Manager extends TestCase $this->assertSame($comment->getObjectId(), $objectId); } + /** + * @expectedException \OCP\Comments\NotFoundException + */ public function testDelete() { $manager = $this->getManager(); @@ -339,7 +350,6 @@ class Test_Comments_Manager extends TestCase $this->assertTrue($comment instanceof \OCP\Comments\IComment); $done = $manager->delete($id); $this->assertTrue($done); - $this->setExpectedException('\OCP\Comments\NotFoundException'); $manager->get($id); } @@ -381,6 +391,9 @@ class Test_Comments_Manager extends TestCase $this->assertSame($comment->getMessage(), $loadedComment->getMessage()); } + /** + * @expectedException \OCP\Comments\NotFoundException + */ public function testSaveUpdateException() { $manager = $this->getManager(); $comment = new \OC\Comments\Comment(); @@ -394,15 +407,16 @@ class Test_Comments_Manager extends TestCase $manager->delete($comment->getId()); $comment->setMessage('very beautiful, I am really so much impressed!'); - $this->setExpectedException('\OCP\Comments\NotFoundException'); $manager->save($comment); } + /** + * @expectedException \UnexpectedValueException + */ public function testSaveIncomplete() { $manager = $this->getManager(); $comment = new \OC\Comments\Comment(); $comment->setMessage('from no one to nothing'); - $this->setExpectedException('\UnexpectedValueException'); $manager->save($comment); } @@ -442,10 +456,10 @@ class Test_Comments_Manager extends TestCase /** * @dataProvider invalidActorArgsProvider + * @expectedException \InvalidArgumentException */ public function testDeleteReferencesOfActorInvalidInput($type, $id) { $manager = $this->getManager(); - $this->setExpectedException('\InvalidArgumentException'); $manager->deleteReferencesOfActor($type, $id); } @@ -508,10 +522,10 @@ class Test_Comments_Manager extends TestCase /** * @dataProvider invalidObjectArgsProvider + * @expectedException \InvalidArgumentException */ public function testDeleteCommentsAtObjectInvalidInput($type, $id) { $manager = $this->getManager(); - $this->setExpectedException('\InvalidArgumentException'); $manager->deleteCommentsAtObject($type, $id); } From 4b68dd372dec249119721c1d250c170018f566e5 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 9 Dec 2015 17:31:14 +0100 Subject: [PATCH 053/194] Do not check storage availability for getOwner Because the owner is always known thanks to the file cache and other places, we don't need the remote storage to be actually available. --- lib/private/files/storage/wrapper/availability.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/private/files/storage/wrapper/availability.php b/lib/private/files/storage/wrapper/availability.php index d6ce78f6e4..d2fbbbacf7 100644 --- a/lib/private/files/storage/wrapper/availability.php +++ b/lib/private/files/storage/wrapper/availability.php @@ -399,7 +399,6 @@ class Availability extends Wrapper { /** {@inheritdoc} */ public function getOwner($path) { - $this->checkAvailability(); try { return parent::getOwner($path); } catch (\OCP\Files\StorageNotAvailableException $e) { From 078ca149b595dd521339d4dcafbd1d8a6d2c1131 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Thu, 10 Dec 2015 01:55:17 -0500 Subject: [PATCH 054/194] [tx-robot] updated from transifex --- apps/files/l10n/lt_LT.js | 11 +++++++++++ apps/files/l10n/lt_LT.json | 11 +++++++++++ apps/files_external/l10n/fr.js | 6 ++++++ apps/files_external/l10n/fr.json | 6 ++++++ apps/files_external/l10n/ja.js | 1 + apps/files_external/l10n/ja.json | 1 + apps/files_external/l10n/nl.js | 9 +++++++++ apps/files_external/l10n/nl.json | 9 +++++++++ core/l10n/fr.js | 1 + core/l10n/fr.json | 1 + core/l10n/ja.js | 3 ++- core/l10n/ja.json | 3 ++- core/l10n/nl.js | 1 + core/l10n/nl.json | 1 + settings/l10n/ja.js | 2 +- settings/l10n/ja.json | 2 +- 16 files changed, 64 insertions(+), 4 deletions(-) diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index b4001e0c8e..e93fb079d5 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -40,6 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Nepavyksta nustatyti datos", "This operation is forbidden" : "Ši operacija yra uždrausta", "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi", + "Could not move \"{file}\", target exists" : "Nepavyko perkelti \"{file}\", toks jau egzistuoja", + "Could not move \"{file}\"" : "Nepavyko perkelti \"{file}\"", + "{newName} already exists" : "{newName} jau egzistuoja", + "Could not rename \"{fileName}\", it does not exist any more" : "Nepavyko pervadinti failo \"{fileName}\", nes jis jau nebeegzistuoja", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas \"{targetName}\" jau naudojamas aplanke \"{dir}\". Prašome pasirinkti kitokį pavadinimą.", + "Could not rename \"{fileName}\"" : "Nepavyko pervadinti failo \"{fileName}\"", + "Could not create file \"{file}\"" : "Nepavyko sukurti failo \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo \"{file}\" - failas su tokiu pavadinimu jau egzistuoja", + "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko \"{dir}\"- aplankas su tokiu pavadinimu jau egzistuoja", + "Error deleting file \"{fileName}\"." : "Klaida trinant failą \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“", "Name" : "Pavadinimas", "Size" : "Dydis", diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index ba8610da86..e6724be98c 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -38,6 +38,17 @@ "Unable to determine date" : "Nepavyksta nustatyti datos", "This operation is forbidden" : "Ši operacija yra uždrausta", "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi", + "Could not move \"{file}\", target exists" : "Nepavyko perkelti \"{file}\", toks jau egzistuoja", + "Could not move \"{file}\"" : "Nepavyko perkelti \"{file}\"", + "{newName} already exists" : "{newName} jau egzistuoja", + "Could not rename \"{fileName}\", it does not exist any more" : "Nepavyko pervadinti failo \"{fileName}\", nes jis jau nebeegzistuoja", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas \"{targetName}\" jau naudojamas aplanke \"{dir}\". Prašome pasirinkti kitokį pavadinimą.", + "Could not rename \"{fileName}\"" : "Nepavyko pervadinti failo \"{fileName}\"", + "Could not create file \"{file}\"" : "Nepavyko sukurti failo \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo \"{file}\" - failas su tokiu pavadinimu jau egzistuoja", + "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko \"{dir}\"- aplankas su tokiu pavadinimu jau egzistuoja", + "Error deleting file \"{fileName}\"." : "Klaida trinant failą \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“", "Name" : "Pavadinimas", "Size" : "Dydis", diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index 8d5f7e911b..9ca35b46b4 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -36,6 +36,12 @@ OC.L10N.register( "(group)" : "(groupe)", "Admin defined" : "Défini par l'administrateur", "Saved" : "Sauvegardé", + "Empty response from the server" : "Réponse vide du serveur", + "Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossible d'obtenir l'information depuis le serveur ownCloud : {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}", + "There was an error with message: " : "Il y a eu une erreur avec le message :", + "External mount error" : "Erreur de montage externe", "Access key" : "Clé d'accès", "Secret key" : "Clé secrète", "Builtin" : "Intégré", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index cae66119a4..8be075113a 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -34,6 +34,12 @@ "(group)" : "(groupe)", "Admin defined" : "Défini par l'administrateur", "Saved" : "Sauvegardé", + "Empty response from the server" : "Réponse vide du serveur", + "Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossible d'obtenir l'information depuis le serveur ownCloud : {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}", + "There was an error with message: " : "Il y a eu une erreur avec le message :", + "External mount error" : "Erreur de montage externe", "Access key" : "Clé d'accès", "Secret key" : "Clé secrète", "Builtin" : "Intégré", diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js index 5518f6afa7..8d50794e5b 100644 --- a/apps/files_external/l10n/ja.js +++ b/apps/files_external/l10n/ja.js @@ -17,6 +17,7 @@ OC.L10N.register( "Unsatisfied backend parameters" : "バックエンドのためのパラメーターが不十分です。", "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です", "Insufficient data: %s" : "データが不足しています: %s", + "%s" : "%s", "Personal" : "個人", "System" : "システム", "Grant access" : "アクセスを許可", diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json index 8134ed16cd..b704504b08 100644 --- a/apps/files_external/l10n/ja.json +++ b/apps/files_external/l10n/ja.json @@ -15,6 +15,7 @@ "Unsatisfied backend parameters" : "バックエンドのためのパラメーターが不十分です。", "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です", "Insufficient data: %s" : "データが不足しています: %s", + "%s" : "%s", "Personal" : "個人", "System" : "システム", "Grant access" : "アクセスを許可", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 5051689216..3200988ec2 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -36,6 +36,15 @@ OC.L10N.register( "(group)" : "(groep)", "Admin defined" : "Beheerder gedefinieerd", "Saved" : "Bewaard", + "Empty response from the server" : "Lege reactie van de server", + "Couldn't access. Please logout and login to activate this mount point" : "Geen toegang. Log uit en opnieuw in om dit koppelpunt te activeren", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Kon geen informatie van de ownCloud server krijgen: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Kon geen overzicht met externe koppelpunten krijgen: {type}", + "There was an error with message: " : "Er was een fout met de volgende melding:", + "External mount error" : "Extern koppelpunt fout", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Kon geen overzicht met Windows netwerk koppelpunten krijgen: lege reactie van de server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sommige van de geconfigureerde koppelpunten zijn niet verbonden. Klok op de rode rij(en) voor meer informatie", "Access key" : "Access Key", "Secret key" : "Geheime sleutel", "Builtin" : "Ingebouwd", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index d8a254bad1..09b912445c 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -34,6 +34,15 @@ "(group)" : "(groep)", "Admin defined" : "Beheerder gedefinieerd", "Saved" : "Bewaard", + "Empty response from the server" : "Lege reactie van de server", + "Couldn't access. Please logout and login to activate this mount point" : "Geen toegang. Log uit en opnieuw in om dit koppelpunt te activeren", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Kon geen informatie van de ownCloud server krijgen: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Kon geen overzicht met externe koppelpunten krijgen: {type}", + "There was an error with message: " : "Er was een fout met de volgende melding:", + "External mount error" : "Extern koppelpunt fout", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Kon geen overzicht met Windows netwerk koppelpunten krijgen: lege reactie van de server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sommige van de geconfigureerde koppelpunten zijn niet verbonden. Klok op de rode rij(en) voor meer informatie", "Access key" : "Access Key", "Secret key" : "Geheime sleutel", "Builtin" : "Ingebouwd", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 4bb7aa82c9..f845185c52 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Veuillez réessayer ou contacter votre administrateur.", "Log in" : "Se connecter", "Wrong password. Reset it?" : "Mot de passe incorrect. Réinitialiser ?", + "Wrong password." : "Mot de passe incorrect.", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 02347de170..070e03a958 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Veuillez réessayer ou contacter votre administrateur.", "Log in" : "Se connecter", "Wrong password. Reset it?" : "Mot de passe incorrect. Réinitialiser ?", + "Wrong password." : "Mot de passe incorrect.", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 375b8c8a78..9d700b71d2 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -114,7 +114,7 @@ OC.L10N.register( "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our documentation." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、documentation を参照してください。", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our documentation." : "/dev/urandom は PHP から読み取ることができず、この状態はセキュリティの観点からおすすめできません。より詳しい情報については、documentation を参照ください。", "Your PHP version ({version}) is no longer supported by PHP. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、PHPでサポート されていません。 我々は、PHPから提供されている新しいバージョンにアップグレードし、それによるセキュリティの確保とパフォーマンスのメリットを受けられることを強くお勧めします。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our documentation." : "リバースプロキシーのヘッダー設定が間違っているか、または信頼されたプロキシーからownCloudにアクセスしていません。もし、信頼されたプロキシーからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、ドキュメントを確認してください。", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our documentation." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、ドキュメントを確認してください。", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the memcached wiki about both modules." : "Memcached は分散キャッシュとして設定されていますが、間違った\"memcache\"のPHPモジュールがインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしていますが、\"memcache\" ではありません。memcached wiki で両方のモジュール を見てください。", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。", @@ -261,6 +261,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "もう一度試してみるか、管理者に問い合わせてください。", "Log in" : "ログイン", "Wrong password. Reset it?" : "パスワードが間違っています。リセットしますか?", + "Wrong password." : "パスワードが間違っています。", "Stay logged in" : "ログインしたままにする", "Alternative Logins" : "代替ログイン", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index 337358d57f..68930ad01c 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -112,7 +112,7 @@ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our documentation." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、documentation を参照してください。", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our documentation." : "/dev/urandom は PHP から読み取ることができず、この状態はセキュリティの観点からおすすめできません。より詳しい情報については、documentation を参照ください。", "Your PHP version ({version}) is no longer supported by PHP. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、PHPでサポート されていません。 我々は、PHPから提供されている新しいバージョンにアップグレードし、それによるセキュリティの確保とパフォーマンスのメリットを受けられることを強くお勧めします。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our documentation." : "リバースプロキシーのヘッダー設定が間違っているか、または信頼されたプロキシーからownCloudにアクセスしていません。もし、信頼されたプロキシーからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、ドキュメントを確認してください。", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our documentation." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、ドキュメントを確認してください。", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the memcached wiki about both modules." : "Memcached は分散キャッシュとして設定されていますが、間違った\"memcache\"のPHPモジュールがインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしていますが、\"memcache\" ではありません。memcached wiki で両方のモジュール を見てください。", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。", @@ -259,6 +259,7 @@ "Please try again or contact your administrator." : "もう一度試してみるか、管理者に問い合わせてください。", "Log in" : "ログイン", "Wrong password. Reset it?" : "パスワードが間違っています。リセットしますか?", + "Wrong password." : "パスワードが間違っています。", "Stay logged in" : "ログインしたままにする", "Alternative Logins" : "代替ログイン", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index 9e2bc2d345..563a10ff40 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Probeer het opnieuw of neem contact op met uw beheerder.", "Log in" : "Meld u aan", "Wrong password. Reset it?" : "Onjuist wachtwoord. Resetten?", + "Wrong password." : "Onjuist wachtwoord.", "Stay logged in" : "Ingelogd blijven", "Alternative Logins" : "Alternatieve inlogs", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index d565545ce3..012fd33ba9 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Probeer het opnieuw of neem contact op met uw beheerder.", "Log in" : "Meld u aan", "Wrong password. Reset it?" : "Onjuist wachtwoord. Resetten?", + "Wrong password." : "Onjuist wachtwoord.", "Stay logged in" : "Ingelogd blijven", "Alternative Logins" : "Alternatieve inlogs", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index 9d6705aff3..2d317695ea 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -20,7 +20,7 @@ OC.L10N.register( "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Couldn't update app." : "アプリをアップデートできませんでした。", - "Wrong password" : "無効なパスワード", + "Wrong password" : "パスワードが間違っています", "No user supplied" : "ユーザーが指定されていません", "Please provide an admin recovery password, otherwise all user data will be lost" : "リカバリ用の管理者パスワードを入力してください。そうでない場合は、全ユーザーのデータが失われます。", "Wrong admin recovery password. Please check the password and try again." : "リカバリ用の管理者パスワードが間違っています。パスワードを確認して再度実行してください。", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index aa22a5ce9b..d7138dbf3b 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -18,7 +18,7 @@ "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Couldn't update app." : "アプリをアップデートできませんでした。", - "Wrong password" : "無効なパスワード", + "Wrong password" : "パスワードが間違っています", "No user supplied" : "ユーザーが指定されていません", "Please provide an admin recovery password, otherwise all user data will be lost" : "リカバリ用の管理者パスワードを入力してください。そうでない場合は、全ユーザーのデータが失われます。", "Wrong admin recovery password. Please check the password and try again." : "リカバリ用の管理者パスワードが間違っています。パスワードを確認して再度実行してください。", From e72955c65d82cd30b63b116eebd19639b4de496e Mon Sep 17 00:00:00 2001 From: Sergio Bertolin Date: Wed, 2 Dec 2015 11:44:03 +0000 Subject: [PATCH 055/194] Added shared by multiple channels test * Small changes plus check of the file using propfind * Restaured line removed accidentally --- .../integration/features/bootstrap/WebDav.php | 12 +++++++++++ build/integration/features/sharing-v1.feature | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index a682467f52..37e8e4ec47 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -153,5 +153,17 @@ trait WebDav{ } } + /** + * @Given User :user created a folder :destination + */ + public function userCreatedAFolder($user, $destination){ + try { + $this->response = $this->makeDavRequest($user, "MKCOL", $destination, []); + } catch (\GuzzleHttp\Exception\ServerException $e) { + // 4xx and 5xx responses cause an exception + $this->response = $e->getResponse(); + } + } + } diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index e00fd47bae..15db0b461b 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -379,6 +379,26 @@ Feature: sharing | /CHILD/child.txt | And the HTTP status code should be "200" + Scenario: Share a file by multiple channels + Given As an "admin" + And user "user0" exists + And user "user1" exists + And user "user2" exists + And group "group0" exists + And user "user1" belongs to group "group0" + And user "user2" belongs to group "group0" + And user "user0" created a folder "/common" + And user "user0" created a folder "/common/sub" + And file "common" of user "user0" is shared with group "group0" + And file "textfile0.txt" of user "user1" is shared with user "user2" + And User "user1" moved file "/textfile0.txt" to "/common/textfile0.txt" + And User "user1" moved file "/common/textfile0.txt" to "/common/sub/textfile0.txt" + And As an "user2" + When Downloading file "/common/sub/textfile0.txt" with range "bytes=9-17" + Then Downloaded content should be "test text" + And user "user2" should see following elements + | /common/sub/textfile0.txt | + Scenario: Delete all group shares Given As an "admin" And user "user0" exists From 1d7a2aa9f97c00a3019214a08694fa583d29d5fb Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 7 Dec 2015 15:03:40 +0100 Subject: [PATCH 056/194] Folder depth needs to be at least 3 for all tests to pass --- build/integration/features/bootstrap/WebDav.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 37e8e4ec47..d88447d41a 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -126,7 +126,7 @@ trait WebDav{ * @param \Behat\Gherkin\Node\TableNode|null $expectedElements */ public function checkElementList($user, $expectedElements){ - $elementList = $this->listFolder($user, '/', 2); + $elementList = $this->listFolder($user, '/', 3); if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) { $elementRows = $expectedElements->getRows(); $elementsSimplified = $this->simplifyArray($elementRows); From 93f4524a9135d52abdf6fd3ba2962aa5a581aa68 Mon Sep 17 00:00:00 2001 From: Sergio Bertolin Date: Wed, 9 Dec 2015 12:56:03 +0000 Subject: [PATCH 057/194] Added check for /textfile0.txt --- .../integration/features/bootstrap/WebDav.php | 9 ++++++++ build/integration/features/sharing-v1.feature | 23 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index d88447d41a..49cd565cf2 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -97,6 +97,15 @@ trait WebDav{ PHPUnit_Framework_Assert::assertEquals($content, (string)$this->response->getBody()); } + /** + * @Then /^Downloaded content when downloading file "([^"]*)" with range "([^"]*)" should be "([^"]*)"$/ + */ + public function downloadedContentWhenDownloadindShouldBe($fileSource, $range, $content){ + $this->downloadFileWithRange($fileSource, $range); + $this->downloadedContentShouldBe($content); + } + + /*Returns the elements of a propfind, $folderDepth requires 1 to see elements without children*/ public function listFolder($user, $path, $folderDepth){ $fullUrl = substr($this->baseUrl, 0, -4); diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index 15db0b461b..31ba0d4ad7 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -379,7 +379,7 @@ Feature: sharing | /CHILD/child.txt | And the HTTP status code should be "200" - Scenario: Share a file by multiple channels + Scenario: Share a file by multiple channels Given As an "admin" And user "user0" exists And user "user1" exists @@ -396,6 +396,27 @@ Feature: sharing And As an "user2" When Downloading file "/common/sub/textfile0.txt" with range "bytes=9-17" Then Downloaded content should be "test text" + And Downloaded content when downloading file "/textfile0.txt" with range "bytes=9-17" should be "test text" + And user "user2" should see following elements + | /common/sub/textfile0.txt | + + Scenario: Share a file by multiple channels + Given As an "admin" + And user "user0" exists + And user "user1" exists + And user "user2" exists + And group "group0" exists + And user "user1" belongs to group "group0" + And user "user2" belongs to group "group0" + And user "user0" created a folder "/common" + And user "user0" created a folder "/common/sub" + And file "common" of user "user0" is shared with group "group0" + And file "textfile0.txt" of user "user1" is shared with user "user2" + And User "user1" moved file "/textfile0.txt" to "/common/textfile0.txt" + And User "user1" moved file "/common/textfile0.txt" to "/common/sub/textfile0.txt" + And As an "user2" + When Downloading file "/textfile0.txt" with range "bytes=9-17" + Then Downloaded content should be "test text" And user "user2" should see following elements | /common/sub/textfile0.txt | From 715b0941eeff2578c8d2bff89dbc901481cb4c7e Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Thu, 10 Dec 2015 09:22:41 +0100 Subject: [PATCH 058/194] Make compatible with PHPUnit 5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `addWarning` needs to be defined as well for it: ``` ➜ master git:(master) ✗ bash autotest.sh sqlite Using PHP executable /usr/local/opt/php56/bin/php Parsing all files in lib/public for the presence of @since or @deprecated on each method... Using database oc_autotest Setup environment for sqlite testing on local storage ... Installing .... ownCloud is not installed - only a limited number of commands are available Mac OS X is not supported and ownCloud will not work properly on this platform. Use it at your own risk! -> For the best results, please consider using a GNU/Linux server instead. creating sqlite db ownCloud was successfully installed Testing with sqlite ... No coverage /usr/local/bin/phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-sqlite.xml PHP Notice: Constant PHPUNIT_RUN already defined in /Users/lukasreschke/Documents/Programming/master/apps/firstrunwizard/tests/bootstrap.php on line 6 PHP Stack trace: PHP 1. {main}() /usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar:0 PHP 2. PHPUnit_TextUI_Command::main() /usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar:514 PHP 3. PHPUnit_TextUI_Command->run() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/TextUI/Command.php:106 PHP 4. PHPUnit_TextUI_Command->handleArguments() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/TextUI/Command.php:117 PHP 5. PHPUnit_Util_Configuration->getTestSuiteConfiguration() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/TextUI/Command.php:663 PHP 6. PHPUnit_Util_Configuration->getTestSuite() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/Util/Configuration.php:796 PHP 7. PHPUnit_Framework_TestSuite->addTestFile() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/Util/Configuration.php:926 PHP 8. PHPUnit_Util_Fileloader::checkAndLoad() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/Framework/TestSuite.php:335 PHP 9. PHPUnit_Util_Fileloader::load() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/Util/Fileloader.php:38 PHP 10. include_once() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/Util/Fileloader.php:56 PHP 11. loadDirectory() /Users/lukasreschke/Documents/Programming/master/tests/apps.php:42 PHP 12. require_once() /Users/lukasreschke/Documents/Programming/master/tests/apps.php:20 PHP 13. define() /Users/lukasreschke/Documents/Programming/master/apps/firstrunwizard/tests/bootstrap.php:6 PHP Fatal error: Class StartSessionListener contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (PHPUnit_Framework_TestListener::addWarning) in /Users/lukasreschke/Documents/Programming/master/tests/startsessionlistener.php on line 47 PHP Stack trace: PHP 1. {main}() /usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar:0 PHP 2. PHPUnit_TextUI_Command::main() /usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar:514 PHP 3. PHPUnit_TextUI_Command->run() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/TextUI/Command.php:106 PHP 4. PHPUnit_TextUI_TestRunner->doRun() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/TextUI/Command.php:155 PHP 5. PHPUnit_TextUI_TestRunner->handleConfiguration() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/TextUI/TestRunner.php:153 PHP 6. require_once() phar:///usr/local/Cellar/phpunit/5.1.0/libexec/phpunit-5.1.0.phar/phpunit/TextUI/TestRunner.php:805 ``` --- tests/startsessionlistener.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/startsessionlistener.php b/tests/startsessionlistener.php index 1f3573555c..88544cc6ce 100644 --- a/tests/startsessionlistener.php +++ b/tests/startsessionlistener.php @@ -44,4 +44,7 @@ class StartSessionListener implements PHPUnit_Framework_TestListener { public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { } + public function addWarning(\PHPUnit_Framework_Test $test, \PHPUnit_Framework_Warning $e, $time) { + } + } From 29b6a03fc1b81a2ae8272e2b18d57335558955d0 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Thu, 10 Dec 2015 09:29:24 +0100 Subject: [PATCH 059/194] Add assertion to test This seems to be missing on that test. --- tests/lib/comments/comment.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/lib/comments/comment.php b/tests/lib/comments/comment.php index ae7e913eaa..02adea8729 100644 --- a/tests/lib/comments/comment.php +++ b/tests/lib/comments/comment.php @@ -58,6 +58,8 @@ class Test_Comments_Comment extends TestCase $comment = new \OC\Comments\Comment(); $comment->setId('c23'); $comment->setId(''); + + $this->assertSame('', $comment->getId()); } public function simpleSetterProvider() { From fb87441fd9c3ff8300c03966a977573601450ad2 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 10 Dec 2015 11:21:28 +0100 Subject: [PATCH 060/194] Deduplicate version expire jobs * versionSize is calculated anyway in the expire job - > dropped * offset/neededSpace was needed for expiry before the file is moved to the versions -> now this is included already in the currently used space because the expiry job is defered to a point in time after the version creation * fixes #21108 --- apps/files_versions/command/expire.php | 18 ++-------------- apps/files_versions/lib/storage.php | 29 +++++++------------------- 2 files changed, 10 insertions(+), 37 deletions(-) diff --git a/apps/files_versions/command/expire.php b/apps/files_versions/command/expire.php index 5db33f3877..8872369060 100644 --- a/apps/files_versions/command/expire.php +++ b/apps/files_versions/command/expire.php @@ -34,16 +34,6 @@ class Expire implements ICommand { */ private $fileName; - /** - * @var int|null - */ - private $versionsSize; - - /** - * @var int - */ - private $neededSpace = 0; - /** * @var string */ @@ -52,14 +42,10 @@ class Expire implements ICommand { /** * @param string $user * @param string $fileName - * @param int|null $versionsSize - * @param int $neededSpace */ - function __construct($user, $fileName, $versionsSize = null, $neededSpace = 0) { + function __construct($user, $fileName) { $this->user = $user; $this->fileName = $fileName; - $this->versionsSize = $versionsSize; - $this->neededSpace = $neededSpace; } @@ -71,7 +57,7 @@ class Expire implements ICommand { } \OC_Util::setupFS($this->user); - Storage::expire($this->fileName, $this->versionsSize, $this->neededSpace); + Storage::expire($this->fileName); \OC_Util::tearDownFS(); } } diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php index 29876b3e38..21b5e9e0e7 100644 --- a/apps/files_versions/lib/storage.php +++ b/apps/files_versions/lib/storage.php @@ -168,14 +168,7 @@ class Storage { // create all parent folders self::createMissingDirectories($filename, $users_view); - $versionsSize = self::getVersionsSize($uid); - - // assumption: we need filesize($filename) for the new version + - // some more free space for the modified file which might be - // 1.5 times as large as the current version -> 2.5 - $neededSpace = $files_view->filesize($filename) * 2.5; - - self::scheduleExpire($uid, $filename, $versionsSize, $neededSpace); + self::scheduleExpire($uid, $filename); // store a new version of a file $mtime = $users_view->filemtime('files/' . $filename); @@ -634,14 +627,12 @@ class Storage { * * @param string $uid owner of the file * @param string $fileName file/folder for which to schedule expiration - * @param int|null $versionsSize current versions size - * @param int $neededSpace requested versions size */ - private static function scheduleExpire($uid, $fileName, $versionsSize = null, $neededSpace = 0) { + private static function scheduleExpire($uid, $fileName) { // let the admin disable auto expire $expiration = self::getExpiration(); if ($expiration->isEnabled()) { - $command = new Expire($uid, $fileName, $versionsSize, $neededSpace); + $command = new Expire($uid, $fileName); \OC::$server->getCommandBus()->push($command); } } @@ -650,11 +641,9 @@ class Storage { * Expire versions which exceed the quota * * @param string $filename - * @param int|null $versionsSize - * @param int $offset * @return bool|int|null */ - public static function expire($filename, $versionsSize = null, $offset = 0) { + public static function expire($filename) { $config = \OC::$server->getConfig(); $expiration = self::getExpiration(); @@ -680,9 +669,7 @@ class Storage { } // make sure that we have the current size of the version history - if ( $versionsSize === null ) { - $versionsSize = self::getVersionsSize($uid); - } + $versionsSize = self::getVersionsSize($uid); // calculate available space for version history // subtract size of files and current versions size from quota @@ -692,12 +679,12 @@ class Storage { $rootInfo = $files_view->getFileInfo('/', false); $free = $quota - $rootInfo['size']; // remaining free space for user if ($free > 0) { - $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - ($versionsSize + $offset); // how much space can be used for versions + $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - $versionsSize; // how much space can be used for versions } else { - $availableSpace = $free - $versionsSize - $offset; + $availableSpace = $free - $versionsSize; } } else { - $availableSpace = $quota - $offset; + $availableSpace = $quota; } } else { $availableSpace = PHP_INT_MAX; From 3d5a7b307f5ef32f74177a8cbbe4ce3c87b254e3 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 10 Dec 2015 13:36:43 +0100 Subject: [PATCH 061/194] Add test case for group share propagation --- apps/files_sharing/tests/etagpropagation.php | 80 +------------- .../tests/groupetagpropagation.php | 104 ++++++++++++++++++ .../tests/propagationtestcase.php | 103 +++++++++++++++++ apps/files_sharing/tests/testcase.php | 6 + 4 files changed, 215 insertions(+), 78 deletions(-) create mode 100644 apps/files_sharing/tests/groupetagpropagation.php create mode 100644 apps/files_sharing/tests/propagationtestcase.php diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php index de9ce56539..5a917fd1c6 100644 --- a/apps/files_sharing/tests/etagpropagation.php +++ b/apps/files_sharing/tests/etagpropagation.php @@ -34,31 +34,7 @@ use OC\Files\View; * * @package OCA\Files_sharing\Tests */ -class EtagPropagation extends TestCase { - /** - * @var \OC\Files\View - */ - private $rootView; - protected $fileIds = []; // [$user=>[$path=>$id]] - protected $fileEtags = []; // [$id=>$etag] - - public static function setUpBeforeClass() { - parent::setUpBeforeClass(); - \OCA\Files_Sharing\Helper::registerHooks(); - } - - protected function setUp() { - parent::setUp(); - $this->setUpShares(); - } - - protected function tearDown() { - \OC_Hook::clear('OC_Filesystem', 'post_write'); - \OC_Hook::clear('OC_Filesystem', 'post_delete'); - \OC_Hook::clear('OC_Filesystem', 'post_rename'); - \OC_Hook::clear('OCP\Share', 'post_update_permissions'); - parent::tearDown(); - } +class EtagPropagation extends PropagationTestCase { /** * "user1" is the admin who shares a folder "sub1/sub2/folder" with "user2" and "user3" @@ -67,7 +43,7 @@ class EtagPropagation extends TestCase { * "user2" reshares the subdir "sub1/sub2/folder/inside" with "user4" * "user4" puts the received "inside" folder into "sub1/sub2/inside" (this is to check if it propagates across multiple subfolders) */ - private function setUpShares() { + protected function setUpShares() { $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = []; $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = []; $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = []; @@ -136,58 +112,6 @@ class EtagPropagation extends TestCase { } } - /** - * @param string[] $users - * @param string $subPath - */ - private function assertEtagsChanged($users, $subPath = '') { - $oldUser = \OC::$server->getUserSession()->getUser(); - foreach ($users as $user) { - $this->loginAsUser($user); - $id = $this->fileIds[$user][$subPath]; - $path = $this->rootView->getPath($id); - $etag = $this->rootView->getFileInfo($path)->getEtag(); - $this->assertNotEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has changed'); - $this->fileEtags[$id] = $etag; - } - $this->loginAsUser($oldUser->getUID()); - } - - /** - * @param string[] $users - * @param string $subPath - */ - private function assertEtagsNotChanged($users, $subPath = '') { - $oldUser = \OC::$server->getUserSession()->getUser(); - foreach ($users as $user) { - $this->loginAsUser($user); - $id = $this->fileIds[$user][$subPath]; - $path = $this->rootView->getPath($id); - $etag = $this->rootView->getFileInfo($path)->getEtag(); - $this->assertEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has not changed'); - $this->fileEtags[$id] = $etag; - } - $this->loginAsUser($oldUser->getUID()); - } - - /** - * Assert that the etags for the root, /sub1 and /sub1/sub2 have changed - * - * @param string[] $users - */ - private function assertEtagsForFoldersChanged($users) { - $this->assertEtagsChanged($users); - - $this->assertEtagsChanged($users, 'sub1'); - $this->assertEtagsChanged($users, 'sub1/sub2'); - } - - private function assertAllUnchanged() { - $users = [self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, - self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]; - $this->assertEtagsNotChanged($users); - } - public function testOwnerWritesToShare() { $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); Filesystem::file_put_contents('/sub1/sub2/folder/asd.txt', 'bar'); diff --git a/apps/files_sharing/tests/groupetagpropagation.php b/apps/files_sharing/tests/groupetagpropagation.php new file mode 100644 index 0000000000..804d064ead --- /dev/null +++ b/apps/files_sharing/tests/groupetagpropagation.php @@ -0,0 +1,104 @@ + + * + * @copyright Copyright (c) 2015, 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\Files_sharing\Tests; + +use OC\Files\Filesystem; +use OC\Files\View; + +/** + * @group DB + * + * @package OCA\Files_sharing\Tests + */ +class GroupEtagPropagation extends PropagationTestCase { + /** + * "user1" creates /test, /test/sub and shares with group1 + * "user2" (in group1) reshares /test with group2 and reshared /test/sub with group3 + * "user3" (in group 2) + * "user4" (in group 3) + */ + protected function setUpShares() { + $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = []; + $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = []; + $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = []; + $this->fileIds[self::TEST_FILES_SHARING_API_USER4] = []; + + $this->rootView = new View(''); + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); + $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); + $view1->mkdir('/test/sub'); + $folderInfo = $view1->getFileInfo('/test'); + \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group1', 31); + $this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test'] = $view1->getFileInfo('test')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test/sub'] = $view1->getFileInfo('test/sub')->getId(); + + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2); + $view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files'); + $folderInfo = $view2->getFileInfo('/test'); + $subFolderInfo = $view2->getFileInfo('/test/sub'); + \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group2', 31); + \OCP\Share::shareItem('folder', $subFolderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group3', 31); + $this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test'] = $view2->getFileInfo('test')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test/sub'] = $view2->getFileInfo('test/sub')->getId(); + + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3); + $view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files'); + $this->fileIds[self::TEST_FILES_SHARING_API_USER3][''] = $view3->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test'] = $view3->getFileInfo('test')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test/sub'] = $view3->getFileInfo('test/sub')->getId(); + + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4); + $view4 = new View('/' . self::TEST_FILES_SHARING_API_USER4 . '/files'); + $this->fileIds[self::TEST_FILES_SHARING_API_USER4][''] = $view4->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub'] = $view4->getFileInfo('sub')->getId(); + + foreach ($this->fileIds as $user => $ids) { + $this->loginAsUser($user); + foreach ($ids as $id) { + $path = $this->rootView->getPath($id); + $this->fileEtags[$id] = $this->rootView->getFileInfo($path)->getEtag(); + } + } + } + + public function testGroupReShareRecipientWrites() { + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3); + + Filesystem::file_put_contents('/test/sub/file.txt', 'asd'); + + $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]); + + $this->assertAllUnchanged(); + } + + public function testGroupReShareSubFolderRecipientWrites() { + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4); + + Filesystem::file_put_contents('/sub/file.txt', 'asd'); + + $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]); + + $this->assertAllUnchanged(); + } +} diff --git a/apps/files_sharing/tests/propagationtestcase.php b/apps/files_sharing/tests/propagationtestcase.php new file mode 100644 index 0000000000..f397c1fb7a --- /dev/null +++ b/apps/files_sharing/tests/propagationtestcase.php @@ -0,0 +1,103 @@ + + * + * @copyright Copyright (c) 2015, 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\Files_sharing\Tests; + +abstract class PropagationTestCase extends TestCase { + /** + * @var \OC\Files\View + */ + protected $rootView; + protected $fileIds = []; // [$user=>[$path=>$id]] + protected $fileEtags = []; // [$id=>$etag] + + public static function setUpBeforeClass() { + parent::setUpBeforeClass(); + \OCA\Files_Sharing\Helper::registerHooks(); + } + + protected function setUp() { + parent::setUp(); + $this->setUpShares(); + } + + protected function tearDown() { + \OC_Hook::clear('OC_Filesystem', 'post_write'); + \OC_Hook::clear('OC_Filesystem', 'post_delete'); + \OC_Hook::clear('OC_Filesystem', 'post_rename'); + \OC_Hook::clear('OCP\Share', 'post_update_permissions'); + parent::tearDown(); + } + + abstract protected function setUpShares(); + + /** + * @param string[] $users + * @param string $subPath + */ + protected function assertEtagsChanged($users, $subPath = '') { + $oldUser = \OC::$server->getUserSession()->getUser(); + foreach ($users as $user) { + $this->loginAsUser($user); + $id = $this->fileIds[$user][$subPath]; + $path = $this->rootView->getPath($id); + $etag = $this->rootView->getFileInfo($path)->getEtag(); + $this->assertNotEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has changed'); + $this->fileEtags[$id] = $etag; + } + $this->loginAsUser($oldUser->getUID()); + } + + /** + * @param string[] $users + * @param string $subPath + */ + protected function assertEtagsNotChanged($users, $subPath = '') { + $oldUser = \OC::$server->getUserSession()->getUser(); + foreach ($users as $user) { + $this->loginAsUser($user); + $id = $this->fileIds[$user][$subPath]; + $path = $this->rootView->getPath($id); + $etag = $this->rootView->getFileInfo($path)->getEtag(); + $this->assertEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has not changed'); + $this->fileEtags[$id] = $etag; + } + $this->loginAsUser($oldUser->getUID()); + } + + /** + * Assert that the etags for the root, /sub1 and /sub1/sub2 have changed + * + * @param string[] $users + */ + protected function assertEtagsForFoldersChanged($users) { + $this->assertEtagsChanged($users); + + $this->assertEtagsChanged($users, 'sub1'); + $this->assertEtagsChanged($users, 'sub1/sub2'); + } + + protected function assertAllUnchanged() { + $users = [self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, + self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]; + $this->assertEtagsNotChanged($users); + } +} diff --git a/apps/files_sharing/tests/testcase.php b/apps/files_sharing/tests/testcase.php index dc5b8ed79d..a74ee83c25 100644 --- a/apps/files_sharing/tests/testcase.php +++ b/apps/files_sharing/tests/testcase.php @@ -84,9 +84,15 @@ abstract class TestCase extends \Test\TestCase { $groupBackend = new \OC_Group_Dummy(); $groupBackend->createGroup(self::TEST_FILES_SHARING_API_GROUP1); $groupBackend->createGroup('group'); + $groupBackend->createGroup('group1'); + $groupBackend->createGroup('group2'); + $groupBackend->createGroup('group3'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER1, 'group'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, 'group'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER3, 'group'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, 'group1'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER3, 'group2'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER4, 'group3'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_GROUP1); \OC_Group::useBackend($groupBackend); From f5e6c7580487ed853f67c0bee556a79a52ceb1ac Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 10 Dec 2015 14:53:34 +0100 Subject: [PATCH 062/194] Make AppManager->checkAppForUser more robust * if the JSON that is stored in the DB is corrupt an error was thrown * with this change it is properly handled and the app is disabled --- lib/private/app/appmanager.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/private/app/appmanager.php b/lib/private/app/appmanager.php index f826c8ba0c..8ae93f9883 100644 --- a/lib/private/app/appmanager.php +++ b/lib/private/app/appmanager.php @@ -148,6 +148,13 @@ class AppManager implements IAppManager { return false; } else { $groupIds = json_decode($enabled); + + if (!is_array($groupIds)) { + $jsonError = json_last_error(); + \OC::$server->getLogger()->warning('AppManger::checkAppForUser - can\'t decode group IDs: ' . print_r($enabled, true) . ' - json error code: ' . $jsonError, ['app' => 'lib']); + return false; + } + $userGroups = $this->groupManager->getUserGroupIds($user); foreach ($userGroups as $groupId) { if (array_search($groupId, $groupIds) !== false) { From 01b9f07ac8ea5674a18fefcc06241b949e05d62d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 10 Dec 2015 16:10:45 +0100 Subject: [PATCH 063/194] Remove info about database locking performance --- settings/templates/admin.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/settings/templates/admin.php b/settings/templates/admin.php index f3de51a23c..2b813257a7 100644 --- a/settings/templates/admin.php +++ b/settings/templates/admin.php @@ -181,13 +181,7 @@ if ($_['cronErrors']) {
- + From 174f7599e575e350bc6177fd315a7657c37323f7 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 9 Dec 2015 17:31:14 +0100 Subject: [PATCH 064/194] Catch exception when querying direct download link --- apps/dav/lib/connector/sabre/filesplugin.php | 11 +++++--- .../unit/connector/sabre/filesplugin.php | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php index 1c78e9dc84..aa75628174 100644 --- a/apps/dav/lib/connector/sabre/filesplugin.php +++ b/apps/dav/lib/connector/sabre/filesplugin.php @@ -31,6 +31,7 @@ use \Sabre\DAV\PropFind; use \Sabre\DAV\PropPatch; use \Sabre\HTTP\RequestInterface; use \Sabre\HTTP\ResponseInterface; +use OCP\Files\StorageNotAvailableException; class FilesPlugin extends \Sabre\DAV\ServerPlugin { @@ -225,9 +226,13 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { if ($node instanceof \OCA\DAV\Connector\Sabre\File) { $propFind->handle(self::DOWNLOADURL_PROPERTYNAME, function() use ($node) { /** @var $node \OCA\DAV\Connector\Sabre\File */ - $directDownloadUrl = $node->getDirectDownload(); - if (isset($directDownloadUrl['url'])) { - return $directDownloadUrl['url']; + try { + $directDownloadUrl = $node->getDirectDownload(); + if (isset($directDownloadUrl['url'])) { + return $directDownloadUrl['url']; + } + } catch (StorageNotAvailableException $e) { + return false; } return false; }); diff --git a/apps/dav/tests/unit/connector/sabre/filesplugin.php b/apps/dav/tests/unit/connector/sabre/filesplugin.php index b33c8340f7..642fc3258c 100644 --- a/apps/dav/tests/unit/connector/sabre/filesplugin.php +++ b/apps/dav/tests/unit/connector/sabre/filesplugin.php @@ -2,6 +2,8 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; +use OCP\Files\StorageNotAvailableException; + /** * Copyright (c) 2015 Vincent Petry * This file is licensed under the Affero General Public License version 3 or @@ -143,6 +145,29 @@ class FilesPlugin extends \Test\TestCase { $this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties()); } + public function testGetPropertiesStorageNotAvailable() { + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); + + $propFind = new \Sabre\DAV\PropFind( + '/dummyPath', + array( + self::DOWNLOADURL_PROPERTYNAME, + ), + 0 + ); + + $node->expects($this->once()) + ->method('getDirectDownload') + ->will($this->throwException(new StorageNotAvailableException())); + + $this->plugin->handleGetProperties( + $propFind, + $node + ); + + $this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME)); + } + public function testGetPublicPermissions() { $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view, true); $this->plugin->initialize($this->server); From ffc49a24f02639afce362384fc3d6e4a0799d1d7 Mon Sep 17 00:00:00 2001 From: Scrutinizer Auto-Fixer Date: Tue, 8 Dec 2015 15:01:20 +0000 Subject: [PATCH 065/194] Scrutinizer Auto-Fixes This commit consists of patches automatically generated for this project on https://scrutinizer-ci.com --- .../lib/systemtag/systemtagsbyidcollection.php | 12 ++++++++++++ .../systemtag/systemtagsobjecttypecollection.php | 15 +++++++++++++++ .../tests/unit/systemtag/systemtagmappingnode.php | 4 ---- .../unit/systemtag/systemtagsbyidcollection.php | 1 - .../systemtagsobjectmappingcollection.php | 1 - apps/files/tests/backgroundjob/ScanFilesTest.php | 1 - apps/files_external/lib/personalmount.php | 2 +- apps/files_external/service/storagesservice.php | 3 +++ .../service/userglobalstoragesservice.php | 3 +++ .../tests/service/globalstoragesservicetest.php | 1 - .../features/bootstrap/CapabilitiesContext.php | 2 -- .../middleware/security/securitymiddleware.php | 1 - lib/private/share/mailnotifications.php | 6 +++--- tests/lib/share/MailNotificationsTest.php | 4 +++- 14 files changed, 40 insertions(+), 16 deletions(-) diff --git a/apps/dav/lib/systemtag/systemtagsbyidcollection.php b/apps/dav/lib/systemtag/systemtagsbyidcollection.php index e7b7b6d0ac..79b0aa8fbb 100644 --- a/apps/dav/lib/systemtag/systemtagsbyidcollection.php +++ b/apps/dav/lib/systemtag/systemtagsbyidcollection.php @@ -46,14 +46,23 @@ class SystemTagsByIdCollection implements ICollection { $this->tagManager = $tagManager; } + /** + * @param string $name + */ function createFile($name, $data = null) { throw new Forbidden('Cannot create tags by id'); } + /** + * @param string $name + */ function createDirectory($name) { throw new Forbidden('Permission denied to create collections'); } + /** + * @param string $name + */ function getChild($name) { try { $tags = $this->tagManager->getTagsByIds([$name]); @@ -72,6 +81,9 @@ class SystemTagsByIdCollection implements ICollection { }, $tags); } + /** + * @param string $name + */ function childExists($name) { try { $this->tagManager->getTagsByIds([$name]); diff --git a/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php b/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php index e544073613..543a684c5b 100644 --- a/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php +++ b/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php @@ -61,14 +61,23 @@ class SystemTagsObjectTypeCollection implements ICollection { $this->objectType = $objectType; } + /** + * @param string $name + */ function createFile($name, $data = null) { throw new Forbidden('Permission denied to create nodes'); } + /** + * @param string $name + */ function createDirectory($name) { throw new Forbidden('Permission denied to create collections'); } + /** + * @param string $objectId + */ function getChild($objectId) { return new SystemTagsObjectMappingCollection( $objectId, @@ -83,6 +92,9 @@ class SystemTagsObjectTypeCollection implements ICollection { throw new MethodNotAllowed(); } + /** + * @param string $name + */ function childExists($name) { return true; } @@ -95,6 +107,9 @@ class SystemTagsObjectTypeCollection implements ICollection { return $this->objectType; } + /** + * @param string $name + */ function setName($name) { throw new Forbidden('Permission denied to rename this collection'); } diff --git a/apps/dav/tests/unit/systemtag/systemtagmappingnode.php b/apps/dav/tests/unit/systemtag/systemtagmappingnode.php index 849f7c2fa5..aef62a1acb 100644 --- a/apps/dav/tests/unit/systemtag/systemtagmappingnode.php +++ b/apps/dav/tests/unit/systemtag/systemtagmappingnode.php @@ -9,12 +9,8 @@ namespace OCA\DAV\Tests\Unit\SystemTag; use Sabre\DAV\Exception\NotFound; -use Sabre\DAV\Exception\MethodNotAllowed; -use Sabre\DAV\Exception\Conflict; - use OC\SystemTag\SystemTag; use OCP\SystemTag\TagNotFoundException; -use OCP\SystemTag\TagAlreadyExistsException; class SystemTagMappingNode extends SystemTagNode { diff --git a/apps/dav/tests/unit/systemtag/systemtagsbyidcollection.php b/apps/dav/tests/unit/systemtag/systemtagsbyidcollection.php index 104ce36603..fa9e42d04f 100644 --- a/apps/dav/tests/unit/systemtag/systemtagsbyidcollection.php +++ b/apps/dav/tests/unit/systemtag/systemtagsbyidcollection.php @@ -11,7 +11,6 @@ namespace OCA\DAV\Tests\Unit\SystemTag; use OC\SystemTag\SystemTag; use OCP\SystemTag\TagNotFoundException; -use OCP\SystemTag\TagAlreadyExistsException; class SystemTagsByIdCollection extends \Test\TestCase { diff --git a/apps/dav/tests/unit/systemtag/systemtagsobjectmappingcollection.php b/apps/dav/tests/unit/systemtag/systemtagsobjectmappingcollection.php index 6e15bb78e7..a9b34f5ae1 100644 --- a/apps/dav/tests/unit/systemtag/systemtagsobjectmappingcollection.php +++ b/apps/dav/tests/unit/systemtag/systemtagsobjectmappingcollection.php @@ -11,7 +11,6 @@ namespace OCA\DAV\Tests\Unit\SystemTag; use OC\SystemTag\SystemTag; use OCP\SystemTag\TagNotFoundException; -use OCP\SystemTag\TagAlreadyExistsException; class SystemTagsObjectMappingCollection extends \Test\TestCase { diff --git a/apps/files/tests/backgroundjob/ScanFilesTest.php b/apps/files/tests/backgroundjob/ScanFilesTest.php index 907cad64f9..087696f0cf 100644 --- a/apps/files/tests/backgroundjob/ScanFilesTest.php +++ b/apps/files/tests/backgroundjob/ScanFilesTest.php @@ -24,7 +24,6 @@ use Test\TestCase; use OCP\IConfig; use OCP\IUserManager; use OCA\Files\BackgroundJob\ScanFiles; -use OCP\ILogger; /** * Class ScanFilesTest diff --git a/apps/files_external/lib/personalmount.php b/apps/files_external/lib/personalmount.php index f81dee5be1..34ae516ea5 100644 --- a/apps/files_external/lib/personalmount.php +++ b/apps/files_external/lib/personalmount.php @@ -40,7 +40,7 @@ class PersonalMount extends MountPoint implements MoveableMount { /** * @param UserStoragesService $storagesService * @param int $storageId - * @param string|\OC\Files\Storage\Storage $storage + * @param \OCP\Files\Storage $storage * @param string $mountpoint * @param array $arguments (optional) configuration for the storage backend * @param \OCP\Files\Storage\IStorageFactory $loader diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php index 9be6498435..97f79c1332 100644 --- a/apps/files_external/service/storagesservice.php +++ b/apps/files_external/service/storagesservice.php @@ -185,6 +185,9 @@ abstract class StoragesService { */ abstract public function getVisibilityType(); + /** + * @return integer + */ protected function getType() { return DBConfigService::MOUNT_TYPE_ADMIN; } diff --git a/apps/files_external/service/userglobalstoragesservice.php b/apps/files_external/service/userglobalstoragesservice.php index cb49f0f672..e58815f8a7 100644 --- a/apps/files_external/service/userglobalstoragesservice.php +++ b/apps/files_external/service/userglobalstoragesservice.php @@ -89,6 +89,9 @@ class UserGlobalStoragesService extends GlobalStoragesService { throw new \DomainException('UserGlobalStoragesService writing disallowed'); } + /** + * @param integer $id + */ public function removeStorage($id) { throw new \DomainException('UserGlobalStoragesService writing disallowed'); } diff --git a/apps/files_external/tests/service/globalstoragesservicetest.php b/apps/files_external/tests/service/globalstoragesservicetest.php index 7c77616563..e620b05a51 100644 --- a/apps/files_external/tests/service/globalstoragesservicetest.php +++ b/apps/files_external/tests/service/globalstoragesservicetest.php @@ -23,7 +23,6 @@ namespace OCA\Files_external\Tests\Service; use \OC\Files\Filesystem; -use OCA\Files_External\Service\DBConfigService; use \OCA\Files_external\Service\GlobalStoragesService; use \OCA\Files_external\NotFoundException; use \OCA\Files_external\Lib\StorageConfig; diff --git a/build/integration/features/bootstrap/CapabilitiesContext.php b/build/integration/features/bootstrap/CapabilitiesContext.php index 4e200bdf42..1b0015dce7 100644 --- a/build/integration/features/bootstrap/CapabilitiesContext.php +++ b/build/integration/features/bootstrap/CapabilitiesContext.php @@ -2,8 +2,6 @@ use Behat\Behat\Context\Context; use Behat\Behat\Context\SnippetAcceptingContext; -use GuzzleHttp\Client; -use GuzzleHttp\Message\ResponseInterface; require __DIR__ . '/../../vendor/autoload.php'; diff --git a/lib/private/appframework/middleware/security/securitymiddleware.php b/lib/private/appframework/middleware/security/securitymiddleware.php index d0b7202a36..725ce689b4 100644 --- a/lib/private/appframework/middleware/security/securitymiddleware.php +++ b/lib/private/appframework/middleware/security/securitymiddleware.php @@ -27,7 +27,6 @@ namespace OC\AppFramework\Middleware\Security; -use OC\AppFramework\Http; use OC\Appframework\Middleware\Security\Exceptions\AppNotEnabledException; use OC\Appframework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException; use OC\Appframework\Middleware\Security\Exceptions\NotAdminException; diff --git a/lib/private/share/mailnotifications.php b/lib/private/share/mailnotifications.php index 4d282158ba..f071c7f3a3 100644 --- a/lib/private/share/mailnotifications.php +++ b/lib/private/share/mailnotifications.php @@ -170,7 +170,7 @@ class MailNotifications { * @param string $filename the shared file * @param string $link the public link * @param int $expiration expiration date (timestamp) - * @return array $result of failed recipients + * @return string[] $result of failed recipients */ public function sendLinkShareMail($recipient, $filename, $link, $expiration) { $subject = (string)$this->l->t('%s shared »%s« with you', [$this->senderDisplayName, $filename]); @@ -232,8 +232,8 @@ class MailNotifications { } /** - * @param $itemSource - * @param $itemType + * @param string $itemSource + * @param string $itemType * @param IUser $recipient * @return array */ diff --git a/tests/lib/share/MailNotificationsTest.php b/tests/lib/share/MailNotificationsTest.php index 8684886e79..66bec8653f 100644 --- a/tests/lib/share/MailNotificationsTest.php +++ b/tests/lib/share/MailNotificationsTest.php @@ -20,7 +20,6 @@ */ use OC\Share\MailNotifications; -use OCP\IConfig; use OCP\IL10N; use OCP\IUser; use OCP\Mail\IMailer; @@ -234,6 +233,9 @@ class MailNotificationsTest extends \Test\TestCase { } + /** + * @param string $subject + */ protected function setupMailerMock($subject, $to, $exceptionOnSend = true) { $message = $this->getMockBuilder('\OC\Mail\Message') ->disableOriginalConstructor()->getMock(); From 19d1e0ebb91de343484614f7d05517305a524ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 10 Dec 2015 16:43:10 +0100 Subject: [PATCH 066/194] adjust PHPDoc --- apps/dav/lib/systemtag/systemtagsbyidcollection.php | 2 ++ apps/dav/lib/systemtag/systemtagsobjecttypecollection.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/apps/dav/lib/systemtag/systemtagsbyidcollection.php b/apps/dav/lib/systemtag/systemtagsbyidcollection.php index 79b0aa8fbb..974d04efa5 100644 --- a/apps/dav/lib/systemtag/systemtagsbyidcollection.php +++ b/apps/dav/lib/systemtag/systemtagsbyidcollection.php @@ -48,6 +48,8 @@ class SystemTagsByIdCollection implements ICollection { /** * @param string $name + * @param resource|string $data Initial payload + * @throws Forbidden */ function createFile($name, $data = null) { throw new Forbidden('Cannot create tags by id'); diff --git a/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php b/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php index 543a684c5b..2a28b9c83a 100644 --- a/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php +++ b/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php @@ -63,6 +63,8 @@ class SystemTagsObjectTypeCollection implements ICollection { /** * @param string $name + * @param resource|string $data Initial payload + * @throws Forbidden */ function createFile($name, $data = null) { throw new Forbidden('Permission denied to create nodes'); From 97f5c095f4018119e15d7c612a685da1dc91a340 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 10 Dec 2015 17:13:02 +0100 Subject: [PATCH 067/194] Dont do a seperate request to check if a file exists for dav->fopen --- lib/private/files/storage/dav.php | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/private/files/storage/dav.php b/lib/private/files/storage/dav.php index dda163e41a..9afebab1dd 100644 --- a/lib/private/files/storage/dav.php +++ b/lib/private/files/storage/dav.php @@ -34,6 +34,7 @@ namespace OC\Files\Storage; use Exception; +use GuzzleHttp\Exception\RequestException; use OC\Files\Filesystem; use OC\Files\Stream\Close; use Icewind\Streams\IteratorDirectory; @@ -339,15 +340,20 @@ class DAV extends Common { switch ($mode) { case 'r': case 'rb': - if (!$this->file_exists($path)) { - return false; + try { + $response = $this->httpClientService + ->newClient() + ->get($this->createBaseUri() . $this->encodePath($path), [ + 'auth' => [$this->user, $this->password], + 'stream' => true + ]); + } catch (RequestException $e) { + if ($e->getResponse()->getStatusCode() === 404) { + return false; + } else { + throw $e; + } } - $response = $this->httpClientService - ->newClient() - ->get($this->createBaseUri() . $this->encodePath($path), [ - 'auth' => [$this->user, $this->password], - 'stream' => true - ]); if ($response->getStatusCode() !== Http::STATUS_OK) { if ($response->getStatusCode() === Http::STATUS_LOCKED) { From 4569d88879d2a34c00d9356355c34039b783d262 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 10 Dec 2015 19:00:07 +0100 Subject: [PATCH 068/194] IMemcacheTTL was backported to 8.2.2 see #21113 --- lib/public/imemcachettl.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/public/imemcachettl.php b/lib/public/imemcachettl.php index a4a7a53054..3c2bfe8ad2 100644 --- a/lib/public/imemcachettl.php +++ b/lib/public/imemcachettl.php @@ -24,7 +24,7 @@ namespace OCP; /** * Interface for memcache backends that support setting ttl after the value is set * - * @since 9.0.0 + * @since 8.2.2 */ interface IMemcacheTTL extends IMemcache { /** @@ -32,7 +32,7 @@ interface IMemcacheTTL extends IMemcache { * * @param string $key * @param int $ttl time to live in seconds - * @since 9.0.0 + * @since 8.2.2 */ public function setTTL($key, $ttl); } From 8c7930015644fdd3121dd8399c975b7d15bf40a7 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 11 Dec 2015 00:12:41 +0100 Subject: [PATCH 069/194] throw NoUserException in getHome when the requested user does not exist anymore --- apps/user_ldap/user_ldap.php | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 0097dda89b..fc62c16857 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -30,6 +30,7 @@ namespace OCA\user_ldap; +use OC\User\NoUserException; use OCA\user_ldap\lib\BackendUtility; use OCA\user_ldap\lib\Access; use OCA\user_ldap\lib\user\OfflineUser; @@ -190,15 +191,18 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn /** * checks whether a user is still available on LDAP + * * @param string|\OCA\User_LDAP\lib\user\User $user either the ownCloud user * name or an instance of that user * @return bool + * @throws \Exception + * @throws \OC\ServerNotAvailableException */ public function userExistsOnLDAP($user) { if(is_string($user)) { $user = $this->access->userManager->get($user); } - if(!$user instanceof User) { + if(is_null($user)) { return false; } @@ -212,6 +216,10 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn return false; } + if($user instanceof OfflineUser) { + $user->unmark(); + } + return true; } @@ -274,10 +282,13 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn } /** - * get the user's home directory - * @param string $uid the username - * @return string|bool - */ + * get the user's home directory + * + * @param string $uid the username + * @return bool|string + * @throws NoUserException + * @throws \Exception + */ public function getHome($uid) { if(isset($this->homesToKill[$uid]) && !empty($this->homesToKill[$uid])) { //a deleted user who needs some clean up @@ -295,6 +306,15 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn } $user = $this->access->userManager->get($uid); + if(is_null($user) || ($user instanceof OfflineUser && !$this->userExistsOnLDAP($user->getUID()))) { + throw new NoUserException($uid . ' is not a valid user anymore'); + } + if($user instanceof OfflineUser) { + // apparently this user survived the userExistsOnLDAP check, + // we request the user instance again in order to retrieve a User + // instance instead + $user = $this->access->userManager->get($uid); + } $path = $user->getHomePath(); $this->access->cacheUserHome($uid, $path); From 4020d5b77a249e75ae81f5c3646db5692488a812 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 11 Dec 2015 01:56:53 +0100 Subject: [PATCH 070/194] look for DN changes before marking a user as deleted --- apps/user_ldap/lib/access.php | 52 +++++++++++++++++++ .../user_ldap/lib/mapping/abstractmapping.php | 12 ++++- apps/user_ldap/user_ldap.php | 15 +++++- 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 667f107623..3be0b6818d 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -1276,6 +1276,58 @@ class Access extends LDAPUtility implements user\IUserTools { return $result; } + /** + * reverse lookup of a DN given a known UUID + * + * @param string $uuid + * @return string + * @throws \Exception + */ + public function getUserDnByUuid($uuid) { + $uuidOverride = $this->connection->ldapExpertUUIDUserAttr; + $filter = $this->connection->ldapUserFilter; + $base = $this->connection->ldapBaseUsers; + + if($this->connection->ldapUuidUserAttribute === 'auto' && empty($uuidOverride)) { + // Sacrebleu! The UUID attribute is unknown :( We need first an + // existing DN to be able to reliably detect it. + $result = $this->search($filter, $base, ['dn'], 1); + if(!isset($result[0]) || !isset($result[0]['dn'])) { + throw new \Exception('Cannot determine UUID attribute'); + } + $dn = $result[0]['dn'][0]; + if(!$this->detectUuidAttribute($dn, true)) { + throw new \Exception('Cannot determine UUID attribute'); + } + } else { + // The UUID attribute is either known or an override is given. + // By calling this method we ensure that $this->connection->$uuidAttr + // is definitely set + if(!$this->detectUuidAttribute('', true)) { + throw new \Exception('Cannot determine UUID attribute'); + } + } + + $uuidAttr = $this->connection->ldapUuidUserAttribute; + if($uuidAttr === 'guid' || $uuidAttr === 'objectguid') { + $dn = ''; + $result = $this->readAttribute($dn, 'dn'); + if(is_array($result) && isset($result[0])) { + return $result[0]; + } + } else { + $filter = $uuidAttr . '=' . $uuid; + $result = $this->searchUsers($filter, ['dn'], 2); + if(is_array($result) && isset($result[0]) && isset($result[0]['dn']) && count($result) === 1) { + // we put the count into account to make sure that this is + // really unique + return $result[0]['dn'][0]; + } + } + + throw new \Exception('Cannot determine UUID attribute'); + } + /** * auto-detects the directory's UUID attribute * @param string $dn a known DN used to check against diff --git a/apps/user_ldap/lib/mapping/abstractmapping.php b/apps/user_ldap/lib/mapping/abstractmapping.php index f0f0f6df75..c3d38ce8b7 100644 --- a/apps/user_ldap/lib/mapping/abstractmapping.php +++ b/apps/user_ldap/lib/mapping/abstractmapping.php @@ -158,7 +158,7 @@ abstract class AbstractMapping { } /** - * Gets the name based on the provided LDAP DN. + * Gets the name based on the provided LDAP UUID. * @param string $uuid * @return string|false */ @@ -166,6 +166,16 @@ abstract class AbstractMapping { return $this->getXbyY('owncloud_name', 'directory_uuid', $uuid); } + /** + * Gets the UUID based on the provided LDAP DN + * @param string $dn + * @return false|string + * @throws \Exception + */ + public function getUUIDByDN($dn) { + return $this->getXbyY('directory_uuid', 'ldap_dn', $dn); + } + /** * gets a piece of the mapping list * @param int $offset diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index fc62c16857..a266be7b7f 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -213,7 +213,18 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn if(is_null($lcr)) { throw new \Exception('No LDAP Connection to server ' . $this->access->connection->ldapHost); } - return false; + + try { + $uuid = $this->access->getUserMapper()->getUUIDByDN($dn); + if(!$uuid) { + return false; + } + $newDn = $this->access->getUserDnByUuid($uuid); + $this->access->getUserMapper()->setDNbyUUID($newDn, $uuid); + return true; + } catch (\Exception $e) { + return false; + } } if($user instanceof OfflineUser) { @@ -306,7 +317,7 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn } $user = $this->access->userManager->get($uid); - if(is_null($user) || ($user instanceof OfflineUser && !$this->userExistsOnLDAP($user->getUID()))) { + if(is_null($user) || ($user instanceof OfflineUser && !$this->userExistsOnLDAP($user->getOCName()))) { throw new NoUserException($uid . ' is not a valid user anymore'); } if($user instanceof OfflineUser) { From acce1638e5c06e0a3c98a0450fd82df9574524dc Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Fri, 11 Dec 2015 01:55:44 -0500 Subject: [PATCH 071/194] [tx-robot] updated from transifex --- settings/l10n/ar.js | 6 +++--- settings/l10n/ar.json | 6 +++--- settings/l10n/ast.js | 6 +++--- settings/l10n/ast.json | 6 +++--- settings/l10n/az.js | 6 +++--- settings/l10n/az.json | 6 +++--- settings/l10n/bg_BG.js | 6 +++--- settings/l10n/bg_BG.json | 6 +++--- settings/l10n/bn_BD.js | 4 ++-- settings/l10n/bn_BD.json | 4 ++-- settings/l10n/bs.js | 6 +++--- settings/l10n/bs.json | 6 +++--- settings/l10n/ca.js | 6 +++--- settings/l10n/ca.json | 6 +++--- settings/l10n/cs_CZ.js | 7 +++---- settings/l10n/cs_CZ.json | 7 +++---- settings/l10n/cy_GB.js | 2 +- settings/l10n/cy_GB.json | 2 +- settings/l10n/da.js | 7 +++---- settings/l10n/da.json | 7 +++---- settings/l10n/el.js | 7 +++---- settings/l10n/el.json | 7 +++---- settings/l10n/en_GB.js | 6 +++--- settings/l10n/en_GB.json | 6 +++--- settings/l10n/eo.js | 6 +++--- settings/l10n/eo.json | 6 +++--- settings/l10n/es.js | 7 +++---- settings/l10n/es.json | 7 +++---- settings/l10n/es_MX.js | 6 +++--- settings/l10n/es_MX.json | 6 +++--- settings/l10n/et_EE.js | 6 +++--- settings/l10n/et_EE.json | 6 +++--- settings/l10n/eu.js | 6 +++--- settings/l10n/eu.json | 6 +++--- settings/l10n/fa.js | 6 +++--- settings/l10n/fa.json | 6 +++--- settings/l10n/fi_FI.js | 6 +++--- settings/l10n/fi_FI.json | 6 +++--- settings/l10n/fr.js | 1 - settings/l10n/fr.json | 1 - settings/l10n/gl.js | 6 +++--- settings/l10n/gl.json | 6 +++--- settings/l10n/he.js | 2 +- settings/l10n/he.json | 2 +- settings/l10n/hr.js | 6 +++--- settings/l10n/hr.json | 6 +++--- settings/l10n/hu_HU.js | 6 +++--- settings/l10n/hu_HU.json | 6 +++--- settings/l10n/id.js | 7 +++---- settings/l10n/id.json | 7 +++---- settings/l10n/is.js | 2 +- settings/l10n/is.json | 2 +- settings/l10n/it.js | 7 +++---- settings/l10n/it.json | 7 +++---- settings/l10n/ja.js | 1 - settings/l10n/ja.json | 1 - settings/l10n/ka_GE.js | 2 +- settings/l10n/ka_GE.json | 2 +- settings/l10n/km.js | 2 +- settings/l10n/km.json | 2 +- settings/l10n/kn.js | 6 +++--- settings/l10n/kn.json | 6 +++--- settings/l10n/ko.js | 7 +++---- settings/l10n/ko.json | 7 +++---- settings/l10n/lb.js | 2 +- settings/l10n/lb.json | 2 +- settings/l10n/lo.js | 4 ++-- settings/l10n/lo.json | 4 ++-- settings/l10n/lt_LT.js | 6 +++--- settings/l10n/lt_LT.json | 6 +++--- settings/l10n/lv.js | 6 +++--- settings/l10n/lv.json | 6 +++--- settings/l10n/mn.js | 6 +++--- settings/l10n/mn.json | 6 +++--- settings/l10n/ms_MY.js | 2 +- settings/l10n/ms_MY.json | 2 +- settings/l10n/my_MM.js | 2 +- settings/l10n/my_MM.json | 2 +- settings/l10n/nb_NO.js | 7 +++---- settings/l10n/nb_NO.json | 7 +++---- settings/l10n/nl.js | 1 - settings/l10n/nl.json | 1 - settings/l10n/nn_NO.js | 2 +- settings/l10n/nn_NO.json | 2 +- settings/l10n/oc.js | 7 +++---- settings/l10n/oc.json | 7 +++---- settings/l10n/pl.js | 6 +++--- settings/l10n/pl.json | 6 +++--- settings/l10n/pt_BR.js | 7 +++---- settings/l10n/pt_BR.json | 7 +++---- settings/l10n/pt_PT.js | 6 +++--- settings/l10n/pt_PT.json | 6 +++--- settings/l10n/ro.js | 6 +++--- settings/l10n/ro.json | 6 +++--- settings/l10n/ru.js | 7 +++---- settings/l10n/ru.json | 7 +++---- settings/l10n/si_LK.js | 2 +- settings/l10n/si_LK.json | 2 +- settings/l10n/sk_SK.js | 6 +++--- settings/l10n/sk_SK.json | 6 +++--- settings/l10n/sq.js | 6 +++--- settings/l10n/sq.json | 6 +++--- settings/l10n/sr.js | 6 +++--- settings/l10n/sr.json | 6 +++--- settings/l10n/sr@latin.js | 2 +- settings/l10n/sr@latin.json | 2 +- settings/l10n/ta_LK.js | 2 +- settings/l10n/ta_LK.json | 2 +- settings/l10n/th_TH.js | 1 - settings/l10n/th_TH.json | 1 - settings/l10n/tr.js | 7 +++---- settings/l10n/tr.json | 7 +++---- settings/l10n/ug.js | 2 +- settings/l10n/ug.json | 2 +- settings/l10n/uk.js | 6 +++--- settings/l10n/uk.json | 6 +++--- settings/l10n/vi.js | 6 +++--- settings/l10n/vi.json | 6 +++--- settings/l10n/zh_CN.js | 1 - settings/l10n/zh_CN.json | 1 - settings/l10n/zh_TW.js | 7 +++---- settings/l10n/zh_TW.json | 7 +++---- 122 files changed, 280 insertions(+), 316 deletions(-) diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js index 818d001b3d..c4b24e2e4a 100644 --- a/settings/l10n/ar.js +++ b/settings/l10n/ar.js @@ -4,11 +4,9 @@ OC.L10N.register( "Sharing" : "مشاركة", "Cron" : "مجدول", "Log" : "سجل", - "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", - "Your full name has been changed." : "اسمك الكامل تم تغييره.", - "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Language changed" : "تم تغيير اللغة", "Invalid request" : "طلب غير مفهوم", + "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", @@ -23,6 +21,8 @@ OC.L10N.register( "test email settings" : "إعدادات البريد التجريبي", "Email sent" : "تم ارسال البريد الالكتروني", "Email saved" : "تم حفظ البريد الإلكتروني", + "Your full name has been changed." : "اسمك الكامل تم تغييره.", + "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.", "Sending..." : "جاري الارسال ...", "All" : "الكل", diff --git a/settings/l10n/ar.json b/settings/l10n/ar.json index 6e2a8268b5..18e50c1c0e 100644 --- a/settings/l10n/ar.json +++ b/settings/l10n/ar.json @@ -2,11 +2,9 @@ "Sharing" : "مشاركة", "Cron" : "مجدول", "Log" : "سجل", - "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", - "Your full name has been changed." : "اسمك الكامل تم تغييره.", - "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Language changed" : "تم تغيير اللغة", "Invalid request" : "طلب غير مفهوم", + "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", @@ -21,6 +19,8 @@ "test email settings" : "إعدادات البريد التجريبي", "Email sent" : "تم ارسال البريد الالكتروني", "Email saved" : "تم حفظ البريد الإلكتروني", + "Your full name has been changed." : "اسمك الكامل تم تغييره.", + "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.", "Sending..." : "جاري الارسال ...", "All" : "الكل", diff --git a/settings/l10n/ast.js b/settings/l10n/ast.js index 9597cc9a52..9a5b7a4e88 100644 --- a/settings/l10n/ast.js +++ b/settings/l10n/ast.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Rexistru", "Updates" : "Anovamientos", - "Authentication error" : "Fallu d'autenticación", - "Your full name has been changed." : "Camudóse'l nome completu.", - "Unable to change full name" : "Nun pue camudase'l nome completu", "Couldn't remove app." : "Nun pudo desaniciase l'aplicación.", "Language changed" : "Camudóse la llingua", "Invalid request" : "Solicitú inválida", + "Authentication error" : "Fallu d'autenticación", "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", @@ -28,6 +26,8 @@ OC.L10N.register( "Email sent" : "Corréu-e unviáu", "You need to set your user email before being able to send test emails." : "Tienes de configurar la direición de corréu-e enantes de poder unviar mensaxes de prueba.", "Email saved" : "Corréu-e guardáu", + "Your full name has been changed." : "Camudóse'l nome completu.", + "Unable to change full name" : "Nun pue camudase'l nome completu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿De xuru que quies amestar \"{domain}\" como dominiu de confianza?", "Add trusted domain" : "Amestar dominiu de confianza", "Sending..." : "Unviando...", diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json index c3252ba8bf..13dd87a943 100644 --- a/settings/l10n/ast.json +++ b/settings/l10n/ast.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Rexistru", "Updates" : "Anovamientos", - "Authentication error" : "Fallu d'autenticación", - "Your full name has been changed." : "Camudóse'l nome completu.", - "Unable to change full name" : "Nun pue camudase'l nome completu", "Couldn't remove app." : "Nun pudo desaniciase l'aplicación.", "Language changed" : "Camudóse la llingua", "Invalid request" : "Solicitú inválida", + "Authentication error" : "Fallu d'autenticación", "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", @@ -26,6 +24,8 @@ "Email sent" : "Corréu-e unviáu", "You need to set your user email before being able to send test emails." : "Tienes de configurar la direición de corréu-e enantes de poder unviar mensaxes de prueba.", "Email saved" : "Corréu-e guardáu", + "Your full name has been changed." : "Camudóse'l nome completu.", + "Unable to change full name" : "Nun pue camudase'l nome completu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿De xuru que quies amestar \"{domain}\" como dominiu de confianza?", "Add trusted domain" : "Amestar dominiu de confianza", "Sending..." : "Unviando...", diff --git a/settings/l10n/az.js b/settings/l10n/az.js index 60a2492a28..6a354b0c9a 100644 --- a/settings/l10n/az.js +++ b/settings/l10n/az.js @@ -7,12 +7,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Jurnal", "Updates" : "Yenilənmələr", - "Authentication error" : "Təyinat metodikası", - "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", - "Unable to change full name" : "Tam adı dəyişmək olmur", "Couldn't remove app." : "Proqram təminatını silmək mümkün olmadı.", "Language changed" : "Dil dəyişdirildi", "Invalid request" : "Səhv müraciət", + "Authentication error" : "Təyinat metodikası", "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", @@ -44,6 +42,8 @@ OC.L10N.register( "Invalid user" : "İstifadəçi adı yalnışdır", "Unable to change mail address" : "Mail ünvanını dəyişmək olmur", "Email saved" : "Məktub yadda saxlanıldı", + "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", + "Unable to change full name" : "Tam adı dəyişmək olmur", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" adını inamlı domainlər siyahısına əlavə etməyinizdən əminsinizmi?", "Add trusted domain" : "İnamlı domainlərə əlavə et", "Sending..." : "Göndərilir...", diff --git a/settings/l10n/az.json b/settings/l10n/az.json index 8b46a472df..1093ff98cf 100644 --- a/settings/l10n/az.json +++ b/settings/l10n/az.json @@ -5,12 +5,10 @@ "Cron" : "Cron", "Log" : "Jurnal", "Updates" : "Yenilənmələr", - "Authentication error" : "Təyinat metodikası", - "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", - "Unable to change full name" : "Tam adı dəyişmək olmur", "Couldn't remove app." : "Proqram təminatını silmək mümkün olmadı.", "Language changed" : "Dil dəyişdirildi", "Invalid request" : "Səhv müraciət", + "Authentication error" : "Təyinat metodikası", "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", @@ -42,6 +40,8 @@ "Invalid user" : "İstifadəçi adı yalnışdır", "Unable to change mail address" : "Mail ünvanını dəyişmək olmur", "Email saved" : "Məktub yadda saxlanıldı", + "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", + "Unable to change full name" : "Tam adı dəyişmək olmur", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" adını inamlı domainlər siyahısına əlavə etməyinizdən əminsinizmi?", "Add trusted domain" : "İnamlı domainlərə əlavə et", "Sending..." : "Göndərilir...", diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js index 425b8f47dc..c1d50044b3 100644 --- a/settings/l10n/bg_BG.js +++ b/settings/l10n/bg_BG.js @@ -7,12 +7,10 @@ OC.L10N.register( "Cron" : "Крон", "Log" : "Лог", "Updates" : "Обновления", - "Authentication error" : "Възникна проблем с идентификацията", - "Your full name has been changed." : "Вашето пълно име е променено.", - "Unable to change full name" : "Неуспешна промяна на пълното име.", "Couldn't remove app." : "Неуспешно премахване на приложението.", "Language changed" : "Езикът е променен", "Invalid request" : "Невалидна заявка", + "Authentication error" : "Възникна проблем с идентификацията", "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", @@ -43,6 +41,8 @@ OC.L10N.register( "Invalid user" : "Невалиден протребител", "Unable to change mail address" : "Неуспешна промяна на адрес на електронна поща", "Email saved" : "Имейлът е запазен", + "Your full name has been changed." : "Вашето пълно име е променено.", + "Unable to change full name" : "Неуспешна промяна на пълното име.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Сигурен/на ли сте, че искате \"{domain}\" да бъде добавен като сигурен домейн?", "Add trusted domain" : "Добавяне на сигурен домейн", "Sending..." : "Изпращане...", diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json index e12faed8f6..154d832d78 100644 --- a/settings/l10n/bg_BG.json +++ b/settings/l10n/bg_BG.json @@ -5,12 +5,10 @@ "Cron" : "Крон", "Log" : "Лог", "Updates" : "Обновления", - "Authentication error" : "Възникна проблем с идентификацията", - "Your full name has been changed." : "Вашето пълно име е променено.", - "Unable to change full name" : "Неуспешна промяна на пълното име.", "Couldn't remove app." : "Неуспешно премахване на приложението.", "Language changed" : "Езикът е променен", "Invalid request" : "Невалидна заявка", + "Authentication error" : "Възникна проблем с идентификацията", "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", @@ -41,6 +39,8 @@ "Invalid user" : "Невалиден протребител", "Unable to change mail address" : "Неуспешна промяна на адрес на електронна поща", "Email saved" : "Имейлът е запазен", + "Your full name has been changed." : "Вашето пълно име е променено.", + "Unable to change full name" : "Неуспешна промяна на пълното име.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Сигурен/на ли сте, че искате \"{domain}\" да бъде добавен като сигурен домейн?", "Add trusted domain" : "Добавяне на сигурен домейн", "Sending..." : "Изпращане...", diff --git a/settings/l10n/bn_BD.js b/settings/l10n/bn_BD.js index b83657ea34..aecaf471c8 100644 --- a/settings/l10n/bn_BD.js +++ b/settings/l10n/bn_BD.js @@ -3,11 +3,10 @@ OC.L10N.register( { "Sharing" : "ভাগাভাগিরত", "External Storage" : "বাহ্যিক সংরক্ষণাগার", - "Authentication error" : "অনুমোদন ঘটিত সমস্যা", - "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "Couldn't remove app." : "অ্যাপ অপসারণ করা গেলনা", "Language changed" : "ভাষা পরিবর্তন করা হয়েছে", "Invalid request" : "অনুরোধটি সঠিক নয়", + "Authentication error" : "অনুমোদন ঘটিত সমস্যা", "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", @@ -19,6 +18,7 @@ OC.L10N.register( "test email settings" : "ইমেইল নিয়ামকসমূহ পরীক্ষা করুন", "Email sent" : "ই-মেইল পাঠানো হয়েছে", "Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে", + "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "All" : "সবাই", "Error while disabling app" : "অ্যাপ অকার্যকর করতে সমস্যা দেখা দিয়েছে ", "Disable" : "নিষ্ক্রিয়", diff --git a/settings/l10n/bn_BD.json b/settings/l10n/bn_BD.json index daa17c9fa9..bb06c3f2fa 100644 --- a/settings/l10n/bn_BD.json +++ b/settings/l10n/bn_BD.json @@ -1,11 +1,10 @@ { "translations": { "Sharing" : "ভাগাভাগিরত", "External Storage" : "বাহ্যিক সংরক্ষণাগার", - "Authentication error" : "অনুমোদন ঘটিত সমস্যা", - "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "Couldn't remove app." : "অ্যাপ অপসারণ করা গেলনা", "Language changed" : "ভাষা পরিবর্তন করা হয়েছে", "Invalid request" : "অনুরোধটি সঠিক নয়", + "Authentication error" : "অনুমোদন ঘটিত সমস্যা", "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", @@ -17,6 +16,7 @@ "test email settings" : "ইমেইল নিয়ামকসমূহ পরীক্ষা করুন", "Email sent" : "ই-মেইল পাঠানো হয়েছে", "Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে", + "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "All" : "সবাই", "Error while disabling app" : "অ্যাপ অকার্যকর করতে সমস্যা দেখা দিয়েছে ", "Disable" : "নিষ্ক্রিয়", diff --git a/settings/l10n/bs.js b/settings/l10n/bs.js index feafcfe966..7dad6db687 100644 --- a/settings/l10n/bs.js +++ b/settings/l10n/bs.js @@ -5,12 +5,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "Ažuriranja", - "Authentication error" : "Grešna autentifikacije", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti", "Couldn't remove app." : "Nije moguće ukloniti aplikaciju.", "Language changed" : "Jezik je promijenjen", "Invalid request" : "Neispravan zahtjev", + "Authentication error" : "Grešna autentifikacije", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -37,6 +35,8 @@ OC.L10N.register( "Invalid user" : "Nevažeči korisnik", "Unable to change mail address" : "Nemoguće je izmjeniti adresu e-pošte", "Email saved" : "E-pošta je spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li zaista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodaj pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/bs.json b/settings/l10n/bs.json index ece2026bc2..5cae766198 100644 --- a/settings/l10n/bs.json +++ b/settings/l10n/bs.json @@ -3,12 +3,10 @@ "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "Ažuriranja", - "Authentication error" : "Grešna autentifikacije", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti", "Couldn't remove app." : "Nije moguće ukloniti aplikaciju.", "Language changed" : "Jezik je promijenjen", "Invalid request" : "Neispravan zahtjev", + "Authentication error" : "Grešna autentifikacije", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -35,6 +33,8 @@ "Invalid user" : "Nevažeči korisnik", "Unable to change mail address" : "Nemoguće je izmjeniti adresu e-pošte", "Email saved" : "E-pošta je spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li zaista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodaj pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js index 1725d278b4..b3ea1aa7cf 100644 --- a/settings/l10n/ca.js +++ b/settings/l10n/ca.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registre", "Tips & tricks" : "Consells i trucs", "Updates" : "Actualitzacions", - "Authentication error" : "Error d'autenticació", - "Your full name has been changed." : "El vostre nom complet ha canviat.", - "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", "Language changed" : "S'ha canviat l'idioma", "Invalid request" : "Sol·licitud no vàlida", + "Authentication error" : "Error d'autenticació", "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", @@ -50,6 +48,8 @@ OC.L10N.register( "Invalid user" : "Usuari no vàlid", "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", + "Your full name has been changed." : "El vostre nom complet ha canviat.", + "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Esteu seguir que voleu afegir \"{domain}\" com a un domini de confiança?", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json index 39f569a4a1..3cb8c962c3 100644 --- a/settings/l10n/ca.json +++ b/settings/l10n/ca.json @@ -10,12 +10,10 @@ "Log" : "Registre", "Tips & tricks" : "Consells i trucs", "Updates" : "Actualitzacions", - "Authentication error" : "Error d'autenticació", - "Your full name has been changed." : "El vostre nom complet ha canviat.", - "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", "Language changed" : "S'ha canviat l'idioma", "Invalid request" : "Sol·licitud no vàlida", + "Authentication error" : "Error d'autenticació", "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", @@ -48,6 +46,8 @@ "Invalid user" : "Usuari no vàlid", "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", + "Your full name has been changed." : "El vostre nom complet ha canviat.", + "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Esteu seguir que voleu afegir \"{domain}\" com a un domini de confiança?", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 3e5d3867c6..84939c5ca5 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizace", - "Authentication error" : "Chyba přihlášení", - "Your full name has been changed." : "Vaše celé jméno bylo změněno.", - "Unable to change full name" : "Nelze změnit celé jméno", "Couldn't remove app." : "Nepodařilo se odebrat aplikaci.", "Language changed" : "Jazyk byl změněn", "Invalid request" : "Neplatný požadavek", + "Authentication error" : "Chyba přihlášení", "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Neplatný uživatel", "Unable to change mail address" : "Nelze změnit emailovou adresu", "Email saved" : "Email uložen", + "Your full name has been changed." : "Vaše celé jméno bylo změněno.", + "Unable to change full name" : "Nelze změnit celé jméno", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jste si jisti, že chcete přidat \"{domain}\" mezi důvěryhodné domény?", "Add trusted domain" : "Přidat důvěryhodnou doménu", "Migration in progress. Please wait until the migration is finished" : "Migrace probíhá. Počkejte prosím než bude dokončena", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Velmi doporučujeme nainstalovat požadované balíčky do systému, pro podporu jednoho z následujících národních prostředí: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Instalace mimo kořenový adresář domény a používání systémového příkazu cron může způsobit problém s generováním správné URL. Pro zabránění těmto chybám nastavte prosím správnou cestu ve svém config.php souboru v hodnotě \"overwrite.cli.url\" (Je doporučena tato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transakční uzamykání souborů používá databázi jako uzamykací mechanismus, pro co nejlepší výkon nakonfigurujte uzamykání pomocí memcache. Více informací najdete v dokumentaci ↗.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Ověřte znovu prosím informace z instalační příručky ↗ a zkontrolujte log na výskyt chyb a varování.", "All checks passed." : "Všechny testy byly úspěšné.", "Open documentation" : "Otevřít dokumentaci", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 42771f82ba..c5c95cfc11 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -10,12 +10,10 @@ "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizace", - "Authentication error" : "Chyba přihlášení", - "Your full name has been changed." : "Vaše celé jméno bylo změněno.", - "Unable to change full name" : "Nelze změnit celé jméno", "Couldn't remove app." : "Nepodařilo se odebrat aplikaci.", "Language changed" : "Jazyk byl změněn", "Invalid request" : "Neplatný požadavek", + "Authentication error" : "Chyba přihlášení", "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", @@ -51,6 +49,8 @@ "Invalid user" : "Neplatný uživatel", "Unable to change mail address" : "Nelze změnit emailovou adresu", "Email saved" : "Email uložen", + "Your full name has been changed." : "Vaše celé jméno bylo změněno.", + "Unable to change full name" : "Nelze změnit celé jméno", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jste si jisti, že chcete přidat \"{domain}\" mezi důvěryhodné domény?", "Add trusted domain" : "Přidat důvěryhodnou doménu", "Migration in progress. Please wait until the migration is finished" : "Migrace probíhá. Počkejte prosím než bude dokončena", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Velmi doporučujeme nainstalovat požadované balíčky do systému, pro podporu jednoho z následujících národních prostředí: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Instalace mimo kořenový adresář domény a používání systémového příkazu cron může způsobit problém s generováním správné URL. Pro zabránění těmto chybám nastavte prosím správnou cestu ve svém config.php souboru v hodnotě \"overwrite.cli.url\" (Je doporučena tato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transakční uzamykání souborů používá databázi jako uzamykací mechanismus, pro co nejlepší výkon nakonfigurujte uzamykání pomocí memcache. Více informací najdete v dokumentaci ↗.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Ověřte znovu prosím informace z instalační příručky ↗ a zkontrolujte log na výskyt chyb a varování.", "All checks passed." : "Všechny testy byly úspěšné.", "Open documentation" : "Otevřít dokumentaci", diff --git a/settings/l10n/cy_GB.js b/settings/l10n/cy_GB.js index 590745e735..74cb40cf89 100644 --- a/settings/l10n/cy_GB.js +++ b/settings/l10n/cy_GB.js @@ -1,8 +1,8 @@ OC.L10N.register( "settings", { - "Authentication error" : "Gwall dilysu", "Invalid request" : "Cais annilys", + "Authentication error" : "Gwall dilysu", "Email sent" : "Anfonwyd yr e-bost", "Delete" : "Dileu", "Groups" : "Grwpiau", diff --git a/settings/l10n/cy_GB.json b/settings/l10n/cy_GB.json index 41535c5c9c..537395458b 100644 --- a/settings/l10n/cy_GB.json +++ b/settings/l10n/cy_GB.json @@ -1,6 +1,6 @@ { "translations": { - "Authentication error" : "Gwall dilysu", "Invalid request" : "Cais annilys", + "Authentication error" : "Gwall dilysu", "Email sent" : "Anfonwyd yr e-bost", "Delete" : "Dileu", "Groups" : "Grwpiau", diff --git a/settings/l10n/da.js b/settings/l10n/da.js index b69c9d248d..4fef120f1b 100644 --- a/settings/l10n/da.js +++ b/settings/l10n/da.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Opdateringer", - "Authentication error" : "Adgangsfejl", - "Your full name has been changed." : "Dit fulde navn er blevet ændret.", - "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Couldn't remove app." : "Kunne ikke fjerne app'en.", "Language changed" : "Sprog ændret", "Invalid request" : "Ugyldig forespørgsel", + "Authentication error" : "Adgangsfejl", "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Ugyldig bruger", "Unable to change mail address" : "Kan ikke ændre mailadresse", "Email saved" : "E-mailadressen er gemt", + "Your full name has been changed." : "Dit fulde navn er blevet ændret.", + "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sikker på at du vil tilføje \"{domain}\" som et domæne du har tiilid til?", "Add trusted domain" : "Tilføj et domæne som du har tillid til", "Migration in progress. Please wait until the migration is finished" : "Immigration er i gang. Vent venligst indtil overflytningen er afsluttet", @@ -132,7 +132,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler kraftigt, at du installerer den krævede pakke på dit system, for at understøtte følgende lokaliteter: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis din installation ikke er installeret i roden af domænet, og bruger systemets cron, så kan der være problemer med URL-oprettelsen. For at undgå disse problemer, så angiv tilvalget \"overwrite.cli.url\" i din fil config.php til webrodens sti for din installation (foreslået værdi: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transaktions låsning af filer bliver brugt af databasen som lås til backend, for den bedste ydelse tilrådes det at konfigurere memcache. Se documentation ↗ for mere information", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Dobbelttjek venligst , og tjek om der er fejl eller advarsler i loggen.", "All checks passed." : "Alle tjek blev bestået.", "Open documentation" : "Åben dokumentation", diff --git a/settings/l10n/da.json b/settings/l10n/da.json index 1519317def..d535bdb38a 100644 --- a/settings/l10n/da.json +++ b/settings/l10n/da.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Opdateringer", - "Authentication error" : "Adgangsfejl", - "Your full name has been changed." : "Dit fulde navn er blevet ændret.", - "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Couldn't remove app." : "Kunne ikke fjerne app'en.", "Language changed" : "Sprog ændret", "Invalid request" : "Ugyldig forespørgsel", + "Authentication error" : "Adgangsfejl", "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", @@ -51,6 +49,8 @@ "Invalid user" : "Ugyldig bruger", "Unable to change mail address" : "Kan ikke ændre mailadresse", "Email saved" : "E-mailadressen er gemt", + "Your full name has been changed." : "Dit fulde navn er blevet ændret.", + "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sikker på at du vil tilføje \"{domain}\" som et domæne du har tiilid til?", "Add trusted domain" : "Tilføj et domæne som du har tillid til", "Migration in progress. Please wait until the migration is finished" : "Immigration er i gang. Vent venligst indtil overflytningen er afsluttet", @@ -130,7 +130,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler kraftigt, at du installerer den krævede pakke på dit system, for at understøtte følgende lokaliteter: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis din installation ikke er installeret i roden af domænet, og bruger systemets cron, så kan der være problemer med URL-oprettelsen. For at undgå disse problemer, så angiv tilvalget \"overwrite.cli.url\" i din fil config.php til webrodens sti for din installation (foreslået værdi: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transaktions låsning af filer bliver brugt af databasen som lås til backend, for den bedste ydelse tilrådes det at konfigurere memcache. Se documentation ↗ for mere information", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Dobbelttjek venligst , og tjek om der er fejl eller advarsler i loggen.", "All checks passed." : "Alle tjek blev bestået.", "Open documentation" : "Åben dokumentation", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index acb9dca3df..1c7212d2ec 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Καταγραφές", "Tips & tricks" : "Συμβουλές & τεχνάσματα", "Updates" : "Ενημερώσεις", - "Authentication error" : "Σφάλμα πιστοποίησης", - "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", - "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", "Language changed" : "Η γλώσσα άλλαξε", "Invalid request" : "Μη έγκυρο αίτημα", + "Authentication error" : "Σφάλμα πιστοποίησης", "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Μη έγκυρος χρήστης", "Unable to change mail address" : "Αδυναμία αλλαγής διεύθυνσης αλληλογραφίας", "Email saved" : "Το email αποθηκεύτηκε ", + "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", + "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Είστε πραγματικά σίγουροι ότι θέλετε να προσθέσετε το \"{domain}\" σαν αξιόπιστη περιοχή;", "Add trusted domain" : "Προσθέστε αξιόπιστη περιοχή", "Migration in progress. Please wait until the migration is finished" : "Μετάβαση σε εξέλιξη. Παρακαλούμε περιμένετε μέχρι να ολοκληρωθεί η μετάβαση", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Προτείνουμε ανεπιφύλακτα να εγκαταστήσετε στο σύστημά σας τα απαιτούμενα πακέτα έτσι ώστε να υποστηρίζεται μια από τις ακόλουθες ρυθμίσεις τοποθεσίας: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Το Transactional file locking χρησιμοποιεί τη βάση δεδομένων ως locking backend, για καλύτερες επιδόσεις συστήνουμς τη διαμόρφωση μιας memcache για το κλείδωμα. Δείτε την τεκμηρίωση ↗ για περισσότερες πληροφορίες.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Παρακαλώ ελέγξτε ξανά τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο log.", "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", "Open documentation" : "Ανοιχτή τεκμηρίωση.", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index 42d6dd01ce..e4d0876661 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -10,12 +10,10 @@ "Log" : "Καταγραφές", "Tips & tricks" : "Συμβουλές & τεχνάσματα", "Updates" : "Ενημερώσεις", - "Authentication error" : "Σφάλμα πιστοποίησης", - "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", - "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", "Language changed" : "Η γλώσσα άλλαξε", "Invalid request" : "Μη έγκυρο αίτημα", + "Authentication error" : "Σφάλμα πιστοποίησης", "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", @@ -51,6 +49,8 @@ "Invalid user" : "Μη έγκυρος χρήστης", "Unable to change mail address" : "Αδυναμία αλλαγής διεύθυνσης αλληλογραφίας", "Email saved" : "Το email αποθηκεύτηκε ", + "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", + "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Είστε πραγματικά σίγουροι ότι θέλετε να προσθέσετε το \"{domain}\" σαν αξιόπιστη περιοχή;", "Add trusted domain" : "Προσθέστε αξιόπιστη περιοχή", "Migration in progress. Please wait until the migration is finished" : "Μετάβαση σε εξέλιξη. Παρακαλούμε περιμένετε μέχρι να ολοκληρωθεί η μετάβαση", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Προτείνουμε ανεπιφύλακτα να εγκαταστήσετε στο σύστημά σας τα απαιτούμενα πακέτα έτσι ώστε να υποστηρίζεται μια από τις ακόλουθες ρυθμίσεις τοποθεσίας: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Το Transactional file locking χρησιμοποιεί τη βάση δεδομένων ως locking backend, για καλύτερες επιδόσεις συστήνουμς τη διαμόρφωση μιας memcache για το κλείδωμα. Δείτε την τεκμηρίωση ↗ για περισσότερες πληροφορίες.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Παρακαλώ ελέγξτε ξανά τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο log.", "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", "Open documentation" : "Ανοιχτή τεκμηρίωση.", diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js index 5a4a1a3c99..d79cc98dc0 100644 --- a/settings/l10n/en_GB.js +++ b/settings/l10n/en_GB.js @@ -10,12 +10,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Updates", - "Authentication error" : "Authentication error", - "Your full name has been changed." : "Your full name has been changed.", - "Unable to change full name" : "Unable to change full name", "Couldn't remove app." : "Couldn't remove app.", "Language changed" : "Language changed", "Invalid request" : "Invalid request", + "Authentication error" : "Authentication error", "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", "Unable to add user to group %s" : "Unable to add user to group %s", "Unable to remove user from group %s" : "Unable to remove user from group %s", @@ -49,6 +47,8 @@ OC.L10N.register( "Invalid user" : "Invalid user", "Unable to change mail address" : "Unable to change mail address", "Email saved" : "Email saved", + "Your full name has been changed." : "Your full name has been changed.", + "Unable to change full name" : "Unable to change full name", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Are you really sure you want add \"{domain}\" as a trusted domain?", "Add trusted domain" : "Add trusted domain", "Migration in progress. Please wait until the migration is finished" : "Migration in progress. Please wait until the migration is finished", diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json index 4f1e2efc45..dcfbf01467 100644 --- a/settings/l10n/en_GB.json +++ b/settings/l10n/en_GB.json @@ -8,12 +8,10 @@ "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Updates", - "Authentication error" : "Authentication error", - "Your full name has been changed." : "Your full name has been changed.", - "Unable to change full name" : "Unable to change full name", "Couldn't remove app." : "Couldn't remove app.", "Language changed" : "Language changed", "Invalid request" : "Invalid request", + "Authentication error" : "Authentication error", "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", "Unable to add user to group %s" : "Unable to add user to group %s", "Unable to remove user from group %s" : "Unable to remove user from group %s", @@ -47,6 +45,8 @@ "Invalid user" : "Invalid user", "Unable to change mail address" : "Unable to change mail address", "Email saved" : "Email saved", + "Your full name has been changed." : "Your full name has been changed.", + "Unable to change full name" : "Unable to change full name", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Are you really sure you want add \"{domain}\" as a trusted domain?", "Add trusted domain" : "Add trusted domain", "Migration in progress. Please wait until the migration is finished" : "Migration in progress. Please wait until the migration is finished", diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js index ca4b5485d5..1f937b22aa 100644 --- a/settings/l10n/eo.js +++ b/settings/l10n/eo.js @@ -6,11 +6,9 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Protokolo", "Updates" : "Ĝisdatigoj", - "Authentication error" : "Aŭtentiga eraro", - "Your full name has been changed." : "Via plena nomo ŝanĝitas.", - "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Language changed" : "La lingvo estas ŝanĝita", "Invalid request" : "Nevalida peto", + "Authentication error" : "Aŭtentiga eraro", "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", @@ -21,6 +19,8 @@ OC.L10N.register( "Saved" : "Konservita", "Email sent" : "La retpoŝtaĵo sendiĝis", "Email saved" : "La retpoŝtadreso konserviĝis", + "Your full name has been changed." : "Via plena nomo ŝanĝitas.", + "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Sending..." : "Sendante...", "All" : "Ĉio", "Please wait...." : "Bonvolu atendi...", diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json index 3df0eda6e8..dad80fad16 100644 --- a/settings/l10n/eo.json +++ b/settings/l10n/eo.json @@ -4,11 +4,9 @@ "Cron" : "Cron", "Log" : "Protokolo", "Updates" : "Ĝisdatigoj", - "Authentication error" : "Aŭtentiga eraro", - "Your full name has been changed." : "Via plena nomo ŝanĝitas.", - "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Language changed" : "La lingvo estas ŝanĝita", "Invalid request" : "Nevalida peto", + "Authentication error" : "Aŭtentiga eraro", "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", @@ -19,6 +17,8 @@ "Saved" : "Konservita", "Email sent" : "La retpoŝtaĵo sendiĝis", "Email saved" : "La retpoŝtadreso konserviĝis", + "Your full name has been changed." : "Via plena nomo ŝanĝitas.", + "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Sending..." : "Sendante...", "All" : "Ĉio", "Please wait...." : "Bonvolu atendi...", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 36d9d9392e..27a87685f2 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registro", "Tips & tricks" : "Sugerencias y trucos", "Updates" : "Actualizaciones", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Couldn't remove app." : "No se pudo eliminar la aplicación.", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Usuario no válido", "Unable to change mail address" : "No se pudo cambiar la dirección de correo electrónico", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿Está seguro de querer agregar \"{domain}\" como un dominio de confianza?", "Add trusted domain" : "Agregar dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "Migración en curso. Por favor, espere hasta que la migración esté finalizada.", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Es muy recomendable instalar los paquetes necesarios para poder soportar una de las siguientes configuraciones regionales: %s. ", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si su instalación no está ubicada en la raíz del dominio y usa el cron del sistema, puede haber problemas al generarse los URL. Para evitarlos, configure la opción \"overwrite.cli.url\" en su archivo config.php para que use la ruta de la raíz del sitio web de su instalación (sugerencia: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No fue posible ejecutar cronjob vía CLI. Han aparecido los siguientes errores técnicos:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "El fichero de bloqueo de transaciones esta usando la base de datos como mecanismo de bloqueo, para mejorar el rendimiento es recomendable usar cacheo de memoria para los bloqueos. Visita la documentación ↗ para mas información.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor revise las guías de instalación ↗, y compruebe los errores o avisos en el registro.", "All checks passed." : "Ha pasado todos los controles", "Open documentation" : "Documentación abierta", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 87cf83a55f..1213c09962 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -10,12 +10,10 @@ "Log" : "Registro", "Tips & tricks" : "Sugerencias y trucos", "Updates" : "Actualizaciones", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Couldn't remove app." : "No se pudo eliminar la aplicación.", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Usuario no válido", "Unable to change mail address" : "No se pudo cambiar la dirección de correo electrónico", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿Está seguro de querer agregar \"{domain}\" como un dominio de confianza?", "Add trusted domain" : "Agregar dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "Migración en curso. Por favor, espere hasta que la migración esté finalizada.", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Es muy recomendable instalar los paquetes necesarios para poder soportar una de las siguientes configuraciones regionales: %s. ", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si su instalación no está ubicada en la raíz del dominio y usa el cron del sistema, puede haber problemas al generarse los URL. Para evitarlos, configure la opción \"overwrite.cli.url\" en su archivo config.php para que use la ruta de la raíz del sitio web de su instalación (sugerencia: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No fue posible ejecutar cronjob vía CLI. Han aparecido los siguientes errores técnicos:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "El fichero de bloqueo de transaciones esta usando la base de datos como mecanismo de bloqueo, para mejorar el rendimiento es recomendable usar cacheo de memoria para los bloqueos. Visita la documentación ↗ para mas información.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor revise las guías de instalación ↗, y compruebe los errores o avisos en el registro.", "All checks passed." : "Ha pasado todos los controles", "Open documentation" : "Documentación abierta", diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js index 0a83ff50f1..1b3a2ffff5 100644 --- a/settings/l10n/es_MX.js +++ b/settings/l10n/es_MX.js @@ -5,11 +5,9 @@ OC.L10N.register( "External Storage" : "Almacenamiento externo", "Cron" : "Cron", "Log" : "Registro", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -23,6 +21,8 @@ OC.L10N.register( "Saved" : "Guardado", "Email sent" : "Correo electrónico enviado", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "All" : "Todos", "Please wait...." : "Espere, por favor....", "Error while disabling app" : "Error mientras se desactivaba la aplicación", diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json index a83dfef804..d7a6527f4f 100644 --- a/settings/l10n/es_MX.json +++ b/settings/l10n/es_MX.json @@ -3,11 +3,9 @@ "External Storage" : "Almacenamiento externo", "Cron" : "Cron", "Log" : "Registro", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -21,6 +19,8 @@ "Saved" : "Guardado", "Email sent" : "Correo electrónico enviado", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "All" : "Todos", "Please wait...." : "Espere, por favor....", "Error while disabling app" : "Error mientras se desactivaba la aplicación", diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js index e783531d6c..a9e616b0d8 100644 --- a/settings/l10n/et_EE.js +++ b/settings/l10n/et_EE.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Logi", "Tips & tricks" : "Nõuanded ja trikid", "Updates" : "Uuendused", - "Authentication error" : "Autentimise viga", - "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", - "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Couldn't remove app." : "Ei suutnud rakendit eemaldada.", "Language changed" : "Keel on muudetud", "Invalid request" : "Vigane päring", + "Authentication error" : "Autentimise viga", "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", @@ -46,6 +44,8 @@ OC.L10N.register( "Invalid user" : "Vigane kasutaja", "Unable to change mail address" : "E-posti aadressi muutmine ebaõnnestus", "Email saved" : "Kiri on salvestatud", + "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", + "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Oled sa kindel, et soovid lisada domeeni \"{domain}\" usaldusväärseks domeeniks?", "Add trusted domain" : "Lis ausaldusväärne domeen", "Migration started …" : "Kolimist on alustatud ...", diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json index 95416aad77..019fc76558 100644 --- a/settings/l10n/et_EE.json +++ b/settings/l10n/et_EE.json @@ -10,12 +10,10 @@ "Log" : "Logi", "Tips & tricks" : "Nõuanded ja trikid", "Updates" : "Uuendused", - "Authentication error" : "Autentimise viga", - "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", - "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Couldn't remove app." : "Ei suutnud rakendit eemaldada.", "Language changed" : "Keel on muudetud", "Invalid request" : "Vigane päring", + "Authentication error" : "Autentimise viga", "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", @@ -44,6 +42,8 @@ "Invalid user" : "Vigane kasutaja", "Unable to change mail address" : "E-posti aadressi muutmine ebaõnnestus", "Email saved" : "Kiri on salvestatud", + "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", + "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Oled sa kindel, et soovid lisada domeeni \"{domain}\" usaldusväärseks domeeniks?", "Add trusted domain" : "Lis ausaldusväärne domeen", "Migration started …" : "Kolimist on alustatud ...", diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js index 486cdc7481..f22c7d6e65 100644 --- a/settings/l10n/eu.js +++ b/settings/l10n/eu.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Log", "Updates" : "Eguneraketak", - "Authentication error" : "Autentifikazio errorea", - "Your full name has been changed." : "Zure izena aldatu egin da.", - "Unable to change full name" : "Ezin izan da izena aldatu", "Couldn't remove app." : "Ezin izan da aplikazioa ezabatu..", "Language changed" : "Hizkuntza aldatuta", "Invalid request" : "Baliogabeko eskaera", + "Authentication error" : "Autentifikazio errorea", "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", @@ -40,6 +38,8 @@ OC.L10N.register( "Invalid user" : "Baliogabeko erabiiltzailea", "Unable to change mail address" : "Ezin izan da posta helbidea aldatu", "Email saved" : "Eposta gorde da", + "Your full name has been changed." : "Zure izena aldatu egin da.", + "Unable to change full name" : "Ezin izan da izena aldatu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ziur zaude gehitu nahi duzula \"{domain}\" domeinu fidagarri gisa?", "Add trusted domain" : "Gehitu domeinu fidagarria", "Sending..." : "Bidaltzen...", diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json index 218241db95..f3387446a8 100644 --- a/settings/l10n/eu.json +++ b/settings/l10n/eu.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Log", "Updates" : "Eguneraketak", - "Authentication error" : "Autentifikazio errorea", - "Your full name has been changed." : "Zure izena aldatu egin da.", - "Unable to change full name" : "Ezin izan da izena aldatu", "Couldn't remove app." : "Ezin izan da aplikazioa ezabatu..", "Language changed" : "Hizkuntza aldatuta", "Invalid request" : "Baliogabeko eskaera", + "Authentication error" : "Autentifikazio errorea", "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", @@ -38,6 +36,8 @@ "Invalid user" : "Baliogabeko erabiiltzailea", "Unable to change mail address" : "Ezin izan da posta helbidea aldatu", "Email saved" : "Eposta gorde da", + "Your full name has been changed." : "Zure izena aldatu egin da.", + "Unable to change full name" : "Ezin izan da izena aldatu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ziur zaude gehitu nahi duzula \"{domain}\" domeinu fidagarri gisa?", "Add trusted domain" : "Gehitu domeinu fidagarria", "Sending..." : "Bidaltzen...", diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js index 299505e156..4ab82f8551 100644 --- a/settings/l10n/fa.js +++ b/settings/l10n/fa.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "کارنامه", "Tips & tricks" : "نکات و راهنمایی‌ها", "Updates" : "به روز رسانی ها", - "Authentication error" : "خطا در اعتبار سنجی", - "Your full name has been changed." : "نام کامل شما تغییر یافت", - "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Couldn't remove app." : "امکان حذف برنامه وجود ندارد.", "Language changed" : "زبان تغییر کرد", "Invalid request" : "درخواست نامعتبر", + "Authentication error" : "خطا در اعتبار سنجی", "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", @@ -44,6 +42,8 @@ OC.L10N.register( "Invalid user" : "کاربر نامعتبر", "Unable to change mail address" : "تغییر آدرس ایمیل امکان‌پذیر نیست", "Email saved" : "ایمیل ذخیره شد", + "Your full name has been changed." : "نام کامل شما تغییر یافت", + "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Add trusted domain" : "افزودن دامنه مورد اعتماد", "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", "Migration started …" : "مهاجرت شروع شد...", diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json index e07f0633e9..208bff2105 100644 --- a/settings/l10n/fa.json +++ b/settings/l10n/fa.json @@ -10,12 +10,10 @@ "Log" : "کارنامه", "Tips & tricks" : "نکات و راهنمایی‌ها", "Updates" : "به روز رسانی ها", - "Authentication error" : "خطا در اعتبار سنجی", - "Your full name has been changed." : "نام کامل شما تغییر یافت", - "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Couldn't remove app." : "امکان حذف برنامه وجود ندارد.", "Language changed" : "زبان تغییر کرد", "Invalid request" : "درخواست نامعتبر", + "Authentication error" : "خطا در اعتبار سنجی", "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", @@ -42,6 +40,8 @@ "Invalid user" : "کاربر نامعتبر", "Unable to change mail address" : "تغییر آدرس ایمیل امکان‌پذیر نیست", "Email saved" : "ایمیل ذخیره شد", + "Your full name has been changed." : "نام کامل شما تغییر یافت", + "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Add trusted domain" : "افزودن دامنه مورد اعتماد", "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", "Migration started …" : "مهاجرت شروع شد...", diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js index 9d0ca9371b..7f4889bb48 100644 --- a/settings/l10n/fi_FI.js +++ b/settings/l10n/fi_FI.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Loki", "Tips & tricks" : "Vinkit", "Updates" : "Päivitykset", - "Authentication error" : "Tunnistautumisvirhe", - "Your full name has been changed." : "Koko nimesi on muutettu.", - "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Couldn't remove app." : "Sovelluksen poistaminen epäonnistui.", "Language changed" : "Kieli on vaihdettu", "Invalid request" : "Virheellinen pyyntö", + "Authentication error" : "Tunnistautumisvirhe", "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", @@ -52,6 +50,8 @@ OC.L10N.register( "Invalid user" : "Virheellinen käyttäjä", "Unable to change mail address" : "Sähköpostiosoitteen vaihtaminen ei onnistunut", "Email saved" : "Sähköposti tallennettu", + "Your full name has been changed." : "Koko nimesi on muutettu.", + "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Haluatko varmasti liittää kohteen \"{domain}\" luotetuksi toimialueeksi?", "Add trusted domain" : "Lisää luotettu toimialue", "Migration in progress. Please wait until the migration is finished" : "Migraatio on kesken. Odota kunnes migraatio valmistuu", diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json index a517c3d2f1..e64246df9f 100644 --- a/settings/l10n/fi_FI.json +++ b/settings/l10n/fi_FI.json @@ -10,12 +10,10 @@ "Log" : "Loki", "Tips & tricks" : "Vinkit", "Updates" : "Päivitykset", - "Authentication error" : "Tunnistautumisvirhe", - "Your full name has been changed." : "Koko nimesi on muutettu.", - "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Couldn't remove app." : "Sovelluksen poistaminen epäonnistui.", "Language changed" : "Kieli on vaihdettu", "Invalid request" : "Virheellinen pyyntö", + "Authentication error" : "Tunnistautumisvirhe", "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", @@ -50,6 +48,8 @@ "Invalid user" : "Virheellinen käyttäjä", "Unable to change mail address" : "Sähköpostiosoitteen vaihtaminen ei onnistunut", "Email saved" : "Sähköposti tallennettu", + "Your full name has been changed." : "Koko nimesi on muutettu.", + "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Haluatko varmasti liittää kohteen \"{domain}\" luotetuksi toimialueeksi?", "Add trusted domain" : "Lisää luotettu toimialue", "Migration in progress. Please wait until the migration is finished" : "Migraatio on kesken. Odota kunnes migraatio valmistuu", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 805b5c05d5..f3ccc491cd 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données. Pour obtenir de meilleures performances il est recommandé d'utiliser plutôt memcache. Consultez la documentation ↗ pour plus d'informations.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultez les guides d'installation ↗, et cherchez des erreurs ou avertissements dans les logs.", "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 61c3129a8c..fa859c6e43 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données. Pour obtenir de meilleures performances il est recommandé d'utiliser plutôt memcache. Consultez la documentation ↗ pour plus d'informations.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultez les guides d'installation ↗, et cherchez des erreurs ou avertissements dans les logs.", "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js index 633e877bd5..ecb31a6a7a 100644 --- a/settings/l10n/gl.js +++ b/settings/l10n/gl.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Rexistro", "Tips & tricks" : "Trucos e consellos", "Updates" : "Actualizacións", - "Authentication error" : "Produciuse un erro de autenticación", - "Your full name has been changed." : "O seu nome completo foi cambiado", - "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Couldn't remove app." : "Non foi posíbel retirar a aplicación.", "Language changed" : "O idioma cambiou", "Invalid request" : "Petición incorrecta", + "Authentication error" : "Produciuse un erro de autenticación", "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Usuario incorrecto", "Unable to change mail address" : "Non é posíbel cambiar o enderezo de correo.", "Email saved" : "Correo gardado", + "Your full name has been changed." : "O seu nome completo foi cambiado", + "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Confirma que quere engadir «{domain}» como dominio de confianza?", "Add trusted domain" : "Engadir dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "A migración está en proceso. Agarde a que remate.", diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json index e8f78c560f..06b0277fda 100644 --- a/settings/l10n/gl.json +++ b/settings/l10n/gl.json @@ -10,12 +10,10 @@ "Log" : "Rexistro", "Tips & tricks" : "Trucos e consellos", "Updates" : "Actualizacións", - "Authentication error" : "Produciuse un erro de autenticación", - "Your full name has been changed." : "O seu nome completo foi cambiado", - "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Couldn't remove app." : "Non foi posíbel retirar a aplicación.", "Language changed" : "O idioma cambiou", "Invalid request" : "Petición incorrecta", + "Authentication error" : "Produciuse un erro de autenticación", "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Usuario incorrecto", "Unable to change mail address" : "Non é posíbel cambiar o enderezo de correo.", "Email saved" : "Correo gardado", + "Your full name has been changed." : "O seu nome completo foi cambiado", + "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Confirma que quere engadir «{domain}» como dominio de confianza?", "Add trusted domain" : "Engadir dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "A migración está en proceso. Agarde a que remate.", diff --git a/settings/l10n/he.js b/settings/l10n/he.js index cfffdc8b96..9fd78e6b02 100644 --- a/settings/l10n/he.js +++ b/settings/l10n/he.js @@ -5,9 +5,9 @@ OC.L10N.register( "External Storage" : "אחסון חיצוני", "Cron" : "Cron", "Log" : "יומן", - "Authentication error" : "שגיאת הזדהות", "Language changed" : "שפה השתנתה", "Invalid request" : "בקשה לא חוקית", + "Authentication error" : "שגיאת הזדהות", "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", diff --git a/settings/l10n/he.json b/settings/l10n/he.json index b38203e3d0..0371190137 100644 --- a/settings/l10n/he.json +++ b/settings/l10n/he.json @@ -3,9 +3,9 @@ "External Storage" : "אחסון חיצוני", "Cron" : "Cron", "Log" : "יומן", - "Authentication error" : "שגיאת הזדהות", "Language changed" : "שפה השתנתה", "Invalid request" : "בקשה לא חוקית", + "Authentication error" : "שגיאת הזדהות", "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", diff --git a/settings/l10n/hr.js b/settings/l10n/hr.js index d9c1bb3f4f..3bfb3ef79a 100644 --- a/settings/l10n/hr.js +++ b/settings/l10n/hr.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "nadogradnje", - "Authentication error" : "Pogrešna autentikacija", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Couldn't remove app." : "Nije moguće ukloniti app.", "Language changed" : "Promjena jezika", "Invalid request" : "Zahtjev neispravan", + "Authentication error" : "Pogrešna autentikacija", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -27,6 +25,8 @@ OC.L10N.register( "Email sent" : "E-pošta je poslana", "You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu e-poštu trebate postaviti svoj korisnički email.", "Email saved" : "E-pošta spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li doista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodajte pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/hr.json b/settings/l10n/hr.json index 8867813b96..8a7f427ad9 100644 --- a/settings/l10n/hr.json +++ b/settings/l10n/hr.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "nadogradnje", - "Authentication error" : "Pogrešna autentikacija", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Couldn't remove app." : "Nije moguće ukloniti app.", "Language changed" : "Promjena jezika", "Invalid request" : "Zahtjev neispravan", + "Authentication error" : "Pogrešna autentikacija", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -25,6 +23,8 @@ "Email sent" : "E-pošta je poslana", "You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu e-poštu trebate postaviti svoj korisnički email.", "Email saved" : "E-pošta spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li doista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodajte pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index 399129eda4..6f5900ed91 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Naplózás", "Tips & tricks" : "Tippek és trükkök", "Updates" : "Frissítések", - "Authentication error" : "Azonosítási hiba", - "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", - "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Couldn't remove app." : "Az alkalmazást nem sikerült eltávolítani.", "Language changed" : "A nyelv megváltozott", "Invalid request" : "Érvénytelen kérés", + "Authentication error" : "Azonosítási hiba", "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Érvénytelen felhasználó", "Unable to change mail address" : "Nem lehet megváltoztatni az e-mail címet", "Email saved" : "E-mail elmentve!", + "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", + "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Biztos abban, hogy hozzá akarja adni \"{domain}\"-t a megbízható tartományokhoz?", "Add trusted domain" : "Megbízható tartomány hozzáadása", "Migration in progress. Please wait until the migration is finished" : "Migráció folyamatban. Kérjük várj, míg a migráció befejeződik.", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index fe9f17f14a..7c6a79c3da 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -10,12 +10,10 @@ "Log" : "Naplózás", "Tips & tricks" : "Tippek és trükkök", "Updates" : "Frissítések", - "Authentication error" : "Azonosítási hiba", - "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", - "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Couldn't remove app." : "Az alkalmazást nem sikerült eltávolítani.", "Language changed" : "A nyelv megváltozott", "Invalid request" : "Érvénytelen kérés", + "Authentication error" : "Azonosítási hiba", "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", @@ -49,6 +47,8 @@ "Invalid user" : "Érvénytelen felhasználó", "Unable to change mail address" : "Nem lehet megváltoztatni az e-mail címet", "Email saved" : "E-mail elmentve!", + "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", + "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Biztos abban, hogy hozzá akarja adni \"{domain}\"-t a megbízható tartományokhoz?", "Add trusted domain" : "Megbízható tartomány hozzáadása", "Migration in progress. Please wait until the migration is finished" : "Migráció folyamatban. Kérjük várj, míg a migráció befejeződik.", diff --git a/settings/l10n/id.js b/settings/l10n/id.js index e5efe797e6..5b4f9f5c6b 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Tips & trik", "Updates" : "Pembaruan", - "Authentication error" : "Terjadi kesalahan saat otentikasi", - "Your full name has been changed." : "Nama lengkap Anda telah diubah", - "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Couldn't remove app." : "Tidak dapat menghapus aplikasi.", "Language changed" : "Bahasa telah diubah", "Invalid request" : "Permintaan tidak valid", + "Authentication error" : "Terjadi kesalahan saat otentikasi", "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Pengguna salah", "Unable to change mail address" : "Tidak dapat mengubah alamat email", "Email saved" : "Email disimpan", + "Your full name has been changed." : "Nama lengkap Anda telah diubah", + "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Apakah Anda yakin ingin menambahkan \"{domain}\" sebagai domain terpercaya?", "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Kamu sangat menyarankan untuk menginstal paket-paket yang dibutuhkan pada sistem agar mendukung lokal berikut: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Jika instalasi Anda tidak di root domain dan menggunakan sistem cron, hal tersebut dapat menyebabkan masalah dengan pembuatan URL. Untuk mencegah masalah tersebut, mohon atur opsi \"overwrite.cli.url\" pada berkas config.php Anda ke jalur lokasi webroot instalasi Anda (Disarankan: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Tidak mungkin untuk mengeksekusi cronjob via CLI. Kesalahan teknis berikut muncul:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transaksi penguncian berkas menggunakan basis data sebagai backend penguncian, untuk mendapatkan kinerja terbaik, disarankan mengkonfigurasi memcache sebagai penguncian. Baca dokumentasi ↗ untuk informasi lebih lanjut.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Mohon periksa dua kali panduan instalasi ↗, dan periksa segala kesalahan atau peringatan pada log.", "All checks passed." : "Semua pemeriksaan lulus.", "Open documentation" : "Buka dokumentasi", diff --git a/settings/l10n/id.json b/settings/l10n/id.json index 8a30d825bc..b6d1f9f750 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Tips & trik", "Updates" : "Pembaruan", - "Authentication error" : "Terjadi kesalahan saat otentikasi", - "Your full name has been changed." : "Nama lengkap Anda telah diubah", - "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Couldn't remove app." : "Tidak dapat menghapus aplikasi.", "Language changed" : "Bahasa telah diubah", "Invalid request" : "Permintaan tidak valid", + "Authentication error" : "Terjadi kesalahan saat otentikasi", "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", @@ -51,6 +49,8 @@ "Invalid user" : "Pengguna salah", "Unable to change mail address" : "Tidak dapat mengubah alamat email", "Email saved" : "Email disimpan", + "Your full name has been changed." : "Nama lengkap Anda telah diubah", + "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Apakah Anda yakin ingin menambahkan \"{domain}\" sebagai domain terpercaya?", "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Kamu sangat menyarankan untuk menginstal paket-paket yang dibutuhkan pada sistem agar mendukung lokal berikut: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Jika instalasi Anda tidak di root domain dan menggunakan sistem cron, hal tersebut dapat menyebabkan masalah dengan pembuatan URL. Untuk mencegah masalah tersebut, mohon atur opsi \"overwrite.cli.url\" pada berkas config.php Anda ke jalur lokasi webroot instalasi Anda (Disarankan: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Tidak mungkin untuk mengeksekusi cronjob via CLI. Kesalahan teknis berikut muncul:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transaksi penguncian berkas menggunakan basis data sebagai backend penguncian, untuk mendapatkan kinerja terbaik, disarankan mengkonfigurasi memcache sebagai penguncian. Baca dokumentasi ↗ untuk informasi lebih lanjut.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Mohon periksa dua kali panduan instalasi ↗, dan periksa segala kesalahan atau peringatan pada log.", "All checks passed." : "Semua pemeriksaan lulus.", "Open documentation" : "Buka dokumentasi", diff --git a/settings/l10n/is.js b/settings/l10n/is.js index 994011a098..ffde7f98b5 100644 --- a/settings/l10n/is.js +++ b/settings/l10n/is.js @@ -2,9 +2,9 @@ OC.L10N.register( "settings", { "External Storage" : "Ytri gagnageymsla", - "Authentication error" : "Villa við auðkenningu", "Language changed" : "Tungumáli breytt", "Invalid request" : "Ógild fyrirspurn", + "Authentication error" : "Villa við auðkenningu", "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", "Unable to add user to group %s" : "Ekki tókst að bæta notenda við hópinn %s", "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", diff --git a/settings/l10n/is.json b/settings/l10n/is.json index 5e2507a549..15d7cbb4a9 100644 --- a/settings/l10n/is.json +++ b/settings/l10n/is.json @@ -1,8 +1,8 @@ { "translations": { "External Storage" : "Ytri gagnageymsla", - "Authentication error" : "Villa við auðkenningu", "Language changed" : "Tungumáli breytt", "Invalid request" : "Ógild fyrirspurn", + "Authentication error" : "Villa við auðkenningu", "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", "Unable to add user to group %s" : "Ekki tókst að bæta notenda við hópinn %s", "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 4d73fe6100..b2881fea3a 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Suggerimenti e trucchi", "Updates" : "Aggiornamenti", - "Authentication error" : "Errore di autenticazione", - "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", - "Unable to change full name" : "Impossibile cambiare il nome completo", "Couldn't remove app." : "Impossibile rimuovere l'applicazione.", "Language changed" : "Lingua modificata", "Invalid request" : "Richiesta non valida", + "Authentication error" : "Errore di autenticazione", "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Utente non valido", "Unable to change mail address" : "Impossibile cambiare l'indirizzo di posta", "Email saved" : "Email salvata", + "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", + "Unable to change full name" : "Impossibile cambiare il nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sei sicuro di voler aggiungere \"{domain}\" come dominio attendibile?", "Add trusted domain" : "Aggiungi dominio attendibile", "Migration in progress. Please wait until the migration is finished" : "Migrazione in corso. Attendi fino al completamento della migrazione", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Consigliamo vivamente di installare i pacchetti richiesti sul tuo sistema per supportare una delle localizzazioni seguenti: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Il blocco del file transazionale sta utilizzando il database come motore di blocco, per avere prestazioni migliori, è consigliato configurare una cache di memoria per il blocco. Vedi la documentazione ↗ per ulteriori informazioni.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Leggi attentamente le guide d'installazione ↗, e controlla gli errori o gli avvisi nel log.", "All checks passed." : "Tutti i controlli passati.", "Open documentation" : "Apri la documentazione", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index 1090780f96..72ac8fa95e 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Suggerimenti e trucchi", "Updates" : "Aggiornamenti", - "Authentication error" : "Errore di autenticazione", - "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", - "Unable to change full name" : "Impossibile cambiare il nome completo", "Couldn't remove app." : "Impossibile rimuovere l'applicazione.", "Language changed" : "Lingua modificata", "Invalid request" : "Richiesta non valida", + "Authentication error" : "Errore di autenticazione", "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Utente non valido", "Unable to change mail address" : "Impossibile cambiare l'indirizzo di posta", "Email saved" : "Email salvata", + "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", + "Unable to change full name" : "Impossibile cambiare il nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sei sicuro di voler aggiungere \"{domain}\" come dominio attendibile?", "Add trusted domain" : "Aggiungi dominio attendibile", "Migration in progress. Please wait until the migration is finished" : "Migrazione in corso. Attendi fino al completamento della migrazione", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Consigliamo vivamente di installare i pacchetti richiesti sul tuo sistema per supportare una delle localizzazioni seguenti: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Il blocco del file transazionale sta utilizzando il database come motore di blocco, per avere prestazioni migliori, è consigliato configurare una cache di memoria per il blocco. Vedi la documentazione ↗ per ulteriori informazioni.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Leggi attentamente le guide d'installazione ↗, e controlla gli errori o gli avvisi nel log.", "All checks passed." : "Tutti i controlli passati.", "Open documentation" : "Apri la documentazione", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index 2d317695ea..5b3643eea8 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "次のロケールをサポートするには、システムに必要なパッケージをインストールすることを強くおすすめします: %s。", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "URLがドメインのルート(/)で終わっていない場合で、システムのcronを利用している場合は、URLの生成に問題が発生します。その場合は、config.php ファイルの中の \"overwrite.cli.url\" オプションをインストールしたwebrootのパスに設定してください。(推奨: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI から cronジョブを実行することができませんでした。次の技術的なエラーが発生しています:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "トランザクションファイルのロックは、データベースを使用してバックエンドのロックをしています。最高のパフォーマンスのためには、ロック用に memcache を設定することをお勧めします。詳細については、ドキュメント↗ を参照してください。", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "インストールガイド ↗をもう一度チェックして、ログ にあるエラーまたは警告について確認してください。", "All checks passed." : "すべてのチェックに合格しました。", "Open documentation" : "ドキュメントを開く", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index d7138dbf3b..f8daf2d798 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "次のロケールをサポートするには、システムに必要なパッケージをインストールすることを強くおすすめします: %s。", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "URLがドメインのルート(/)で終わっていない場合で、システムのcronを利用している場合は、URLの生成に問題が発生します。その場合は、config.php ファイルの中の \"overwrite.cli.url\" オプションをインストールしたwebrootのパスに設定してください。(推奨: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI から cronジョブを実行することができませんでした。次の技術的なエラーが発生しています:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "トランザクションファイルのロックは、データベースを使用してバックエンドのロックをしています。最高のパフォーマンスのためには、ロック用に memcache を設定することをお勧めします。詳細については、ドキュメント↗ を参照してください。", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "インストールガイド ↗をもう一度チェックして、ログ にあるエラーまたは警告について確認してください。", "All checks passed." : "すべてのチェックに合格しました。", "Open documentation" : "ドキュメントを開く", diff --git a/settings/l10n/ka_GE.js b/settings/l10n/ka_GE.js index 0c6ad6fd82..636954b6d7 100644 --- a/settings/l10n/ka_GE.js +++ b/settings/l10n/ka_GE.js @@ -5,9 +5,9 @@ OC.L10N.register( "External Storage" : "ექსტერნალ საცავი", "Cron" : "Cron–ი", "Log" : "ლოგი", - "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Language changed" : "ენა შეცვლილია", "Invalid request" : "არასწორი მოთხოვნა", + "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", diff --git a/settings/l10n/ka_GE.json b/settings/l10n/ka_GE.json index 5892c19547..a1a3bb241e 100644 --- a/settings/l10n/ka_GE.json +++ b/settings/l10n/ka_GE.json @@ -3,9 +3,9 @@ "External Storage" : "ექსტერნალ საცავი", "Cron" : "Cron–ი", "Log" : "ლოგი", - "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Language changed" : "ენა შეცვლილია", "Invalid request" : "არასწორი მოთხოვნა", + "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", diff --git a/settings/l10n/km.js b/settings/l10n/km.js index bba9783e9a..c816d5bed3 100644 --- a/settings/l10n/km.js +++ b/settings/l10n/km.js @@ -5,9 +5,9 @@ OC.L10N.register( "External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ", "Language changed" : "បាន​ប្ដូរ​ភាសា", "Invalid request" : "សំណើ​មិន​ត្រឹម​ត្រូវ", + "Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ", "Admins can't remove themself from the admin group" : "អ្នក​គ្រប់​គ្រង​មិន​អាច​លុប​ខ្លួន​ឯង​ចេញ​ពី​ក្រុម​អ្នក​គ្រប់​គ្រង​ឡើយ", "Unable to add user to group %s" : "មិន​អាច​បន្ថែម​អ្នក​ប្រើ​ទៅ​ក្រុម %s", "Unable to remove user from group %s" : "មិន​អាច​ដក​អ្នក​ប្រើ​ចេញ​ពី​ក្រុម​ %s", diff --git a/settings/l10n/km.json b/settings/l10n/km.json index 89cd82da01..b57c054faa 100644 --- a/settings/l10n/km.json +++ b/settings/l10n/km.json @@ -3,9 +3,9 @@ "External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ", "Language changed" : "បាន​ប្ដូរ​ភាសា", "Invalid request" : "សំណើ​មិន​ត្រឹម​ត្រូវ", + "Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ", "Admins can't remove themself from the admin group" : "អ្នក​គ្រប់​គ្រង​មិន​អាច​លុប​ខ្លួន​ឯង​ចេញ​ពី​ក្រុម​អ្នក​គ្រប់​គ្រង​ឡើយ", "Unable to add user to group %s" : "មិន​អាច​បន្ថែម​អ្នក​ប្រើ​ទៅ​ក្រុម %s", "Unable to remove user from group %s" : "មិន​អាច​ដក​អ្នក​ប្រើ​ចេញ​ពី​ក្រុម​ %s", diff --git a/settings/l10n/kn.js b/settings/l10n/kn.js index 4ef7313b3b..673081e5f0 100644 --- a/settings/l10n/kn.js +++ b/settings/l10n/kn.js @@ -3,12 +3,10 @@ OC.L10N.register( { "Sharing" : "ಹಂಚಿಕೆ", "Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ", - "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", - "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", - "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Couldn't remove app." : "ಅಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", "Language changed" : "ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ", "Invalid request" : "ಅಮಾನ್ಯ ಕೋರಿಕೆ", + "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", @@ -33,6 +31,8 @@ OC.L10N.register( "Invalid user" : "ಅಮಾನ್ಯ ಬಳಕೆದಾರ", "Unable to change mail address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Email saved" : "ಇ-ಅಂಚೆಯನ್ನು ಉಳಿಸಿದೆ", + "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", + "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Sending..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...", "All" : "ಎಲ್ಲಾ", "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", diff --git a/settings/l10n/kn.json b/settings/l10n/kn.json index cbae632d1c..5942e8a8dc 100644 --- a/settings/l10n/kn.json +++ b/settings/l10n/kn.json @@ -1,12 +1,10 @@ { "translations": { "Sharing" : "ಹಂಚಿಕೆ", "Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ", - "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", - "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", - "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Couldn't remove app." : "ಅಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", "Language changed" : "ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ", "Invalid request" : "ಅಮಾನ್ಯ ಕೋರಿಕೆ", + "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", @@ -31,6 +29,8 @@ "Invalid user" : "ಅಮಾನ್ಯ ಬಳಕೆದಾರ", "Unable to change mail address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Email saved" : "ಇ-ಅಂಚೆಯನ್ನು ಉಳಿಸಿದೆ", + "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", + "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Sending..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...", "All" : "ಎಲ್ಲಾ", "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index 6eea3ecede..56d7b315fb 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "로그", "Tips & tricks" : "팁과 추가 정보", "Updates" : "업데이트", - "Authentication error" : "인증 오류", - "Your full name has been changed." : "전체 이름이 변경되었습니다.", - "Unable to change full name" : "전체 이름을 변경할 수 없음", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", "Language changed" : "언어가 변경됨", "Invalid request" : "잘못된 요청", + "Authentication error" : "인증 오류", "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "잘못된 사용자", "Unable to change mail address" : "이메일 주소를 변경할 수 없음", "Email saved" : "이메일 저장됨", + "Your full name has been changed." : "전체 이름이 변경되었습니다.", + "Unable to change full name" : "전체 이름을 변경할 수 없음", "Are you really sure you want add \"{domain}\" as trusted domain?" : "신뢰할 수 있는 도메인 목록에 \"{domain}\"을(를) 추가하시겠습니까?", "Add trusted domain" : "신뢰할 수 있는 도메인 추가", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "잠금 백엔드로 데이터베이스를 사용하고 있으므로 트랜잭션 기반 파일 잠금을 사용합니다. 더 좋은 성능을 내려면 memcache 기반 잠금 사용을 추천합니다. 더 많은 정보를 보려면 문서 ↗를 참고하십시오.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "설치 가이드 ↗를 다시 확인하시고 로그의 오류 및 경고를 확인하십시오.", "All checks passed." : "모든 검사를 통과했습니다.", "Open documentation" : "문서 열기", diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index 1fb664b213..07e8b253e7 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -10,12 +10,10 @@ "Log" : "로그", "Tips & tricks" : "팁과 추가 정보", "Updates" : "업데이트", - "Authentication error" : "인증 오류", - "Your full name has been changed." : "전체 이름이 변경되었습니다.", - "Unable to change full name" : "전체 이름을 변경할 수 없음", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", "Language changed" : "언어가 변경됨", "Invalid request" : "잘못된 요청", + "Authentication error" : "인증 오류", "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", @@ -51,6 +49,8 @@ "Invalid user" : "잘못된 사용자", "Unable to change mail address" : "이메일 주소를 변경할 수 없음", "Email saved" : "이메일 저장됨", + "Your full name has been changed." : "전체 이름이 변경되었습니다.", + "Unable to change full name" : "전체 이름을 변경할 수 없음", "Are you really sure you want add \"{domain}\" as trusted domain?" : "신뢰할 수 있는 도메인 목록에 \"{domain}\"을(를) 추가하시겠습니까?", "Add trusted domain" : "신뢰할 수 있는 도메인 추가", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "잠금 백엔드로 데이터베이스를 사용하고 있으므로 트랜잭션 기반 파일 잠금을 사용합니다. 더 좋은 성능을 내려면 memcache 기반 잠금 사용을 추천합니다. 더 많은 정보를 보려면 문서 ↗를 참고하십시오.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "설치 가이드 ↗를 다시 확인하시고 로그의 오류 및 경고를 확인하십시오.", "All checks passed." : "모든 검사를 통과했습니다.", "Open documentation" : "문서 열기", diff --git a/settings/l10n/lb.js b/settings/l10n/lb.js index 79643dc416..43f9705baa 100644 --- a/settings/l10n/lb.js +++ b/settings/l10n/lb.js @@ -5,9 +5,9 @@ OC.L10N.register( "Redis" : "Redis", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Authentifikatioun's Fehler", "Language changed" : "Sprooch huet geännert", "Invalid request" : "Ongülteg Requête", + "Authentication error" : "Authentifikatioun's Fehler", "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "Wrong password" : "Falscht Passwuert", diff --git a/settings/l10n/lb.json b/settings/l10n/lb.json index 26af461d14..1d408deb07 100644 --- a/settings/l10n/lb.json +++ b/settings/l10n/lb.json @@ -3,9 +3,9 @@ "Redis" : "Redis", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Authentifikatioun's Fehler", "Language changed" : "Sprooch huet geännert", "Invalid request" : "Ongülteg Requête", + "Authentication error" : "Authentifikatioun's Fehler", "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "Wrong password" : "Falscht Passwuert", diff --git a/settings/l10n/lo.js b/settings/l10n/lo.js index 862f93e195..4306981813 100644 --- a/settings/l10n/lo.js +++ b/settings/l10n/lo.js @@ -3,7 +3,7 @@ OC.L10N.register( { "Sharing" : "ການແບ່ງປັນ", "Log" : "ບັນທຶກ", - "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້", - "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້" + "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້", + "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/lo.json b/settings/l10n/lo.json index 7551594418..942e427821 100644 --- a/settings/l10n/lo.json +++ b/settings/l10n/lo.json @@ -1,7 +1,7 @@ { "translations": { "Sharing" : "ການແບ່ງປັນ", "Log" : "ບັນທຶກ", - "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້", - "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້" + "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້", + "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js index c1ec5be221..41fa2256de 100644 --- a/settings/l10n/lt_LT.js +++ b/settings/l10n/lt_LT.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Žurnalas", "Tips & tricks" : "Patarimai ir gudrybės", "Updates" : "Atnaujinimai", - "Authentication error" : "Autentikacijos klaida", - "Your full name has been changed." : "Pilnas vardas pakeistas.", - "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "Couldn't remove app." : "Nepavyko pašalinti programėlės.", "Language changed" : "Kalba pakeista", "Invalid request" : "Klaidinga užklausa", + "Authentication error" : "Autentikacijos klaida", "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", "Unable to add user to group %s" : "Nepavyko pridėti vartotojo prie grupės %s", "Unable to remove user from group %s" : "Nepavyko ištrinti vartotojo iš grupės %s", @@ -37,6 +35,8 @@ OC.L10N.register( "Your %s account was created" : "Tavo paskyra %s sukurta", "Unable to delete user." : "Nepavyko ištrinti vartotojo.", "Email saved" : "El. paštas išsaugotas", + "Your full name has been changed." : "Pilnas vardas pakeistas.", + "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "All" : "Viskas", "Please wait...." : "Prašome palaukti...", "Error while disabling app" : "Klaida išjungiant programą", diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json index cf38951209..dab231151a 100644 --- a/settings/l10n/lt_LT.json +++ b/settings/l10n/lt_LT.json @@ -10,12 +10,10 @@ "Log" : "Žurnalas", "Tips & tricks" : "Patarimai ir gudrybės", "Updates" : "Atnaujinimai", - "Authentication error" : "Autentikacijos klaida", - "Your full name has been changed." : "Pilnas vardas pakeistas.", - "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "Couldn't remove app." : "Nepavyko pašalinti programėlės.", "Language changed" : "Kalba pakeista", "Invalid request" : "Klaidinga užklausa", + "Authentication error" : "Autentikacijos klaida", "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", "Unable to add user to group %s" : "Nepavyko pridėti vartotojo prie grupės %s", "Unable to remove user from group %s" : "Nepavyko ištrinti vartotojo iš grupės %s", @@ -35,6 +33,8 @@ "Your %s account was created" : "Tavo paskyra %s sukurta", "Unable to delete user." : "Nepavyko ištrinti vartotojo.", "Email saved" : "El. paštas išsaugotas", + "Your full name has been changed." : "Pilnas vardas pakeistas.", + "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "All" : "Viskas", "Please wait...." : "Prašome palaukti...", "Error while disabling app" : "Klaida išjungiant programą", diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js index 30cb20b645..f5c3214b57 100644 --- a/settings/l10n/lv.js +++ b/settings/l10n/lv.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Žurnāls", "Updates" : "Atjauninājumi", - "Authentication error" : "Autentifikācijas kļūda", - "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", - "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Couldn't remove app." : "Nebija iespējams atslēgt lietoni.", "Language changed" : "Valoda tika nomainīta", "Invalid request" : "Nederīgs vaicājums", + "Authentication error" : "Autentifikācijas kļūda", "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", @@ -40,6 +38,8 @@ OC.L10N.register( "Invalid user" : "Nepareizs lietotājs", "Unable to change mail address" : "Nevar nomainīt e-pasta adresi", "Email saved" : "E-pasts tika saglabāts", + "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", + "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Vai esat pārliecināts, ka vēlaties pievienot \"{domain}\" kā uzticamu domēnu?", "Add trusted domain" : "Pievienot uzticamu domēnu", "Sending..." : "Sūta...", diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json index 18b41b82f9..db564c9ae1 100644 --- a/settings/l10n/lv.json +++ b/settings/l10n/lv.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Žurnāls", "Updates" : "Atjauninājumi", - "Authentication error" : "Autentifikācijas kļūda", - "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", - "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Couldn't remove app." : "Nebija iespējams atslēgt lietoni.", "Language changed" : "Valoda tika nomainīta", "Invalid request" : "Nederīgs vaicājums", + "Authentication error" : "Autentifikācijas kļūda", "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", @@ -38,6 +36,8 @@ "Invalid user" : "Nepareizs lietotājs", "Unable to change mail address" : "Nevar nomainīt e-pasta adresi", "Email saved" : "E-pasts tika saglabāts", + "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", + "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Vai esat pārliecināts, ka vēlaties pievienot \"{domain}\" kā uzticamu domēnu?", "Add trusted domain" : "Pievienot uzticamu domēnu", "Sending..." : "Sūta...", diff --git a/settings/l10n/mn.js b/settings/l10n/mn.js index 30c8a71df7..56695ede7a 100644 --- a/settings/l10n/mn.js +++ b/settings/l10n/mn.js @@ -4,14 +4,14 @@ OC.L10N.register( "Sharing" : "Түгээлт", "Cron" : "Крон", "Log" : "Лог бичилт", - "Authentication error" : "Нотолгооны алдаа", - "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", - "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "Couldn't remove app." : "Апп-ыг устгаж чадсангүй", "Language changed" : "Хэл солигдлоо", "Invalid request" : "Буруу хүсэлт", + "Authentication error" : "Нотолгооны алдаа", "Admins can't remove themself from the admin group" : "Админууд өөрсдийгөө Админ бүлгээс хасаж чадахгүй", "Wrong password" : "Нууц үг буруу", + "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", + "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "All" : "Бүгд", "Password" : "Нууц үг", "Email" : "И-мэйл", diff --git a/settings/l10n/mn.json b/settings/l10n/mn.json index 95400f3893..560c7c9cb2 100644 --- a/settings/l10n/mn.json +++ b/settings/l10n/mn.json @@ -2,14 +2,14 @@ "Sharing" : "Түгээлт", "Cron" : "Крон", "Log" : "Лог бичилт", - "Authentication error" : "Нотолгооны алдаа", - "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", - "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "Couldn't remove app." : "Апп-ыг устгаж чадсангүй", "Language changed" : "Хэл солигдлоо", "Invalid request" : "Буруу хүсэлт", + "Authentication error" : "Нотолгооны алдаа", "Admins can't remove themself from the admin group" : "Админууд өөрсдийгөө Админ бүлгээс хасаж чадахгүй", "Wrong password" : "Нууц үг буруу", + "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", + "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "All" : "Бүгд", "Password" : "Нууц үг", "Email" : "И-мэйл", diff --git a/settings/l10n/ms_MY.js b/settings/l10n/ms_MY.js index db26c502d3..a4c28176fc 100644 --- a/settings/l10n/ms_MY.js +++ b/settings/l10n/ms_MY.js @@ -2,9 +2,9 @@ OC.L10N.register( "settings", { "Log" : "Log", - "Authentication error" : "Ralat pengesahan", "Language changed" : "Bahasa diubah", "Invalid request" : "Permintaan tidak sah", + "Authentication error" : "Ralat pengesahan", "Email saved" : "Emel disimpan", "Disable" : "Nyahaktif", "Enable" : "Aktif", diff --git a/settings/l10n/ms_MY.json b/settings/l10n/ms_MY.json index 342d679ecb..9ee8415ef8 100644 --- a/settings/l10n/ms_MY.json +++ b/settings/l10n/ms_MY.json @@ -1,8 +1,8 @@ { "translations": { "Log" : "Log", - "Authentication error" : "Ralat pengesahan", "Language changed" : "Bahasa diubah", "Invalid request" : "Permintaan tidak sah", + "Authentication error" : "Ralat pengesahan", "Email saved" : "Emel disimpan", "Disable" : "Nyahaktif", "Enable" : "Aktif", diff --git a/settings/l10n/my_MM.js b/settings/l10n/my_MM.js index 88ad33d005..f95325bb8d 100644 --- a/settings/l10n/my_MM.js +++ b/settings/l10n/my_MM.js @@ -1,8 +1,8 @@ OC.L10N.register( "settings", { - "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Invalid request" : "တောင်းဆိုချက်မမှန်ကန်ပါ", + "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Password" : "စကားဝှက်", "New password" : "စကားဝှက်အသစ်", "Cancel" : "ပယ်ဖျက်မည်", diff --git a/settings/l10n/my_MM.json b/settings/l10n/my_MM.json index 0ded957958..503f7fcb4d 100644 --- a/settings/l10n/my_MM.json +++ b/settings/l10n/my_MM.json @@ -1,6 +1,6 @@ { "translations": { - "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Invalid request" : "တောင်းဆိုချက်မမှန်ကန်ပါ", + "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Password" : "စကားဝှက်", "New password" : "စကားဝှက်အသစ်", "Cancel" : "ပယ်ဖျက်မည်", diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index 0cea17dbb4..9d02c085f0 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Logg", "Tips & tricks" : "Tips og triks", "Updates" : "Oppdateringer", - "Authentication error" : "Autentiseringsfeil", - "Your full name has been changed." : "Ditt fulle navn er blitt endret.", - "Unable to change full name" : "Klarte ikke å endre fullt navn", "Couldn't remove app." : "Klarte ikke å fjerne app.", "Language changed" : "Språk endret", "Invalid request" : "Ugyldig forespørsel", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Ugyldig bruker", "Unable to change mail address" : "Kan ikke endre epost-adresse", "Email saved" : "Epost lagret", + "Your full name has been changed." : "Ditt fulle navn er blitt endret.", + "Unable to change full name" : "Klarte ikke å endre fullt navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ønsker du virkelig å legge til \"{domain}\" som tiltrodd domene?", "Add trusted domain" : "Legg til et tiltrodd domene", "Migration in progress. Please wait until the migration is finished" : "Migrering utføres. Vent til migreringen er ferdig.", @@ -134,7 +134,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transaksjonsbasert fil-låsing bruker databasen som låsemekanisme. For best ytelse anbefales det å konfigurerer en memcache for låsing. Se dokumentasjonen ↗ for mer informasjon.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Vennligst dobbeltsjekk Installasjonsveiledningene ↗ og se etter feil og advarsler i loggen.", "All checks passed." : "Alle sjekker bestått.", "Open documentation" : "Åpne dokumentasjonen", diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index 0eca73177d..7a6e0c6867 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -10,12 +10,10 @@ "Log" : "Logg", "Tips & tricks" : "Tips og triks", "Updates" : "Oppdateringer", - "Authentication error" : "Autentiseringsfeil", - "Your full name has been changed." : "Ditt fulle navn er blitt endret.", - "Unable to change full name" : "Klarte ikke å endre fullt navn", "Couldn't remove app." : "Klarte ikke å fjerne app.", "Language changed" : "Språk endret", "Invalid request" : "Ugyldig forespørsel", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", @@ -51,6 +49,8 @@ "Invalid user" : "Ugyldig bruker", "Unable to change mail address" : "Kan ikke endre epost-adresse", "Email saved" : "Epost lagret", + "Your full name has been changed." : "Ditt fulle navn er blitt endret.", + "Unable to change full name" : "Klarte ikke å endre fullt navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ønsker du virkelig å legge til \"{domain}\" som tiltrodd domene?", "Add trusted domain" : "Legg til et tiltrodd domene", "Migration in progress. Please wait until the migration is finished" : "Migrering utføres. Vent til migreringen er ferdig.", @@ -132,7 +132,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transaksjonsbasert fil-låsing bruker databasen som låsemekanisme. For best ytelse anbefales det å konfigurerer en memcache for låsing. Se dokumentasjonen ↗ for mer informasjon.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Vennligst dobbeltsjekk Installasjonsveiledningene ↗ og se etter feil og advarsler i loggen.", "All checks passed." : "Alle sjekker bestått.", "Open documentation" : "Åpne dokumentasjonen", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index f28a9f3b17..3162fc6130 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We adviseren met klem om de noodzakelijke pakketten op uw systeem te installeren om een van de volgende talen te ondersteunen: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transactionele bestandslocking gebruikt de database als blokkeermechanisme. Voor de beste prestaties wordt geadviseerd om een memcache voor locking te configureren. Zie de documentatie ↗ voor meer informatie.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lees de installatie handleiding goed door en controleer op fouten en waarschuwingen in de logging.", "All checks passed." : "Alle checks geslaagd", "Open documentation" : "Open documentatie", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index b9a7baadde..d629588a40 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We adviseren met klem om de noodzakelijke pakketten op uw systeem te installeren om een van de volgende talen te ondersteunen: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Transactionele bestandslocking gebruikt de database als blokkeermechanisme. Voor de beste prestaties wordt geadviseerd om een memcache voor locking te configureren. Zie de documentatie ↗ voor meer informatie.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lees de installatie handleiding goed door en controleer op fouten en waarschuwingen in de logging.", "All checks passed." : "Alle checks geslaagd", "Open documentation" : "Open documentatie", diff --git a/settings/l10n/nn_NO.js b/settings/l10n/nn_NO.js index 7539ca7f09..62871d4ac2 100644 --- a/settings/l10n/nn_NO.js +++ b/settings/l10n/nn_NO.js @@ -4,9 +4,9 @@ OC.L10N.register( "Sharing" : "Deling", "Cron" : "Cron", "Log" : "Logg", - "Authentication error" : "Autentiseringsfeil", "Language changed" : "Språk endra", "Invalid request" : "Ugyldig førespurnad", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", diff --git a/settings/l10n/nn_NO.json b/settings/l10n/nn_NO.json index 8d30f4c361..02497c840a 100644 --- a/settings/l10n/nn_NO.json +++ b/settings/l10n/nn_NO.json @@ -2,9 +2,9 @@ "Sharing" : "Deling", "Cron" : "Cron", "Log" : "Logg", - "Authentication error" : "Autentiseringsfeil", "Language changed" : "Språk endra", "Invalid request" : "Ugyldig førespurnad", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", diff --git a/settings/l10n/oc.js b/settings/l10n/oc.js index 3805573944..dc6acaf5de 100644 --- a/settings/l10n/oc.js +++ b/settings/l10n/oc.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Estècs e astúcias", "Updates" : "Mesas a jorn", - "Authentication error" : "Error d'autentificacion", - "Your full name has been changed." : "Vòstre nom complet es estat modificat.", - "Unable to change full name" : "Impossible de cambiar lo nom complet", "Couldn't remove app." : "Impossible de suprimir l'aplicacion.", "Language changed" : "Lenga cambiada", "Invalid request" : "Requèsta invalida", + "Authentication error" : "Error d'autentificacion", "Admins can't remove themself from the admin group" : "Los administrators se pòdon pas levar eles-meteisses del grop admin", "Unable to add user to group %s" : "Impossible d'apondre l'utilizaire al grop %s", "Unable to remove user from group %s" : "Impossible de suprimir l'utilizaire del grop %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Utilizaire invalid", "Unable to change mail address" : "Impossible de modificar l'adreça de corrièl", "Email saved" : "Email salvat", + "Your full name has been changed." : "Vòstre nom complet es estat modificat.", + "Unable to change full name" : "Impossible de cambiar lo nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sètz segur que volètz apondre \"{domain}\" coma domeni de fisança ?", "Add trusted domain" : "Apondre un domeni de fisança", "Migration in progress. Please wait until the migration is finished" : "Migracion en cors. Esperatz qu'aquela s'acabe", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vos recomandam d'installar sus vòstre sistèma los paquets requesits a la presa en carga d'un dels paramètres regionals seguents : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se vòstra installacion es pas estada efectuada a la raiç del domeni e qu'utiliza lo cron del sistèma, i pòt aver de problèmas amb la generacion d'URL. Per los evitar, configuratz l'opcion \"overwrite.cli.url\" de vòstre fichièr config.php amb lo camin de la raiç de vòstra installacion (suggerit : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Lo prètzfach cron a pas pogut s'executar via CLI. Aquelas errors tecnicas son aparegudas :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Lo verrolhatge transaccional de fichièrs utiliza la banca de donadas. Per obténer de performànciasmelhor il est recommandé d'utiliser plutôt memcache. Consultez la documentation ↗ pour plus d'informations.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultatz los guidas d'installacion ↗, e cercatz d'errors o avertiments dins los logs.", "All checks passed." : "Totes los tèsts an capitat.", "Open documentation" : "Veire la documentacion", diff --git a/settings/l10n/oc.json b/settings/l10n/oc.json index e60cfb45ed..30fa894cae 100644 --- a/settings/l10n/oc.json +++ b/settings/l10n/oc.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Estècs e astúcias", "Updates" : "Mesas a jorn", - "Authentication error" : "Error d'autentificacion", - "Your full name has been changed." : "Vòstre nom complet es estat modificat.", - "Unable to change full name" : "Impossible de cambiar lo nom complet", "Couldn't remove app." : "Impossible de suprimir l'aplicacion.", "Language changed" : "Lenga cambiada", "Invalid request" : "Requèsta invalida", + "Authentication error" : "Error d'autentificacion", "Admins can't remove themself from the admin group" : "Los administrators se pòdon pas levar eles-meteisses del grop admin", "Unable to add user to group %s" : "Impossible d'apondre l'utilizaire al grop %s", "Unable to remove user from group %s" : "Impossible de suprimir l'utilizaire del grop %s", @@ -51,6 +49,8 @@ "Invalid user" : "Utilizaire invalid", "Unable to change mail address" : "Impossible de modificar l'adreça de corrièl", "Email saved" : "Email salvat", + "Your full name has been changed." : "Vòstre nom complet es estat modificat.", + "Unable to change full name" : "Impossible de cambiar lo nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sètz segur que volètz apondre \"{domain}\" coma domeni de fisança ?", "Add trusted domain" : "Apondre un domeni de fisança", "Migration in progress. Please wait until the migration is finished" : "Migracion en cors. Esperatz qu'aquela s'acabe", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vos recomandam d'installar sus vòstre sistèma los paquets requesits a la presa en carga d'un dels paramètres regionals seguents : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se vòstra installacion es pas estada efectuada a la raiç del domeni e qu'utiliza lo cron del sistèma, i pòt aver de problèmas amb la generacion d'URL. Per los evitar, configuratz l'opcion \"overwrite.cli.url\" de vòstre fichièr config.php amb lo camin de la raiç de vòstra installacion (suggerit : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Lo prètzfach cron a pas pogut s'executar via CLI. Aquelas errors tecnicas son aparegudas :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Lo verrolhatge transaccional de fichièrs utiliza la banca de donadas. Per obténer de performànciasmelhor il est recommandé d'utiliser plutôt memcache. Consultez la documentation ↗ pour plus d'informations.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultatz los guidas d'installacion ↗, e cercatz d'errors o avertiments dins los logs.", "All checks passed." : "Totes los tèsts an capitat.", "Open documentation" : "Veire la documentacion", diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index 862d56fc84..a7535c540a 100644 --- a/settings/l10n/pl.js +++ b/settings/l10n/pl.js @@ -7,12 +7,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Logi", "Updates" : "Aktualizacje", - "Authentication error" : "Błąd uwierzytelniania", - "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", - "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Couldn't remove app." : "Nie można usunąć aplikacji.", "Language changed" : "Zmieniono język", "Invalid request" : "Nieprawidłowe żądanie", + "Authentication error" : "Błąd uwierzytelniania", "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", @@ -40,6 +38,8 @@ OC.L10N.register( "Invalid user" : "Nieprawidłowy użytkownik", "Unable to change mail address" : "Nie można zmienić adresu email", "Email saved" : "E-mail zapisany", + "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", + "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", "Add trusted domain" : "Dodaj zaufaną domenę", "Sending..." : "Wysyłam...", diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json index db527fa451..f14377903d 100644 --- a/settings/l10n/pl.json +++ b/settings/l10n/pl.json @@ -5,12 +5,10 @@ "Cron" : "Cron", "Log" : "Logi", "Updates" : "Aktualizacje", - "Authentication error" : "Błąd uwierzytelniania", - "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", - "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Couldn't remove app." : "Nie można usunąć aplikacji.", "Language changed" : "Zmieniono język", "Invalid request" : "Nieprawidłowe żądanie", + "Authentication error" : "Błąd uwierzytelniania", "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", @@ -38,6 +36,8 @@ "Invalid user" : "Nieprawidłowy użytkownik", "Unable to change mail address" : "Nie można zmienić adresu email", "Email saved" : "E-mail zapisany", + "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", + "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", "Add trusted domain" : "Dodaj zaufaną domenę", "Sending..." : "Wysyłam...", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 1e33ffb10c..e7ea47e6b7 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registro", "Tips & tricks" : "Dicas & Truques", "Updates" : "Atualizações", - "Authentication error" : "Erro de autenticação", - "Your full name has been changed." : "Seu nome completo foi alterado.", - "Unable to change full name" : "Não é possível alterar o nome completo", "Couldn't remove app." : "Não foi possível remover aplicativos.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido inválido", + "Authentication error" : "Erro de autenticação", "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Usuário inválido", "Unable to change mail address" : "Não é possível trocar o endereço de email", "Email saved" : "E-mail salvo", + "Your full name has been changed." : "Seu nome completo foi alterado.", + "Unable to change full name" : "Não é possível alterar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que você quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor aguarde até que a migração seja finalizada", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós sugerimos a instalação dos pacotes necessários em seu sistema para suportar um dos seguintes locais: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não estiver instalada na raiz do domínio e usa cron do sistema, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" em seu arquivo config.php para o caminho webroot de sua instalação (Sugestão: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Bloqueio de arquivos transacional está usando o banco de dados como bloqueio de back-end, para o melhor o desempenho é aconselhável configurar um cache de memória para bloqueio. Veja a documentação ↗ para mais informação.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor, verifique os guias de instalação ↗, e verificar se há erros ou avisos no log.", "All checks passed." : "Todas as verificações passaram.", "Open documentation" : "Abrir documentação", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index eaaf84d373..89fd6bbbb1 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -10,12 +10,10 @@ "Log" : "Registro", "Tips & tricks" : "Dicas & Truques", "Updates" : "Atualizações", - "Authentication error" : "Erro de autenticação", - "Your full name has been changed." : "Seu nome completo foi alterado.", - "Unable to change full name" : "Não é possível alterar o nome completo", "Couldn't remove app." : "Não foi possível remover aplicativos.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido inválido", + "Authentication error" : "Erro de autenticação", "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Usuário inválido", "Unable to change mail address" : "Não é possível trocar o endereço de email", "Email saved" : "E-mail salvo", + "Your full name has been changed." : "Seu nome completo foi alterado.", + "Unable to change full name" : "Não é possível alterar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que você quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor aguarde até que a migração seja finalizada", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós sugerimos a instalação dos pacotes necessários em seu sistema para suportar um dos seguintes locais: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não estiver instalada na raiz do domínio e usa cron do sistema, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" em seu arquivo config.php para o caminho webroot de sua instalação (Sugestão: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Bloqueio de arquivos transacional está usando o banco de dados como bloqueio de back-end, para o melhor o desempenho é aconselhável configurar um cache de memória para bloqueio. Veja a documentação ↗ para mais informação.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor, verifique os guias de instalação ↗, e verificar se há erros ou avisos no log.", "All checks passed." : "Todas as verificações passaram.", "Open documentation" : "Abrir documentação", diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js index b0f2579690..37126e2e77 100644 --- a/settings/l10n/pt_PT.js +++ b/settings/l10n/pt_PT.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registo", "Tips & tricks" : "Dicas e truqes", "Updates" : "Atualizações", - "Authentication error" : "Erro na autenticação", - "Your full name has been changed." : "O seu nome completo foi alterado.", - "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Couldn't remove app." : "Não foi possível remover a aplicação.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido Inválido", + "Authentication error" : "Erro na autenticação", "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Utilizador inválido", "Unable to change mail address" : "Não foi possível alterar o teu endereço de email", "Email saved" : "E-mail guardado", + "Your full name has been changed." : "O seu nome completo foi alterado.", + "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável ", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor, aguarde até que a mesma esteja concluída..", diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json index 4df54b8100..89357332ce 100644 --- a/settings/l10n/pt_PT.json +++ b/settings/l10n/pt_PT.json @@ -10,12 +10,10 @@ "Log" : "Registo", "Tips & tricks" : "Dicas e truqes", "Updates" : "Atualizações", - "Authentication error" : "Erro na autenticação", - "Your full name has been changed." : "O seu nome completo foi alterado.", - "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Couldn't remove app." : "Não foi possível remover a aplicação.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido Inválido", + "Authentication error" : "Erro na autenticação", "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", @@ -49,6 +47,8 @@ "Invalid user" : "Utilizador inválido", "Unable to change mail address" : "Não foi possível alterar o teu endereço de email", "Email saved" : "E-mail guardado", + "Your full name has been changed." : "O seu nome completo foi alterado.", + "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável ", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor, aguarde até que a mesma esteja concluída..", diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js index 354c45092b..54666e9086 100644 --- a/settings/l10n/ro.js +++ b/settings/l10n/ro.js @@ -8,11 +8,9 @@ OC.L10N.register( "Log" : "Jurnal de activitate", "Tips & tricks" : "Tips & tricks", "Updates" : "Actualizări", - "Authentication error" : "Eroare la autentificare", - "Your full name has been changed." : "Numele tău complet a fost schimbat.", - "Unable to change full name" : "Nu s-a puput schimba numele complet", "Language changed" : "Limba a fost schimbată", "Invalid request" : "Cerere eronată", + "Authentication error" : "Eroare la autentificare", "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul admin", "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul la grupul %s", "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", @@ -34,6 +32,8 @@ OC.L10N.register( "Forbidden" : "Interzis", "Invalid user" : "Utilizator nevalid", "Email saved" : "E-mail salvat", + "Your full name has been changed." : "Numele tău complet a fost schimbat.", + "Unable to change full name" : "Nu s-a puput schimba numele complet", "Sending..." : "Se expediază...", "All" : "Toate ", "Please wait...." : "Aşteptaţi vă rog....", diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json index 05a736d9fd..2f1edea71c 100644 --- a/settings/l10n/ro.json +++ b/settings/l10n/ro.json @@ -6,11 +6,9 @@ "Log" : "Jurnal de activitate", "Tips & tricks" : "Tips & tricks", "Updates" : "Actualizări", - "Authentication error" : "Eroare la autentificare", - "Your full name has been changed." : "Numele tău complet a fost schimbat.", - "Unable to change full name" : "Nu s-a puput schimba numele complet", "Language changed" : "Limba a fost schimbată", "Invalid request" : "Cerere eronată", + "Authentication error" : "Eroare la autentificare", "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul admin", "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul la grupul %s", "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", @@ -32,6 +30,8 @@ "Forbidden" : "Interzis", "Invalid user" : "Utilizator nevalid", "Email saved" : "E-mail salvat", + "Your full name has been changed." : "Numele tău complet a fost schimbat.", + "Unable to change full name" : "Nu s-a puput schimba numele complet", "Sending..." : "Se expediază...", "All" : "Toate ", "Please wait...." : "Aşteptaţi vă rog....", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index a6f62fd5e9..78a5525eb0 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Журнал", "Tips & tricks" : "Советы и трюки", "Updates" : "Обновления", - "Authentication error" : "Ошибка аутентификации", - "Your full name has been changed." : "Ваше полное имя было изменено.", - "Unable to change full name" : "Невозможно изменить полное имя", "Couldn't remove app." : "Невозможно удалить приложение.", "Language changed" : "Язык изменён", "Invalid request" : "Неправильный запрос", + "Authentication error" : "Ошибка аутентификации", "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Неверный пользователь", "Unable to change mail address" : "Невозможно изменить адрес электронной почты", "Email saved" : "Email сохранен", + "Your full name has been changed." : "Ваше полное имя было изменено.", + "Unable to change full name" : "Невозможно изменить полное имя", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Вы действительно хотите добавить домен \"{domain}\" как доверенный?", "Add trusted domain" : "Добавить доверенный домен", "Migration in progress. Please wait until the migration is finished" : "Миграция в процессе. Пожалуйста, подождите завершения миграции", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Мы рекомендуем установить требуемые пакеты для вашей системы для поддержки одного из следующих языков: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Механизм блокировки файлов во время передачи основан на базе данных, для лучшей производительности рекомендуется использование memcache. За подробной информацией обратитесь к документации.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Пожалуйста, перепроверьте инструкцию по установке и проверьте ошибки или предупреждения в журнале", "All checks passed." : "Все проверки пройдены.", "Open documentation" : "Открыть документацию", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 4ecc1dd619..fd9af89039 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -10,12 +10,10 @@ "Log" : "Журнал", "Tips & tricks" : "Советы и трюки", "Updates" : "Обновления", - "Authentication error" : "Ошибка аутентификации", - "Your full name has been changed." : "Ваше полное имя было изменено.", - "Unable to change full name" : "Невозможно изменить полное имя", "Couldn't remove app." : "Невозможно удалить приложение.", "Language changed" : "Язык изменён", "Invalid request" : "Неправильный запрос", + "Authentication error" : "Ошибка аутентификации", "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", @@ -51,6 +49,8 @@ "Invalid user" : "Неверный пользователь", "Unable to change mail address" : "Невозможно изменить адрес электронной почты", "Email saved" : "Email сохранен", + "Your full name has been changed." : "Ваше полное имя было изменено.", + "Unable to change full name" : "Невозможно изменить полное имя", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Вы действительно хотите добавить домен \"{domain}\" как доверенный?", "Add trusted domain" : "Добавить доверенный домен", "Migration in progress. Please wait until the migration is finished" : "Миграция в процессе. Пожалуйста, подождите завершения миграции", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Мы рекомендуем установить требуемые пакеты для вашей системы для поддержки одного из следующих языков: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "Механизм блокировки файлов во время передачи основан на базе данных, для лучшей производительности рекомендуется использование memcache. За подробной информацией обратитесь к документации.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Пожалуйста, перепроверьте инструкцию по установке и проверьте ошибки или предупреждения в журнале", "All checks passed." : "Все проверки пройдены.", "Open documentation" : "Открыть документацию", diff --git a/settings/l10n/si_LK.js b/settings/l10n/si_LK.js index 8dc28f5ab1..9207b5ab18 100644 --- a/settings/l10n/si_LK.js +++ b/settings/l10n/si_LK.js @@ -4,9 +4,9 @@ OC.L10N.register( "Sharing" : "හුවමාරු කිරීම", "External Storage" : "භාහිර ගබඩාව", "Log" : "ලඝුව", - "Authentication error" : "සත්‍යාපන දෝෂයක්", "Language changed" : "භාෂාව ාවනස් කිරීම", "Invalid request" : "අවලංගු අයැදුමක්", + "Authentication error" : "සත්‍යාපන දෝෂයක්", "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "Email saved" : "වි-තැපෑල සුරකින ලදී", diff --git a/settings/l10n/si_LK.json b/settings/l10n/si_LK.json index afded14ebf..9b2287b13b 100644 --- a/settings/l10n/si_LK.json +++ b/settings/l10n/si_LK.json @@ -2,9 +2,9 @@ "Sharing" : "හුවමාරු කිරීම", "External Storage" : "භාහිර ගබඩාව", "Log" : "ලඝුව", - "Authentication error" : "සත්‍යාපන දෝෂයක්", "Language changed" : "භාෂාව ාවනස් කිරීම", "Invalid request" : "අවලංගු අයැදුමක්", + "Authentication error" : "සත්‍යාපන දෝෂයක්", "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "Email saved" : "වි-තැපෑල සුරකින ලදී", diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js index 2de64dd5a5..ea1887a92d 100644 --- a/settings/l10n/sk_SK.js +++ b/settings/l10n/sk_SK.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizácie", - "Authentication error" : "Chyba autentifikácie", - "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", - "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Couldn't remove app." : "Nemožno odstrániť aplikáciu.", "Language changed" : "Jazyk zmenený", "Invalid request" : "Neplatná požiadavka", + "Authentication error" : "Chyba autentifikácie", "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Neplatný používateľ", "Unable to change mail address" : "Nemožno zmeniť emailovú adresu", "Email saved" : "Email uložený", + "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", + "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ste si istí, že chcete pridať \"{domain}\" medzi dôveryhodné domény?", "Add trusted domain" : "Pridať dôveryhodnú doménu", "Migration in progress. Please wait until the migration is finished" : "Prebieha migrácia. Počkajte prosím, kým sa skončí", diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json index 2fc4064a03..784a46fe08 100644 --- a/settings/l10n/sk_SK.json +++ b/settings/l10n/sk_SK.json @@ -10,12 +10,10 @@ "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizácie", - "Authentication error" : "Chyba autentifikácie", - "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", - "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Couldn't remove app." : "Nemožno odstrániť aplikáciu.", "Language changed" : "Jazyk zmenený", "Invalid request" : "Neplatná požiadavka", + "Authentication error" : "Chyba autentifikácie", "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", @@ -49,6 +47,8 @@ "Invalid user" : "Neplatný používateľ", "Unable to change mail address" : "Nemožno zmeniť emailovú adresu", "Email saved" : "Email uložený", + "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", + "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ste si istí, že chcete pridať \"{domain}\" medzi dôveryhodné domény?", "Add trusted domain" : "Pridať dôveryhodnú doménu", "Migration in progress. Please wait until the migration is finished" : "Prebieha migrácia. Počkajte prosím, kým sa skončí", diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index 7addd9d7d3..7248797b6f 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Regjistër", "Tips & tricks" : "Ndihmëza & rrengje", "Updates" : "Përditësime", - "Authentication error" : "Gabim mirëfilltësimi", - "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", - "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Couldn't remove app." : "S’hoqi dot aplikacionin.", "Language changed" : "Gjuha u ndryshua", "Invalid request" : "Kërkesë e pavlefshme", + "Authentication error" : "Gabim mirëfilltësimi", "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", @@ -52,6 +50,8 @@ OC.L10N.register( "Invalid user" : "Përdorues i pavlefshëm", "Unable to change mail address" : "S’arrin të ndryshojë adresë email", "Email saved" : "Email-i u ruajt", + "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", + "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", "Add trusted domain" : "Shtoni përkatësi të besuar", "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index c5017a053a..1b27cb6d31 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -10,12 +10,10 @@ "Log" : "Regjistër", "Tips & tricks" : "Ndihmëza & rrengje", "Updates" : "Përditësime", - "Authentication error" : "Gabim mirëfilltësimi", - "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", - "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Couldn't remove app." : "S’hoqi dot aplikacionin.", "Language changed" : "Gjuha u ndryshua", "Invalid request" : "Kërkesë e pavlefshme", + "Authentication error" : "Gabim mirëfilltësimi", "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", @@ -50,6 +48,8 @@ "Invalid user" : "Përdorues i pavlefshëm", "Unable to change mail address" : "S’arrin të ndryshojë adresë email", "Email saved" : "Email-i u ruajt", + "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", + "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", "Add trusted domain" : "Shtoni përkatësi të besuar", "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js index 3a3bc29347..f0fc5eb338 100644 --- a/settings/l10n/sr.js +++ b/settings/l10n/sr.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Бележење", "Tips & tricks" : "Савети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка при провери идентитета", - "Your full name has been changed." : "Ваше пуно име је промењено.", - "Unable to change full name" : "Не могу да променим пуно име", "Couldn't remove app." : "Не могу да уклоним апликацију.", "Language changed" : "Језик је промењен", "Invalid request" : "Неисправан захтев", + "Authentication error" : "Грешка при провери идентитета", "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Неисправан корисник", "Unable to change mail address" : "Не могу да изменим е-адресу", "Email saved" : "Е-порука сачувана", + "Your full name has been changed." : "Ваше пуно име је промењено.", + "Unable to change full name" : "Не могу да променим пуно име", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Да ли заиста желите да додате „{domain}“ као поуздан домен?", "Add trusted domain" : "Додај поуздан домен", "Migration in progress. Please wait until the migration is finished" : "Пресељење је у току. Сачекајте док се не заврши", diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json index 5003066df7..ec0d3f078d 100644 --- a/settings/l10n/sr.json +++ b/settings/l10n/sr.json @@ -10,12 +10,10 @@ "Log" : "Бележење", "Tips & tricks" : "Савети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка при провери идентитета", - "Your full name has been changed." : "Ваше пуно име је промењено.", - "Unable to change full name" : "Не могу да променим пуно име", "Couldn't remove app." : "Не могу да уклоним апликацију.", "Language changed" : "Језик је промењен", "Invalid request" : "Неисправан захтев", + "Authentication error" : "Грешка при провери идентитета", "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", @@ -49,6 +47,8 @@ "Invalid user" : "Неисправан корисник", "Unable to change mail address" : "Не могу да изменим е-адресу", "Email saved" : "Е-порука сачувана", + "Your full name has been changed." : "Ваше пуно име је промењено.", + "Unable to change full name" : "Не могу да променим пуно име", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Да ли заиста желите да додате „{domain}“ као поуздан домен?", "Add trusted domain" : "Додај поуздан домен", "Migration in progress. Please wait until the migration is finished" : "Пресељење је у току. Сачекајте док се не заврши", diff --git a/settings/l10n/sr@latin.js b/settings/l10n/sr@latin.js index baacd0efdd..e7319b531f 100644 --- a/settings/l10n/sr@latin.js +++ b/settings/l10n/sr@latin.js @@ -3,9 +3,9 @@ OC.L10N.register( { "External Storage" : "Spoljašnje skladište", "Updates" : "Ažuriranja", - "Authentication error" : "Greška pri autentifikaciji", "Language changed" : "Jezik je izmenjen", "Invalid request" : "Neispravan zahtev", + "Authentication error" : "Greška pri autentifikaciji", "Saved" : "Sačuvano", "Email sent" : "Email poslat", "Very weak password" : "Veoma slaba lozinka", diff --git a/settings/l10n/sr@latin.json b/settings/l10n/sr@latin.json index 70392768da..f53b0f418c 100644 --- a/settings/l10n/sr@latin.json +++ b/settings/l10n/sr@latin.json @@ -1,9 +1,9 @@ { "translations": { "External Storage" : "Spoljašnje skladište", "Updates" : "Ažuriranja", - "Authentication error" : "Greška pri autentifikaciji", "Language changed" : "Jezik je izmenjen", "Invalid request" : "Neispravan zahtev", + "Authentication error" : "Greška pri autentifikaciji", "Saved" : "Sačuvano", "Email sent" : "Email poslat", "Very weak password" : "Veoma slaba lozinka", diff --git a/settings/l10n/ta_LK.js b/settings/l10n/ta_LK.js index f611af9eb1..e1c01ee9d5 100644 --- a/settings/l10n/ta_LK.js +++ b/settings/l10n/ta_LK.js @@ -2,9 +2,9 @@ OC.L10N.register( "settings", { "External Storage" : "வெளி சேமிப்பு", - "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Language changed" : "மொழி மாற்றப்பட்டது", "Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்", + "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "Email saved" : "மின்னஞ்சல் சேமிக்கப்பட்டது", diff --git a/settings/l10n/ta_LK.json b/settings/l10n/ta_LK.json index 1a16f5f7b3..84c2acbe2a 100644 --- a/settings/l10n/ta_LK.json +++ b/settings/l10n/ta_LK.json @@ -1,8 +1,8 @@ { "translations": { "External Storage" : "வெளி சேமிப்பு", - "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Language changed" : "மொழி மாற்றப்பட்டது", "Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்", + "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "Email saved" : "மின்னஞ்சல் சேமிக்கப்பட்டது", diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index f5fa8a547d..28cc6d0e3b 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "เราขอแนะนำให้ติดตั้งแพคเกจที่จำเป็นต้องใช้ในระบบของคุณ ให้การสนับสนุนตำแหน่งที่ตั้งดังต่อไปนี้: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "หากการติดตั้งของคุณไม่ได้ติดตั้งในรากของโดเมนและใช้ระบบ cron อาจมีปัญหาเกี่ยวกับการสร้าง URL เพื่อหลีกเลี่ยงปัญหาเหล่านี้โปรดไปตั้งค่า \"overwrite.cli.url\" ในไฟล์ config.php ของคุณไปยังเส้นทาง webroot ของการติดตั้งของคุณ (แนะนำ: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "มันเป็นไปไม่ได้ที่จะดำเนินการ cronjob ผ่านทาง CLI ข้อผิดพลาดทางเทคนิคต่อไปนี้จะปรากฏ:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "การทำธุรกรรมล็อคไฟล์จะใช้ฐานข้อมูลเป็นล็อคแบ็กเอนด์ สำหรับประสิทธิภาพที่ดีที่สุดก็ควรที่จะกำหนดค่า memcache สำหรับล็อค ดูเพิ่มเติมได้จาก เอกสาร", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "กรุณาตรวจสอบ คู่มือการติดตั้ง และตรวจสอบข้อผิดพลาดหรือคำเตือนใน บันทึก", "All checks passed." : "ผ่านการตรวจสอบทั้งหมด", "Open documentation" : "เปิดเอกสาร", diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index 90eaa41ea9..16757eda42 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "เราขอแนะนำให้ติดตั้งแพคเกจที่จำเป็นต้องใช้ในระบบของคุณ ให้การสนับสนุนตำแหน่งที่ตั้งดังต่อไปนี้: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "หากการติดตั้งของคุณไม่ได้ติดตั้งในรากของโดเมนและใช้ระบบ cron อาจมีปัญหาเกี่ยวกับการสร้าง URL เพื่อหลีกเลี่ยงปัญหาเหล่านี้โปรดไปตั้งค่า \"overwrite.cli.url\" ในไฟล์ config.php ของคุณไปยังเส้นทาง webroot ของการติดตั้งของคุณ (แนะนำ: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "มันเป็นไปไม่ได้ที่จะดำเนินการ cronjob ผ่านทาง CLI ข้อผิดพลาดทางเทคนิคต่อไปนี้จะปรากฏ:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "การทำธุรกรรมล็อคไฟล์จะใช้ฐานข้อมูลเป็นล็อคแบ็กเอนด์ สำหรับประสิทธิภาพที่ดีที่สุดก็ควรที่จะกำหนดค่า memcache สำหรับล็อค ดูเพิ่มเติมได้จาก เอกสาร", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "กรุณาตรวจสอบ คู่มือการติดตั้ง และตรวจสอบข้อผิดพลาดหรือคำเตือนใน บันทึก", "All checks passed." : "ผ่านการตรวจสอบทั้งหมด", "Open documentation" : "เปิดเอกสาร", diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index eb003a1f2f..0e8bbe28b1 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Günlük", "Tips & tricks" : "İpuçları ve hileler", "Updates" : "Güncellemeler", - "Authentication error" : "Kimlik doğrulama hatası", - "Your full name has been changed." : "Tam adınız değiştirildi.", - "Unable to change full name" : "Tam adınız değiştirilirken hata", "Couldn't remove app." : "Uygulama kaldırılamadı.", "Language changed" : "Dil değiştirildi", "Invalid request" : "Geçersiz istek", + "Authentication error" : "Kimlik doğrulama hatası", "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Geçersiz kullanıcı", "Unable to change mail address" : "Posta adresini değiştirme başarısız", "Email saved" : "E-posta kaydedildi", + "Your full name has been changed." : "Tam adınız değiştirildi.", + "Unable to change full name" : "Tam adınız değiştirilirken hata", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" alan adını güvenilir alan adı olarak eklemek istediğinizden emin misiniz?", "Add trusted domain" : "Güvenilir alan adı ekle", "Migration in progress. Please wait until the migration is finished" : "Taşınma sürüyor. Lütfen taşınma tamamlanana kadar bekleyin", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "İşlemsel dosya kilidi, kilitleme arkaucu olarak veritabanını kullanıyor. En iyi performans için kilitleme adına memcache yapılandırılması önerilir. Daha fazla bilgi için belgelendirmeye ↗ bakın.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lütfen kurulum rehberlerini ↗ iki kez denetleyip günlük içerisindeki hata ve uyarılara bakın.", "All checks passed." : "Tüm kontroller geçildi.", "Open documentation" : "Belgelendirmeyi aç", diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index c96a4f566c..4774d4dc48 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -10,12 +10,10 @@ "Log" : "Günlük", "Tips & tricks" : "İpuçları ve hileler", "Updates" : "Güncellemeler", - "Authentication error" : "Kimlik doğrulama hatası", - "Your full name has been changed." : "Tam adınız değiştirildi.", - "Unable to change full name" : "Tam adınız değiştirilirken hata", "Couldn't remove app." : "Uygulama kaldırılamadı.", "Language changed" : "Dil değiştirildi", "Invalid request" : "Geçersiz istek", + "Authentication error" : "Kimlik doğrulama hatası", "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", @@ -51,6 +49,8 @@ "Invalid user" : "Geçersiz kullanıcı", "Unable to change mail address" : "Posta adresini değiştirme başarısız", "Email saved" : "E-posta kaydedildi", + "Your full name has been changed." : "Tam adınız değiştirildi.", + "Unable to change full name" : "Tam adınız değiştirilirken hata", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" alan adını güvenilir alan adı olarak eklemek istediğinizden emin misiniz?", "Add trusted domain" : "Güvenilir alan adı ekle", "Migration in progress. Please wait until the migration is finished" : "Taşınma sürüyor. Lütfen taşınma tamamlanana kadar bekleyin", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "İşlemsel dosya kilidi, kilitleme arkaucu olarak veritabanını kullanıyor. En iyi performans için kilitleme adına memcache yapılandırılması önerilir. Daha fazla bilgi için belgelendirmeye ↗ bakın.", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lütfen kurulum rehberlerini ↗ iki kez denetleyip günlük içerisindeki hata ve uyarılara bakın.", "All checks passed." : "Tüm kontroller geçildi.", "Open documentation" : "Belgelendirmeyi aç", diff --git a/settings/l10n/ug.js b/settings/l10n/ug.js index fafe6cf559..0182ed481c 100644 --- a/settings/l10n/ug.js +++ b/settings/l10n/ug.js @@ -3,9 +3,9 @@ OC.L10N.register( { "Sharing" : "ھەمبەھىر", "Log" : "خاتىرە", - "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Language changed" : "تىل ئۆزگەردى", "Invalid request" : "ئىناۋەتسىز ئىلتىماس", + "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", diff --git a/settings/l10n/ug.json b/settings/l10n/ug.json index f81f82ab70..30a13dd57f 100644 --- a/settings/l10n/ug.json +++ b/settings/l10n/ug.json @@ -1,9 +1,9 @@ { "translations": { "Sharing" : "ھەمبەھىر", "Log" : "خاتىرە", - "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Language changed" : "تىل ئۆزگەردى", "Invalid request" : "ئىناۋەتسىز ئىلتىماس", + "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js index 2775efd8fa..6818791d10 100644 --- a/settings/l10n/uk.js +++ b/settings/l10n/uk.js @@ -11,12 +11,10 @@ OC.L10N.register( "Log" : "Журнал", "Tips & tricks" : "Поради і трюки", "Updates" : "Оновлення", - "Authentication error" : "Помилка автентифікації", - "Your full name has been changed." : "Ваше повне ім'я було змінено", - "Unable to change full name" : "Неможливо змінити повне ім'я", "Couldn't remove app." : "Неможливо видалити додаток.", "Language changed" : "Мову змінено", "Invalid request" : "Некоректний запит", + "Authentication error" : "Помилка автентифікації", "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", @@ -52,6 +50,8 @@ OC.L10N.register( "Invalid user" : "Неправильний користувач", "Unable to change mail address" : "Неможливо поміняти email адресу", "Email saved" : "Адресу збережено", + "Your full name has been changed." : "Ваше повне ім'я було змінено", + "Unable to change full name" : "Неможливо змінити повне ім'я", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ви дійсно бажаєте додати \"{domain}\" як довірений домен?", "Add trusted domain" : "Додати довірений домен", "Migration in progress. Please wait until the migration is finished" : "Міграція триває. Будь ласка, зачекайте доки процес міграції завершиться", diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json index d2a594fffc..1b75667fd3 100644 --- a/settings/l10n/uk.json +++ b/settings/l10n/uk.json @@ -9,12 +9,10 @@ "Log" : "Журнал", "Tips & tricks" : "Поради і трюки", "Updates" : "Оновлення", - "Authentication error" : "Помилка автентифікації", - "Your full name has been changed." : "Ваше повне ім'я було змінено", - "Unable to change full name" : "Неможливо змінити повне ім'я", "Couldn't remove app." : "Неможливо видалити додаток.", "Language changed" : "Мову змінено", "Invalid request" : "Некоректний запит", + "Authentication error" : "Помилка автентифікації", "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", @@ -50,6 +48,8 @@ "Invalid user" : "Неправильний користувач", "Unable to change mail address" : "Неможливо поміняти email адресу", "Email saved" : "Адресу збережено", + "Your full name has been changed." : "Ваше повне ім'я було змінено", + "Unable to change full name" : "Неможливо змінити повне ім'я", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ви дійсно бажаєте додати \"{domain}\" як довірений домен?", "Add trusted domain" : "Додати довірений домен", "Migration in progress. Please wait until the migration is finished" : "Міграція триває. Будь ласка, зачекайте доки процес міграції завершиться", diff --git a/settings/l10n/vi.js b/settings/l10n/vi.js index c451a11e48..ff82c3e6ca 100644 --- a/settings/l10n/vi.js +++ b/settings/l10n/vi.js @@ -6,11 +6,9 @@ OC.L10N.register( "External Storage" : "Lưu trữ ngoài", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Lỗi xác thực", - "Your full name has been changed." : "Họ và tên đã được thay đổi.", - "Unable to change full name" : "Họ và tên không thể đổi ", "Language changed" : "Ngôn ngữ đã được thay đổi", "Invalid request" : "Yêu cầu không hợp lệ", + "Authentication error" : "Lỗi xác thực", "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", @@ -19,6 +17,8 @@ OC.L10N.register( "Saved" : "Đã lưu", "Email sent" : "Email đã được gửi", "Email saved" : "Lưu email", + "Your full name has been changed." : "Họ và tên đã được thay đổi.", + "Unable to change full name" : "Họ và tên không thể đổi ", "All" : "Tất cả", "Please wait...." : "Xin hãy đợi...", "Disable" : "Tắt", diff --git a/settings/l10n/vi.json b/settings/l10n/vi.json index a86e778713..95674c8fb3 100644 --- a/settings/l10n/vi.json +++ b/settings/l10n/vi.json @@ -4,11 +4,9 @@ "External Storage" : "Lưu trữ ngoài", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Lỗi xác thực", - "Your full name has been changed." : "Họ và tên đã được thay đổi.", - "Unable to change full name" : "Họ và tên không thể đổi ", "Language changed" : "Ngôn ngữ đã được thay đổi", "Invalid request" : "Yêu cầu không hợp lệ", + "Authentication error" : "Lỗi xác thực", "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", @@ -17,6 +15,8 @@ "Saved" : "Đã lưu", "Email sent" : "Email đã được gửi", "Email saved" : "Lưu email", + "Your full name has been changed." : "Họ và tên đã được thay đổi.", + "Unable to change full name" : "Họ và tên không thể đổi ", "All" : "Tất cả", "Please wait...." : "Xin hãy đợi...", "Disable" : "Tắt", diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js index 624858c842..cc01afbf24 100644 --- a/settings/l10n/zh_CN.js +++ b/settings/l10n/zh_CN.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅文档↗了解详情。", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "请点击检查 安装向导 ↗, 点击 日志 查看详细错误和警告。", "All checks passed." : "所有检查已通过。", "Open documentation" : "打开文档", diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json index f927bb35a4..e5532b98a5 100644 --- a/settings/l10n/zh_CN.json +++ b/settings/l10n/zh_CN.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅文档↗了解详情。", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "请点击检查 安装向导 ↗, 点击 日志 查看详细错误和警告。", "All checks passed." : "所有检查已通过。", "Open documentation" : "打开文档", diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js index e863891e04..c0cf5ad402 100644 --- a/settings/l10n/zh_TW.js +++ b/settings/l10n/zh_TW.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "紀錄檔", "Tips & tricks" : "技巧 & 提示", "Updates" : "更新", - "Authentication error" : "認證錯誤", - "Your full name has been changed." : "您的全名已變更。", - "Unable to change full name" : "無法變更全名", "Couldn't remove app." : "無法移除應用程式", "Language changed" : "語言已變更", "Invalid request" : "無效請求", + "Authentication error" : "認證錯誤", "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", "Unable to add user to group %s" : "使用者加入群組 %s 錯誤", "Unable to remove user from group %s" : "使用者移出群組 %s 錯誤", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "無效的使用者", "Unable to change mail address" : "無法更改 email 地址", "Email saved" : "Email 已儲存", + "Your full name has been changed." : "您的全名已變更。", + "Unable to change full name" : "無法變更全名", "Are you really sure you want add \"{domain}\" as trusted domain?" : "您確定要新增 \"{domain}' 為信任的網域?", "Add trusted domain" : "新增信任的網域", "Migration in progress. Please wait until the migration is finished" : "資料搬移中,請耐心等候直到資料搬移結束", @@ -133,7 +133,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我們強烈建議在您的系統上安裝必要的套件來支援以下的語系: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果您不是使用root來安裝,而是透過系統自定義的排程的話,URL的生成可能會有問題,為了避免這樣的狀況,請您在config.php檔案裡設置 \"overwrite.cli.url\",設定您安裝的webroot的路徑 (建議值: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : " 不可能透過CLI來執行cronjob,發生以下技術性錯誤:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "事務型文件鎖定目前是使用後端資料庫的鎖定功能,為了達到最好的效能,建議鎖定功能使用記憶體快取,請看文件手冊 ↗ 來獲得更多的資訊。", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "請再次檢查 安裝導引手冊 ↗,並且確定沒有任何的錯誤或是警告訊息在 記錄檔。", "All checks passed." : "通過所有的檢查。", "Open documentation" : "開啟文件", diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json index 312d93ea25..aaa5881d44 100644 --- a/settings/l10n/zh_TW.json +++ b/settings/l10n/zh_TW.json @@ -10,12 +10,10 @@ "Log" : "紀錄檔", "Tips & tricks" : "技巧 & 提示", "Updates" : "更新", - "Authentication error" : "認證錯誤", - "Your full name has been changed." : "您的全名已變更。", - "Unable to change full name" : "無法變更全名", "Couldn't remove app." : "無法移除應用程式", "Language changed" : "語言已變更", "Invalid request" : "無效請求", + "Authentication error" : "認證錯誤", "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", "Unable to add user to group %s" : "使用者加入群組 %s 錯誤", "Unable to remove user from group %s" : "使用者移出群組 %s 錯誤", @@ -51,6 +49,8 @@ "Invalid user" : "無效的使用者", "Unable to change mail address" : "無法更改 email 地址", "Email saved" : "Email 已儲存", + "Your full name has been changed." : "您的全名已變更。", + "Unable to change full name" : "無法變更全名", "Are you really sure you want add \"{domain}\" as trusted domain?" : "您確定要新增 \"{domain}' 為信任的網域?", "Add trusted domain" : "新增信任的網域", "Migration in progress. Please wait until the migration is finished" : "資料搬移中,請耐心等候直到資料搬移結束", @@ -131,7 +131,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我們強烈建議在您的系統上安裝必要的套件來支援以下的語系: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果您不是使用root來安裝,而是透過系統自定義的排程的話,URL的生成可能會有問題,為了避免這樣的狀況,請您在config.php檔案裡設置 \"overwrite.cli.url\",設定您安裝的webroot的路徑 (建議值: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : " 不可能透過CLI來執行cronjob,發生以下技術性錯誤:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the documentation ↗ for more information." : "事務型文件鎖定目前是使用後端資料庫的鎖定功能,為了達到最好的效能,建議鎖定功能使用記憶體快取,請看文件手冊 ↗ 來獲得更多的資訊。", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "請再次檢查 安裝導引手冊 ↗,並且確定沒有任何的錯誤或是警告訊息在 記錄檔。", "All checks passed." : "通過所有的檢查。", "Open documentation" : "開啟文件", From f3360d51c6d069fc873a0b5563c01d37d58727c7 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Fri, 11 Dec 2015 06:17:47 +0100 Subject: [PATCH 072/194] Use PHP polyfills --- 3rdparty | 2 +- apps/encryption/lib/crypto/crypt.php | 31 +++----- apps/encryption/vendor/pbkdf2fallback.php | 87 ----------------------- apps/federation/api/ocsauthapi.php | 2 +- lib/private/appframework/http/request.php | 2 +- lib/private/log.php | 2 +- lib/private/security/crypto.php | 2 +- lib/private/security/hasher.php | 2 +- lib/private/security/securerandom.php | 47 ++++-------- lib/private/security/stringutils.php | 60 ---------------- lib/public/security/isecurerandom.php | 11 +-- lib/public/security/stringutils.php | 3 +- tests/lib/security/securerandom.php | 7 +- tests/lib/security/stringutils.php | 38 ---------- 14 files changed, 39 insertions(+), 257 deletions(-) delete mode 100644 apps/encryption/vendor/pbkdf2fallback.php delete mode 100644 lib/private/security/stringutils.php delete mode 100644 tests/lib/security/stringutils.php diff --git a/3rdparty b/3rdparty index a7b34d6f83..56934b1fc0 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit a7b34d6f831c8fa363f389d27acd0150128fc0b9 +Subproject commit 56934b1fc0f15760690c7a28c6c6429ce6ce6bef diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php index dbc0364a15..12e9008545 100644 --- a/apps/encryption/lib/crypto/crypt.php +++ b/apps/encryption/lib/crypto/crypt.php @@ -30,7 +30,6 @@ use OC\Encryption\Exceptions\DecryptionFailedException; use OC\Encryption\Exceptions\EncryptionFailedException; use OCA\Encryption\Exceptions\MultiKeyDecryptException; use OCA\Encryption\Exceptions\MultiKeyEncryptException; -use OCA\Encryption\Vendor\PBKDF2Fallback; use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\IConfig; use OCP\ILogger; @@ -293,28 +292,14 @@ class Crypt { $salt = hash('sha256', $uid . $instanceId . $instanceSecret, true); $keySize = $this->getKeySize($cipher); - if (function_exists('hash_pbkdf2')) { - $hash = hash_pbkdf2( - 'sha256', - $password, - $salt, - 100000, - $keySize, - true - ); - } else { - // fallback to 3rdparty lib for PHP <= 5.4. - // FIXME: Can be removed as soon as support for PHP 5.4 was dropped - $fallback = new PBKDF2Fallback(); - $hash = $fallback->pbkdf2( - 'sha256', - $password, - $salt, - 100000, - $keySize, - true - ); - } + $hash = hash_pbkdf2( + 'sha256', + $password, + $salt, + 100000, + $keySize, + true + ); return $hash; } diff --git a/apps/encryption/vendor/pbkdf2fallback.php b/apps/encryption/vendor/pbkdf2fallback.php deleted file mode 100644 index ca579f8e7d..0000000000 --- a/apps/encryption/vendor/pbkdf2fallback.php +++ /dev/null @@ -1,87 +0,0 @@ -dbHandler->getToken($url); - return StringUtils::equals($storedToken, $token); + return hash_equals($storedToken, $token); } } diff --git a/lib/private/appframework/http/request.php b/lib/private/appframework/http/request.php index 2bbb70db0f..6ba1d8f644 100644 --- a/lib/private/appframework/http/request.php +++ b/lib/private/appframework/http/request.php @@ -447,7 +447,7 @@ class Request implements \ArrayAccess, \Countable, IRequest { $deobfuscatedToken = base64_decode($obfuscatedToken) ^ $secret; // Check if the token is valid - if(\OCP\Security\StringUtils::equals($deobfuscatedToken, $this->items['requesttoken'])) { + if(hash_equals($deobfuscatedToken, $this->items['requesttoken'])) { return true; } else { return false; diff --git a/lib/private/log.php b/lib/private/log.php index ee5d61e98d..a722243dc6 100644 --- a/lib/private/log.php +++ b/lib/private/log.php @@ -227,7 +227,7 @@ class Log implements ILogger { $request = \OC::$server->getRequest(); // if token is found in the request change set the log condition to satisfied - if($request && StringUtils::equals($request->getParam('log_secret'), $logCondition['shared_secret'])) { + if($request && hash_equals($logCondition['shared_secret'], $request->getParam('log_secret'))) { $this->logConditionSatisfied = true; } } diff --git a/lib/private/security/crypto.php b/lib/private/security/crypto.php index 0bd34df3f3..46d0c750b2 100644 --- a/lib/private/security/crypto.php +++ b/lib/private/security/crypto.php @@ -123,7 +123,7 @@ class Crypto implements ICrypto { $this->cipher->setIV($iv); - if(!\OCP\Security\StringUtils::equals($this->calculateHMAC($parts[0].$parts[1], $password), $hmac)) { + if(!hash_equals($this->calculateHMAC($parts[0].$parts[1], $password), $hmac)) { throw new \Exception('HMAC does not match.'); } diff --git a/lib/private/security/hasher.php b/lib/private/security/hasher.php index a5dd22e5dc..318141b685 100644 --- a/lib/private/security/hasher.php +++ b/lib/private/security/hasher.php @@ -109,7 +109,7 @@ class Hasher implements IHasher { // Verify whether it matches a legacy PHPass or SHA1 string $hashLength = strlen($hash); if($hashLength === 60 && password_verify($message.$this->legacySalt, $hash) || - $hashLength === 40 && StringUtils::equals($hash, sha1($message))) { + $hashLength === 40 && hash_equals($hash, sha1($message))) { $newHash = $this->hash($message); return true; } diff --git a/lib/private/security/securerandom.php b/lib/private/security/securerandom.php index 87dca68985..24affbe898 100644 --- a/lib/private/security/securerandom.php +++ b/lib/private/security/securerandom.php @@ -27,25 +27,15 @@ use Sabre\DAV\Exception; use OCP\Security\ISecureRandom; /** - * Class SecureRandom provides a layer around RandomLib to generate - * secure random strings. For PHP 7 the native CSPRNG is used. + * Class SecureRandom provides a wrapper around the random_int function to generate + * secure random strings. For PHP 7 the native CSPRNG is used, older versions do + * use a fallback. * * Usage: - * \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(10); - * + * \OC::$server->getSecureRandom()->generate(10); * @package OC\Security */ class SecureRandom implements ISecureRandom { - - /** @var \RandomLib\Factory */ - var $factory; - /** @var \RandomLib\Generator */ - var $generator; - - function __construct() { - $this->factory = new RandomLib\Factory; - } - /** * Convenience method to get a low strength random number generator. * @@ -53,10 +43,10 @@ class SecureRandom implements ISecureRandom { * in a non-cryptographical setting. They are not strong enough to be * used as keys or salts. They are however useful for one-time use tokens. * + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() * @return $this */ public function getLowStrengthGenerator() { - $this->generator = $this->factory->getLowStrengthGenerator(); return $this; } @@ -67,10 +57,10 @@ class SecureRandom implements ISecureRandom { * They are strong enough to be used as keys and salts. However, they do * take some time and resources to generate, so they should not be over-used * + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() * @return $this */ public function getMediumStrengthGenerator() { - $this->generator = $this->factory->getMediumStrengthGenerator(); return $this; } @@ -80,26 +70,17 @@ class SecureRandom implements ISecureRandom { * @param string $characters An optional list of characters to use if no character list is * specified all valid base64 characters are used. * @return string - * @throws \Exception If the generator is not initialized. */ public function generate($length, $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/') { - if(is_null($this->generator)) { - throw new \Exception('Generator is not initialized.'); + $maxCharIndex = strlen($characters) - 1; + $randomString = ''; + + while($length > 0) { + $randomNumber = random_int(0, $maxCharIndex); + $randomString .= $characters[$randomNumber]; + $length--; } - - if(function_exists('random_int')) { - $maxCharIndex = strlen($characters) - 1; - $randomString = ''; - - while($length > 0) { - $randomNumber = random_int(0, $maxCharIndex); - $randomString .= $characters[$randomNumber]; - $length--; - } - return $randomString; - } - - return $this->generator->generateString($length, $characters); + return $randomString; } } diff --git a/lib/private/security/stringutils.php b/lib/private/security/stringutils.php deleted file mode 100644 index fa4342a2b4..0000000000 --- a/lib/private/security/stringutils.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @author Morris Jobke - * - * @copyright Copyright (c) 2015, 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 OC\Security; - -class StringUtils { - - /** - * Compares whether two strings are equal. To prevent guessing of the string - * length this is done by comparing two hashes against each other and afterwards - * a comparison of the real string to prevent against the unlikely chance of - * collisions. - * - * Be aware that this function may leak whether the string to compare have a different - * length. - * - * @param string $expected The expected value - * @param string $input The input to compare against - * @return bool True if the two strings are equal, otherwise false. - */ - public static function equals($expected, $input) { - - if(!is_string($expected) || !is_string($input)) { - return false; - } - - if(function_exists('hash_equals')) { - return hash_equals($expected, $input); - } - - $randomString = \OC::$server->getSecureRandom()->getLowStrengthGenerator()->generate(10); - - if(hash('sha512', $expected.$randomString) === hash('sha512', $input.$randomString)) { - if($expected === $input) { - return true; - } - } - - return false; - } -} \ No newline at end of file diff --git a/lib/public/security/isecurerandom.php b/lib/public/security/isecurerandom.php index 1b72e4f437..8315d0f971 100644 --- a/lib/public/security/isecurerandom.php +++ b/lib/public/security/isecurerandom.php @@ -23,12 +23,12 @@ namespace OCP\Security; /** - * Class SecureRandom provides a layer around RandomLib to generate - * secure random strings. For PHP 7 the native CSPRNG is used. + * Class SecureRandom provides a wrapper around the random_int function to generate + * secure random strings. For PHP 7 the native CSPRNG is used, older versions do + * use a fallback. * * Usage: - * $rng = new \OC\Security\SecureRandom(); - * $randomString = $rng->getMediumStrengthGenerator()->generateString(30); + * \OC::$server->getSecureRandom()->generate(10); * * @package OCP\Security * @since 8.0.0 @@ -52,6 +52,7 @@ interface ISecureRandom { * * @return $this * @since 8.0.0 + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() */ public function getLowStrengthGenerator(); @@ -64,6 +65,7 @@ interface ISecureRandom { * * @return $this * @since 8.0.0 + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() */ public function getMediumStrengthGenerator(); @@ -73,7 +75,6 @@ interface ISecureRandom { * @param string $characters An optional list of characters to use if no character list is * specified all valid base64 characters are used. * @return string - * @throws \Exception If the generator is not initialized. * @since 8.0.0 */ public function generate($length, diff --git a/lib/public/security/stringutils.php b/lib/public/security/stringutils.php index 4f41fcf826..7cf12ea270 100644 --- a/lib/public/security/stringutils.php +++ b/lib/public/security/stringutils.php @@ -39,8 +39,9 @@ class StringUtils { * @param string $input The input to compare against * @return bool True if the two strings are equal, otherwise false. * @since 8.0.0 + * @deprecated 9.0.0 Use hash_equals */ public static function equals($expected, $input) { - return \OC\Security\StringUtils::equals($expected, $input); + return hash_equals($expected, $input); } } diff --git a/tests/lib/security/securerandom.php b/tests/lib/security/securerandom.php index d9bbd0e71e..af43764080 100644 --- a/tests/lib/security/securerandom.php +++ b/tests/lib/security/securerandom.php @@ -57,11 +57,10 @@ class SecureRandomTest extends \Test\TestCase { } /** - * @expectedException \Exception - * @expectedExceptionMessage Generator is not initialized + * @dataProvider stringGenerationProvider */ - function testUninitializedGenerate() { - $this->rng->generate(30); + function testUninitializedGenerate($length, $expectedLength) { + $this->assertEquals($expectedLength, strlen($this->rng->generate($length))); } /** diff --git a/tests/lib/security/stringutils.php b/tests/lib/security/stringutils.php deleted file mode 100644 index 060315debb..0000000000 --- a/tests/lib/security/stringutils.php +++ /dev/null @@ -1,38 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -use \OC\Security\StringUtils; - -class StringUtilsTest extends \Test\TestCase { - - public function dataProvider() - { - return array( - array('Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.', 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.'), - array('', ''), - array('我看这本书。 我看這本書', '我看这本书。 我看這本書'), - array('GpKY9fSnWNJbES99zVGvA', 'GpKY9fSnWNJbES99zVGvA') - ); - } - - /** - * @dataProvider dataProvider - */ - function testWrongEquals($string) { - $this->assertFalse(StringUtils::equals($string, 'A Completely Wrong String')); - $this->assertFalse(StringUtils::equals($string, null)); - } - - /** - * @dataProvider dataProvider - */ - function testTrueEquals($string, $expected) { - $this->assertTrue(StringUtils::equals($string, $expected)); - } - -} From 60071ef04050e7a11e9e691043193dc892c9d935 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 11 Dec 2015 09:56:24 +0100 Subject: [PATCH 073/194] Fix the sample occ config call --- issue_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/issue_template.md b/issue_template.md index 3859ea1c41..4932a402ea 100644 --- a/issue_template.md +++ b/issue_template.md @@ -34,7 +34,7 @@ from within your ownCloud installation folder ``` If you have access to your command line run e.g.: -sudo -u www-data php occ config:list system --public +sudo -u www-data php occ config:list system from within your ownCloud installation folder or From 0f122dcefef14b37a53760b2cf947927fa2b9dee Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 11 Dec 2015 09:59:38 +0100 Subject: [PATCH 074/194] Remove steps for ownCloud 6 --- issue_template.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/issue_template.md b/issue_template.md index 4932a402ea..0295eb9c33 100644 --- a/issue_template.md +++ b/issue_template.md @@ -52,16 +52,14 @@ Insert your config.php content here #### LDAP configuration (delete this part if not used) ``` -On ownCloud 7+ with access to your command line run e.g.: +With access to your command line run e.g.: sudo -u www-data php occ ldap:show-config from within your ownCloud installation folder -On ownCloud 6 with access to your command line run e.g.: -sqlite3 data/owncloud.db or mysql -u root -p owncloud -then execute: select * from oc_appconfig where appid='user_ldap'; - Without access to your command line download the data/owncloud.db to your local -computer or access your SQL server remotely and run the select query above. +computer or access your SQL server remotely and run the select query: +SELECT * FROM `oc_appconfig` WHERE `appid` = 'user_ldap'; + Eventually replace sensitive data as the name/IP-address of your LDAP server or groups. ``` From 2f3b10f980db9a54fc0022c69387ae5d7d9c0914 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Fri, 11 Dec 2015 10:20:01 +0100 Subject: [PATCH 075/194] Adjust third-party reference --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index 56934b1fc0..8face268eb 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 56934b1fc0f15760690c7a28c6c6429ce6ce6bef +Subproject commit 8face268eb0db84b3a53b84f6c2a3d4ab555e615 From 13ec2bda2d1eb826951e9e5336ecac6ff6d1d199 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 11 Dec 2015 11:22:38 +0100 Subject: [PATCH 076/194] Properly check X-Requested-With header in case of multiple values Saw this happening in IE8... --- apps/dav/lib/connector/sabre/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dav/lib/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php index 4f31977023..7f4f4a531b 100644 --- a/apps/dav/lib/connector/sabre/auth.php +++ b/apps/dav/lib/connector/sabre/auth.php @@ -160,7 +160,7 @@ class Auth extends AbstractBasic { return [true, $this->principalPrefix . $user]; } - if (!$this->userSession->isLoggedIn() && $request->getHeader('X-Requested-With') === 'XMLHttpRequest') { + if (!$this->userSession->isLoggedIn() && in_array('XMLHttpRequest', explode(',', $request->getHeader('X-Requested-With')))) { // do not re-authenticate over ajax, use dummy auth name to prevent browser popup $response->addHeader('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"'); $response->setStatus(401); From aedbc0c6269aa16a733bd025aeb6d1a2360743fe Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 11 Dec 2015 12:52:12 +0100 Subject: [PATCH 077/194] adjust unit test --- apps/user_ldap/tests/user_ldap.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php index 7593371d85..b08706c71d 100644 --- a/apps/user_ldap/tests/user_ldap.php +++ b/apps/user_ldap/tests/user_ldap.php @@ -686,6 +686,14 @@ class Test_User_Ldap_Direct extends \Test\TestCase { return false; } })); + + $userMapper = $this->getMockBuilder('\OCA\User_LDAP\Mapping\UserMapping') + ->disableOriginalConstructor() + ->getMock(); + + $access->expects($this->any()) + ->method('getUserMapper') + ->will($this->returnValue($userMapper)); } public function testGetDisplayName() { From 415cf9278446b4422ef7633d944ca0f3aebcd301 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 27 Oct 2015 12:10:23 +0100 Subject: [PATCH 078/194] Fix thrashbin wrapper when no user is loggedin --- apps/files_trashbin/lib/storage.php | 5 +++-- apps/files_trashbin/tests/storage.php | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/files_trashbin/lib/storage.php b/apps/files_trashbin/lib/storage.php index 0e42df1e96..becde5e635 100644 --- a/apps/files_trashbin/lib/storage.php +++ b/apps/files_trashbin/lib/storage.php @@ -26,6 +26,7 @@ namespace OCA\Files_Trashbin; use OC\Files\Filesystem; use OC\Files\Storage\Wrapper\Wrapper; +use OC\Files\View; use OCP\IUserManager; class Storage extends Wrapper { @@ -151,8 +152,8 @@ class Storage extends Wrapper { $normalized = Filesystem::normalizePath($this->mountPoint . '/' . $path); $result = true; - if (!isset($this->deletedFiles[$normalized])) { - $view = Filesystem::getView(); + $view = Filesystem::getView(); + if (!isset($this->deletedFiles[$normalized]) && $view instanceof View) { $this->deletedFiles[$normalized] = $normalized; if ($filesPath = $view->getRelativePath($normalized)) { $filesPath = trim($filesPath, '/'); diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php index 3ebbbc3ec9..abd0810f21 100644 --- a/apps/files_trashbin/tests/storage.php +++ b/apps/files_trashbin/tests/storage.php @@ -531,4 +531,14 @@ class Storage extends \Test\TestCase { ['/schiesbn/', '/test.txt', false, false], ]; } + + /** + * Test that deleting a file doesn't error when nobody is logged in + */ + public function testSingleStorageDeleteFileLoggedOut() { + $this->logout(); + + $this->assertTrue($this->userView->file_exists('test.txt')); + $this->userView->unlink('test.txt'); + } } From 5b2957bad14adb7895f75dd27cafd2257e24e78a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 11 Dec 2015 14:29:38 +0100 Subject: [PATCH 079/194] skip test if we cant use the filesystem when not logged in --- apps/files_trashbin/tests/storage.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php index abd0810f21..387bb20c6d 100644 --- a/apps/files_trashbin/tests/storage.php +++ b/apps/files_trashbin/tests/storage.php @@ -538,7 +538,10 @@ class Storage extends \Test\TestCase { public function testSingleStorageDeleteFileLoggedOut() { $this->logout(); - $this->assertTrue($this->userView->file_exists('test.txt')); - $this->userView->unlink('test.txt'); + if (!$this->userView->file_exists('test.txt')) { + $this->markTestSkipped('Skipping since the current home storage backend requires the user to logged in'); + } else { + $this->userView->unlink('test.txt'); + } } } From baa5a69c55848aede39e14c936f837f77a221496 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 11 Dec 2015 15:14:30 +0100 Subject: [PATCH 080/194] Bring back file delete action text to be based on context For received shares, the delete action becomes "Unshare" and for personal mounts it becomes "Disconnect storage". This also makes it possible from now on to pass a function to a file action's "displayName" attribute. --- apps/files/js/fileactions.js | 26 +++++++++++++++++++--- apps/files/js/fileactionsmenu.js | 8 +++++++ apps/files/tests/js/fileactionsmenuSpec.js | 20 +++++++++++++++-- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 871a2149c8..67125f1570 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -617,7 +617,16 @@ this.registerAction({ name: 'Delete', - displayName: t('files', 'Delete'), + displayName: function(context) { + var mountType = context.$file.attr('data-mounttype'); + var deleteTitle = t('files', 'Delete'); + if (mountType === 'external-root') { + deleteTitle = t('files', 'Disconnect storage'); + } else if (mountType === 'shared-root') { + deleteTitle = t('files', 'Unshare'); + } + return deleteTitle; + }, mime: 'all', order: 1000, // permission is READ because we show a hint instead if there is no permission @@ -668,8 +677,9 @@ * @typedef {Object} OCA.Files.FileAction * * @property {String} name identifier of the action - * @property {String} displayName display name of the action, defaults - * to the name given in name property + * @property {(String|OCA.Files.FileActions~displayNameFunction)} displayName + * display name string for the action, or function that returns the display name. + * Defaults to the name given in name property * @property {String} mime mime type * @property {int} permissions permissions * @property {(Function|String)} icon icon path to the icon or function @@ -702,6 +712,16 @@ * @return {Object} jQuery link object */ + /** + * Display name function for actions. + * The function returns the display name of the action using + * the given context information.. + * + * @callback OCA.Files.FileActions~displayNameFunction + * @param {OCA.Files.FileActionContext} context action context + * @return {String} display name + */ + /** * Action handler function for file actions * diff --git a/apps/files/js/fileactionsmenu.js b/apps/files/js/fileactionsmenu.js index 67cbb48c96..9e51d8f1f1 100644 --- a/apps/files/js/fileactionsmenu.js +++ b/apps/files/js/fileactionsmenu.js @@ -81,6 +81,7 @@ * Renders the menu with the currently set items */ render: function() { + var self = this; var fileActions = this._context.fileActions; var actions = fileActions.getActions( fileActions.getCurrentMimeType(), @@ -100,6 +101,13 @@ (!defaultAction || actionSpec.name !== defaultAction.name) ); }); + items = _.map(items, function(item) { + if (_.isFunction(item.displayName)) { + item = _.extend({}, item); + item.displayName = item.displayName(self._context); + } + return item; + }); items = items.sort(function(actionA, actionB) { var orderA = actionA.order || 0; var orderB = actionB.order || 0; diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js index 747a746a60..3028db2b3a 100644 --- a/apps/files/tests/js/fileactionsmenuSpec.js +++ b/apps/files/tests/js/fileactionsmenuSpec.js @@ -20,7 +20,7 @@ */ describe('OCA.Files.FileActionsMenu tests', function() { - var fileList, fileActions, menu, actionStub, $tr; + var fileList, fileActions, menu, actionStub, menuContext, $tr; beforeEach(function() { // init horrible parameters @@ -80,7 +80,7 @@ describe('OCA.Files.FileActionsMenu tests', function() { }; $tr = fileList.add(fileData); - var menuContext = { + menuContext = { $file: $tr, fileList: fileList, fileActions: fileActions, @@ -189,6 +189,22 @@ describe('OCA.Files.FileActionsMenu tests', function() { var yactionIndex = menu.$el.find('a[data-action=Yaction]').closest('li').index(); expect(wactionIndex).toBeLessThan(yactionIndex); }); + it('calls displayName function', function() { + var displayNameStub = sinon.stub().returns('Test'); + + fileActions.registerAction({ + name: 'Something', + displayName: displayNameStub, + mime: 'text/plain', + permissions: OC.PERMISSION_ALL + }); + + menu.render(); + + expect(displayNameStub.calledOnce).toEqual(true); + expect(displayNameStub.calledWith(menuContext)).toEqual(true); + expect(menu.$el.find('a[data-action=Something]').text()).toEqual('Test'); + }); }); describe('action handler', function() { From 35a2639701ffdd257adbd7270ef8648c4ae9f15b Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Fri, 11 Dec 2015 17:25:57 +0100 Subject: [PATCH 081/194] unit test on getHome in combination with OfflineUser --- apps/user_ldap/tests/user_ldap.php | 54 ++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php index b08706c71d..3aec2a5ce5 100644 --- a/apps/user_ldap/tests/user_ldap.php +++ b/apps/user_ldap/tests/user_ldap.php @@ -70,14 +70,26 @@ class Test_User_Ldap_Direct extends \Test\TestCase { array($lw, null, null)); $this->configMock = $this->getMock('\OCP\IConfig'); - $um = new \OCA\user_ldap\lib\user\Manager( + + $offlineUser = $this->getMockBuilder('\OCA\user_ldap\lib\user\OfflineUser') + ->disableOriginalConstructor() + ->getMock(); + + $um = $this->getMockBuilder('\OCA\user_ldap\lib\user\Manager') + ->setMethods(['getDeletedUser']) + ->setConstructorArgs([ $this->configMock, $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'), $this->getMock('\OCA\user_ldap\lib\LogWrapper'), $this->getMock('\OCP\IAvatarManager'), $this->getMock('\OCP\Image'), $this->getMock('\OCP\IDBConnection') - ); + ]) + ->getMock(); + + $um->expects($this->any()) + ->method('getDeletedUser') + ->will($this->returnValue($offlineUser)); $access = $this->getMock('\OCA\user_ldap\lib\Access', $accMethods, @@ -661,6 +673,44 @@ class Test_User_Ldap_Direct extends \Test\TestCase { $this->assertFalse($result); } + /** + * @expectedException \OC\User\NoUserException + */ + public function testGetHomeDeletedUser() { + $access = $this->getAccessMock(); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); + $this->prepareMockForUserExists($access); + + $access->connection->expects($this->any()) + ->method('__get') + ->will($this->returnCallback(function($name) { + if($name === 'homeFolderNamingRule') { + return 'attr:testAttribute'; + } + return null; + })); + + $access->expects($this->any()) + ->method('readAttribute') + ->will($this->returnValue([])); + + $userMapper = $this->getMockBuilder('\OCA\User_LDAP\Mapping\UserMapping') + ->disableOriginalConstructor() + ->getMock(); + + $access->expects($this->any()) + ->method('getUserMapper') + ->will($this->returnValue($userMapper)); + + $this->configMock->expects($this->any()) + ->method('getUserValue') + ->will($this->returnValue(true)); + + //no path at all – triggers OC default behaviour + $result = $backend->getHome('newyorker'); + $this->assertFalse($result); + } + private function prepareAccessForGetDisplayName(&$access) { $access->connection->expects($this->any()) ->method('__get') From 32525fa9771a73e2bdd260ac38527afb9960d88a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 18 Nov 2015 20:26:14 +0100 Subject: [PATCH 082/194] save wip --- apps/dav/appinfo/app.php | 31 +++++++ apps/dav/lib/carddav/AddressBookImpl.php | 100 +++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 apps/dav/appinfo/app.php create mode 100644 apps/dav/lib/carddav/AddressBookImpl.php diff --git a/apps/dav/appinfo/app.php b/apps/dav/appinfo/app.php new file mode 100644 index 0000000000..0a54df19c7 --- /dev/null +++ b/apps/dav/appinfo/app.php @@ -0,0 +1,31 @@ + + * + * @copyright Copyright (c) 2015, 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 + * + */ + +$cm = \OC::$server->getContactsManager(); +$cm->register(function() use ($cm) { + $db = \OC::$server->getDatabaseConnection(); + $userId = \OC::$server->getUserSession()->getUser()->getUID(); + $cardDav = new \OCA\DAV\CardDAV\CardDavBackend($db); + $addressBooks = $cardDav->getAddressBooksForUser("principals/$userId"); + foreach ($addressBooks as $addressBook) { + $cm->registerAddressBook(new OCA\DAV\CardDAV\AddressBookImpl($addressBook)); + } +}); diff --git a/apps/dav/lib/carddav/AddressBookImpl.php b/apps/dav/lib/carddav/AddressBookImpl.php new file mode 100644 index 0000000000..7eee731fca --- /dev/null +++ b/apps/dav/lib/carddav/AddressBookImpl.php @@ -0,0 +1,100 @@ + + * + * @copyright Copyright (c) 2015, 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\CardDAV; + +class AddressBookImpl implements \OCP\IAddressBook { + + public function __construct(array $values, CardDavBackend $backend) { + $this->values = $values; + $this->backend = $backend; + /* + * 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + '{DAV:}displayname' => $row['displayname'], + '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], + '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], + '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', +*/ + } + + /** + * @return string defining the technical unique key + * @since 5.0.0 + */ + public function getKey() { + return $this->values['id']; + } + + /** + * In comparison to getKey() this function returns a human readable (maybe translated) name + * + * @return mixed + * @since 5.0.0 + */ + public function getDisplayName() { + return $this->values['{DAV:}displayname']; + } + + /** + * @param string $pattern which should match within the $searchProperties + * @param array $searchProperties defines the properties within the query pattern should match + * @param array $options - for future use. One should always have options! + * @return array an array of contacts which are arrays of key-value-pairs + * @since 5.0.0 + */ + public function search($pattern, $searchProperties, $options) { + // TODO: Implement search() method. + $cards = $this->backend->getCards($this->values['id']); + + // + // TODO: search now + // + + } + + /** + * @param array $properties this array if key-value-pairs defines a contact + * @return array an array representing the contact just created or updated + * @since 5.0.0 + */ + public function createOrUpdate($properties) { + // TODO: Implement createOrUpdate() method. + } + + /** + * @return mixed + * @since 5.0.0 + */ + public function getPermissions() { + // TODO: Implement getPermissions() method. + } + + /** + * @param object $id the unique identifier to a contact + * @return bool successful or not + * @since 5.0.0 + */ + public function delete($id) { + // TODO: Implement delete() method. + } +} From e8d5eb65c6825543096035b7481957bf5942a819 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Fri, 11 Dec 2015 22:28:26 +0100 Subject: [PATCH 083/194] Files can't have create permissions Fixes #20839 --- core/js/files/client.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/js/files/client.js b/core/js/files/client.js index 82cf3ff512..608c2702fb 100644 --- a/core/js/files/client.js +++ b/core/js/files/client.js @@ -303,10 +303,6 @@ } break; case 'W': - if (isFile) { - // also add create permissions - data.permissions |= OC.PERMISSION_CREATE; - } data.permissions |= OC.PERMISSION_UPDATE; break; case 'D': From f2ac1a80d8833b49c10a2195adbb1df1a002cff5 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sat, 12 Dec 2015 01:55:39 -0500 Subject: [PATCH 084/194] [tx-robot] updated from transifex --- apps/files/l10n/ar.js | 1 + apps/files/l10n/ar.json | 1 + apps/files/l10n/ast.js | 2 ++ apps/files/l10n/ast.json | 2 ++ apps/files/l10n/az.js | 2 ++ apps/files/l10n/az.json | 2 ++ apps/files/l10n/bn_BD.js | 1 + apps/files/l10n/bn_BD.json | 1 + apps/files/l10n/bs.js | 2 ++ apps/files/l10n/bs.json | 2 ++ apps/files/l10n/de_AT.js | 1 + apps/files/l10n/de_AT.json | 1 + apps/files/l10n/de_DE.js | 2 ++ apps/files/l10n/de_DE.json | 2 ++ apps/files/l10n/el.js | 2 ++ apps/files/l10n/el.json | 2 ++ apps/files/l10n/en_GB.js | 2 ++ apps/files/l10n/en_GB.json | 2 ++ apps/files/l10n/eo.js | 1 + apps/files/l10n/eo.json | 1 + apps/files/l10n/es.js | 2 ++ apps/files/l10n/es.json | 2 ++ apps/files/l10n/es_MX.js | 1 + apps/files/l10n/es_MX.json | 1 + apps/files/l10n/et_EE.js | 2 ++ apps/files/l10n/et_EE.json | 2 ++ apps/files/l10n/eu.js | 2 ++ apps/files/l10n/eu.json | 2 ++ apps/files/l10n/fa.js | 1 + apps/files/l10n/fa.json | 1 + apps/files/l10n/fi_FI.js | 2 ++ apps/files/l10n/fi_FI.json | 2 ++ apps/files/l10n/fr.js | 2 ++ apps/files/l10n/fr.json | 2 ++ apps/files/l10n/ia.js | 1 + apps/files/l10n/ia.json | 1 + apps/files/l10n/id.js | 2 ++ apps/files/l10n/id.json | 2 ++ apps/files/l10n/is.js | 1 + apps/files/l10n/is.json | 1 + apps/files/l10n/it.js | 2 ++ apps/files/l10n/it.json | 2 ++ apps/files/l10n/km.js | 1 + apps/files/l10n/km.json | 1 + apps/files/l10n/kn.js | 2 ++ apps/files/l10n/kn.json | 2 ++ apps/files/l10n/ko.js | 2 ++ apps/files/l10n/ko.json | 2 ++ apps/files/l10n/nb_NO.js | 2 ++ apps/files/l10n/nb_NO.json | 2 ++ apps/files/l10n/nl.js | 2 ++ apps/files/l10n/nl.json | 2 ++ apps/files/l10n/nn_NO.js | 1 + apps/files/l10n/nn_NO.json | 1 + apps/files/l10n/oc.js | 2 ++ apps/files/l10n/oc.json | 2 ++ apps/files/l10n/pl.js | 2 ++ apps/files/l10n/pl.json | 2 ++ apps/files/l10n/pt_BR.js | 2 ++ apps/files/l10n/pt_BR.json | 2 ++ apps/files/l10n/ro.js | 2 ++ apps/files/l10n/ro.json | 2 ++ apps/files/l10n/ru.js | 2 ++ apps/files/l10n/ru.json | 2 ++ apps/files/l10n/sl.js | 2 ++ apps/files/l10n/sl.json | 2 ++ apps/files/l10n/sq.js | 2 ++ apps/files/l10n/sq.json | 2 ++ apps/files/l10n/sr.js | 2 ++ apps/files/l10n/sr.json | 2 ++ apps/files/l10n/sr@latin.js | 2 ++ apps/files/l10n/sr@latin.json | 2 ++ apps/files/l10n/sv.js | 2 ++ apps/files/l10n/sv.json | 2 ++ apps/files/l10n/ug.js | 1 + apps/files/l10n/ug.json | 1 + apps/files/l10n/uk.js | 2 ++ apps/files/l10n/uk.json | 2 ++ apps/files/l10n/ur_PK.js | 1 + apps/files/l10n/ur_PK.json | 1 + apps/files/l10n/vi.js | 1 + apps/files/l10n/vi.json | 1 + apps/files/l10n/zh_TW.js | 2 ++ apps/files/l10n/zh_TW.json | 2 ++ apps/files_external/l10n/de.js | 4 ++++ apps/files_external/l10n/de.json | 4 ++++ core/l10n/de.js | 3 +++ core/l10n/de.json | 3 +++ 88 files changed, 156 insertions(+) diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index 953267393b..021c6b52b3 100644 --- a/apps/files/l10n/ar.js +++ b/apps/files/l10n/ar.js @@ -34,6 +34,7 @@ OC.L10N.register( "Download" : "تحميل", "Rename" : "إعادة التسمية", "Delete" : "حذف ", + "Unshare" : "إلغاء المشاركة", "Details" : "تفاصيل", "Select" : "اختار", "Pending" : "قيد الانتظار", diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index 245fe9a0b9..53385598c2 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -32,6 +32,7 @@ "Download" : "تحميل", "Rename" : "إعادة التسمية", "Delete" : "حذف ", + "Unshare" : "إلغاء المشاركة", "Details" : "تفاصيل", "Select" : "اختار", "Pending" : "قيد الانتظار", diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js index 8fc63c1ac3..637adcebc7 100644 --- a/apps/files/l10n/ast.js +++ b/apps/files/l10n/ast.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Descargar", "Rename" : "Renomar", "Delete" : "Desaniciar", + "Disconnect storage" : "Desconeutar almacenamientu", + "Unshare" : "Dexar de compartir", "Details" : "Detalles", "Select" : "Esbillar", "Pending" : "Pendiente", diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json index 33c119771f..352fbd9fac 100644 --- a/apps/files/l10n/ast.json +++ b/apps/files/l10n/ast.json @@ -32,6 +32,8 @@ "Download" : "Descargar", "Rename" : "Renomar", "Delete" : "Desaniciar", + "Disconnect storage" : "Desconeutar almacenamientu", + "Unshare" : "Dexar de compartir", "Details" : "Detalles", "Select" : "Esbillar", "Pending" : "Pendiente", diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js index cf7d81063c..302bb05140 100644 --- a/apps/files/l10n/az.js +++ b/apps/files/l10n/az.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Yüklə", "Rename" : "Adı dəyiş", "Delete" : "Sil", + "Disconnect storage" : "Daşıyıcını ayır", + "Unshare" : "Paylaşımı durdur", "Details" : "Detallar", "Select" : "Seç", "Pending" : "Gözləmə", diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json index f2c45fda2f..b213c86cb2 100644 --- a/apps/files/l10n/az.json +++ b/apps/files/l10n/az.json @@ -32,6 +32,8 @@ "Download" : "Yüklə", "Rename" : "Adı dəyiş", "Delete" : "Sil", + "Disconnect storage" : "Daşıyıcını ayır", + "Unshare" : "Paylaşımı durdur", "Details" : "Detallar", "Select" : "Seç", "Pending" : "Gözləmə", diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js index b968a225da..0ee56888df 100644 --- a/apps/files/l10n/bn_BD.js +++ b/apps/files/l10n/bn_BD.js @@ -26,6 +26,7 @@ OC.L10N.register( "Download" : "ডাউনলোড", "Rename" : "পূনঃনামকরণ", "Delete" : "মুছে", + "Unshare" : "ভাগাভাগি বাতিল ", "Details" : "বিস্তারিত", "Pending" : "মুলতুবি", "Name" : "রাম", diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json index bed559330a..15ec2b4b82 100644 --- a/apps/files/l10n/bn_BD.json +++ b/apps/files/l10n/bn_BD.json @@ -24,6 +24,7 @@ "Download" : "ডাউনলোড", "Rename" : "পূনঃনামকরণ", "Delete" : "মুছে", + "Unshare" : "ভাগাভাগি বাতিল ", "Details" : "বিস্তারিত", "Pending" : "মুলতুবি", "Name" : "রাম", diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js index 9da51ece87..278b637177 100644 --- a/apps/files/l10n/bs.js +++ b/apps/files/l10n/bs.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Preuzmi", "Rename" : "Preimenuj", "Delete" : "Izbriši", + "Disconnect storage" : "Diskonektuj pohranu", + "Unshare" : "Prestani dijeliti", "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Nemoguće odrediti datum", diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json index 095fe47048..678bedcbe3 100644 --- a/apps/files/l10n/bs.json +++ b/apps/files/l10n/bs.json @@ -32,6 +32,8 @@ "Download" : "Preuzmi", "Rename" : "Preimenuj", "Delete" : "Izbriši", + "Disconnect storage" : "Diskonektuj pohranu", + "Unshare" : "Prestani dijeliti", "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Nemoguće odrediti datum", diff --git a/apps/files/l10n/de_AT.js b/apps/files/l10n/de_AT.js index d7a77f9ee4..783ff4aaa6 100644 --- a/apps/files/l10n/de_AT.js +++ b/apps/files/l10n/de_AT.js @@ -5,6 +5,7 @@ OC.L10N.register( "Files" : "Dateien", "Download" : "Herunterladen", "Delete" : "Löschen", + "Unshare" : "Teilung zurücknehmen", "Details" : "Details", "New folder" : "Neuer Ordner", "Upload" : "Hochladen", diff --git a/apps/files/l10n/de_AT.json b/apps/files/l10n/de_AT.json index 7381a96665..2d54751bdf 100644 --- a/apps/files/l10n/de_AT.json +++ b/apps/files/l10n/de_AT.json @@ -3,6 +3,7 @@ "Files" : "Dateien", "Download" : "Herunterladen", "Delete" : "Löschen", + "Unshare" : "Teilung zurücknehmen", "Details" : "Details", "New folder" : "Neuer Ordner", "Upload" : "Hochladen", diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index d65d062c75..517799c1bc 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Herunterladen", "Rename" : "Umbenennen", "Delete" : "Löschen", + "Disconnect storage" : "Speicher trennen", + "Unshare" : "Freigabe aufheben", "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 79467fc764..90e499bec2 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -32,6 +32,8 @@ "Download" : "Herunterladen", "Rename" : "Umbenennen", "Delete" : "Löschen", + "Disconnect storage" : "Speicher trennen", + "Unshare" : "Freigabe aufheben", "Details" : "Details", "Select" : "Auswählen", "Pending" : "Ausstehend", diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index f60e842199..265381cd67 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Λήψη", "Rename" : "Μετονομασία", "Delete" : "Διαγραφή", + "Disconnect storage" : "Αποσυνδεδεμένος αποθηκευτικός χώρος", + "Unshare" : "Διακοπή διαμοιρασμού", "Details" : "Λεπτομέρειες", "Select" : "Επιλογή", "Pending" : "Εκκρεμεί", diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index 15cb56c87d..1f0d997b3d 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -32,6 +32,8 @@ "Download" : "Λήψη", "Rename" : "Μετονομασία", "Delete" : "Διαγραφή", + "Disconnect storage" : "Αποσυνδεδεμένος αποθηκευτικός χώρος", + "Unshare" : "Διακοπή διαμοιρασμού", "Details" : "Λεπτομέρειες", "Select" : "Επιλογή", "Pending" : "Εκκρεμεί", diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index a190c45e84..96c5acf917 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Download", "Rename" : "Rename", "Delete" : "Delete", + "Disconnect storage" : "Disconnect storage", + "Unshare" : "Unshare", "Details" : "Details", "Select" : "Select", "Pending" : "Pending", diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index ca8a60ec73..4b0762f8b7 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -32,6 +32,8 @@ "Download" : "Download", "Rename" : "Rename", "Delete" : "Delete", + "Disconnect storage" : "Disconnect storage", + "Unshare" : "Unshare", "Details" : "Details", "Select" : "Select", "Pending" : "Pending", diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js index dbdd042291..398d2f669b 100644 --- a/apps/files/l10n/eo.js +++ b/apps/files/l10n/eo.js @@ -28,6 +28,7 @@ OC.L10N.register( "Download" : "Elŝuti", "Rename" : "Alinomigi", "Delete" : "Forigi", + "Unshare" : "Malkunhavigi", "Details" : "Detaloj", "Select" : "Elekti", "Pending" : "Traktotaj", diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json index b858ccece4..2a76d0ab2c 100644 --- a/apps/files/l10n/eo.json +++ b/apps/files/l10n/eo.json @@ -26,6 +26,7 @@ "Download" : "Elŝuti", "Rename" : "Alinomigi", "Delete" : "Forigi", + "Unshare" : "Malkunhavigi", "Details" : "Detaloj", "Select" : "Elekti", "Pending" : "Traktotaj", diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 7bc628b8f9..aefcef734a 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Descargar", "Rename" : "Renombrar", "Delete" : "Eliminar", + "Disconnect storage" : "Desconectar almacenamiento", + "Unshare" : "Dejar de compartir", "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendiente", diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 27ebcb1da4..3c89e59a8c 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -32,6 +32,8 @@ "Download" : "Descargar", "Rename" : "Renombrar", "Delete" : "Eliminar", + "Disconnect storage" : "Desconectar almacenamiento", + "Unshare" : "Dejar de compartir", "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendiente", diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index 0e4dbddeda..9d4924d1d5 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -28,6 +28,7 @@ OC.L10N.register( "Download" : "Descargar", "Rename" : "Renombrar", "Delete" : "Eliminar", + "Unshare" : "Dejar de compartir", "Details" : "Detalles", "Pending" : "Pendiente", "Name" : "Nombre", diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index cb903ddd9d..9abf30f0c7 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -26,6 +26,7 @@ "Download" : "Descargar", "Rename" : "Renombrar", "Delete" : "Eliminar", + "Unshare" : "Dejar de compartir", "Details" : "Detalles", "Pending" : "Pendiente", "Name" : "Nombre", diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index f136bd300b..d300a6f885 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Lae alla", "Rename" : "Nimeta ümber", "Delete" : "Kustuta", + "Disconnect storage" : "Ühenda andmehoidla lahti.", + "Unshare" : "Lõpeta jagamine", "Details" : "Üksikasjad", "Select" : "Vali", "Pending" : "Ootel", diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index 6e1961770c..426623cbc8 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -32,6 +32,8 @@ "Download" : "Lae alla", "Rename" : "Nimeta ümber", "Delete" : "Kustuta", + "Disconnect storage" : "Ühenda andmehoidla lahti.", + "Unshare" : "Lõpeta jagamine", "Details" : "Üksikasjad", "Select" : "Vali", "Pending" : "Ootel", diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js index 9add1516c4..d7b9935ac5 100644 --- a/apps/files/l10n/eu.js +++ b/apps/files/l10n/eu.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Deskargatu", "Rename" : "Berrizendatu", "Delete" : "Ezabatu", + "Disconnect storage" : "Deskonektatu biltegia", + "Unshare" : "Ez elkarbanatu", "Details" : "Xehetasunak", "Select" : "hautatu", "Pending" : "Zain", diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json index 96943f33a9..71dc13b574 100644 --- a/apps/files/l10n/eu.json +++ b/apps/files/l10n/eu.json @@ -32,6 +32,8 @@ "Download" : "Deskargatu", "Rename" : "Berrizendatu", "Delete" : "Ezabatu", + "Disconnect storage" : "Deskonektatu biltegia", + "Unshare" : "Ez elkarbanatu", "Details" : "Xehetasunak", "Select" : "hautatu", "Pending" : "Zain", diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index 46cbbc376a..5f6c49e742 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -34,6 +34,7 @@ OC.L10N.register( "Download" : "دانلود", "Rename" : "تغییرنام", "Delete" : "حذف", + "Unshare" : "لغو اشتراک", "Details" : "جزئیات", "Select" : "انتخاب", "Pending" : "در انتظار", diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index b9e32d69e3..a4d0add25b 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -32,6 +32,7 @@ "Download" : "دانلود", "Rename" : "تغییرنام", "Delete" : "حذف", + "Unshare" : "لغو اشتراک", "Details" : "جزئیات", "Select" : "انتخاب", "Pending" : "در انتظار", diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js index 8bebb81fd3..5e1327f755 100644 --- a/apps/files/l10n/fi_FI.js +++ b/apps/files/l10n/fi_FI.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Lataa", "Rename" : "Nimeä uudelleen", "Delete" : "Poista", + "Disconnect storage" : "Katkaise yhteys tallennustilaan", + "Unshare" : "Peru jakaminen", "Details" : "Tiedot", "Select" : "Valitse", "Pending" : "Odottaa", diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json index 64b0a886b7..baf6c5d449 100644 --- a/apps/files/l10n/fi_FI.json +++ b/apps/files/l10n/fi_FI.json @@ -32,6 +32,8 @@ "Download" : "Lataa", "Rename" : "Nimeä uudelleen", "Delete" : "Poista", + "Disconnect storage" : "Katkaise yhteys tallennustilaan", + "Unshare" : "Peru jakaminen", "Details" : "Tiedot", "Select" : "Valitse", "Pending" : "Odottaa", diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 6af58e9309..16f9557293 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Télécharger", "Rename" : "Renommer", "Delete" : "Supprimer", + "Disconnect storage" : "Déconnecter ce support de stockage", + "Unshare" : "Ne plus partager", "Details" : "Détails", "Select" : "Sélectionner", "Pending" : "En attente", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index ba25b77e3d..3f8cdf9553 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -32,6 +32,8 @@ "Download" : "Télécharger", "Rename" : "Renommer", "Delete" : "Supprimer", + "Disconnect storage" : "Déconnecter ce support de stockage", + "Unshare" : "Ne plus partager", "Details" : "Détails", "Select" : "Sélectionner", "Pending" : "En attente", diff --git a/apps/files/l10n/ia.js b/apps/files/l10n/ia.js index a1548e6b73..8310334287 100644 --- a/apps/files/l10n/ia.js +++ b/apps/files/l10n/ia.js @@ -10,6 +10,7 @@ OC.L10N.register( "Close" : "Clauder", "Download" : "Discargar", "Delete" : "Deler", + "Unshare" : "Leva compartir", "Name" : "Nomine", "Size" : "Dimension", "Modified" : "Modificate", diff --git a/apps/files/l10n/ia.json b/apps/files/l10n/ia.json index bbc3f4bc02..eee4980e34 100644 --- a/apps/files/l10n/ia.json +++ b/apps/files/l10n/ia.json @@ -8,6 +8,7 @@ "Close" : "Clauder", "Download" : "Discargar", "Delete" : "Deler", + "Unshare" : "Leva compartir", "Name" : "Nomine", "Size" : "Dimension", "Modified" : "Modificate", diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index 93ec698cfa..07b33195d4 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Unduh", "Rename" : "Ubah nama", "Delete" : "Hapus", + "Disconnect storage" : "Memutuskan penyimpaan", + "Unshare" : "Batalkan berbagi", "Details" : "Rincian", "Select" : "Pilih", "Pending" : "Tertunda", diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index dca3e7bd16..efe7c4559e 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -32,6 +32,8 @@ "Download" : "Unduh", "Rename" : "Ubah nama", "Delete" : "Hapus", + "Disconnect storage" : "Memutuskan penyimpaan", + "Unshare" : "Batalkan berbagi", "Details" : "Rincian", "Select" : "Pilih", "Pending" : "Tertunda", diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index 967e205145..68b0ad573a 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -17,6 +17,7 @@ OC.L10N.register( "Download" : "Niðurhal", "Rename" : "Endurskýra", "Delete" : "Eyða", + "Unshare" : "Hætta deilingu", "Select" : "Velja", "Pending" : "Bíður", "Name" : "Nafn", diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index caff3b037d..44153e9410 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -15,6 +15,7 @@ "Download" : "Niðurhal", "Rename" : "Endurskýra", "Delete" : "Eyða", + "Unshare" : "Hætta deilingu", "Select" : "Velja", "Pending" : "Bíður", "Name" : "Nafn", diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 93a013492a..d3a567e1d1 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Scarica", "Rename" : "Rinomina", "Delete" : "Elimina", + "Disconnect storage" : "Disconnetti archiviazione", + "Unshare" : "Rimuovi condivisione", "Details" : "Dettagli", "Select" : "Seleziona", "Pending" : "In corso", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 25d3834b0a..611de29514 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -32,6 +32,8 @@ "Download" : "Scarica", "Rename" : "Rinomina", "Delete" : "Elimina", + "Disconnect storage" : "Disconnetti archiviazione", + "Unshare" : "Rimuovi condivisione", "Details" : "Dettagli", "Select" : "Seleziona", "Pending" : "In corso", diff --git a/apps/files/l10n/km.js b/apps/files/l10n/km.js index f03aa9c469..55080926fc 100644 --- a/apps/files/l10n/km.js +++ b/apps/files/l10n/km.js @@ -10,6 +10,7 @@ OC.L10N.register( "Download" : "ទាញយក", "Rename" : "ប្ដូរ​ឈ្មោះ", "Delete" : "លុប", + "Unshare" : "លែង​ចែក​រំលែក", "Details" : "ព័ត៌មាន​លម្អិត", "Pending" : "កំពុង​រង់ចាំ", "Name" : "ឈ្មោះ", diff --git a/apps/files/l10n/km.json b/apps/files/l10n/km.json index f050b00b79..c1e9159ee8 100644 --- a/apps/files/l10n/km.json +++ b/apps/files/l10n/km.json @@ -8,6 +8,7 @@ "Download" : "ទាញយក", "Rename" : "ប្ដូរ​ឈ្មោះ", "Delete" : "លុប", + "Unshare" : "លែង​ចែក​រំលែក", "Details" : "ព័ត៌មាន​លម្អិត", "Pending" : "កំពុង​រង់ចាំ", "Name" : "ឈ្មោះ", diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js index 840837bdad..f9fb8977f9 100644 --- a/apps/files/l10n/kn.js +++ b/apps/files/l10n/kn.js @@ -25,6 +25,8 @@ OC.L10N.register( "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", "Rename" : "ಮರುಹೆಸರಿಸು", "Delete" : "ಅಳಿಸಿ", + "Disconnect storage" : "ಸಂಗ್ರಹ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿ", + "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ", "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", "Pending" : "ಬಾಕಿ ಇದೆ", "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json index d6345be732..12446a3f8b 100644 --- a/apps/files/l10n/kn.json +++ b/apps/files/l10n/kn.json @@ -23,6 +23,8 @@ "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", "Rename" : "ಮರುಹೆಸರಿಸು", "Delete" : "ಅಳಿಸಿ", + "Disconnect storage" : "ಸಂಗ್ರಹ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿ", + "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ", "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", "Pending" : "ಬಾಕಿ ಇದೆ", "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js index 13e917e3cf..e6d0f0a1b8 100644 --- a/apps/files/l10n/ko.js +++ b/apps/files/l10n/ko.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "다운로드", "Rename" : "이름 바꾸기", "Delete" : "삭제", + "Disconnect storage" : "저장소 연결 해제", + "Unshare" : "공유 해제", "Details" : "자세한 정보", "Select" : "선택", "Pending" : "대기 중", diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json index 1e77ab1b9b..e695b9cd42 100644 --- a/apps/files/l10n/ko.json +++ b/apps/files/l10n/ko.json @@ -32,6 +32,8 @@ "Download" : "다운로드", "Rename" : "이름 바꾸기", "Delete" : "삭제", + "Disconnect storage" : "저장소 연결 해제", + "Unshare" : "공유 해제", "Details" : "자세한 정보", "Select" : "선택", "Pending" : "대기 중", diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js index 9d01ad626b..7f933c2e6a 100644 --- a/apps/files/l10n/nb_NO.js +++ b/apps/files/l10n/nb_NO.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Last ned", "Rename" : "Gi nytt navn", "Delete" : "Slett", + "Disconnect storage" : "Koble fra lagring", + "Unshare" : "Avslutt deling", "Details" : "Detaljer", "Select" : "Velg", "Pending" : "Ventende", diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json index 32eb320296..ca895007f6 100644 --- a/apps/files/l10n/nb_NO.json +++ b/apps/files/l10n/nb_NO.json @@ -32,6 +32,8 @@ "Download" : "Last ned", "Rename" : "Gi nytt navn", "Delete" : "Slett", + "Disconnect storage" : "Koble fra lagring", + "Unshare" : "Avslutt deling", "Details" : "Detaljer", "Select" : "Velg", "Pending" : "Ventende", diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 4169c05326..d64dc68c47 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Downloaden", "Rename" : "Naam wijzigen", "Delete" : "Verwijderen", + "Disconnect storage" : "Verbinding met opslag verbreken", + "Unshare" : "Stop met delen", "Details" : "Details", "Select" : "Selecteer", "Pending" : "In behandeling", diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 07210b1382..1268cc1086 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -32,6 +32,8 @@ "Download" : "Downloaden", "Rename" : "Naam wijzigen", "Delete" : "Verwijderen", + "Disconnect storage" : "Verbinding met opslag verbreken", + "Unshare" : "Stop met delen", "Details" : "Details", "Select" : "Selecteer", "Pending" : "In behandeling", diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js index efe3707c21..519387d6ba 100644 --- a/apps/files/l10n/nn_NO.js +++ b/apps/files/l10n/nn_NO.js @@ -28,6 +28,7 @@ OC.L10N.register( "Download" : "Last ned", "Rename" : "Endra namn", "Delete" : "Slett", + "Unshare" : "Udel", "Details" : "Detaljar", "Pending" : "Under vegs", "Name" : "Namn", diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json index 929f8c0d7f..a29e272eba 100644 --- a/apps/files/l10n/nn_NO.json +++ b/apps/files/l10n/nn_NO.json @@ -26,6 +26,7 @@ "Download" : "Last ned", "Rename" : "Endra namn", "Delete" : "Slett", + "Unshare" : "Udel", "Details" : "Detaljar", "Pending" : "Under vegs", "Name" : "Namn", diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js index a3088b663f..a6f59679a1 100644 --- a/apps/files/l10n/oc.js +++ b/apps/files/l10n/oc.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Telecargar", "Rename" : "Renomenar", "Delete" : "Suprimir", + "Disconnect storage" : "Desconnectar aqueste supòrt d'emmagazinatge", + "Unshare" : "Partejar pas", "Details" : "Detalhs", "Select" : "Seleccionar", "Pending" : "En espèra", diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json index c604860569..61caa1724b 100644 --- a/apps/files/l10n/oc.json +++ b/apps/files/l10n/oc.json @@ -32,6 +32,8 @@ "Download" : "Telecargar", "Rename" : "Renomenar", "Delete" : "Suprimir", + "Disconnect storage" : "Desconnectar aqueste supòrt d'emmagazinatge", + "Unshare" : "Partejar pas", "Details" : "Detalhs", "Select" : "Seleccionar", "Pending" : "En espèra", diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index 6478fbe5eb..de1d858124 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Pobierz", "Rename" : "Zmień nazwę", "Delete" : "Usuń", + "Disconnect storage" : "Odłącz magazyn", + "Unshare" : "Zatrzymaj współdzielenie", "Details" : "Szczegóły", "Select" : "Wybierz", "Pending" : "Oczekujące", diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index 98a0592cc7..491991c6f6 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -32,6 +32,8 @@ "Download" : "Pobierz", "Rename" : "Zmień nazwę", "Delete" : "Usuń", + "Disconnect storage" : "Odłącz magazyn", + "Unshare" : "Zatrzymaj współdzielenie", "Details" : "Szczegóły", "Select" : "Wybierz", "Pending" : "Oczekujące", diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 6619da366e..ed838e122e 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Baixar", "Rename" : "Renomear", "Delete" : "Excluir", + "Disconnect storage" : "Desconectar armazenagem", + "Unshare" : "Descompartilhar", "Details" : "Detalhes", "Select" : "Selecionar", "Pending" : "Pendente", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index e656d9e007..d1fcf01ed6 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -32,6 +32,8 @@ "Download" : "Baixar", "Rename" : "Renomear", "Delete" : "Excluir", + "Disconnect storage" : "Desconectar armazenagem", + "Unshare" : "Descompartilhar", "Details" : "Detalhes", "Select" : "Selecionar", "Pending" : "Pendente", diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index 54e7c505c9..e9114f5531 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Descarcă", "Rename" : "Redenumește", "Delete" : "Șterge", + "Disconnect storage" : "Deconectează stocarea", + "Unshare" : "Nu mai partaja", "Details" : "Detalii", "Select" : "Alege", "Pending" : "În așteptare", diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index 3fe8ba180b..ed4bf8e385 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -32,6 +32,8 @@ "Download" : "Descarcă", "Rename" : "Redenumește", "Delete" : "Șterge", + "Disconnect storage" : "Deconectează stocarea", + "Unshare" : "Nu mai partaja", "Details" : "Detalii", "Select" : "Alege", "Pending" : "În așteptare", diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index f4b71563e6..a6fb70944e 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Скачать", "Rename" : "Переименовать", "Delete" : "Удалить", + "Disconnect storage" : "Отсоединить хранилище", + "Unshare" : "Закрыть доступ", "Details" : "Подробно", "Select" : "Выбрать", "Pending" : "Ожидание", diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 81dbf53184..964a819535 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -32,6 +32,8 @@ "Download" : "Скачать", "Rename" : "Переименовать", "Delete" : "Удалить", + "Disconnect storage" : "Отсоединить хранилище", + "Unshare" : "Закрыть доступ", "Details" : "Подробно", "Select" : "Выбрать", "Pending" : "Ожидание", diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 240bce73af..103b486120 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Prejmi", "Rename" : "Preimenuj", "Delete" : "Izbriši", + "Disconnect storage" : "Odklopi shrambo", + "Unshare" : "Prekini souporabo", "Details" : "Podrobnosti", "Select" : "Izberi", "Pending" : "V čakanju ...", diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index 64ad90f56b..ef5720b8be 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -32,6 +32,8 @@ "Download" : "Prejmi", "Rename" : "Preimenuj", "Delete" : "Izbriši", + "Disconnect storage" : "Odklopi shrambo", + "Unshare" : "Prekini souporabo", "Details" : "Podrobnosti", "Select" : "Izberi", "Pending" : "V čakanju ...", diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js index 6811dc5791..5a95ea92e3 100644 --- a/apps/files/l10n/sq.js +++ b/apps/files/l10n/sq.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Shkarkoje", "Rename" : "Riemërtojeni", "Delete" : "Fshije", + "Disconnect storage" : "Shkëput hapësirën e memorizimit", + "Unshare" : "Hiqe ndarjen", "Details" : "Hollësi", "Select" : "Përzgjidhe", "Pending" : "Në pritje", diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json index 45b9d6acb6..e70fffe8e5 100644 --- a/apps/files/l10n/sq.json +++ b/apps/files/l10n/sq.json @@ -32,6 +32,8 @@ "Download" : "Shkarkoje", "Rename" : "Riemërtojeni", "Delete" : "Fshije", + "Disconnect storage" : "Shkëput hapësirën e memorizimit", + "Unshare" : "Hiqe ndarjen", "Details" : "Hollësi", "Select" : "Përzgjidhe", "Pending" : "Në pritje", diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index 80f81b1e02..6a97b5f282 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Преузми", "Rename" : "Преименуј", "Delete" : "Обриши", + "Disconnect storage" : "Искључи складиште", + "Unshare" : "Не дели", "Details" : "Подаци", "Select" : "Изабери", "Pending" : "На чекању", diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index f878b9c14d..7f319f6ab4 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -32,6 +32,8 @@ "Download" : "Преузми", "Rename" : "Преименуј", "Delete" : "Обриши", + "Disconnect storage" : "Искључи складиште", + "Unshare" : "Не дели", "Details" : "Подаци", "Select" : "Изабери", "Pending" : "На чекању", diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js index d7017005a1..ed166f5ee8 100644 --- a/apps/files/l10n/sr@latin.js +++ b/apps/files/l10n/sr@latin.js @@ -33,6 +33,8 @@ OC.L10N.register( "Download" : "Preuzmi", "Rename" : "Preimenuj", "Delete" : "Obriši", + "Disconnect storage" : "Isključi skladište", + "Unshare" : "Ne deli", "Details" : "Detaljnije", "Select" : "Izaberi", "Pending" : "Na čekanju", diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json index 98356e441d..a58df8712a 100644 --- a/apps/files/l10n/sr@latin.json +++ b/apps/files/l10n/sr@latin.json @@ -31,6 +31,8 @@ "Download" : "Preuzmi", "Rename" : "Preimenuj", "Delete" : "Obriši", + "Disconnect storage" : "Isključi skladište", + "Unshare" : "Ne deli", "Details" : "Detaljnije", "Select" : "Izaberi", "Pending" : "Na čekanju", diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index f5e81760b0..f6df4ee16d 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Ladda ner", "Rename" : "Byt namn", "Delete" : "Radera", + "Disconnect storage" : "Koppla bort lagring", + "Unshare" : "Sluta dela", "Details" : "Detaljer", "Select" : "Välj", "Pending" : "Väntar", diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index c624c34029..143e35a1e0 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -32,6 +32,8 @@ "Download" : "Ladda ner", "Rename" : "Byt namn", "Delete" : "Radera", + "Disconnect storage" : "Koppla bort lagring", + "Unshare" : "Sluta dela", "Details" : "Detaljer", "Select" : "Välj", "Pending" : "Väntar", diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js index 55985f6a65..b587b59063 100644 --- a/apps/files/l10n/ug.js +++ b/apps/files/l10n/ug.js @@ -17,6 +17,7 @@ OC.L10N.register( "Download" : "چۈشۈر", "Rename" : "ئات ئۆزگەرت", "Delete" : "ئۆچۈر", + "Unshare" : "ھەمبەھىرلىمە", "Pending" : "كۈتۈۋاتىدۇ", "Name" : "ئاتى", "Size" : "چوڭلۇقى", diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json index 716bf62afb..dd2e9c98ee 100644 --- a/apps/files/l10n/ug.json +++ b/apps/files/l10n/ug.json @@ -15,6 +15,7 @@ "Download" : "چۈشۈر", "Rename" : "ئات ئۆزگەرت", "Delete" : "ئۆچۈر", + "Unshare" : "ھەمبەھىرلىمە", "Pending" : "كۈتۈۋاتىدۇ", "Name" : "ئاتى", "Size" : "چوڭلۇقى", diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index 8d43949d8f..7da8b160af 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Завантажити", "Rename" : "Перейменувати", "Delete" : "Видалити", + "Disconnect storage" : "Від’єднати сховище", + "Unshare" : "Закрити спільний доступ", "Details" : "Деталі", "Select" : "Оберіть", "Pending" : "Очікування", diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index d7381e0cfa..15dabf456f 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -32,6 +32,8 @@ "Download" : "Завантажити", "Rename" : "Перейменувати", "Delete" : "Видалити", + "Disconnect storage" : "Від’єднати сховище", + "Unshare" : "Закрити спільний доступ", "Details" : "Деталі", "Select" : "Оберіть", "Pending" : "Очікування", diff --git a/apps/files/l10n/ur_PK.js b/apps/files/l10n/ur_PK.js index bac2c3b614..094511db42 100644 --- a/apps/files/l10n/ur_PK.js +++ b/apps/files/l10n/ur_PK.js @@ -5,6 +5,7 @@ OC.L10N.register( "Close" : "بند ", "Download" : "ڈاؤن لوڈ،", "Delete" : "حذف کریں", + "Unshare" : "شئیرنگ ختم کریں", "Name" : "اسم", "Save" : "حفظ", "Settings" : "ترتیبات" diff --git a/apps/files/l10n/ur_PK.json b/apps/files/l10n/ur_PK.json index be36293b91..3c859bb452 100644 --- a/apps/files/l10n/ur_PK.json +++ b/apps/files/l10n/ur_PK.json @@ -3,6 +3,7 @@ "Close" : "بند ", "Download" : "ڈاؤن لوڈ،", "Delete" : "حذف کریں", + "Unshare" : "شئیرنگ ختم کریں", "Name" : "اسم", "Save" : "حفظ", "Settings" : "ترتیبات" diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js index 4af893ab66..83dd03f48f 100644 --- a/apps/files/l10n/vi.js +++ b/apps/files/l10n/vi.js @@ -30,6 +30,7 @@ OC.L10N.register( "Download" : "Tải về", "Rename" : "Sửa tên", "Delete" : "Xóa", + "Unshare" : "Bỏ chia sẻ", "Details" : "Chi tiết", "Select" : "Chọn", "Pending" : "Đang chờ", diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json index ebffb82752..abc8396387 100644 --- a/apps/files/l10n/vi.json +++ b/apps/files/l10n/vi.json @@ -28,6 +28,7 @@ "Download" : "Tải về", "Rename" : "Sửa tên", "Delete" : "Xóa", + "Unshare" : "Bỏ chia sẻ", "Details" : "Chi tiết", "Select" : "Chọn", "Pending" : "Đang chờ", diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 09829db3bc..0283c91b65 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "下載", "Rename" : "重新命名", "Delete" : "刪除", + "Disconnect storage" : "斷開儲存空間連接", + "Unshare" : "取消分享", "Details" : "詳細資料", "Select" : "選擇", "Pending" : "等候中", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index 6f2c396ad1..4969b3d5bf 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -32,6 +32,8 @@ "Download" : "下載", "Rename" : "重新命名", "Delete" : "刪除", + "Disconnect storage" : "斷開儲存空間連接", + "Unshare" : "取消分享", "Details" : "詳細資料", "Select" : "選擇", "Pending" : "等候中", diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js index d4d00e7f83..18f67db420 100644 --- a/apps/files_external/l10n/de.js +++ b/apps/files_external/l10n/de.js @@ -10,10 +10,12 @@ OC.L10N.register( "Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden", "Invalid mount point" : "Ungültiger mount point", "Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“", + "%s" : "%s", "Personal" : "Persönlich", "System" : "System", "Grant access" : "Zugriff gestatten", "Access granted" : "Zugriff gestattet", + "Error configuring OAuth1" : "Fehler beim konfigurieren von OAuth1", "Error configuring OAuth2" : "Fehler beim Einrichten von OAuth2", "Generate keys" : "Schlüssel erzeugen", "Error generating key pair" : "Fehler beim Erzeugen des Schlüsselpaares", @@ -25,7 +27,9 @@ OC.L10N.register( "Every time the filesystem is used" : "Immer, wenn das Dateisystem benutzt wird", "All users. Type to select user or group." : "Alle Benutzer. Benutzer oder Gruppe zur Auswahl eingeben.", "(group)" : "(group)", + "Admin defined" : "Administrator festlegen", "Saved" : "Gespeichert", + "There was an error with message: " : "Es ist ein Fehler mit folgender Meldung aufgetreten:", "Access key" : "Zugangsschlüssel", "Secret key" : "Geheimer Schlüssel", "None" : "Keine", diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json index a65f58b0fd..cae7672260 100644 --- a/apps/files_external/l10n/de.json +++ b/apps/files_external/l10n/de.json @@ -8,10 +8,12 @@ "Storage with id \"%i\" not found" : "Der Speicher mit der ID „%i“ wurde nicht gefunden", "Invalid mount point" : "Ungültiger mount point", "Invalid storage backend \"%s\"" : "Ungültiges Speicher-Backend „%s“", + "%s" : "%s", "Personal" : "Persönlich", "System" : "System", "Grant access" : "Zugriff gestatten", "Access granted" : "Zugriff gestattet", + "Error configuring OAuth1" : "Fehler beim konfigurieren von OAuth1", "Error configuring OAuth2" : "Fehler beim Einrichten von OAuth2", "Generate keys" : "Schlüssel erzeugen", "Error generating key pair" : "Fehler beim Erzeugen des Schlüsselpaares", @@ -23,7 +25,9 @@ "Every time the filesystem is used" : "Immer, wenn das Dateisystem benutzt wird", "All users. Type to select user or group." : "Alle Benutzer. Benutzer oder Gruppe zur Auswahl eingeben.", "(group)" : "(group)", + "Admin defined" : "Administrator festlegen", "Saved" : "Gespeichert", + "There was an error with message: " : "Es ist ein Fehler mit folgender Meldung aufgetreten:", "Access key" : "Zugangsschlüssel", "Secret key" : "Geheimer Schlüssel", "None" : "Keine", diff --git a/core/l10n/de.js b/core/l10n/de.js index 79527a46e0..326d4e9e68 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -172,6 +172,7 @@ OC.L10N.register( "Hello {name}" : "Hallo {name}", "_download %n file_::_download %n files_" : ["Lade %n Datei herunter","Lade %n Dateien herunter"], "{version} is available. Get more information on how to update." : "{version} ist verfügbar. Hole weitere Informationen zu Aktualisierungen ein.", + "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Das Update läuft gerade. Das Verlassen dieser Seite könnte den Update Prozess in einigen Umgebungen unterbrechen.", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}. Dies könnte eine Weile dauern.", "An error occurred." : "Es ist ein Fehler aufgetreten.", "Please reload the page." : "Bitte lade die Seite neu.", @@ -181,6 +182,7 @@ OC.L10N.register( "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.", "%s password reset" : "%s-Passwort zurücksetzen", "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}", "New password" : "Neues Passwort", @@ -255,6 +257,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere Deinen Administrator.", "Log in" : "Anmelden", "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", + "Wrong password." : "Falsches Passwort.", "Stay logged in" : "Angemeldet bleiben", "Alternative Logins" : "Alternative Logins", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", diff --git a/core/l10n/de.json b/core/l10n/de.json index b567d209a4..ab5bf8614c 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -170,6 +170,7 @@ "Hello {name}" : "Hallo {name}", "_download %n file_::_download %n files_" : ["Lade %n Datei herunter","Lade %n Dateien herunter"], "{version} is available. Get more information on how to update." : "{version} ist verfügbar. Hole weitere Informationen zu Aktualisierungen ein.", + "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Das Update läuft gerade. Das Verlassen dieser Seite könnte den Update Prozess in einigen Umgebungen unterbrechen.", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}. Dies könnte eine Weile dauern.", "An error occurred." : "Es ist ein Fehler aufgetreten.", "Please reload the page." : "Bitte lade die Seite neu.", @@ -179,6 +180,7 @@ "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.", "%s password reset" : "%s-Passwort zurücksetzen", "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}", "New password" : "Neues Passwort", @@ -253,6 +255,7 @@ "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere Deinen Administrator.", "Log in" : "Anmelden", "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", + "Wrong password." : "Falsches Passwort.", "Stay logged in" : "Angemeldet bleiben", "Alternative Logins" : "Alternative Logins", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", From 74de12c698e01514c8fe42727d98aeaa8956eeee Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sun, 13 Dec 2015 01:54:51 -0500 Subject: [PATCH 085/194] [tx-robot] updated from transifex --- apps/encryption/l10n/es.js | 1 + apps/encryption/l10n/es.json | 1 + apps/files/l10n/pt_BR.js | 13 ++++++++++++- apps/files/l10n/pt_BR.json | 13 ++++++++++++- apps/files_external/l10n/es.js | 1 + apps/files_external/l10n/es.json | 1 + apps/files_external/l10n/ja.js | 4 ++++ apps/files_external/l10n/ja.json | 4 ++++ core/l10n/es.js | 8 ++++++++ core/l10n/es.json | 8 ++++++++ core/l10n/ja.js | 5 +++++ core/l10n/ja.json | 5 +++++ lib/l10n/ja.js | 6 +++++- lib/l10n/ja.json | 6 +++++- settings/l10n/pt_BR.js | 1 + settings/l10n/pt_BR.json | 1 + 16 files changed, 74 insertions(+), 4 deletions(-) diff --git a/apps/encryption/l10n/es.js b/apps/encryption/l10n/es.js index 6b49b3917f..1dadb88064 100644 --- a/apps/encryption/l10n/es.js +++ b/apps/encryption/l10n/es.js @@ -32,6 +32,7 @@ OC.L10N.register( "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", "Cheers!" : "¡Saludos!", "Hey there,

the admin enabled server-side-encryption. Your files were encrypted using the password %s.

Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.

" : "Hola,\n

\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: %s\n

\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.

", + "Encrypt the home storage" : "Encriptar el almacenamiento personal", "Enable recovery key" : "Activa la clave de recuperación", "Disable recovery key" : "Desactiva la clave de recuperación", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clave de recuperación es una clave de cifrado extra que se usa para cifrar ficheros. Permite la recuperación de los ficheros de un usuario si él o ella olvida su contraseña.", diff --git a/apps/encryption/l10n/es.json b/apps/encryption/l10n/es.json index 3f21b4c09a..5cf2b12ce5 100644 --- a/apps/encryption/l10n/es.json +++ b/apps/encryption/l10n/es.json @@ -30,6 +30,7 @@ "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", "Cheers!" : "¡Saludos!", "Hey there,

the admin enabled server-side-encryption. Your files were encrypted using the password %s.

Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.

" : "Hola,\n

\nEl administrador ha habilitado el cifrado del lado servidor. Sus archivos serán cifrados usando como contraseña: %s\n

\nPor favor, identifíquese en la interfaz web, vaya a la sección 'Modulo básico de cifrado' de sus opciones personales y actualice su contraseña tecleando esta contraseña en el campo 'contraseña antigua' e introduciendo la nueva en su correspondiente campo.

", + "Encrypt the home storage" : "Encriptar el almacenamiento personal", "Enable recovery key" : "Activa la clave de recuperación", "Disable recovery key" : "Desactiva la clave de recuperación", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clave de recuperación es una clave de cifrado extra que se usa para cifrar ficheros. Permite la recuperación de los ficheros de un usuario si él o ella olvida su contraseña.", diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index ed838e122e..e3200d28a2 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -34,7 +34,7 @@ OC.L10N.register( "Download" : "Baixar", "Rename" : "Renomear", "Delete" : "Excluir", - "Disconnect storage" : "Desconectar armazenagem", + "Disconnect storage" : "Desconectar armazenamento", "Unshare" : "Descompartilhar", "Details" : "Detalhes", "Select" : "Selecionar", @@ -42,6 +42,17 @@ OC.L10N.register( "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", + "Could not move \"{file}\", target exists" : "Não foi possível mover o \"{file}\", o alvo já existe", + "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"", + "{newName} already exists" : "{newName} já existe", + "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", ele já não existe", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta \"{dir}\". Por favor escolha um outro nome.", + "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"", + "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" porque ele já existe", + "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" porque ela já existe", + "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao apagar o arquivo \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", "Name" : "Nome", "Size" : "Tamanho", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index d1fcf01ed6..0aa0e94e87 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -32,7 +32,7 @@ "Download" : "Baixar", "Rename" : "Renomear", "Delete" : "Excluir", - "Disconnect storage" : "Desconectar armazenagem", + "Disconnect storage" : "Desconectar armazenamento", "Unshare" : "Descompartilhar", "Details" : "Detalhes", "Select" : "Selecionar", @@ -40,6 +40,17 @@ "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", + "Could not move \"{file}\", target exists" : "Não foi possível mover o \"{file}\", o alvo já existe", + "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"", + "{newName} already exists" : "{newName} já existe", + "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", ele já não existe", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta \"{dir}\". Por favor escolha um outro nome.", + "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"", + "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" porque ele já existe", + "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" porque ela já existe", + "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao apagar o arquivo \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", "Name" : "Nome", "Size" : "Tamanho", diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js index 6d8bf0d313..804e75526b 100644 --- a/apps/files_external/l10n/es.js +++ b/apps/files_external/l10n/es.js @@ -36,6 +36,7 @@ OC.L10N.register( "(group)" : "(grupo)", "Admin defined" : "Admin definido", "Saved" : "Guardado", + "There was an error with message: " : "Hubo un error con el mensaje:", "Access key" : "Clave de acceso", "Secret key" : "Clave secreta", "None" : "Ninguno", diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json index bf0624e96d..86148cf3b0 100644 --- a/apps/files_external/l10n/es.json +++ b/apps/files_external/l10n/es.json @@ -34,6 +34,7 @@ "(group)" : "(grupo)", "Admin defined" : "Admin definido", "Saved" : "Guardado", + "There was an error with message: " : "Hubo un error con el mensaje:", "Access key" : "Clave de acceso", "Secret key" : "Clave secreta", "None" : "Ninguno", diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js index 8d50794e5b..dc31bdb180 100644 --- a/apps/files_external/l10n/ja.js +++ b/apps/files_external/l10n/ja.js @@ -36,6 +36,10 @@ OC.L10N.register( "(group)" : "(グループ)", "Admin defined" : "管理者設定済", "Saved" : "保存されました", + "Empty response from the server" : "サーバーから空の応答がありました", + "Couldn't access. Please logout and login to activate this mount point" : "アクセス出来ませんでした。このマウントポイントを有効にするには一度ログアウトしてからログインしてください。", + "There was an error with message: " : "メッセージ付きのエラーが発生しました:", + "goto-external-storage" : "外部ストレージに行く", "Access key" : "アクセスキー", "Secret key" : "シークレットキー", "Builtin" : "ビルトイン", diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json index b704504b08..6e7f00d6a5 100644 --- a/apps/files_external/l10n/ja.json +++ b/apps/files_external/l10n/ja.json @@ -34,6 +34,10 @@ "(group)" : "(グループ)", "Admin defined" : "管理者設定済", "Saved" : "保存されました", + "Empty response from the server" : "サーバーから空の応答がありました", + "Couldn't access. Please logout and login to activate this mount point" : "アクセス出来ませんでした。このマウントポイントを有効にするには一度ログアウトしてからログインしてください。", + "There was an error with message: " : "メッセージ付きのエラーが発生しました:", + "goto-external-storage" : "外部ストレージに行く", "Access key" : "アクセスキー", "Secret key" : "シークレットキー", "Builtin" : "ビルトイン", diff --git a/core/l10n/es.js b/core/l10n/es.js index fd8df5f6c2..2967d07b3d 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -8,13 +8,20 @@ OC.L10N.register( "Maintenance mode is kept active" : "El modo mantenimiento aún está activo.", "Updating database schema" : "Actualizando el esquema del base de datos", "Updated database" : "Base de datos actualizada", + "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Comprobar si se puede actualizar el esquema de la base de datos (esto puede tardar bastante tiempo, dependiendo del tamaño de la base de datos)", "Checked database schema update" : "Actualización del esquema de base de datos revisado", + "Checking updates of apps" : "Comprobar actualizaciones de apps", + "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Comprobar si se puede actualizar el esquema de la base de datos %s (esto puede tardar bastante tiempo, dependiendo del tamaño de la base de datos)", "Checked database schema update for apps" : "Comprobada la actualización del esquema de la base de datos para aplicaciones", "Updated \"%s\" to %s" : "Se ha actualizado \"%s\" a %s", "Repair warning: " : "Advertencia de reparación:", "Repair error: " : "Error que reparar:", "Set log level to debug - current level: \"%s\"" : "Establecer nivel de registro para depurar - nivel actual: \"%s\"", "Reset log level to \"%s\"" : "Restablecer nivel de registro a \"%s\"", + "Starting code integrity check" : "Comenzando comprobación de integridad de código", + "Finished code integrity check" : "Terminando comprobación de integridad de código", + "%s (3rdparty)" : "%s (tercer parte)", + "%s (incompatible)" : "%s (incompatible)", "Following apps have been disabled: %s" : "Siguiendo aplicaciones ha sido deshabilitado: %s", "Already up to date" : "Ya actualizado", "File is too big" : "El archivo es demasiado grande", @@ -256,6 +263,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Por favor reintente nuevamente o contáctese con su administrador.", "Log in" : "Ingresar", "Wrong password. Reset it?" : "Contraseña incorrecta. ¿Restablecerla?", + "Wrong password." : "Contraseña incorrecta.", "Stay logged in" : "Permanecer autenticado", "Alternative Logins" : "Inicios de sesión alternativos", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", diff --git a/core/l10n/es.json b/core/l10n/es.json index a3ad1e2a9a..d7350cc333 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -6,13 +6,20 @@ "Maintenance mode is kept active" : "El modo mantenimiento aún está activo.", "Updating database schema" : "Actualizando el esquema del base de datos", "Updated database" : "Base de datos actualizada", + "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Comprobar si se puede actualizar el esquema de la base de datos (esto puede tardar bastante tiempo, dependiendo del tamaño de la base de datos)", "Checked database schema update" : "Actualización del esquema de base de datos revisado", + "Checking updates of apps" : "Comprobar actualizaciones de apps", + "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Comprobar si se puede actualizar el esquema de la base de datos %s (esto puede tardar bastante tiempo, dependiendo del tamaño de la base de datos)", "Checked database schema update for apps" : "Comprobada la actualización del esquema de la base de datos para aplicaciones", "Updated \"%s\" to %s" : "Se ha actualizado \"%s\" a %s", "Repair warning: " : "Advertencia de reparación:", "Repair error: " : "Error que reparar:", "Set log level to debug - current level: \"%s\"" : "Establecer nivel de registro para depurar - nivel actual: \"%s\"", "Reset log level to \"%s\"" : "Restablecer nivel de registro a \"%s\"", + "Starting code integrity check" : "Comenzando comprobación de integridad de código", + "Finished code integrity check" : "Terminando comprobación de integridad de código", + "%s (3rdparty)" : "%s (tercer parte)", + "%s (incompatible)" : "%s (incompatible)", "Following apps have been disabled: %s" : "Siguiendo aplicaciones ha sido deshabilitado: %s", "Already up to date" : "Ya actualizado", "File is too big" : "El archivo es demasiado grande", @@ -254,6 +261,7 @@ "Please try again or contact your administrator." : "Por favor reintente nuevamente o contáctese con su administrador.", "Log in" : "Ingresar", "Wrong password. Reset it?" : "Contraseña incorrecta. ¿Restablecerla?", + "Wrong password." : "Contraseña incorrecta.", "Stay logged in" : "Permanecer autenticado", "Alternative Logins" : "Inicios de sesión alternativos", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 9d700b71d2..f2874659f6 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -18,6 +18,8 @@ OC.L10N.register( "Repair error: " : "修復エラー:", "Set log level to debug - current level: \"%s\"" : "ログレベルをデバッグにセットします - 現在のレベル: \"%s\"", "Reset log level to \"%s\"" : "ログレベルを \"%s\" にリセットします。", + "Starting code integrity check" : "コード整合性の確認を開始", + "Finished code integrity check" : "コード整合性の確認が終了", "%s (3rdparty)" : "%s (サードパーティー)", "%s (incompatible)" : "%s (非互換)", "Following apps have been disabled: %s" : "以下のアプリが無効にされています: %s", @@ -77,6 +79,7 @@ OC.L10N.register( "Oct." : "10月", "Nov." : "11月", "Dec." : "12月", + "There were problems with the code integrity check. More information…" : "コード整合性の確認で問題が発生しました。詳しくはこちら…", "Settings" : "設定", "Saving..." : "保存中...", "seconds ago" : "数秒前", @@ -116,6 +119,7 @@ OC.L10N.register( "Your PHP version ({version}) is no longer supported by PHP. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、PHPでサポート されていません。 我々は、PHPから提供されている新しいバージョンにアップグレードし、それによるセキュリティの確保とパフォーマンスのメリットを受けられることを強くお勧めします。", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our documentation." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、ドキュメントを確認してください。", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the memcached wiki about both modules." : "Memcached は分散キャッシュとして設定されていますが、間違った\"memcache\"のPHPモジュールがインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしていますが、\"memcache\" ではありません。memcached wiki で両方のモジュール を見てください。", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our documentation. (List of invalid files… / Rescan…)" : "いくつかのファイルで整合性の確認が取れませんでした。この問題を解決するための詳細情報がドキュメントにあります。 (不適正ファイルのリスト… / 再スキャン…)", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our security tips." : "\"Strict-Transport-Security\" HTTP ヘッダが最小値の \"{seconds}\" 秒に設定されていません。 セキュリティを強化するため、security tipsを参照して、HSTS を有効にすることをおすすめします。", @@ -187,6 +191,7 @@ OC.L10N.register( "Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした", "Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした", "Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。", "%s password reset" : "%s パスワードリセット", "Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}", "New password" : "新しいパスワードを入力", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index 68930ad01c..8b1b077361 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -16,6 +16,8 @@ "Repair error: " : "修復エラー:", "Set log level to debug - current level: \"%s\"" : "ログレベルをデバッグにセットします - 現在のレベル: \"%s\"", "Reset log level to \"%s\"" : "ログレベルを \"%s\" にリセットします。", + "Starting code integrity check" : "コード整合性の確認を開始", + "Finished code integrity check" : "コード整合性の確認が終了", "%s (3rdparty)" : "%s (サードパーティー)", "%s (incompatible)" : "%s (非互換)", "Following apps have been disabled: %s" : "以下のアプリが無効にされています: %s", @@ -75,6 +77,7 @@ "Oct." : "10月", "Nov." : "11月", "Dec." : "12月", + "There were problems with the code integrity check. More information…" : "コード整合性の確認で問題が発生しました。詳しくはこちら…", "Settings" : "設定", "Saving..." : "保存中...", "seconds ago" : "数秒前", @@ -114,6 +117,7 @@ "Your PHP version ({version}) is no longer supported by PHP. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、PHPでサポート されていません。 我々は、PHPから提供されている新しいバージョンにアップグレードし、それによるセキュリティの確保とパフォーマンスのメリットを受けられることを強くお勧めします。", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our documentation." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、ドキュメントを確認してください。", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the memcached wiki about both modules." : "Memcached は分散キャッシュとして設定されていますが、間違った\"memcache\"のPHPモジュールがインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしていますが、\"memcache\" ではありません。memcached wiki で両方のモジュール を見てください。", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our documentation. (List of invalid files… / Rescan…)" : "いくつかのファイルで整合性の確認が取れませんでした。この問題を解決するための詳細情報がドキュメントにあります。 (不適正ファイルのリスト… / 再スキャン…)", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our security tips." : "\"Strict-Transport-Security\" HTTP ヘッダが最小値の \"{seconds}\" 秒に設定されていません。 セキュリティを強化するため、security tipsを参照して、HSTS を有効にすることをおすすめします。", @@ -185,6 +189,7 @@ "Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした", "Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした", "Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。", "%s password reset" : "%s パスワードリセット", "Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}", "New password" : "新しいパスワードを入力", diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js index 21375b5392..b21abe31b4 100644 --- a/lib/l10n/ja.js +++ b/lib/l10n/ja.js @@ -147,6 +147,10 @@ OC.L10N.register( "Data directory (%s) is invalid" : "データディレクトリ (%s) は無効です", "Please check that the data directory contains a file \".ocdata\" in its root." : "データディレクトリに \".ocdata\" ファイルが含まれていることを確認してください。", "Could not obtain lock type %d on \"%s\"." : "\"%s\" で %d タイプのロックを取得できませんでした。", - "Storage not available" : "ストレージが利用できません" + "Storage unauthorized. %s" : "権限のないストレージです。 %s", + "Storage incomplete configuration. %s" : "設定が未完了のストレージです。 %s", + "Storage connection error. %s" : "ストレージへの接続エラー。 %s", + "Storage not available" : "ストレージが利用できません", + "Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json index 204eb63787..acc0911859 100644 --- a/lib/l10n/ja.json +++ b/lib/l10n/ja.json @@ -145,6 +145,10 @@ "Data directory (%s) is invalid" : "データディレクトリ (%s) は無効です", "Please check that the data directory contains a file \".ocdata\" in its root." : "データディレクトリに \".ocdata\" ファイルが含まれていることを確認してください。", "Could not obtain lock type %d on \"%s\"." : "\"%s\" で %d タイプのロックを取得できませんでした。", - "Storage not available" : "ストレージが利用できません" + "Storage unauthorized. %s" : "権限のないストレージです。 %s", + "Storage incomplete configuration. %s" : "設定が未完了のストレージです。 %s", + "Storage connection error. %s" : "ストレージへの接続エラー。 %s", + "Storage not available" : "ストレージが利用できません", + "Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index e7ea47e6b7..9949b4f7d8 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -191,6 +191,7 @@ OC.L10N.register( "More" : "Mais", "Less" : "Menos", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "O arquivo de log é maior que 100 MB. Baixar esse arquivo requer algum tempo!", + "What to log" : "O que colocar no log", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é usada como base de dados. Para instalações maiores recomendamos mudar para um backend de banco de dados diferente.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'db occ: converter-type', verifique a documentação ↗.", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index 89fd6bbbb1..6cb18294c0 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -189,6 +189,7 @@ "More" : "Mais", "Less" : "Menos", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "O arquivo de log é maior que 100 MB. Baixar esse arquivo requer algum tempo!", + "What to log" : "O que colocar no log", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é usada como base de dados. Para instalações maiores recomendamos mudar para um backend de banco de dados diferente.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'db occ: converter-type', verifique a documentação ↗.", From 9d732e35e1a35401ffb7b495b90bf999c5e15e6a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 11 Dec 2015 13:52:04 +0100 Subject: [PATCH 086/194] Check if user isset in $_REQUEST first --- lib/private/util.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/private/util.php b/lib/private/util.php index 9016dc5975..578001988d 100644 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -951,9 +951,11 @@ class OC_Util { $parameters['canResetPassword'] = true; if (!\OC::$server->getSystemConfig()->getValue('lost_password_link')) { - $user = \OC::$server->getUserManager()->get($_REQUEST['user']); - if ($user instanceof IUser) { - $parameters['canResetPassword'] = $user->canChangePassword(); + if (isset($_REQUEST['user'])) { + $user = \OC::$server->getUserManager()->get($_REQUEST['user']); + if ($user instanceof IUser) { + $parameters['canResetPassword'] = $user->canChangePassword(); + } } } From 4d9e12b8bcc09a3b75a847523876ad961cab1de3 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 14 Dec 2015 10:44:47 +0100 Subject: [PATCH 087/194] Fix mount type root detection Since Webdav doesn't contain that information, we need to rely on the parent folder's mount type to find out whether a child item is a shared/external root or not. Fixed the mount type detection logic and added unit test. Also added a fix that ignores detection if no parent folder exists (ex: shared file list, favorites, etc) --- apps/files/js/filelist.js | 17 +++++++++------- apps/files/tests/js/filelistSpec.js | 30 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 672c39a8bb..7e1329d115 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -990,13 +990,16 @@ } if (fileData.mountType) { - // FIXME: HACK: detect shared-root - if (fileData.mountType === 'shared' && this.dirInfo.mountType !== 'shared') { - // if parent folder isn't share, assume the displayed folder is a share root - fileData.mountType = 'shared-root'; - } else if (fileData.mountType === 'external' && this.dirInfo.mountType !== 'external') { - // if parent folder isn't external, assume the displayed folder is the external storage root - fileData.mountType = 'external-root'; + // dirInfo (parent) only exist for the "real" file list + if (this.dirInfo.id) { + // FIXME: HACK: detect shared-root + if (fileData.mountType === 'shared' && this.dirInfo.mountType !== 'shared' && this.dirInfo.mountType !== 'shared-root') { + // if parent folder isn't share, assume the displayed folder is a share root + fileData.mountType = 'shared-root'; + } else if (fileData.mountType === 'external' && this.dirInfo.mountType !== 'external' && this.dirInfo.mountType !== 'external-root') { + // if parent folder isn't external, assume the displayed folder is the external storage root + fileData.mountType = 'external-root'; + } } tr.attr('data-mounttype', fileData.mountType); } diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index 9f7ad50bc6..3542a5cee8 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -2534,4 +2534,34 @@ describe('OCA.Files.FileList tests', function() { expect(newFileMenuStub.notCalled).toEqual(true); }); }); + describe('mount type detection', function() { + function testMountType(dirInfoId, dirInfoMountType, inputMountType, expectedMountType) { + var $tr; + fileList.dirInfo.id = dirInfoId; + fileList.dirInfo.mountType = dirInfoMountType; + $tr = fileList.add({ + type: 'dir', + mimetype: 'httpd/unix-directory', + name: 'test dir', + mountType: inputMountType + }); + + expect($tr.attr('data-mounttype')).toEqual(expectedMountType); + } + + it('leaves mount type as is if no parent exists', function() { + testMountType(null, null, 'external', 'external'); + testMountType(null, null, 'shared', 'shared'); + }); + it('detects share root if parent exists', function() { + testMountType(123, null, 'shared', 'shared-root'); + testMountType(123, 'shared', 'shared', 'shared'); + testMountType(123, 'shared-root', 'shared', 'shared'); + }); + it('detects external storage root if parent exists', function() { + testMountType(123, null, 'external', 'external-root'); + testMountType(123, 'external', 'external', 'external'); + testMountType(123, 'external-root', 'external', 'external'); + }); + }); }); From a7ecb6e984a3259ffe75abfdafaba46a4435af17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 14 Dec 2015 12:16:41 +0100 Subject: [PATCH 088/194] Let's print error messages to the builtin webserver console ... makes development a bit easier --- lib/private/log/owncloud.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/private/log/owncloud.php b/lib/private/log/owncloud.php index f8a5f7534c..be69150d87 100644 --- a/lib/private/log/owncloud.php +++ b/lib/private/log/owncloud.php @@ -101,6 +101,9 @@ class OC_Log_Owncloud { // Fall back to error_log error_log($entry); } + if (php_sapi_name() === 'cli-server') { + error_log($message, 4); + } } /** From f27e98a3e28e3697f6eaf3521cbbe754318f9ba5 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 10 Dec 2015 16:40:27 +0100 Subject: [PATCH 089/194] Migrate files external for the user that the filesystem is being setup for --- .../lib/config/configadapter.php | 2 +- .../migration/dummyusersession.php | 51 +++++++++++++++++++ .../migration/storagemigrator.php | 21 ++++---- 3 files changed, 61 insertions(+), 13 deletions(-) create mode 100644 apps/files_external/migration/dummyusersession.php diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php index 4e37e6a400..4f68c3c7fd 100644 --- a/apps/files_external/lib/config/configadapter.php +++ b/apps/files_external/lib/config/configadapter.php @@ -114,7 +114,7 @@ class ConfigAdapter implements IMountProvider { * @return \OCP\Files\Mount\IMountPoint[] */ public function getMountsForUser(IUser $user, IStorageFactory $loader) { - $this->migrator->migrateUser(); + $this->migrator->migrateUser($user); $mounts = []; diff --git a/apps/files_external/migration/dummyusersession.php b/apps/files_external/migration/dummyusersession.php new file mode 100644 index 0000000000..9ffbfd6309 --- /dev/null +++ b/apps/files_external/migration/dummyusersession.php @@ -0,0 +1,51 @@ + + * + * @copyright Copyright (c) 2015, 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\Files_external\Migration; + +use OCP\IUser; +use OCP\IUserSession; + +class DummyUserSession implements IUserSession { + + /** + * @var IUser + */ + private $user; + + public function login($user, $password) { + } + + public function logout() { + } + + public function setUser($user) { + $this->user = $user; + } + + public function getUser() { + return $this->user; + } + + public function isLoggedIn() { + return !is_null($this->user); + } +} diff --git a/apps/files_external/migration/storagemigrator.php b/apps/files_external/migration/storagemigrator.php index c8e323121e..b469205ac5 100644 --- a/apps/files_external/migration/storagemigrator.php +++ b/apps/files_external/migration/storagemigrator.php @@ -32,6 +32,7 @@ use OCA\Files_external\Service\UserStoragesService; use OCP\IConfig; use OCP\IDBConnection; use OCP\ILogger; +use OCP\IUser; use OCP\IUserSession; /** @@ -48,11 +49,6 @@ class StorageMigrator { */ private $dbConfig; - /** - * @var IUserSession - */ - private $userSession; - /** * @var IConfig */ @@ -73,7 +69,6 @@ class StorageMigrator { * * @param BackendService $backendService * @param DBConfigService $dbConfig - * @param IUserSession $userSession * @param IConfig $config * @param IDBConnection $connection * @param ILogger $logger @@ -81,14 +76,12 @@ class StorageMigrator { public function __construct( BackendService $backendService, DBConfigService $dbConfig, - IUserSession $userSession, IConfig $config, IDBConnection $connection, ILogger $logger ) { $this->backendService = $backendService; $this->dbConfig = $dbConfig; - $this->userSession = $userSession; $this->config = $config; $this->connection = $connection; $this->logger = $logger; @@ -121,14 +114,18 @@ class StorageMigrator { /** * Migrate personal storages configured by the current user + * + * @param IUser $user */ - public function migrateUser() { - $userId = $this->userSession->getUser()->getUID(); + public function migrateUser(IUser $user) { + $dummySession = new DummyUserSession(); + $dummySession->setUser($user); + $userId = $user->getUID(); $userVersion = $this->config->getUserValue($userId, 'files_external', 'config_version', '0.0.0'); if (version_compare($userVersion, '0.5.0', '<')) { $this->config->setUserValue($userId, 'files_external', 'config_version', '0.5.0'); - $legacyService = new UserLegacyStoragesService($this->backendService, $this->userSession); - $storageService = new UserStoragesService($this->backendService, $this->dbConfig, $this->userSession); + $legacyService = new UserLegacyStoragesService($this->backendService, $dummySession); + $storageService = new UserStoragesService($this->backendService, $this->dbConfig, $dummySession); $this->migrate($legacyService, $storageService); } From 843cf906b1f9fd9adce3b5f4bc8ae364a83de69b Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 14 Dec 2015 14:03:14 +0100 Subject: [PATCH 090/194] File shares can't have create permissions fixes #21187 --- apps/files_sharing/js/share.js | 3 +++ apps/files_sharing/tests/js/sharedfilelistSpec.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 3d105f283d..f8d89828f4 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -45,6 +45,9 @@ if (fileData.type === 'file') { // files can't be shared with delete permissions sharePermissions = sharePermissions & ~OC.PERMISSION_DELETE; + + // create permissions don't mean anything for files + sharePermissions = sharePermissions & ~OC.PERMISSION_CREATE; } tr.attr('data-share-permissions', sharePermissions); if (fileData.shareOwner) { diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js index fdc9de49c1..0b0676a19e 100644 --- a/apps/files_sharing/tests/js/sharedfilelistSpec.js +++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js @@ -712,7 +712,7 @@ describe('OCA.Sharing.FileList tests', function() { $tr = fileList.$el.find('tr:first'); expect(parseInt($tr.attr('data-share-permissions'), 10)) - .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_SHARE - OC.PERMISSION_DELETE); + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_SHARE - OC.PERMISSION_DELETE - OC.PERMISSION_CREATE); }); }); }); From efc030aa25b047a7c9f720cf781f26cbe1d274e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Wed, 9 Dec 2015 12:00:00 +0100 Subject: [PATCH 091/194] don't allow to create a federated share if source and target server are the same --- apps/files_sharing/ajax/external.php | 8 ++++++ lib/private/share/helper.php | 34 +++++++++++++++++++++++++ lib/private/share/share.php | 13 ++++++++-- tests/lib/share/helper.php | 37 ++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php index 0f8a3d56cf..65861ac6a0 100644 --- a/apps/files_sharing/ajax/external.php +++ b/apps/files_sharing/ajax/external.php @@ -49,6 +49,14 @@ if(!\OCP\Util::isValidFileName($name)) { exit(); } +$currentUser = \OC::$server->getUserSession()->getUser()->getUID(); +$currentServer = \OC::$server->getURLGenerator()->getAbsoluteURL('/'); +if (\OC\Share\Helper::isSameUserOnSameServer($owner, $remote, $currentUser, $currentServer )) { + \OCP\JSON::error(array('data' => array('message' => $l->t('Not allowed to create a federated share with the same user server')))); + exit(); +} + + $externalManager = new \OCA\Files_Sharing\External\Manager( \OC::$server->getDatabaseConnection(), \OC\Files\Filesystem::getMountManager(), diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php index 26bbca8131..0441647df8 100644 --- a/lib/private/share/helper.php +++ b/lib/private/share/helper.php @@ -289,4 +289,38 @@ class Helper extends \OC\Share\Constants { $hint = $l->t('Invalid Federated Cloud ID'); throw new HintException('Invalid Fededrated Cloud ID', $hint); } + + /** + * check if two federated cloud IDs refer to the same user + * + * @param string $user1 + * @param string $server1 + * @param string $user2 + * @param string $server2 + * @return bool true if both users and servers are the same + */ + public static function isSameUserOnSameServer($user1, $server1, $user2, $server2) { + $normalizedServer1 = strtolower(\OC\Share\Share::removeProtocolFromUrl($server1)); + $normalizedServer2 = strtolower(\OC\Share\Share::removeProtocolFromUrl($server2)); + + if (rtrim($normalizedServer1, '/') === rtrim($normalizedServer2, '/')) { + // FIXME this should be a method in the user management instead + \OCP\Util::emitHook( + '\OCA\Files_Sharing\API\Server2Server', + 'preLoginNameUsedAsUserName', + array('uid' => &$user1) + ); + \OCP\Util::emitHook( + '\OCA\Files_Sharing\API\Server2Server', + 'preLoginNameUsedAsUserName', + array('uid' => &$user2) + ); + + if ($user1 === $user2) { + return true; + } + } + + return false; + } } diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 3edffba8a3..fff437b3ff 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -849,11 +849,20 @@ class Share extends Constants { throw new \Exception($message_t); } + // don't allow federated shares if source and target server are the same + list($user, $remote) = Helper::splitUserRemote($shareWith); + $currentServer = self::removeProtocolFromUrl(\OC::$server->getURLGenerator()->getAbsoluteURL('/')); + $currentUser = \OC::$server->getUserSession()->getUser()->getUID(); + if (Helper::isSameUserOnSameServer($user, $remote, $currentUser, $currentServer)) { + $message = 'Not allowed to create a federated share with the same user.'; + $message_t = $l->t('Not allowed to create a federated share with the same user'); + \OCP\Util::writeLog('OCP\Share', $message, \OCP\Util::DEBUG); + throw new \Exception($message_t); + } $token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(self::TOKEN_LENGTH, \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER . \OCP\Security\ISecureRandom::CHAR_DIGITS); - list($user, $remote) = Helper::splitUserRemote($shareWith); $shareWith = $user . '@' . $remote; $shareId = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, $token, $itemSourceName); @@ -2510,7 +2519,7 @@ class Share extends Constants { * @param string $url * @return string */ - private static function removeProtocolFromUrl($url) { + public static function removeProtocolFromUrl($url) { if (strpos($url, 'https://') === 0) { return substr($url, strlen('https://')); } else if (strpos($url, 'http://') === 0) { diff --git a/tests/lib/share/helper.php b/tests/lib/share/helper.php index e37a3db8bf..eaa29c8cb9 100644 --- a/tests/lib/share/helper.php +++ b/tests/lib/share/helper.php @@ -19,6 +19,10 @@ * License along with this library. If not, see . */ +/** + * @group DB + * Class Test_Share_Helper + */ class Test_Share_Helper extends \Test\TestCase { public function expireDateProvider() { @@ -121,4 +125,37 @@ class Test_Share_Helper extends \Test\TestCase { public function testSplitUserRemoteError($id) { \OC\Share\Helper::splitUserRemote($id); } + + /** + * @dataProvider dataTestCompareServerAddresses + * + * @param string $server1 + * @param string $server2 + * @param bool $expected + */ + public function testIsSameUserOnSameServer($user1, $server1, $user2, $server2, $expected) { + $this->assertSame($expected, + \OC\Share\Helper::isSameUserOnSameServer($user1, $server1, $user2, $server2) + ); + } + + public function dataTestCompareServerAddresses() { + return [ + ['user1', 'http://server1', 'user1', 'http://server1', true], + ['user1', 'https://server1', 'user1', 'http://server1', true], + ['user1', 'http://serVer1', 'user1', 'http://server1', true], + ['user1', 'http://server1/', 'user1', 'http://server1', true], + ['user1', 'server1', 'user1', 'http://server1', true], + ['user1', 'http://server1', 'user1', 'http://server2', false], + ['user1', 'https://server1', 'user1', 'http://server2', false], + ['user1', 'http://serVer1', 'user1', 'http://serer2', false], + ['user1', 'http://server1/', 'user1', 'http://server2', false], + ['user1', 'server1', 'user1', 'http://server2', false], + ['user1', 'http://server1', 'user2', 'http://server1', false], + ['user1', 'https://server1', 'user2', 'http://server1', false], + ['user1', 'http://serVer1', 'user2', 'http://server1', false], + ['user1', 'http://server1/', 'user2', 'http://server1', false], + ['user1', 'server1', 'user2', 'http://server1', false], + ]; + } } From c4b65170f2d77298f130f959d85ac3be5f6ea0a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Mon, 14 Dec 2015 16:04:05 +0100 Subject: [PATCH 092/194] show display name but internally use the user name --- apps/files_sharing/ajax/external.php | 3 ++- apps/files_sharing/js/external.js | 3 ++- apps/files_sharing/js/public.js | 7 ++++--- apps/files_sharing/lib/controllers/sharecontroller.php | 1 + apps/files_sharing/templates/public.php | 2 +- apps/files_sharing/tests/controller/sharecontroller.php | 1 + 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php index 65861ac6a0..2ba1cb470c 100644 --- a/apps/files_sharing/ajax/external.php +++ b/apps/files_sharing/ajax/external.php @@ -40,6 +40,7 @@ if (OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled() === false) { $token = $_POST['token']; $remote = $_POST['remote']; $owner = $_POST['owner']; +$ownerDisplayName = $_POST['ownerDisplayName']; $name = $_POST['name']; $password = $_POST['password']; @@ -76,7 +77,7 @@ if (substr($remote, 0, 5) === 'https') { } } -$mount = $externalManager->addShare($remote, $token, $password, $name, $owner, true); +$mount = $externalManager->addShare($remote, $token, $password, $name, $ownerDisplayName, true); /** * @var \OCA\Files_Sharing\External\Storage $storage diff --git a/apps/files_sharing/js/external.js b/apps/files_sharing/js/external.js index f658de307a..45a6ef0275 100644 --- a/apps/files_sharing/js/external.js +++ b/apps/files_sharing/js/external.js @@ -19,7 +19,7 @@ */ OCA.Sharing.showAddExternalDialog = function (share, passwordProtected, callback) { var remote = share.remote; - var owner = share.owner; + var owner = share.ownerDisplayName || share.owner; var name = share.name; var remoteClean = (remote.substr(0, 8) === 'https://') ? remote.substr(8) : remote.substr(7); @@ -92,6 +92,7 @@ remote: share.remote, token: share.token, owner: share.owner, + ownerDisplayName: share.ownerDisplayName || share.owner, name: share.name, password: password}, function(result) { if (result.status === 'error') { diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 70c1ba5c0c..af80844738 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -242,9 +242,10 @@ OCA.Sharing.PublicApp = { var remote = $(this).find('input[type="text"]').val(); var token = $('#sharingToken').val(); var owner = $('#save').data('owner'); + var ownerDisplayName = $('#save').data('owner-display-name'); var name = $('#save').data('name'); var isProtected = $('#save').data('protected') ? 1 : 0; - OCA.Sharing.PublicApp._saveToOwnCloud(remote, token, owner, name, isProtected); + OCA.Sharing.PublicApp._saveToOwnCloud(remote, token, owner, ownerDisplayName, name, isProtected); }); $('#remote_address').on("keyup paste", function() { @@ -291,7 +292,7 @@ OCA.Sharing.PublicApp = { this.fileList.changeDirectory(params.path || params.dir, false, true); }, - _saveToOwnCloud: function (remote, token, owner, name, isProtected) { + _saveToOwnCloud: function (remote, token, owner, ownerDisplayName, name, isProtected) { var location = window.location.protocol + '//' + window.location.host + OC.webroot; if(remote.substr(-1) !== '/') { @@ -299,7 +300,7 @@ OCA.Sharing.PublicApp = { }; var url = remote + 'index.php/apps/files#' + 'remote=' + encodeURIComponent(location) // our location is the remote for the other server - + "&token=" + encodeURIComponent(token) + "&owner=" + encodeURIComponent(owner) + "&name=" + encodeURIComponent(name) + "&protected=" + isProtected; + + "&token=" + encodeURIComponent(token) + "&owner=" + encodeURIComponent(owner) +"&ownerDisplayName=" + encodeURIComponent(ownerDisplayName) + "&name=" + encodeURIComponent(name) + "&protected=" + isProtected; if (remote.indexOf('://') > 0) { diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php index fe7b159449..e28019c358 100644 --- a/apps/files_sharing/lib/controllers/sharecontroller.php +++ b/apps/files_sharing/lib/controllers/sharecontroller.php @@ -181,6 +181,7 @@ class ShareController extends Controller { $shareTmpl = []; $shareTmpl['displayName'] = User::getDisplayName($shareOwner); + $shareTmpl['owner'] = $shareOwner; $shareTmpl['filename'] = $file; $shareTmpl['directory_path'] = $linkItem['file_target']; $shareTmpl['mimetype'] = Filesystem::getMimeType($originalSharePath); diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php index b5dd653d71..046f954106 100644 --- a/apps/files_sharing/templates/public.php +++ b/apps/files_sharing/templates/public.php @@ -72,7 +72,7 @@ $thumbSize = 1024; if ($_['server2serversharing']) { ?> + data-owner-display-name="" data-owner="" data-name="">