From c51bdd18096eb447eec72b934f7bb1d537f1a6f8 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 7 Jun 2016 17:40:34 +0200 Subject: [PATCH 01/52] Fix GDrive test rename overwrite folder --- apps/files_external/lib/Lib/Storage/Google.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files_external/lib/Lib/Storage/Google.php b/apps/files_external/lib/Lib/Storage/Google.php index 96f12800c1..0b617aafe9 100644 --- a/apps/files_external/lib/Lib/Storage/Google.php +++ b/apps/files_external/lib/Lib/Storage/Google.php @@ -168,11 +168,11 @@ class Google extends \OC\Files\Storage\Common { $path = trim($path, '/'); $this->driveFiles[$path] = $file; if ($file === false) { - // Set all child paths as false + // Remove all children $len = strlen($path); foreach ($this->driveFiles as $key => $file) { if (substr($key, 0, $len) === $path) { - $this->driveFiles[$key] = false; + unset($this->driveFiles[$key]); } } } From 338cd4033ac0662a4077825d2084f53645af1865 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 13 Jun 2016 13:31:45 +0200 Subject: [PATCH 02/52] handle invalid storages in LazyStorageMountInfo --- .../Files/Config/LazyStorageMountInfo.php | 8 ++++++-- lib/private/Files/Config/UserMountCache.php | 16 ++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/private/Files/Config/LazyStorageMountInfo.php b/lib/private/Files/Config/LazyStorageMountInfo.php index 654c5b2b23..5df04c4b78 100644 --- a/lib/private/Files/Config/LazyStorageMountInfo.php +++ b/lib/private/Files/Config/LazyStorageMountInfo.php @@ -28,7 +28,7 @@ use OCP\Files\Node; use OCP\IUser; class LazyStorageMountInfo extends CachedMountInfo { - /** @var IMountPoint */ + /** @var IMountPoint */ private $mount; /** @@ -47,7 +47,11 @@ class LazyStorageMountInfo extends CachedMountInfo { */ public function getStorageId() { if (!$this->storageId) { - $this->storageId = $this->mount->getStorage()->getStorageCache()->getNumericId(); + $storage = $this->mount->getStorage(); + if (!$storage) { + return -1; + } + $this->storageId = $storage->getStorageCache()->getNumericId(); } return parent::getStorageId(); } diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index edb1525b27..c947004860 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -124,12 +124,16 @@ class UserMountCache implements IUserMountCache { } private function addToCache(ICachedMountInfo $mount) { - $this->connection->insertIfNotExist('*PREFIX*mounts', [ - 'storage_id' => $mount->getStorageId(), - 'root_id' => $mount->getRootId(), - 'user_id' => $mount->getUser()->getUID(), - 'mount_point' => $mount->getMountPoint() - ], ['root_id', 'user_id']); + if ($mount->getStorageId() !== -1) { + $this->connection->insertIfNotExist('*PREFIX*mounts', [ + 'storage_id' => $mount->getStorageId(), + 'root_id' => $mount->getRootId(), + 'user_id' => $mount->getUser()->getUID(), + 'mount_point' => $mount->getMountPoint() + ], ['root_id', 'user_id']); + } else { + $this->logger->error('Error getting storage info for mount at ' . $mount->getMountPoint()); + } } private function setMountPoint(ICachedMountInfo $mount) { From 64471b5d4a235addcc4dde43cb80232a403f8e08 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 13 Jun 2016 13:14:38 +0200 Subject: [PATCH 03/52] Remove shares of the root folder Fixes #23265 (A possibly costly) repair job to remove cyclic shares. --- lib/private/Repair.php | 2 + lib/private/Repair/RemoveRootShares.php | 157 +++++++++++++++++ tests/lib/Repair/RemoveRootSharesTest.php | 194 ++++++++++++++++++++++ 3 files changed, 353 insertions(+) create mode 100644 lib/private/Repair/RemoveRootShares.php create mode 100644 tests/lib/Repair/RemoveRootSharesTest.php diff --git a/lib/private/Repair.php b/lib/private/Repair.php index bb2967d7e6..1ed896dac4 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -36,6 +36,7 @@ use OC\Repair\DropOldJobs; use OC\Repair\OldGroupMembershipShares; use OC\Repair\RemoveGetETagEntries; use OC\Repair\RemoveOldShares; +use OC\Repair\RemoveRootShares; use OC\Repair\SharePropagation; use OC\Repair\SqliteAutoincrement; use OC\Repair\DropOldTables; @@ -136,6 +137,7 @@ class Repair implements IOutput{ new SharePropagation(\OC::$server->getConfig()), new RemoveOldShares(\OC::$server->getDatabaseConnection()), new AvatarPermissions(\OC::$server->getDatabaseConnection()), + new RemoveRootShares(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager(), \OC::$server->getRootFolder()), ]; } diff --git a/lib/private/Repair/RemoveRootShares.php b/lib/private/Repair/RemoveRootShares.php new file mode 100644 index 0000000000..89f797e3ef --- /dev/null +++ b/lib/private/Repair/RemoveRootShares.php @@ -0,0 +1,157 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ +namespace OC\Repair; + +use OCP\Files\IRootFolder; +use OCP\IDBConnection; +use OCP\IUser; +use OCP\IUserManager; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +/** + * Class RemoveRootShares + * + * @package OC\Repair + */ +class RemoveRootShares implements IRepairStep { + + /** @var IDBConnection */ + protected $connection; + + /** @var IUserManager */ + protected $userManager; + + /** @var IRootFolder */ + protected $rootFolder; + + /** + * RemoveRootShares constructor. + * + * @param IDBConnection $connection + * @param IUserManager $userManager + * @param IRootFolder $rootFolder + */ + public function __construct(IDBConnection $connection, + IUserManager $userManager, + IRootFolder $rootFolder) { + $this->connection = $connection; + $this->userManager = $userManager; + $this->rootFolder = $rootFolder; + } + + /** + * @return string + */ + public function getName() { + return 'Remove shares of a users root folder'; + } + + /** + * @param IOutput $output + */ + public function run(IOutput $output) { + if ($this->rootSharesExist()) { + $this->removeRootShares($output); + } + } + + /** + * @param IOutput $output + */ + private function removeRootShares(IOutput $output) { + $function = function(IUser $user) use ($output) { + $userFolder = $this->rootFolder->getUserFolder($user->getUID()); + $fileId = $userFolder->getId(); + + $qb = $this->connection->getQueryBuilder(); + $qb->delete('share') + ->where($qb->expr()->eq('file_source', $qb->createNamedParameter($fileId))) + ->andWhere($qb->expr()->orX( + $qb->expr()->eq('item_type', $qb->expr()->literal('file')), + $qb->expr()->eq('item_type', $qb->expr()->literal('folder')) + )); + + $qb->execute(); + + $output->advance(); + }; + + $userCount = $this->countUsers(); + $output->startProgress($userCount); + + $this->userManager->callForAllUsers($function); + + $output->finishProgress(); + } + + /** + * Count all the users + * + * @return int + */ + private function countUsers() { + $allCount = $this->userManager->countUsers(); + + $totalCount = 0; + foreach ($allCount as $backend => $count) { + $totalCount += $count; + } + + return $totalCount; + } + + /** + * Verify if this repair steps is required + * It *should* not be necessary in most cases and it can be very + * costly. + * + * @return bool + */ + private function rootSharesExist() { + $qb = $this->connection->getQueryBuilder(); + $qb2 = $this->connection->getQueryBuilder(); + + $qb->select('fileid') + ->from('filecache') + ->where($qb->expr()->eq('path', $qb->expr()->literal('files'))); + + $qb2->select('id') + ->from('share') + ->where($qb2->expr()->in('file_source', $qb2->createFunction($qb->getSQL()))) + ->andWhere($qb2->expr()->orX( + $qb2->expr()->eq('item_type', $qb->expr()->literal('file')), + $qb2->expr()->eq('item_type', $qb->expr()->literal('folder')) + )) + ->setMaxResults(1); + + $cursor = $qb2->execute(); + $data = $cursor->fetch(); + $cursor->closeCursor(); + + if ($data === false) { + return false; + } + + return true; + } +} + diff --git a/tests/lib/Repair/RemoveRootSharesTest.php b/tests/lib/Repair/RemoveRootSharesTest.php new file mode 100644 index 0000000000..bf255fc7e9 --- /dev/null +++ b/tests/lib/Repair/RemoveRootSharesTest.php @@ -0,0 +1,194 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ +namespace Test\Repair; + +use OC\Repair\RemoveRootShares; +use OCP\Files\IRootFolder; +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\Migration\IOutput; +use Test\Traits\UserTrait; + +/** + * Class RemoveOldSharesTest + * + * @package Test\Repair + * @group DB + */ +class RemoveRootSharesTest extends \Test\TestCase { + use UserTrait; + + /** @var RemoveRootShares */ + protected $repair; + + /** @var IDBConnection */ + protected $connection; + + /** @var IOutput */ + private $outputMock; + + /** @var IUserManager */ + private $userManager; + + /** @var IRootFolder */ + private $rootFolder; + + protected function setUp() { + parent::setUp(); + + $this->outputMock = $this->getMockBuilder('\OCP\Migration\IOutput') + ->disableOriginalConstructor() + ->getMock(); + + $this->userManager = \OC::$server->getUserManager(); + $this->rootFolder = \OC::$server->getRootFolder(); + + $this->connection = \OC::$server->getDatabaseConnection(); + $this->repair = new RemoveRootShares($this->connection, $this->userManager, $this->rootFolder); + } + + protected function tearDown() { + $qb = $this->connection->getQueryBuilder(); + $qb->delete('share'); + $qb->execute(); + + return parent::tearDown(); + } + + public function testRootSharesExist() { + //Add test user + $user = $this->userManager->createUser('test', 'test'); + $userFolder = $this->rootFolder->getUserFolder('test'); + $fileId = $userFolder->getId(); + + //Now insert cyclic share + $qb = $this->connection->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->createNamedParameter(0), + 'share_with' => $qb->createNamedParameter('foo'), + 'uid_owner' => $qb->createNamedParameter('owner'), + 'item_type' => $qb->createNamedParameter('file'), + 'item_source' => $qb->createNamedParameter($fileId), + 'item_target' => $qb->createNamedParameter('/target'), + 'file_source' => $qb->createNamedParameter($fileId), + 'file_target' => $qb->createNamedParameter('/target'), + 'permissions' => $qb->createNamedParameter(1), + ]); + $qb->execute(); + + $res = $this->invokePrivate($this->repair, 'rootSharesExist', []); + $this->assertTrue($res); + + $user->delete(); + } + + public function testRootSharesDontExist() { + //Add test user + $user = $this->userManager->createUser('test', 'test'); + $userFolder = $this->rootFolder->getUserFolder('test'); + $fileId = $userFolder->getId(); + + //Now insert cyclic share + $qb = $this->connection->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->createNamedParameter(0), + 'share_with' => $qb->createNamedParameter('foo'), + 'uid_owner' => $qb->createNamedParameter('owner'), + 'item_type' => $qb->createNamedParameter('file'), + 'item_source' => $qb->createNamedParameter($fileId+1), + 'item_target' => $qb->createNamedParameter('/target'), + 'file_source' => $qb->createNamedParameter($fileId+1), + 'file_target' => $qb->createNamedParameter('/target'), + 'permissions' => $qb->createNamedParameter(1), + ]); + $qb->execute(); + + $res = $this->invokePrivate($this->repair, 'rootSharesExist', []); + $this->assertFalse($res); + + $user->delete(); + } + + public function testRun() { + //Add test user + $user1 = $this->userManager->createUser('test1', 'test1'); + $userFolder = $this->rootFolder->getUserFolder('test1'); + $fileId = $userFolder->getId(); + + //Now insert cyclic share + $qb = $this->connection->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->createNamedParameter(0), + 'share_with' => $qb->createNamedParameter('foo'), + 'uid_owner' => $qb->createNamedParameter('owner'), + 'item_type' => $qb->createNamedParameter('file'), + 'item_source' => $qb->createNamedParameter($fileId), + 'item_target' => $qb->createNamedParameter('/target'), + 'file_source' => $qb->createNamedParameter($fileId), + 'file_target' => $qb->createNamedParameter('/target'), + 'permissions' => $qb->createNamedParameter(1), + ]); + $qb->execute(); + + //Add test user + $user2 = $this->userManager->createUser('test2', 'test2'); + $userFolder = $this->rootFolder->getUserFolder('test2'); + $folder = $userFolder->newFolder('foo'); + $fileId = $folder->getId(); + + //Now insert cyclic share + $qb = $this->connection->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->createNamedParameter(0), + 'share_with' => $qb->createNamedParameter('foo'), + 'uid_owner' => $qb->createNamedParameter('owner'), + 'item_type' => $qb->createNamedParameter('file'), + 'item_source' => $qb->createNamedParameter($fileId), + 'item_target' => $qb->createNamedParameter('/target'), + 'file_source' => $qb->createNamedParameter($fileId), + 'file_target' => $qb->createNamedParameter('/target'), + 'permissions' => $qb->createNamedParameter(1), + ]); + $qb->execute(); + + $this->repair->run($this->outputMock); + + //Verify + $qb = $this->connection->getQueryBuilder(); + $qb->selectAlias($qb->createFunction('COUNT(*)'), 'count') + ->from('share'); + + $cursor = $qb->execute(); + $data = $cursor->fetch(); + $cursor->closeCursor(); + + $count = (int)$data['count']; + + $this->assertEquals(1, $count); + + $user1->delete(); + $user2->delete(); + } +} From 86d7241be206ec00d793f35a737d24bba3295ab3 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 10 Jun 2016 13:06:45 +0200 Subject: [PATCH 04/52] Capped cache for cache info in UserMountCache --- lib/private/Files/Config/UserMountCache.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index edb1525b27..9b11fddc85 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -36,6 +36,7 @@ use OCP\IDBConnection; use OCP\ILogger; use OCP\IUser; use OCP\IUserManager; +use OC\Cache\CappedMemoryCache; /** * Cache mounts points per user in the cache so we can easilly look them up @@ -51,15 +52,23 @@ class UserMountCache implements IUserMountCache { */ private $userManager; - /** @var ICachedMountInfo[][] [$userId => [$cachedMountInfo, ....], ...] */ - private $mountsForUsers = []; + /** + * Cached mount info. + * Map of $userId to ICachedMountInfo. + * + * @var ICache + **/ + private $mountsForUsers; /** * @var ILogger */ private $logger; - private $cacheInfoCache = []; + /** + * @var ICache + */ + private $cacheInfoCache; /** * UserMountCache constructor. @@ -72,6 +81,8 @@ class UserMountCache implements IUserMountCache { $this->connection = $connection; $this->userManager = $userManager; $this->logger = $logger; + $this->cacheInfoCache = new CappedMemoryCache(); + $this->mountsForUsers = new CappedMemoryCache(); } public function registerMounts(IUser $user, array $mounts) { From 331d88bcabd4a66b0efc89fa28b90d26e88f4637 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 13 Jun 2016 15:38:34 +0200 Subject: [PATCH 05/52] create session token on all APIs --- apps/dav/lib/Connector/Sabre/Auth.php | 3 +-- .../AppFramework/Middleware/Security/CORSMiddleware.php | 2 +- lib/private/User/Session.php | 9 +++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php index 653da10bc3..51f0acbe2e 100644 --- a/apps/dav/lib/Connector/Sabre/Auth.php +++ b/apps/dav/lib/Connector/Sabre/Auth.php @@ -115,8 +115,7 @@ class Auth extends AbstractBasic { return true; } else { \OC_Util::setupFS(); //login hooks may need early access to the filesystem - if($this->userSession->logClientIn($username, $password)) { - $this->userSession->createSessionToken($this->request, $this->userSession->getUser()->getUID(), $username, $password); + if($this->userSession->logClientIn($username, $password, $this->request)) { \OC_Util::setupFS($this->userSession->getUser()->getUID()); $this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID()); $this->session->close(); diff --git a/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php index d84e996343..69bfeb5e9b 100644 --- a/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php +++ b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php @@ -89,7 +89,7 @@ class CORSMiddleware extends Middleware { $pass = $this->request->server['PHP_AUTH_PW']; $this->session->logout(); - if(!$this->session->logClientIn($user, $pass)) { + if(!$this->session->logClientIn($user, $pass, $this->request)) { throw new SecurityException('CORS requires basic auth', Http::STATUS_UNAUTHORIZED); } } diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index f560bb4bfc..0376e81b6d 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -348,10 +348,11 @@ class Session implements IUserSession, Emitter { * * @param string $user * @param string $password + * @param IRequest $request * @throws LoginException * @return boolean */ - public function logClientIn($user, $password) { + public function logClientIn($user, $password, IRequest $request) { $isTokenPassword = $this->isTokenPassword($password); if (!$isTokenPassword && $this->isTokenAuthEnforced()) { // TODO: throw LoginException instead (https://github.com/owncloud/core/pull/24616) @@ -368,6 +369,9 @@ class Session implements IUserSession, Emitter { } return false; } + + $this->createSessionToken($request, $this->getUser()->getUID(), $user, $password); + return true; } @@ -428,7 +432,8 @@ class Session implements IUserSession, Emitter { */ public function tryBasicAuthLogin(IRequest $request) { if (!empty($request->server['PHP_AUTH_USER']) && !empty($request->server['PHP_AUTH_PW'])) { - $result = $this->logClientIn($request->server['PHP_AUTH_USER'], $request->server['PHP_AUTH_PW']); + $request = \OC::$server->getRequest(); + $result = $this->logClientIn($request->server['PHP_AUTH_USER'], $request->server['PHP_AUTH_PW'], $request); if ($result === true) { /** * Add DAV authenticated. This should in an ideal world not be From 465807490d7648e5675f1cdbc5b1d232cda4feee Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 13 Jun 2016 16:00:49 +0200 Subject: [PATCH 06/52] create session token only for clients that support cookies --- .../tests/unit/Connector/Sabre/AuthTest.php | 17 ++----- lib/private/User/Session.php | 13 ++++- tests/lib/User/SessionTest.php | 48 +++++++++++++++++-- 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php index b3ab49a027..147a0c2b8c 100644 --- a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php @@ -159,7 +159,7 @@ class AuthTest extends TestCase { $user = $this->getMockBuilder('\OCP\IUser') ->disableOriginalConstructor() ->getMock(); - $user->expects($this->exactly(4)) + $user->expects($this->exactly(3)) ->method('getUID') ->will($this->returnValue('MyTestUser')); $this->userSession @@ -167,7 +167,7 @@ class AuthTest extends TestCase { ->method('isLoggedIn') ->will($this->returnValue(true)); $this->userSession - ->expects($this->exactly(4)) + ->expects($this->exactly(3)) ->method('getUser') ->will($this->returnValue($user)); $this->session @@ -178,12 +178,8 @@ class AuthTest extends TestCase { $this->userSession ->expects($this->once()) ->method('logClientIn') - ->with('MyTestUser', 'MyTestPassword') + ->with('MyTestUser', 'MyTestPassword', $this->request) ->will($this->returnValue(true)); - $this->userSession - ->expects($this->once()) - ->method('createSessionToken') - ->with($this->request, 'MyTestUser', 'MyTestUser', 'MyTestPassword'); $this->session ->expects($this->once()) ->method('set') @@ -626,17 +622,14 @@ class AuthTest extends TestCase { ->method('logClientIn') ->with('username', 'password') ->will($this->returnValue(true)); - $this->userSession - ->expects($this->once()) - ->method('createSessionToken'); $user = $this->getMockBuilder('\OCP\IUser') ->disableOriginalConstructor() ->getMock(); - $user->expects($this->exactly(4)) + $user->expects($this->exactly(3)) ->method('getUID') ->will($this->returnValue('MyTestUser')); $this->userSession - ->expects($this->exactly(4)) + ->expects($this->exactly(3)) ->method('getUser') ->will($this->returnValue($user)); $response = $this->auth->check($server->httpRequest, $server->httpResponse); diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 0376e81b6d..0cebb3e061 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -370,11 +370,21 @@ class Session implements IUserSession, Emitter { return false; } - $this->createSessionToken($request, $this->getUser()->getUID(), $user, $password); + if ($this->supportsCookies($request)) { + $this->createSessionToken($request, $this->getUser()->getUID(), $user, $password); + } return true; } + protected function supportsCookies(IRequest $request) { + if (!is_null($request->getCookie('cookie_test'))) { + return true; + } + setcookie('cookie_test', 'test', $this->timeFacory->getTime() + 3600); + return false; + } + private function isTokenAuthEnforced() { return $this->config->getSystemValue('token_auth_enforced', false); } @@ -432,7 +442,6 @@ class Session implements IUserSession, Emitter { */ public function tryBasicAuthLogin(IRequest $request) { if (!empty($request->server['PHP_AUTH_USER']) && !empty($request->server['PHP_AUTH_PW'])) { - $request = \OC::$server->getRequest(); $result = $this->logClientIn($request->server['PHP_AUTH_USER'], $request->server['PHP_AUTH_PW'], $request); if ($result === true) { /** diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index eac38ebba1..28f6b6a537 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -311,11 +311,13 @@ class SessionTest extends \Test\TestCase { ->disableOriginalConstructor() ->getMock(); $session = $this->getMock('\OCP\ISession'); + $request = $this->getMock('\OCP\IRequest'); + $user = $this->getMock('\OCP\IUser'); /** @var \OC\User\Session $userSession */ $userSession = $this->getMockBuilder('\OC\User\Session') ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config]) - ->setMethods(['login']) + ->setMethods(['login', 'supportsCookies', 'createSessionToken', 'getUser']) ->getMock(); $this->tokenProvider->expects($this->once()) @@ -327,7 +329,46 @@ class SessionTest extends \Test\TestCase { ->with('token_auth_enforced', false) ->will($this->returnValue(true)); - $this->assertFalse($userSession->logClientIn('john', 'doe')); + $this->assertFalse($userSession->logClientIn('john', 'doe', $request)); + } + + public function testLogClientInWithTokenPassword() { + $manager = $this->getMockBuilder('\OC\User\Manager') + ->disableOriginalConstructor() + ->getMock(); + $session = $this->getMock('\OCP\ISession'); + $request = $this->getMock('\OCP\IRequest'); + $user = $this->getMock('\OCP\IUser'); + + /** @var \OC\User\Session $userSession */ + $userSession = $this->getMockBuilder('\OC\User\Session') + ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config]) + ->setMethods(['isTokenPassword', 'login', 'supportsCookies', 'createSessionToken', 'getUser']) + ->getMock(); + + $userSession->expects($this->once()) + ->method('isTokenPassword') + ->will($this->returnValue(true)); + $userSession->expects($this->once()) + ->method('login') + ->with('john', 'doe') + ->will($this->returnValue(true)); + + $userSession->expects($this->once()) + ->method('supportsCookies') + ->with($request) + ->will($this->returnValue(true)); + $userSession->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('user123')); + $userSession->expects($this->once()) + ->method('createSessionToken') + ->with($request, 'user123', 'john', 'doe'); + + $this->assertTrue($userSession->logClientIn('john', 'doe', $request)); } public function testLogClientInNoTokenPasswordNo2fa() { @@ -336,6 +377,7 @@ class SessionTest extends \Test\TestCase { ->getMock(); $session = $this->getMock('\OCP\ISession'); $user = $this->getMock('\OCP\IUser'); + $request = $this->getMock('\OCP\IRequest'); /** @var \OC\User\Session $userSession */ $userSession = $this->getMockBuilder('\OC\User\Session') @@ -357,7 +399,7 @@ class SessionTest extends \Test\TestCase { ->with('john') ->will($this->returnValue(true)); - $this->assertFalse($userSession->logClientIn('john', 'doe')); + $this->assertFalse($userSession->logClientIn('john', 'doe', $request)); } public function testRememberLoginValidToken() { From 5887afbb37a81df64e2d1b5f55648785d2d5af55 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Tue, 14 Jun 2016 08:02:15 +0200 Subject: [PATCH 07/52] [tx-robot] updated from transifex --- apps/files/l10n/he.js | 7 +++++++ apps/files/l10n/he.json | 7 +++++++ apps/files_sharing/l10n/he.js | 19 +++++++++++++++++++ apps/files_sharing/l10n/he.json | 19 +++++++++++++++++++ apps/user_ldap/l10n/he.js | 2 ++ apps/user_ldap/l10n/he.json | 2 ++ lib/l10n/he.js | 5 +++++ lib/l10n/he.json | 5 +++++ settings/l10n/cs_CZ.js | 1 + settings/l10n/cs_CZ.json | 1 + settings/l10n/de.js | 1 + settings/l10n/de.json | 1 + settings/l10n/de_DE.js | 1 + settings/l10n/de_DE.json | 1 + settings/l10n/es.js | 3 ++- settings/l10n/es.json | 3 ++- settings/l10n/he.js | 10 ++++++++++ settings/l10n/he.json | 10 ++++++++++ settings/l10n/it.js | 1 + settings/l10n/it.json | 1 + 20 files changed, 98 insertions(+), 2 deletions(-) diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js index a0152b94d2..13b0922efd 100644 --- a/apps/files/l10n/he.js +++ b/apps/files/l10n/he.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "תיקייה שגויה.", "Files" : "קבצים", "All files" : "כל הקבצים", + "File could not be found" : "הקובץ לא ניתן לאיתור", "Home" : "בית", "Close" : "סגירה", "Favorites" : "מועדפים", @@ -33,8 +34,14 @@ OC.L10N.register( "Uploading..." : "העלאה...", "..." : "...", "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} hour{plural_s} left", + "{hours}:{minutes}h" : "{hours}:{minutes}שעות", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} דקות{plural_s} נשארו", + "{minutes}:{seconds}m" : "{minutes}:{seconds}דקות", + "{seconds} second{plural_s} left" : "{seconds} שניות{plural_s} נשארו", + "{seconds}s" : "{seconds}שניות", "Any moment now..." : "עכשיו בכל רגע...", "Soon..." : "בקרוב...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} מתוך {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", "Actions" : "פעולות", "Download" : "הורדה", diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json index c5e22507e0..57ecefe49b 100644 --- a/apps/files/l10n/he.json +++ b/apps/files/l10n/he.json @@ -19,6 +19,7 @@ "Invalid directory." : "תיקייה שגויה.", "Files" : "קבצים", "All files" : "כל הקבצים", + "File could not be found" : "הקובץ לא ניתן לאיתור", "Home" : "בית", "Close" : "סגירה", "Favorites" : "מועדפים", @@ -31,8 +32,14 @@ "Uploading..." : "העלאה...", "..." : "...", "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} hour{plural_s} left", + "{hours}:{minutes}h" : "{hours}:{minutes}שעות", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} דקות{plural_s} נשארו", + "{minutes}:{seconds}m" : "{minutes}:{seconds}דקות", + "{seconds} second{plural_s} left" : "{seconds} שניות{plural_s} נשארו", + "{seconds}s" : "{seconds}שניות", "Any moment now..." : "עכשיו בכל רגע...", "Soon..." : "בקרוב...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} מתוך {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", "Actions" : "פעולות", "Download" : "הורדה", diff --git a/apps/files_sharing/l10n/he.js b/apps/files_sharing/l10n/he.js index 32fe49005a..985e5807e5 100644 --- a/apps/files_sharing/l10n/he.js +++ b/apps/files_sharing/l10n/he.js @@ -27,6 +27,25 @@ OC.L10N.register( "Invalid ownCloud url" : "נתיב ownCloud לא חוקי", "Shared by" : "שותף על־ידי", "Sharing" : "שיתוף", + "Share API is disabled" : "שיתוף API מנוטרל", + "Wrong share ID, share doesn't exist" : "מספר זיהוי שיתוף שגוי, שיתוף אינו קיים", + "Could not delete share" : "לא ניתן היה למחוק את השיתוף", + "Please specify a file or folder path" : "יש לספק נתיב לקובץ או תיקייה", + "Wrong path, file/folder doesn't exist" : "נתיב שגוי, קובץ/תיקייה אינם קיימים", + "Please specify a valid user" : "יש לספק משתמש חוקי", + "Group sharing is disabled by the administrator" : "שיתוף קבוצתי מנוטרל על ידי המנהל", + "Please specify a valid group" : "יש לספק קבוצה חוקית", + "Public link sharing is disabled by the administrator" : "שיתוף ציבורי מנוטרל על ידי המנהל", + "Public upload disabled by the administrator" : "שיתוף ציבורי מנוטרל על ידי המנהל", + "Public upload is only possible for publicly shared folders" : "העלאה ציבורית אפשרית רק אל תיקיות משותפות ציבוריות", + "Invalid date, date format must be YYYY-MM-DD" : "תאריך לא חוקי, תבנית התאריך חייבת להיות YYYY-MM-DD", + "Sharing %s failed because the back end does not allow shares from type %s" : "שיתוף %s נכשל כיוון שהצד האחרוי ינו מאפשר שיתוף מסוג %s", + "Unknown share type" : "סוג שיתוף אינו מוכר", + "Not a directory" : "אינה תיקייה", + "Could not lock path" : "לא ניתן היה לנעול נתיב", + "Can't change permissions for public share links" : "לא ניתן לשנות הרשאות לקישורי שיתוף ציבוריים", + "Wrong or no update parameter given" : "משתנה עדכון שניתן שגוי או לא קיים", + "Cannot increase permissions" : "לא ניתן להעלות הרשאות", "A file or folder has been shared" : "קובץ או תיקייה שותפו", "A file or folder was shared from another server" : "קובץ או תיקייה שותפו מ- שרת אחר", "A public shared file or folder was downloaded" : "קובץ או תיקייה עם שיתוף ציבורי הורדו", diff --git a/apps/files_sharing/l10n/he.json b/apps/files_sharing/l10n/he.json index 4aa639d8e5..247c8e2239 100644 --- a/apps/files_sharing/l10n/he.json +++ b/apps/files_sharing/l10n/he.json @@ -25,6 +25,25 @@ "Invalid ownCloud url" : "נתיב ownCloud לא חוקי", "Shared by" : "שותף על־ידי", "Sharing" : "שיתוף", + "Share API is disabled" : "שיתוף API מנוטרל", + "Wrong share ID, share doesn't exist" : "מספר זיהוי שיתוף שגוי, שיתוף אינו קיים", + "Could not delete share" : "לא ניתן היה למחוק את השיתוף", + "Please specify a file or folder path" : "יש לספק נתיב לקובץ או תיקייה", + "Wrong path, file/folder doesn't exist" : "נתיב שגוי, קובץ/תיקייה אינם קיימים", + "Please specify a valid user" : "יש לספק משתמש חוקי", + "Group sharing is disabled by the administrator" : "שיתוף קבוצתי מנוטרל על ידי המנהל", + "Please specify a valid group" : "יש לספק קבוצה חוקית", + "Public link sharing is disabled by the administrator" : "שיתוף ציבורי מנוטרל על ידי המנהל", + "Public upload disabled by the administrator" : "שיתוף ציבורי מנוטרל על ידי המנהל", + "Public upload is only possible for publicly shared folders" : "העלאה ציבורית אפשרית רק אל תיקיות משותפות ציבוריות", + "Invalid date, date format must be YYYY-MM-DD" : "תאריך לא חוקי, תבנית התאריך חייבת להיות YYYY-MM-DD", + "Sharing %s failed because the back end does not allow shares from type %s" : "שיתוף %s נכשל כיוון שהצד האחרוי ינו מאפשר שיתוף מסוג %s", + "Unknown share type" : "סוג שיתוף אינו מוכר", + "Not a directory" : "אינה תיקייה", + "Could not lock path" : "לא ניתן היה לנעול נתיב", + "Can't change permissions for public share links" : "לא ניתן לשנות הרשאות לקישורי שיתוף ציבוריים", + "Wrong or no update parameter given" : "משתנה עדכון שניתן שגוי או לא קיים", + "Cannot increase permissions" : "לא ניתן להעלות הרשאות", "A file or folder has been shared" : "קובץ או תיקייה שותפו", "A file or folder was shared from another server" : "קובץ או תיקייה שותפו מ- שרת אחר", "A public shared file or folder was downloaded" : "קובץ או תיקייה עם שיתוף ציבורי הורדו", diff --git a/apps/user_ldap/l10n/he.js b/apps/user_ldap/l10n/he.js index 385132a0b5..8ff1a2037e 100644 --- a/apps/user_ldap/l10n/he.js +++ b/apps/user_ldap/l10n/he.js @@ -13,6 +13,7 @@ OC.L10N.register( " Could not set configuration %s" : " לא ניתן היה לקבוע הגדרות %s", "Action does not exist" : "פעולה לא קיימת", "The Base DN appears to be wrong" : "בסיס DN נראה כשגוי", + "Testing configuration…" : "בדיקת תצורה...", "Configuration incorrect" : "הגדרה שגויה", "Configuration incomplete" : "הגדרה לא מלאה", "Configuration OK" : "הגדרה בסדר", @@ -95,6 +96,7 @@ OC.L10N.register( "Test Base DN" : "בדיקת DN בסיסי", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "נמנע מבקשות אוטומטיות של LDAP. מועדף עבור התקנות גדולות, אבל מחייב ידע מסויים של LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "הכנסת מסנני LDAP ידנית (מומלץ עבוק תיקיות גדולות)", + "%s access is limited to users meeting these criteria:" : "%s גישה מוגבלת למשתמשים שעונים על קריטריונים אלו:", "The filter specifies which LDAP users shall have access to the %s instance." : "הסינון קובע לאיזו משתמשי LDAP תהיה יכולת כניסה למקרה %s.", "Verify settings and count users" : "מאמת הגדרות וסופר משתמשים", "Saving" : "שמירה", diff --git a/apps/user_ldap/l10n/he.json b/apps/user_ldap/l10n/he.json index 44e94a5870..0ad2d1fc61 100644 --- a/apps/user_ldap/l10n/he.json +++ b/apps/user_ldap/l10n/he.json @@ -11,6 +11,7 @@ " Could not set configuration %s" : " לא ניתן היה לקבוע הגדרות %s", "Action does not exist" : "פעולה לא קיימת", "The Base DN appears to be wrong" : "בסיס DN נראה כשגוי", + "Testing configuration…" : "בדיקת תצורה...", "Configuration incorrect" : "הגדרה שגויה", "Configuration incomplete" : "הגדרה לא מלאה", "Configuration OK" : "הגדרה בסדר", @@ -93,6 +94,7 @@ "Test Base DN" : "בדיקת DN בסיסי", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "נמנע מבקשות אוטומטיות של LDAP. מועדף עבור התקנות גדולות, אבל מחייב ידע מסויים של LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "הכנסת מסנני LDAP ידנית (מומלץ עבוק תיקיות גדולות)", + "%s access is limited to users meeting these criteria:" : "%s גישה מוגבלת למשתמשים שעונים על קריטריונים אלו:", "The filter specifies which LDAP users shall have access to the %s instance." : "הסינון קובע לאיזו משתמשי LDAP תהיה יכולת כניסה למקרה %s.", "Verify settings and count users" : "מאמת הגדרות וסופר משתמשים", "Saving" : "שמירה", diff --git a/lib/l10n/he.js b/lib/l10n/he.js index 35d2593ffe..bad99d5c63 100644 --- a/lib/l10n/he.js +++ b/lib/l10n/he.js @@ -9,6 +9,7 @@ OC.L10N.register( "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "התגלה שדוגמת התצורה הועתקה. דבר זה עלול לשבור את ההתקנה ולא נתמך.יש לקרוא את מסמכי התיעוד לפני שמבצעים שינויים ב- config.php", "PHP %s or higher is required." : "נדרש PHP בגרסת %s ומעלה.", "PHP with a version lower than %s is required." : "נדרש PHP בגרסה נמוכה מ- %s.", + "%sbit or higher PHP required." : "נדרש PHP בגרסת %s ומעלה.", "Following databases are supported: %s" : "מסדי הנתונים הבאים נתמכים: %s", "The command line tool %s could not be found" : "כלי שורת הפקודה %s לא אותר", "The library %s is not available." : "הספריה %s אינה זמינה.", @@ -98,6 +99,8 @@ OC.L10N.register( "Sharing %s failed, because the sharing backend for %s could not find its source" : "השיתוף %s נכשל, כיוון שבצד אחורי לשיתוף עבור %s לא ניתן היה לאתר את מקורו", "Sharing %s failed, because the file could not be found in the file cache" : "השיתוף %s נכשל, כייון שלא ניתן היה למצוא את הקובץ בזכרון המטמון", "Cannot increase permissions of %s" : "לא ניתן להגדיל את ההיתרים של %s", + "Files can't be shared with delete permissions" : "קובץ לא ניתן לשיתוף בפעולת מחיקת הרשאות", + "Files can't be shared with create permissions" : "קובץ לא ניתן לשיתוף בפעולת יצירת הרשאות", "Expiration date is in the past" : "תאריך תפוגה הנו בעבר", "Cannot set expiration date more than %s days in the future" : "לא ניתן להגדיר את תאריך התפוגה מעל %s ימים בעתיד", "Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“", @@ -107,12 +110,14 @@ OC.L10N.register( "Username contains whitespace at the beginning or at the end" : "שם המשתמש מכיל רווח בתחילתו או בסופו", "A valid password must be provided" : "יש לספק ססמה תקנית", "The username is already being used" : "השם משתמש כבר בשימוש", + "Login canceled by app" : "התחברות בוטלה על ידי יישום", "User disabled" : "משתמש מנוטרל", "Help" : "עזרה", "Personal" : "אישי", "Users" : "משתמשים", "Admin" : "מנהל", "Recommended" : "מומלץ", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "יישום \"%s\" לא ניתן להתקנה כיוון שקובץ appinfo לא ניתן לקריאה.", "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "היישום \"%s\" לא ניתן להתקנה כיוון שאינו תואם לגרסה זו של ownCloud.", "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "היישום \"%s\" לא ניתן להתקנה כיוון שיחסי התלות הבאים אינם מתקיימים: %s", "No app name specified" : "לא הוגדר שם יישום", diff --git a/lib/l10n/he.json b/lib/l10n/he.json index d60e048657..73481766e0 100644 --- a/lib/l10n/he.json +++ b/lib/l10n/he.json @@ -7,6 +7,7 @@ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "התגלה שדוגמת התצורה הועתקה. דבר זה עלול לשבור את ההתקנה ולא נתמך.יש לקרוא את מסמכי התיעוד לפני שמבצעים שינויים ב- config.php", "PHP %s or higher is required." : "נדרש PHP בגרסת %s ומעלה.", "PHP with a version lower than %s is required." : "נדרש PHP בגרסה נמוכה מ- %s.", + "%sbit or higher PHP required." : "נדרש PHP בגרסת %s ומעלה.", "Following databases are supported: %s" : "מסדי הנתונים הבאים נתמכים: %s", "The command line tool %s could not be found" : "כלי שורת הפקודה %s לא אותר", "The library %s is not available." : "הספריה %s אינה זמינה.", @@ -96,6 +97,8 @@ "Sharing %s failed, because the sharing backend for %s could not find its source" : "השיתוף %s נכשל, כיוון שבצד אחורי לשיתוף עבור %s לא ניתן היה לאתר את מקורו", "Sharing %s failed, because the file could not be found in the file cache" : "השיתוף %s נכשל, כייון שלא ניתן היה למצוא את הקובץ בזכרון המטמון", "Cannot increase permissions of %s" : "לא ניתן להגדיל את ההיתרים של %s", + "Files can't be shared with delete permissions" : "קובץ לא ניתן לשיתוף בפעולת מחיקת הרשאות", + "Files can't be shared with create permissions" : "קובץ לא ניתן לשיתוף בפעולת יצירת הרשאות", "Expiration date is in the past" : "תאריך תפוגה הנו בעבר", "Cannot set expiration date more than %s days in the future" : "לא ניתן להגדיר את תאריך התפוגה מעל %s ימים בעתיד", "Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“", @@ -105,12 +108,14 @@ "Username contains whitespace at the beginning or at the end" : "שם המשתמש מכיל רווח בתחילתו או בסופו", "A valid password must be provided" : "יש לספק ססמה תקנית", "The username is already being used" : "השם משתמש כבר בשימוש", + "Login canceled by app" : "התחברות בוטלה על ידי יישום", "User disabled" : "משתמש מנוטרל", "Help" : "עזרה", "Personal" : "אישי", "Users" : "משתמשים", "Admin" : "מנהל", "Recommended" : "מומלץ", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "יישום \"%s\" לא ניתן להתקנה כיוון שקובץ appinfo לא ניתן לקריאה.", "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "היישום \"%s\" לא ניתן להתקנה כיוון שאינו תואם לגרסה זו של ownCloud.", "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "היישום \"%s\" לא ניתן להתקנה כיוון שיחסי התלות הבאים אינם מתקיימים: %s", "No app name specified" : "לא הוגדר שם יישום", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 708686d8ac..bbca7e3fcd 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -223,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Dokumentace:", "User documentation" : "Dokumentace uživatele", "Admin documentation" : "Dokumentace pro administrátory", + "Visit website" : "Navštívit webovou stránku", "Report a bug" : "Nahlásit chybu", "Show description …" : "Zobrazit popis ...", "Hide description …" : "Skrýt popis ...", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 7d341e0499..59e2d3efed 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -221,6 +221,7 @@ "Documentation:" : "Dokumentace:", "User documentation" : "Dokumentace uživatele", "Admin documentation" : "Dokumentace pro administrátory", + "Visit website" : "Navštívit webovou stránku", "Report a bug" : "Nahlásit chybu", "Show description …" : "Zobrazit popis ...", "Hide description …" : "Skrýt popis ...", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index 9c42f190e0..1eb29d8d1b 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -223,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Dokumentation:", "User documentation" : "Dokumentation für Benutzer", "Admin documentation" : "Dokumentation für Administratoren", + "Visit website" : "Webseite besuchen", "Report a bug" : "Melde einen technischen Fehler", "Show description …" : "Beschreibung anzeigen…", "Hide description …" : "Beschreibung ausblenden…", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index c8f55690af..9249ab2f63 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -221,6 +221,7 @@ "Documentation:" : "Dokumentation:", "User documentation" : "Dokumentation für Benutzer", "Admin documentation" : "Dokumentation für Administratoren", + "Visit website" : "Webseite besuchen", "Report a bug" : "Melde einen technischen Fehler", "Show description …" : "Beschreibung anzeigen…", "Hide description …" : "Beschreibung ausblenden…", diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index e5447564a4..048a5b1cdf 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -223,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Dokumentation:", "User documentation" : "Dokumentation für Benutzer", "Admin documentation" : "Dokumentation für Administratoren", + "Visit website" : "Webseite besuchen", "Report a bug" : "Melden Sie einen technischen Fehler", "Show description …" : "Beschreibung anzeigen…", "Hide description …" : "Beschreibung ausblenden…", diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index 65a129eed7..89e69a3f88 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -221,6 +221,7 @@ "Documentation:" : "Dokumentation:", "User documentation" : "Dokumentation für Benutzer", "Admin documentation" : "Dokumentation für Administratoren", + "Visit website" : "Webseite besuchen", "Report a bug" : "Melden Sie einen technischen Fehler", "Show description …" : "Beschreibung anzeigen…", "Hide description …" : "Beschreibung ausblenden…", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index e169a7a1b6..742b485f44 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -149,7 +149,7 @@ OC.L10N.register( "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:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor, compruebe de nuevo las guías de instalación ↗, y comprueba por cualquier error o advertencia en el Registro", "All checks passed." : "Ha pasado todos los controles", - "Open documentation" : "Documentación abierta", + "Open documentation" : "Abrir Documentación", "Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición", "Allow users to share via link" : "Permite a los usuarios compartir por medio de enlaces", "Allow public uploads" : "Permitir subidas públicas", @@ -223,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Documentación:", "User documentation" : "Documentación de usuario", "Admin documentation" : "Documentación de administrador", + "Visit website" : "Visite nuestro sitio web", "Report a bug" : "Notificar un error", "Show description …" : "Mostrar descripción…", "Hide description …" : "Ocultar descripción…", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 3fb9252588..783777c24d 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -147,7 +147,7 @@ "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:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Por favor, compruebe de nuevo las guías de instalación ↗, y comprueba por cualquier error o advertencia en el Registro", "All checks passed." : "Ha pasado todos los controles", - "Open documentation" : "Documentación abierta", + "Open documentation" : "Abrir Documentación", "Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición", "Allow users to share via link" : "Permite a los usuarios compartir por medio de enlaces", "Allow public uploads" : "Permitir subidas públicas", @@ -221,6 +221,7 @@ "Documentation:" : "Documentación:", "User documentation" : "Documentación de usuario", "Admin documentation" : "Documentación de administrador", + "Visit website" : "Visite nuestro sitio web", "Report a bug" : "Notificar un error", "Show description …" : "Mostrar descripción…", "Hide description …" : "Ocultar descripción…", diff --git a/settings/l10n/he.js b/settings/l10n/he.js index a9ef2b3642..a8a0cf420e 100644 --- a/settings/l10n/he.js +++ b/settings/l10n/he.js @@ -87,6 +87,9 @@ OC.L10N.register( "App update" : "עדכון יישום", "No apps found for {query}" : "לא נמצא יישום עבור {query}", "Disconnect" : "ניתוק", + "Error while loading browser sessions and device tokens" : "שגיאה בזמן טעינת שיחת דפדפן ומחרוזת התקן", + "Error while creating device token" : "שגיאה בזמן יצירת מחרוזת התקן", + "Error while deleting the token" : "שגיאה בזמן מחיקת המחרוזת", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "אירעה שגיאה. יש להעלות תעודת ASCII-encoded PEM.", "Valid until {date}" : "בתוקף עד ל- {date}", "Delete" : "מחיקה", @@ -115,6 +118,7 @@ OC.L10N.register( "__language_name__" : "עברית", "Unlimited" : "ללא הגבלה", "Personal info" : "מידע אישי", + "Sessions" : "שיחות", "Devices" : "התקנים", "Sync clients" : "סנכרון לקוחות", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", @@ -133,6 +137,7 @@ OC.L10N.register( "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "תצורת קריאה בלבד הופעלה. תצורה זו מונעת קביעת מספר הגדרות באמצעות ממשק האינטרנט. יתר על כן, יש צורך להגדיר ההרשאות כתיבה באופן ידני לכל עדכון.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP מוגדר ככל הנראה להפשיט בלוקי קוד. מצב זה יגרום למספר יישומי ליבה להיות לא נגישים.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "זה ככל הנראה נגרם על ידי מאיץ/מטמון כמו Zend OPcache או eAccelerator.", + "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "מסד הנתונים שלך אינו רץ עם \"READ COMMITED\" ברמת בידוד פעולה. דבר זה עלול להוות בעייה בזמן הרצת מספר פעולות במקביל.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "השרת רץ על גבי חלונות של מיקוסופט. אנו ממליצים בחום על לינוקס לחווית משתמש מיטבית.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s מתחת לגרסה %2$s מותקנת, מסיבות יציבות וביצועים אנו ממליצים לעדכן לגרסה חדשה יותר גרסה %1$s.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "מודול ה- PHP מסוג 'fileinfo' חסר. אנו ממליצים בחום לאפשר מודול זה כדי לקבל תוצאות מיטביות עם גילוי mime-type.", @@ -218,6 +223,8 @@ OC.L10N.register( "Documentation:" : "תיעוד", "User documentation" : "תיעוד משתמש", "Admin documentation" : "תיעוד מנהל", + "Visit website" : "ביקור באתר האינטרנט", + "Report a bug" : "דיווח על באג", "Show description …" : "הצגת תיאור ...", "Hide description …" : "הסתרת תיאור ...", "This app has an update available." : "ליישום זה קיים עדכון זמין.", @@ -262,9 +269,12 @@ OC.L10N.register( "Current password" : "סיסמא נוכחית", "New password" : "סיסמא חדשה", "Change password" : "שינוי סיסמא", + "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "אלו הם לקוחות האינטרנט, המחשב השולחני והטלפון שכרגע מחוברים ל- ownCloud שלך.", "Browser" : "דפדפן", "Most recent activity" : "פעילות אחרונה", + "You've linked these devices." : "ההתקנים האלו קושרו.", "Name" : "שם", + "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "סיסמת התקן הנה קוד סודי שמאפשר הרשאות ליישום או התקן להכנס לחשבון ה- ownCloud שלך.", "Language" : "שפה", "Help translate" : "עזרה בתרגום", "Get the apps to sync your files" : "קבלת היישומים לסנכרון הקבצים שלך", diff --git a/settings/l10n/he.json b/settings/l10n/he.json index cda70c972d..bf367ed602 100644 --- a/settings/l10n/he.json +++ b/settings/l10n/he.json @@ -85,6 +85,9 @@ "App update" : "עדכון יישום", "No apps found for {query}" : "לא נמצא יישום עבור {query}", "Disconnect" : "ניתוק", + "Error while loading browser sessions and device tokens" : "שגיאה בזמן טעינת שיחת דפדפן ומחרוזת התקן", + "Error while creating device token" : "שגיאה בזמן יצירת מחרוזת התקן", + "Error while deleting the token" : "שגיאה בזמן מחיקת המחרוזת", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "אירעה שגיאה. יש להעלות תעודת ASCII-encoded PEM.", "Valid until {date}" : "בתוקף עד ל- {date}", "Delete" : "מחיקה", @@ -113,6 +116,7 @@ "__language_name__" : "עברית", "Unlimited" : "ללא הגבלה", "Personal info" : "מידע אישי", + "Sessions" : "שיחות", "Devices" : "התקנים", "Sync clients" : "סנכרון לקוחות", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", @@ -131,6 +135,7 @@ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "תצורת קריאה בלבד הופעלה. תצורה זו מונעת קביעת מספר הגדרות באמצעות ממשק האינטרנט. יתר על כן, יש צורך להגדיר ההרשאות כתיבה באופן ידני לכל עדכון.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP מוגדר ככל הנראה להפשיט בלוקי קוד. מצב זה יגרום למספר יישומי ליבה להיות לא נגישים.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "זה ככל הנראה נגרם על ידי מאיץ/מטמון כמו Zend OPcache או eAccelerator.", + "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "מסד הנתונים שלך אינו רץ עם \"READ COMMITED\" ברמת בידוד פעולה. דבר זה עלול להוות בעייה בזמן הרצת מספר פעולות במקביל.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "השרת רץ על גבי חלונות של מיקוסופט. אנו ממליצים בחום על לינוקס לחווית משתמש מיטבית.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s מתחת לגרסה %2$s מותקנת, מסיבות יציבות וביצועים אנו ממליצים לעדכן לגרסה חדשה יותר גרסה %1$s.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "מודול ה- PHP מסוג 'fileinfo' חסר. אנו ממליצים בחום לאפשר מודול זה כדי לקבל תוצאות מיטביות עם גילוי mime-type.", @@ -216,6 +221,8 @@ "Documentation:" : "תיעוד", "User documentation" : "תיעוד משתמש", "Admin documentation" : "תיעוד מנהל", + "Visit website" : "ביקור באתר האינטרנט", + "Report a bug" : "דיווח על באג", "Show description …" : "הצגת תיאור ...", "Hide description …" : "הסתרת תיאור ...", "This app has an update available." : "ליישום זה קיים עדכון זמין.", @@ -260,9 +267,12 @@ "Current password" : "סיסמא נוכחית", "New password" : "סיסמא חדשה", "Change password" : "שינוי סיסמא", + "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "אלו הם לקוחות האינטרנט, המחשב השולחני והטלפון שכרגע מחוברים ל- ownCloud שלך.", "Browser" : "דפדפן", "Most recent activity" : "פעילות אחרונה", + "You've linked these devices." : "ההתקנים האלו קושרו.", "Name" : "שם", + "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "סיסמת התקן הנה קוד סודי שמאפשר הרשאות ליישום או התקן להכנס לחשבון ה- ownCloud שלך.", "Language" : "שפה", "Help translate" : "עזרה בתרגום", "Get the apps to sync your files" : "קבלת היישומים לסנכרון הקבצים שלך", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 489309255d..1d36d8156c 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -223,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Documentazione:", "User documentation" : "Documentazione utente", "Admin documentation" : "Documentazione di amministrazione", + "Visit website" : "Visita il sito web", "Report a bug" : "Segnala un bug", "Show description …" : "Mostra descrizione...", "Hide description …" : "Nascondi descrizione...", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index acdee58008..9d5c160b8b 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -221,6 +221,7 @@ "Documentation:" : "Documentazione:", "User documentation" : "Documentazione utente", "Admin documentation" : "Documentazione di amministrazione", + "Visit website" : "Visita il sito web", "Report a bug" : "Segnala un bug", "Show description …" : "Mostra descrizione...", "Hide description …" : "Nascondi descrizione...", From d0a2515e2b08bffac3e3f447cc78c24f372a0589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 14 Jun 2016 09:53:30 +0200 Subject: [PATCH 08/52] Us an explicit version of sabre/dav to allow caching on the jenkins slaves - fixes #25087 (#25088) --- build/integration/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/integration/composer.json b/build/integration/composer.json index 9e5335c4b2..29f73f2064 100644 --- a/build/integration/composer.json +++ b/build/integration/composer.json @@ -4,6 +4,6 @@ "behat/behat": "^3.0", "guzzlehttp/guzzle": "~5.0", "jarnaiz/behat-junit-formatter": "^1.3", - "sabre/dav": "3.0.x-dev" + "sabre/dav": "3.0.9" } } From ae3d0d96fe7e273f6dfae3a5ca4754b5da4353cc Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 3 May 2016 11:58:33 +0200 Subject: [PATCH 09/52] Optimize isSharingDisabledForuser --- lib/private/Share20/Manager.php | 40 ++++++++++++++++++++------------- lib/public/Util.php | 14 +++++++----- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index ceaaa58cf6..2b1c7d828f 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -24,25 +24,24 @@ namespace OC\Share20; +use OC\Cache\CappedMemoryCache; use OC\Files\Mount\MoveableMount; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\IUserManager; -use OCP\Share\IManager; -use OCP\Share\IProviderFactory; -use OC\Share20\Exception\BackendError; -use OCP\IConfig; -use OCP\IL10N; -use OCP\ILogger; -use OCP\Security\ISecureRandom; -use OCP\Security\IHasher; -use OCP\Files\Mount\IMountManager; -use OCP\IGroupManager; use OCP\Files\File; use OCP\Files\Folder; - -use OCP\Share\Exceptions\ShareNotFound; +use OCP\Files\IRootFolder; +use OCP\Files\Mount\IMountManager; +use OCP\Files\NotFoundException; +use OCP\IConfig; +use OCP\IGroupManager; +use OCP\IL10N; +use OCP\ILogger; +use OCP\IUserManager; +use OCP\Security\IHasher; +use OCP\Security\ISecureRandom; use OCP\Share\Exceptions\GenericShareException; +use OCP\Share\Exceptions\ShareNotFound; +use OCP\Share\IManager; +use OCP\Share\IProviderFactory; /** * This class is the communication hub for all sharing related operations. @@ -69,6 +68,9 @@ class Manager implements IManager { private $userManager; /** @var IRootFolder */ private $rootFolder; + /** @var CappedMemoryCache */ + private $sharingDisabledForUsersCache; + /** * Manager constructor. @@ -106,6 +108,7 @@ class Manager implements IManager { $this->factory = $factory; $this->userManager = $userManager; $this->rootFolder = $rootFolder; + $this->sharingDisabledForUsersCache = new CappedMemoryCache(); } /** @@ -1209,6 +1212,10 @@ class Manager implements IManager { * @return bool */ public function sharingDisabledForUser($userId) { + if (isset($this->sharingDisabledForUsersCache[$userId])) { + return $this->sharingDisabledForUsersCache[$userId]; + } + if ($this->config->getAppValue('core', 'shareapi_exclude_groups', 'no') === 'yes') { $groupsList = $this->config->getAppValue('core', 'shareapi_exclude_groups_list', ''); $excludedGroups = json_decode($groupsList); @@ -1224,10 +1231,13 @@ class Manager implements IManager { // if the user is only in groups which are disabled for sharing then // sharing is also disabled for the user if (empty($remainingGroups)) { + $this->sharingDisabledForUsersCache[$userId] = true; return true; } } } + + $this->sharingDisabledForUsersCache[$userId] = false; return false; } diff --git a/lib/public/Util.php b/lib/public/Util.php index eb573168e1..86f8456521 100644 --- a/lib/public/Util.php +++ b/lib/public/Util.php @@ -63,6 +63,9 @@ class Util { const ERROR=3; const FATAL=4; + /** \OCP\Share\IManager */ + private static $shareManager; + /** * get the current installed version of ownCloud * @return array @@ -171,13 +174,14 @@ class Util { * * @return boolean * @since 7.0.0 + * @deprecated 9.1.0 Use \OC::$server->getShareManager()->sharingDisabledForUser */ public static function isSharingDisabledForUser() { - return \OC_Util::isSharingDisabledForUser( - \OC::$server->getConfig(), - \OC::$server->getGroupManager(), - \OC::$server->getUserSession()->getUser() - ); + if (self::$shareManager === null) { + self::$shareManager = \OC::$server->getShareManager(); + } + + return self::$shareManager->sharingDisabledForUser(\OC::$server->getUserSession()->getUser()->getUID()); } /** From 28d070730d9de5aec690f152a95dbf1da123d2ee Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 3 May 2016 14:05:51 +0200 Subject: [PATCH 10/52] Fix case with no user --- lib/private/Share20/Manager.php | 4 ++++ lib/public/Util.php | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 2b1c7d828f..e2730f4d5f 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -1212,6 +1212,10 @@ class Manager implements IManager { * @return bool */ public function sharingDisabledForUser($userId) { + if ($userId === null) { + return false; + } + if (isset($this->sharingDisabledForUsersCache[$userId])) { return $this->sharingDisabledForUsersCache[$userId]; } diff --git a/lib/public/Util.php b/lib/public/Util.php index 86f8456521..687f4e78f6 100644 --- a/lib/public/Util.php +++ b/lib/public/Util.php @@ -181,7 +181,12 @@ class Util { self::$shareManager = \OC::$server->getShareManager(); } - return self::$shareManager->sharingDisabledForUser(\OC::$server->getUserSession()->getUser()->getUID()); + $user = \OC::$server->getUserSession()->getUser(); + if ($user !== null) { + $user = $user->getUID(); + } + + return self::$shareManager->sharingDisabledForUser($user); } /** From 123bf78ca8e25cbc91d937f5090423594bf7ae35 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 14 Jun 2016 12:30:22 +0200 Subject: [PATCH 11/52] Clean up tags of deleted users --- lib/private/Repair.php | 2 +- lib/private/Repair/CleanTags.php | 57 +++++++++++++++++++++++++++++- tests/lib/Repair/CleanTagsTest.php | 28 +++++++++++++-- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/lib/private/Repair.php b/lib/private/Repair.php index bb2967d7e6..1fd204fcd8 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -127,7 +127,7 @@ class Repair implements IOutput{ new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), new AssetCache(), new FillETags(\OC::$server->getDatabaseConnection()), - new CleanTags(\OC::$server->getDatabaseConnection()), + new CleanTags(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager()), new DropOldTables(\OC::$server->getDatabaseConnection()), new DropOldJobs(\OC::$server->getJobList()), new RemoveGetETagEntries(\OC::$server->getDatabaseConnection()), diff --git a/lib/private/Repair/CleanTags.php b/lib/private/Repair/CleanTags.php index 60ddeff08f..4241fa6da3 100644 --- a/lib/private/Repair/CleanTags.php +++ b/lib/private/Repair/CleanTags.php @@ -25,6 +25,7 @@ namespace OC\Repair; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; +use OCP\IUserManager; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; @@ -38,11 +39,18 @@ class CleanTags implements IRepairStep { /** @var IDBConnection */ protected $connection; + /** @var IUserManager */ + protected $userManager; + + protected $deletedTags = 0; + /** * @param IDBConnection $connection + * @param IUserManager $userManager */ - public function __construct(IDBConnection $connection) { + public function __construct(IDBConnection $connection, IUserManager $userManager) { $this->connection = $connection; + $this->userManager = $userManager; } /** @@ -56,11 +64,58 @@ class CleanTags implements IRepairStep { * Updates the configuration after running an update */ public function run(IOutput $output) { + $this->deleteOrphanTags($output); $this->deleteOrphanFileEntries($output); $this->deleteOrphanTagEntries($output); $this->deleteOrphanCategoryEntries($output); } + /** + * Delete tags for deleted users + */ + protected function deleteOrphanTags(IOutput $output) { + $offset = 0; + while ($this->checkTags($offset)) { + $offset += 50; + } + + $output->info(sprintf('%d tags of deleted users have been removed.', $this->deletedTags)); + } + + protected function checkTags($offset) { + $query = $this->connection->getQueryBuilder(); + $query->select('uid') + ->from('vcategory') + ->groupBy('uid') + ->orderBy('uid') + ->setMaxResults(50) + ->setFirstResult($offset); + $result = $query->execute(); + + $users = []; + $hadResults = false; + while ($row = $result->fetch()) { + $hadResults = true; + if (!$this->userManager->userExists($row['uid'])) { + $users[] = $row['uid']; + } + } + $result->closeCursor(); + + if (!$hadResults) { + // No more tags, stop looping + return false; + } + + if (!empty($users)) { + $query = $this->connection->getQueryBuilder(); + $query->delete('vcategory') + ->where($query->expr()->in('uid', $query->createNamedParameter($users, IQueryBuilder::PARAM_STR_ARRAY))); + $this->deletedTags += $query->execute(); + } + return true; + } + /** * Delete tag entries for deleted files */ diff --git a/tests/lib/Repair/CleanTagsTest.php b/tests/lib/Repair/CleanTagsTest.php index 804fa4f66c..ac79907c52 100644 --- a/tests/lib/Repair/CleanTagsTest.php +++ b/tests/lib/Repair/CleanTagsTest.php @@ -25,6 +25,9 @@ class CleanTagsTest extends \Test\TestCase { /** @var \OCP\IDBConnection */ protected $connection; + /** @var \OCP\IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $userManager; + /** @var int */ protected $createdFile; @@ -38,8 +41,12 @@ class CleanTagsTest extends \Test\TestCase { ->disableOriginalConstructor() ->getMock(); + $this->userManager = $this->getMockBuilder('\OCP\IUserManager') + ->disableOriginalConstructor() + ->getMock(); + $this->connection = \OC::$server->getDatabaseConnection(); - $this->repair = new \OC\Repair\CleanTags($this->connection); + $this->repair = new \OC\Repair\CleanTags($this->connection, $this->userManager); $this->cleanUpTables(); } @@ -86,6 +93,20 @@ class CleanTagsTest extends \Test\TestCase { self::invokePrivate($this->repair, 'deleteOrphanCategoryEntries', [$this->outputMock]); $this->assertEntryCount('vcategory_to_object', 2, 'Assert tag entries count after cleaning category entries'); $this->assertEntryCount('vcategory', 2, 'Assert tag categories count after cleaning category entries'); + + + $this->addTagCategory('TestRepairCleanTags', 'contacts', 'userExists'); // Retained + $this->assertEntryCount('vcategory', 3, 'Assert tag categories count before cleaning categories by users'); + + $this->userManager->expects($this->exactly(2)) + ->method('userExists') + ->willReturnMap([ + ['userExists', true], + ['TestRepairCleanTags', false], + ]); + + self::invokePrivate($this->repair, 'deleteOrphanTags', [$this->outputMock]); + $this->assertEntryCount('vcategory', 1, 'Assert tag categories count after cleaning categories by users'); } /** @@ -107,13 +128,14 @@ class CleanTagsTest extends \Test\TestCase { * * @param string $category * @param string $type + * @param string $user * @return int */ - protected function addTagCategory($category, $type) { + protected function addTagCategory($category, $type, $user = 'TestRepairCleanTags') { $qb = $this->connection->getQueryBuilder(); $qb->insert('vcategory') ->values([ - 'uid' => $qb->createNamedParameter('TestRepairCleanTags'), + 'uid' => $qb->createNamedParameter($user), 'category' => $qb->createNamedParameter($category), 'type' => $qb->createNamedParameter($type), ]) From ea4c5e6e0abb978d8cc49e604966609e97bec525 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 14 Jun 2016 11:03:32 +0200 Subject: [PATCH 12/52] Fix unit tests --- tests/lib/Files/ViewTest.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php index 59b17b8395..87feb63888 100644 --- a/tests/lib/Files/ViewTest.php +++ b/tests/lib/Files/ViewTest.php @@ -7,6 +7,7 @@ namespace Test\Files; +use OC\Cache\CappedMemoryCache; use OC\Files\Cache\Watcher; use OC\Files\Storage\Common; use OC\Files\Mount\MountPoint; @@ -269,6 +270,9 @@ class ViewTest extends \Test\TestCase { * @dataProvider sharingDisabledPermissionProvider */ public function testRemoveSharePermissionWhenSharingDisabledForUser($excludeGroups, $excludeGroupsList, $expectedShareable) { + // Reset sharing disabled for users cache + $this->invokePrivate(\OC::$server->getShareManager(), 'sharingDisabledForUsersCache', [new CappedMemoryCache()]); + $appConfig = \OC::$server->getAppConfig(); $oldExcludeGroupsFlag = $appConfig->getValue('core', 'shareapi_exclude_groups', 'no'); $oldExcludeGroupsList = $appConfig->getValue('core', 'shareapi_exclude_groups_list', ''); @@ -290,6 +294,9 @@ class ViewTest extends \Test\TestCase { $appConfig->setValue('core', 'shareapi_exclude_groups', $oldExcludeGroupsFlag); $appConfig->setValue('core', 'shareapi_exclude_groups_list', $oldExcludeGroupsList); + + // Reset sharing disabled for users cache + $this->invokePrivate(\OC::$server->getShareManager(), 'sharingDisabledForUsersCache', [new CappedMemoryCache()]); } public function testCacheIncompleteFolder() { From 1fddd62c1ca0cd3407fb15d62d463491e37e336d Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 14 Jun 2016 17:06:24 +0200 Subject: [PATCH 13/52] remvoe duplicate rmdir --- lib/private/Preview.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/private/Preview.php b/lib/private/Preview.php index f5e2f6b57e..b5625ce0df 100644 --- a/lib/private/Preview.php +++ b/lib/private/Preview.php @@ -422,7 +422,6 @@ class Preview { // .ocTransferId*.part file from chunked file upload. if (!empty($fileId)) { $previewPath = $this->getPreviewPath($fileId); - $this->userView->deleteAll($previewPath); $this->userView->rmdir($previewPath); } } From dfcaeeabb3b69888d993c29016a5e8d4a0aa7569 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 14 Jun 2016 17:17:29 +0200 Subject: [PATCH 14/52] propagator batching when removing thumbnails --- lib/private/Preview.php | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/private/Preview.php b/lib/private/Preview.php index b5625ce0df..8bc262d704 100644 --- a/lib/private/Preview.php +++ b/lib/private/Preview.php @@ -136,9 +136,9 @@ class Preview { //check if there are preview backends if (!\OC::$server->getPreviewManager() - ->hasProviders() + ->hasProviders() && \OC::$server->getConfig() - ->getSystemValue('enable_previews', true) + ->getSystemValue('enable_previews', true) ) { \OCP\Util::writeLog('core', 'No preview providers exist', \OCP\Util::ERROR); throw new \Exception('No preview providers'); @@ -410,6 +410,10 @@ class Preview { * Deletes all previews of a file */ public function deleteAllPreviews() { + $thumbnailMount = $this->userView->getMount($this->getThumbnailsFolder()); + $propagator = $thumbnailMount->getStorage()->getPropagator(); + $propagator->beginBatch(); + $toDelete = $this->getChildren(); $toDelete[] = $this->getFileInfo(); @@ -426,6 +430,8 @@ class Preview { } } } + + $propagator->commitBatch(); } /** @@ -572,8 +578,8 @@ class Preview { * @return integer[] */ private function applyAspectRatio($askedWidth, $askedHeight, $originalWidth = 0, $originalHeight = 0) { - if(!$originalWidth){ - $originalWidth= $this->maxPreviewWidth; + if (!$originalWidth) { + $originalWidth = $this->maxPreviewWidth; } if (!$originalHeight) { $originalHeight = $this->maxPreviewHeight; @@ -1112,7 +1118,7 @@ class Preview { $preview = null; $previewProviders = \OC::$server->getPreviewManager() - ->getProviders(); + ->getProviders(); foreach ($previewProviders as $supportedMimeType => $providers) { if (!preg_match($supportedMimeType, $this->mimeType)) { continue; @@ -1126,7 +1132,7 @@ class Preview { \OCP\Util::writeLog( 'core', 'Generating preview for "' . $file . '" with "' . get_class($provider) - . '"', \OCP\Util::DEBUG + . '"', \OCP\Util::DEBUG ); /** @var $provider Provider */ @@ -1260,7 +1266,7 @@ class Preview { $absPath = Files\Filesystem::normalizePath($view->getAbsolutePath($path)); $fileInfo = $view->getFileInfo($path); - if($fileInfo === false) { + if ($fileInfo === false) { return; } self::addPathToDeleteFileMapper($absPath, $fileInfo); From 01d9ad6b14bc5d9fd6c1140e801e92167b0c7f6a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 14 Jun 2016 17:17:43 +0200 Subject: [PATCH 15/52] optimized size propagation on deletes --- lib/private/Files/Cache/Updater.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/private/Files/Cache/Updater.php b/lib/private/Files/Cache/Updater.php index 4e17c4d778..361db4b3f8 100644 --- a/lib/private/Files/Cache/Updater.php +++ b/lib/private/Files/Cache/Updater.php @@ -25,6 +25,8 @@ */ namespace OC\Files\Cache; + +use OCP\Files\Cache\ICacheEntry; use OCP\Files\Cache\IUpdater; use OCP\Files\Storage\IStorage; @@ -150,12 +152,20 @@ class Updater implements IUpdater { $parent = ''; } + $entry = $this->cache->get($path); + $this->cache->remove($path); - if ($this->cache instanceof Cache) { - $this->cache->correctFolderSize($parent); - } + $this->correctParentStorageMtime($path); - $this->propagator->propagateChange($path, time()); + if ($entry instanceof ICacheEntry) { + $this->propagator->propagateChange($path, time(), -$entry->getSize()); + } else { + $this->propagator->propagateChange($path, time()); + if ($this->cache instanceof Cache) { + $this->cache->correctFolderSize($parent); + } + } + } /** From 4f02bd1dff6d2b672c3194ed8d947c849eec173a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 14 Jun 2016 17:27:06 +0200 Subject: [PATCH 16/52] disable cleanFolder for the federated share storage --- apps/files_sharing/lib/External/Storage.php | 11 ++++++- apps/files_sharing/lib/External/Watcher.php | 33 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 apps/files_sharing/lib/External/Watcher.php diff --git a/apps/files_sharing/lib/External/Storage.php b/apps/files_sharing/lib/External/Storage.php index a12b9597db..ca99393a1e 100644 --- a/apps/files_sharing/lib/External/Storage.php +++ b/apps/files_sharing/lib/External/Storage.php @@ -89,8 +89,17 @@ class Storage extends DAV implements ISharedStorage { 'user' => $options['token'], 'password' => (string)$options['password'] )); + } - $this->getWatcher()->setPolicy(\OC\Files\Cache\Watcher::CHECK_ONCE); + public function getWatcher($path = '', $storage = null) { + if (!$storage) { + $storage = $this; + } + if (!isset($this->watcher)) { + $this->watcher = new Watcher($storage); + $this->watcher->setPolicy(\OC\Files\Cache\Watcher::CHECK_ONCE); + } + return $this->watcher; } public function getRemoteUser() { diff --git a/apps/files_sharing/lib/External/Watcher.php b/apps/files_sharing/lib/External/Watcher.php new file mode 100644 index 0000000000..6be35bdeb3 --- /dev/null +++ b/apps/files_sharing/lib/External/Watcher.php @@ -0,0 +1,33 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_Sharing\External; + +class Watcher extends \OC\Files\Cache\Watcher { + /** + * remove deleted files in $path from the cache + * + * @param string $path + */ + public function cleanFolder($path) { + // not needed, the scanner takes care of this + } +} From e325209291b2f5e509638466228a2eb1e7efef5e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 14 Jun 2016 17:38:32 +0200 Subject: [PATCH 17/52] Convert Dropbox Forbidden exception to StorageNotAvailableException --- apps/files_external/lib/Lib/Storage/Dropbox.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/files_external/lib/Lib/Storage/Dropbox.php b/apps/files_external/lib/Lib/Storage/Dropbox.php index f15cbba046..f0f62f9f35 100644 --- a/apps/files_external/lib/Lib/Storage/Dropbox.php +++ b/apps/files_external/lib/Lib/Storage/Dropbox.php @@ -32,6 +32,7 @@ namespace OCA\Files_External\Lib\Storage; use GuzzleHttp\Exception\RequestException; use Icewind\Streams\IteratorDirectory; use Icewind\Streams\RetryWrapper; +use OCP\Files\StorageNotAvailableException; require_once __DIR__ . '/../../../3rdparty/Dropbox/autoload.php'; @@ -94,6 +95,8 @@ class Dropbox extends \OC\Files\Storage\Common { if ($list) { try { $response = $this->dropbox->getMetaData($path); + } catch (\Dropbox_Exception_Forbidden $e) { + throw new StorageNotAvailableException('Dropbox API rate limit exceeded', StorageNotAvailableException::STATUS_ERROR, $e); } catch (\Exception $exception) { \OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR); return false; @@ -127,6 +130,8 @@ class Dropbox extends \OC\Files\Storage\Common { return $response; } return null; + } catch (\Dropbox_Exception_Forbidden $e) { + throw new StorageNotAvailableException('Dropbox API rate limit exceeded', StorageNotAvailableException::STATUS_ERROR, $e); } catch (\Exception $exception) { if ($exception instanceof \Dropbox_Exception_NotFound) { // don't log, might be a file_exist check From be4a29d75f412c7ac7c8e690e5fcdb4b63c3342f Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Wed, 15 Jun 2016 05:54:49 +0000 Subject: [PATCH 18/52] [tx-robot] updated from transifex --- apps/federatedfilesharing/l10n/nl.js | 1 + apps/federatedfilesharing/l10n/nl.json | 1 + apps/files/l10n/fr.js | 1 + apps/files/l10n/fr.json | 1 + apps/files/l10n/nl.js | 3 ++- apps/files/l10n/nl.json | 3 ++- apps/updatenotification/l10n/nl.js | 1 + apps/updatenotification/l10n/nl.json | 1 + core/l10n/fr.js | 1 + core/l10n/fr.json | 1 + core/l10n/he.js | 27 ++++++++++++++++++++++++++ core/l10n/he.json | 27 ++++++++++++++++++++++++++ lib/l10n/ca.js | 1 + lib/l10n/ca.json | 1 + settings/l10n/fr.js | 6 ++++++ settings/l10n/fr.json | 6 ++++++ 16 files changed, 80 insertions(+), 2 deletions(-) diff --git a/apps/federatedfilesharing/l10n/nl.js b/apps/federatedfilesharing/l10n/nl.js index 805abd0877..0e91c23c73 100644 --- a/apps/federatedfilesharing/l10n/nl.js +++ b/apps/federatedfilesharing/l10n/nl.js @@ -5,6 +5,7 @@ OC.L10N.register( "Invalid Federated Cloud ID" : "Ongeldige Federated Cloud ID", "Sharing %s failed, because this item is already shared with %s" : "Delen van %s is mislukt, omdat het object al wordt gedeeld met %s", "Not allowed to create a federated share with the same user" : "Het is niet toegestaan om een gefedereerde share met dezelfde gebruikersserver te maken", + "File is already shared with %s" : "Bestand is al gedeeld met %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar.", "Accept" : "Accepteren", "Decline" : "Afwijzen", diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json index c208126327..00144dfcac 100644 --- a/apps/federatedfilesharing/l10n/nl.json +++ b/apps/federatedfilesharing/l10n/nl.json @@ -3,6 +3,7 @@ "Invalid Federated Cloud ID" : "Ongeldige Federated Cloud ID", "Sharing %s failed, because this item is already shared with %s" : "Delen van %s is mislukt, omdat het object al wordt gedeeld met %s", "Not allowed to create a federated share with the same user" : "Het is niet toegestaan om een gefedereerde share met dezelfde gebruikersserver te maken", + "File is already shared with %s" : "Bestand is al gedeeld met %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar.", "Accept" : "Accepteren", "Decline" : "Afwijzen", diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index c0d1f22e74..b2d6662a9c 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "Dossier non valide.", "Files" : "Fichiers", "All files" : "Tous les fichiers", + "File could not be found" : "Ce fichier n'a pu être trouvé.", "Home" : "Mes fichiers", "Close" : "Fermer", "Favorites" : "Favoris", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 7db4cf9531..780ef364b9 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -19,6 +19,7 @@ "Invalid directory." : "Dossier non valide.", "Files" : "Fichiers", "All files" : "Tous les fichiers", + "File could not be found" : "Ce fichier n'a pu être trouvé.", "Home" : "Mes fichiers", "Close" : "Fermer", "Favorites" : "Favoris", diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 94483ede49..971ca49f4c 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "Ongeldige directory.", "Files" : "Bestanden", "All files" : "Alle bestanden", + "File could not be found" : "Bestand kon niet worden gevonden", "Home" : "Thuis", "Close" : "Sluiten", "Favorites" : "Favorieten", @@ -86,7 +87,7 @@ OC.L10N.register( "A file or folder has been changed" : "Een bestand of map is gewijzigd", "Limit notifications about creation and changes to your favorite files (Stream only)" : "Beperk meldingen over aanmaken en wijzigen aan uw favoriete bestanden (Alleen stream)", "A file or folder has been deleted" : "Een bestand of map is verwijderd", - "A file or folder has been restored" : "Een bestand of een mmaps is hersteld", + "A file or folder has been restored" : "Een bestand of een map is hersteld", "You created %1$s" : "Gecreëerd: %1$s", "%2$s created %1$s" : "%2$s creëerde %1$s", "%1$s was created in a public folder" : "%1$s werd gecreëerd in een openbare map", diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 524570f487..67ec790a59 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -19,6 +19,7 @@ "Invalid directory." : "Ongeldige directory.", "Files" : "Bestanden", "All files" : "Alle bestanden", + "File could not be found" : "Bestand kon niet worden gevonden", "Home" : "Thuis", "Close" : "Sluiten", "Favorites" : "Favorieten", @@ -84,7 +85,7 @@ "A file or folder has been changed" : "Een bestand of map is gewijzigd", "Limit notifications about creation and changes to your favorite files (Stream only)" : "Beperk meldingen over aanmaken en wijzigen aan uw favoriete bestanden (Alleen stream)", "A file or folder has been deleted" : "Een bestand of map is verwijderd", - "A file or folder has been restored" : "Een bestand of een mmaps is hersteld", + "A file or folder has been restored" : "Een bestand of een map is hersteld", "You created %1$s" : "Gecreëerd: %1$s", "%2$s created %1$s" : "%2$s creëerde %1$s", "%1$s was created in a public folder" : "%1$s werd gecreëerd in een openbare map", diff --git a/apps/updatenotification/l10n/nl.js b/apps/updatenotification/l10n/nl.js index d7bc20bcfe..b2e269835b 100644 --- a/apps/updatenotification/l10n/nl.js +++ b/apps/updatenotification/l10n/nl.js @@ -3,6 +3,7 @@ OC.L10N.register( { "{version} is available. Get more information on how to update." : "{version} is beschikbaar. Meer informatie over het bijwerken.", "Updated channel" : "Bijgewerkt kanaal", + "Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.", "Updater" : "Updater", "A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s", "Open updater" : "Open updater", diff --git a/apps/updatenotification/l10n/nl.json b/apps/updatenotification/l10n/nl.json index caecfa275f..3a8c617fda 100644 --- a/apps/updatenotification/l10n/nl.json +++ b/apps/updatenotification/l10n/nl.json @@ -1,6 +1,7 @@ { "translations": { "{version} is available. Get more information on how to update." : "{version} is beschikbaar. Meer informatie over het bijwerken.", "Updated channel" : "Bijgewerkt kanaal", + "Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.", "Updater" : "Updater", "A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s", "Open updater" : "Open updater", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index d43f7fe473..b72796996f 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -297,6 +297,7 @@ OC.L10N.register( "Contact your system administrator if this message persists or appeared unexpectedly." : "Veuillez contacter votre administrateur système si ce message persiste ou apparaît de façon inattendue.", "Thank you for your patience." : "Merci de votre patience.", "Two-step verification" : "Vérification en deux étapes", + "Cancel login" : "Annuler la connexion", "An error occured while verifying the token" : "Une erreur est survenue lors de la vérification du jeton", "You are accessing the server from an untrusted domain." : "Vous accédez au serveur à partir d'un domaine non approuvé.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Veuillez contacter votre administrateur. Si vous être l'administrateur de cette instance, configurez la variable \"trusted_domains\" dans le fichier config/config.php. Un exemple de configuration est fournit dans le fichier config/config.sample.php.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index d96f83f804..1edfbe71ab 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -295,6 +295,7 @@ "Contact your system administrator if this message persists or appeared unexpectedly." : "Veuillez contacter votre administrateur système si ce message persiste ou apparaît de façon inattendue.", "Thank you for your patience." : "Merci de votre patience.", "Two-step verification" : "Vérification en deux étapes", + "Cancel login" : "Annuler la connexion", "An error occured while verifying the token" : "Une erreur est survenue lors de la vérification du jeton", "You are accessing the server from an untrusted domain." : "Vous accédez au serveur à partir d'un domaine non approuvé.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Veuillez contacter votre administrateur. Si vous être l'administrateur de cette instance, configurez la variable \"trusted_domains\" dans le fichier config/config.php. Un exemple de configuration est fournit dans le fichier config/config.sample.php.", diff --git a/core/l10n/he.js b/core/l10n/he.js index 217dfe8cc0..b37b9d0eee 100644 --- a/core/l10n/he.js +++ b/core/l10n/he.js @@ -27,8 +27,11 @@ OC.L10N.register( "Error unfavoriting" : "שגיאה בהסרת מועדפים", "Couldn't send mail to following users: %s " : "לא ניתן היה לשלוח דואר אלקטרוני למשתמשים הבאים %s ", "Preparing update" : "מכין עדכון", + "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "אזהרת תיקון:", "Repair error: " : "שגיאת תיקון:", + "Please use the command line updater because automatic updating is disabled in the config.php." : "יש להשתמש בעדכון על בסיס שורת פקודה כיוון שעדכון אוטומטי מנוטרל בקובץ config.php.", + "[%d / %d]: Checking table %s" : "[%d / %d]: בודק טבלה %s", "Turned on maintenance mode" : "הפעלת מצב אחזקה", "Turned off maintenance mode" : "כיבוי מצב אחזקה", "Maintenance mode is kept active" : "מצב אחזקה נשמר פעיל", @@ -95,6 +98,7 @@ OC.L10N.register( "Dec." : "דצמ׳", "There were problems with the code integrity check. More information…" : "קיימות בעיות עם בדיקת תקינות קוד. למידע נוסף…", "Settings" : "הגדרות", + "Problem loading page, reloading in 5 seconds" : "בעיה בטעינת העמוד, טעינה מחדש בעוד 5 שניות.", "Saving..." : "שמירה…", "Dismiss" : "שחרור", "seconds ago" : "שניות", @@ -126,10 +130,18 @@ OC.L10N.register( "Good password" : "סיסמא טובה", "Strong password" : "סיסמא חזקה", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "שרת האינטרנט שלך אינו מוגדר כהלכה לאפשר סנכרון כיוון שממשק ה־WebDAV כנראה שבור.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "שרת האינטרנט שלך לא מוגדר כהלכה לפתור \"{url}\". מידע נוסף קיים במסמכים שלנו.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "לשרת זה אין חיבור אינטרנט פעיל. לפיכך חלק מהתכונות כגון עגינת אחסון חיצוני, הודעות על עדכונים או התקנת יישומי צד שלישי לא יעבדו. ייתכן ולא יעבדו גם כניסה לקבצים מבחוץ ושליחת הודעות דואר אלקטרוני. אנו ממליצים לאפשר חיבור אינטרנט לשרת זה אם ברצונך שיהיו לך את כל התכונות.", + "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 אם קיים. מידע נוסף ניתן לצפות ב- מסמכי התיעוד.", + "/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 אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- מסמכי התיעוד שלנו.", + "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by the PHP Group as soon as your distribution supports it." : "כרגע המערכת מריצה PHP {version}. מומלץ מאוד לשדרג את גרסת ה- PHP vשלך כדי לנצל את עדכוני הביצועים והאבטחה המופקים על ידי קבוצת ה- 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 מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- מסמכי התיעוד שלנו.", + "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 מוגדר כמטמון מופץ, אבל מותקן מודול PHP \"memcache\" מוטעה. רק \\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…)" : "חלק מהקבצים לא עברו את בדיקת השלמות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our מסמכי התיעוד שלנו. (רשימה של קבצים לא תקינים… / סריקה מחדש…)", "Error occurred while checking server setup" : "שגיאה אירעה בזמן בדיקת התקנת השרת", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "כנראה וניתן לגשת אל תיקיית data והקבצים שלך מהאינטרנט. קובץ .htaccess אינו עובד. אנו ממליצים בכל תוקף שתגדיר את השרת בצורה כזאת שלא ניתן יהיה לגשת לתיקיית ה- data או להעביר את תיקיית ה- dta מחוץ לנתיב המסמכים של שרת האינטרנט.", "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." : "כותרת ה- HTTP \"{header}\" אינה מוגדרת להיות שווה ל- \"{expected}\". הדבר מהווה פוטנציאל סיכון אבטחה או פגיעה בפרטיות ואנו ממליצים לתקן את הגדרה זו.", + "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our security tips." : "כותרת HTTP \"Strict-Transport-Security\" אינה מוגדרת לפחות \"{seconds}\" שניות. להגברת האבטחה אנו ממליצים לאפשר HSTS כפי שמוסבר ב- טיפים לאבטחה שלנו.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our security tips." : "הנך נכנס לאתר באמצעות פרוטוקול HTTP. אנו ממליצים מאוד להגדיר את השרת לעבוד עם פרוטוקול HTTPS במקום כפי שמוסבר ב- טיפים לאבטחה שלנו.", "Shared" : "שותף", "Shared with {recipients}" : "שיתוף עם {recipients}", @@ -152,6 +164,7 @@ OC.L10N.register( "Send" : "שליחה", "Sending ..." : "מתבצעת שליחה ...", "Email sent" : "הודעת הדוא״ל נשלחה", + "Send link via email" : "שליחת קישור באמצעות דואר אלקטרוני", "Shared with you and the group {group} by {owner}" : "שותף אתך ועם הקבוצה {group} שבבעלות {owner}", "Shared with you by {owner}" : "שותף אתך על ידי {owner}", "group" : "קבוצה", @@ -168,6 +181,7 @@ OC.L10N.register( "Share details could not be loaded for this item." : "לא ניתן היה לטעון מידע שיתוף לפריט זה", "No users or groups found for {search}" : "לא אותרו משתמשים או קבוצות עבור {search}", "No users found for {search}" : "לא אותרו משתמשים עבור {search}", + "An error occurred. Please try again" : "אירעה שגיאה. יש לנסות שנית", "{sharee} (group)" : "{sharee} (קבוצה)", "{sharee} (at {server})" : "{sharee} (ב- {server})", "{sharee} (remote)" : "{sharee} (מרוחק)", @@ -181,6 +195,7 @@ OC.L10N.register( "Warning" : "אזהרה", "Error while sending notification" : "שגיאה בזמן שליחת הודעה", "Non-existing tag #{tag}" : "תגית לא קיימת #{tag}", + "restricted" : "מוגבל", "invisible" : "בלתי גלוי", "({scope})" : "({scope})", "Delete" : "מחיקה", @@ -200,6 +215,7 @@ OC.L10N.register( "new" : "חדש", "_download %n file_::_download %n files_" : ["הורד %n קובץ","הורדו %n קבצים"], "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "מתבצע עכשיו שדרוג, מעבר מדף זה עלול לפגוע בתהליך בסביבות הפעלה מסויימות.", + "Updating to {version}" : "מעדכן ל- {version}", "An error occurred." : "אירעה שגיאה.", "Please reload the page." : "יש להעלות מחדש דף זה.", "The update was unsuccessful. For more information check our forum post covering this issue." : "העדכון בוצע בהצלחה. למידע נוסף ניתן לבדוק בהודעת הפורום שלנו המכסה נושא זו.", @@ -264,7 +280,9 @@ OC.L10N.register( "Search" : "חיפוש", "Server side authentication failed!" : "אימות לצד שרת נכשל!", "Please contact your administrator." : "יש ליצור קשר עם המנהל.", + "An internal error occurred." : "אירעה שגיאה פנימית.", "Please try again or contact your administrator." : "יש לנסות שוב ליצור קשר עם המנהל שלך.", + "Username or email" : "שם משתמש או דואר אלקטרוני", "Log in" : "כניסה", "Wrong password. Reset it?" : "סיסמא שגוייה. האם לאפס אותה?", "Wrong password." : "סיסמא שגוייה.", @@ -278,6 +296,11 @@ OC.L10N.register( "This means only administrators can use the instance." : "לפיכך רק מנהלים יכולים להשתמש בהפעלה זו.", "Contact your system administrator if this message persists or appeared unexpectedly." : "יש ליצור קשר עם מנהל המערכת אם הודעה שו נמשכת או מופיעה באופן בלתי צפוי. ", "Thank you for your patience." : "תודה על הסבלנות.", + "Two-step verification" : "אימות דו-שלבי", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "אבטחה מורחבת הופעלה בחשבון שלך. יש לאמת באמצעות גורם שני.", + "Cancel login" : "ביטול התחברות", + "Please authenticate using the selected factor." : "יש לאמת באמצעות גורם נבחר.", + "An error occured while verifying the token" : "שגיאה אירעה בזמן אימות המחרוזת", "You are accessing the server from an untrusted domain." : "נכנסת לשרת משם מתחם / דומיין שאינו מהימן.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "יש ליצור קשר עם המנהל שלך. אם הנך המנהל של הפעלה זו, יש להגדיר את הגדרות ה- \"trusted_domains\" של config/config.php. דוגמת תצורה ניתן לראות ב- config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "בהתאם לתצורה שלך, כמנהל יתכן ותוכל להשתמש בכפתור מטה להפיכת שם המתחם / דומיין למהימן.", @@ -290,6 +313,10 @@ OC.L10N.register( "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "יש לוודא שמסד הנתונים, תיקיית config ותיקיית data גובו לפני ההמשך.", "Start update" : "התחלת עדכון", "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "למניעת פסקי זמן בהתקנות גדולות, ניתן במקום להריץ את הפקודה הבאה בתיקיית ההתקנה שלך:", + "Detailed logs" : "לוג פרטים", + "Update needed" : "עדכון נדרש", + "Please use the command line updater because you have a big instance." : "יש להשתמש בעדכון על בסיס שורת פקודה כיוון שמדובר בעדכון גדול.", + "For help, see the documentation." : "לעזרה, ניתן לצפות במסמכי התיעוד.", "This %s instance is currently in maintenance mode, which may take a while." : "הפעלה %s זו כרגע במצב אחזקה, שתמשך זמן מה.", "This page will refresh itself when the %s instance is available again." : "עמוד זה ירענן את עצמו כשהפעלת %s תהיה זמינה שוב." }, diff --git a/core/l10n/he.json b/core/l10n/he.json index 60bd0a33ca..1824733eb8 100644 --- a/core/l10n/he.json +++ b/core/l10n/he.json @@ -25,8 +25,11 @@ "Error unfavoriting" : "שגיאה בהסרת מועדפים", "Couldn't send mail to following users: %s " : "לא ניתן היה לשלוח דואר אלקטרוני למשתמשים הבאים %s ", "Preparing update" : "מכין עדכון", + "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "אזהרת תיקון:", "Repair error: " : "שגיאת תיקון:", + "Please use the command line updater because automatic updating is disabled in the config.php." : "יש להשתמש בעדכון על בסיס שורת פקודה כיוון שעדכון אוטומטי מנוטרל בקובץ config.php.", + "[%d / %d]: Checking table %s" : "[%d / %d]: בודק טבלה %s", "Turned on maintenance mode" : "הפעלת מצב אחזקה", "Turned off maintenance mode" : "כיבוי מצב אחזקה", "Maintenance mode is kept active" : "מצב אחזקה נשמר פעיל", @@ -93,6 +96,7 @@ "Dec." : "דצמ׳", "There were problems with the code integrity check. More information…" : "קיימות בעיות עם בדיקת תקינות קוד. למידע נוסף…", "Settings" : "הגדרות", + "Problem loading page, reloading in 5 seconds" : "בעיה בטעינת העמוד, טעינה מחדש בעוד 5 שניות.", "Saving..." : "שמירה…", "Dismiss" : "שחרור", "seconds ago" : "שניות", @@ -124,10 +128,18 @@ "Good password" : "סיסמא טובה", "Strong password" : "סיסמא חזקה", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "שרת האינטרנט שלך אינו מוגדר כהלכה לאפשר סנכרון כיוון שממשק ה־WebDAV כנראה שבור.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "שרת האינטרנט שלך לא מוגדר כהלכה לפתור \"{url}\". מידע נוסף קיים במסמכים שלנו.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "לשרת זה אין חיבור אינטרנט פעיל. לפיכך חלק מהתכונות כגון עגינת אחסון חיצוני, הודעות על עדכונים או התקנת יישומי צד שלישי לא יעבדו. ייתכן ולא יעבדו גם כניסה לקבצים מבחוץ ושליחת הודעות דואר אלקטרוני. אנו ממליצים לאפשר חיבור אינטרנט לשרת זה אם ברצונך שיהיו לך את כל התכונות.", + "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 אם קיים. מידע נוסף ניתן לצפות ב- מסמכי התיעוד.", + "/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 אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- מסמכי התיעוד שלנו.", + "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by the PHP Group as soon as your distribution supports it." : "כרגע המערכת מריצה PHP {version}. מומלץ מאוד לשדרג את גרסת ה- PHP vשלך כדי לנצל את עדכוני הביצועים והאבטחה המופקים על ידי קבוצת ה- 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 מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- מסמכי התיעוד שלנו.", + "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 מוגדר כמטמון מופץ, אבל מותקן מודול PHP \"memcache\" מוטעה. רק \\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…)" : "חלק מהקבצים לא עברו את בדיקת השלמות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our מסמכי התיעוד שלנו. (רשימה של קבצים לא תקינים… / סריקה מחדש…)", "Error occurred while checking server setup" : "שגיאה אירעה בזמן בדיקת התקנת השרת", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "כנראה וניתן לגשת אל תיקיית data והקבצים שלך מהאינטרנט. קובץ .htaccess אינו עובד. אנו ממליצים בכל תוקף שתגדיר את השרת בצורה כזאת שלא ניתן יהיה לגשת לתיקיית ה- data או להעביר את תיקיית ה- dta מחוץ לנתיב המסמכים של שרת האינטרנט.", "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." : "כותרת ה- HTTP \"{header}\" אינה מוגדרת להיות שווה ל- \"{expected}\". הדבר מהווה פוטנציאל סיכון אבטחה או פגיעה בפרטיות ואנו ממליצים לתקן את הגדרה זו.", + "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our security tips." : "כותרת HTTP \"Strict-Transport-Security\" אינה מוגדרת לפחות \"{seconds}\" שניות. להגברת האבטחה אנו ממליצים לאפשר HSTS כפי שמוסבר ב- טיפים לאבטחה שלנו.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our security tips." : "הנך נכנס לאתר באמצעות פרוטוקול HTTP. אנו ממליצים מאוד להגדיר את השרת לעבוד עם פרוטוקול HTTPS במקום כפי שמוסבר ב- טיפים לאבטחה שלנו.", "Shared" : "שותף", "Shared with {recipients}" : "שיתוף עם {recipients}", @@ -150,6 +162,7 @@ "Send" : "שליחה", "Sending ..." : "מתבצעת שליחה ...", "Email sent" : "הודעת הדוא״ל נשלחה", + "Send link via email" : "שליחת קישור באמצעות דואר אלקטרוני", "Shared with you and the group {group} by {owner}" : "שותף אתך ועם הקבוצה {group} שבבעלות {owner}", "Shared with you by {owner}" : "שותף אתך על ידי {owner}", "group" : "קבוצה", @@ -166,6 +179,7 @@ "Share details could not be loaded for this item." : "לא ניתן היה לטעון מידע שיתוף לפריט זה", "No users or groups found for {search}" : "לא אותרו משתמשים או קבוצות עבור {search}", "No users found for {search}" : "לא אותרו משתמשים עבור {search}", + "An error occurred. Please try again" : "אירעה שגיאה. יש לנסות שנית", "{sharee} (group)" : "{sharee} (קבוצה)", "{sharee} (at {server})" : "{sharee} (ב- {server})", "{sharee} (remote)" : "{sharee} (מרוחק)", @@ -179,6 +193,7 @@ "Warning" : "אזהרה", "Error while sending notification" : "שגיאה בזמן שליחת הודעה", "Non-existing tag #{tag}" : "תגית לא קיימת #{tag}", + "restricted" : "מוגבל", "invisible" : "בלתי גלוי", "({scope})" : "({scope})", "Delete" : "מחיקה", @@ -198,6 +213,7 @@ "new" : "חדש", "_download %n file_::_download %n files_" : ["הורד %n קובץ","הורדו %n קבצים"], "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "מתבצע עכשיו שדרוג, מעבר מדף זה עלול לפגוע בתהליך בסביבות הפעלה מסויימות.", + "Updating to {version}" : "מעדכן ל- {version}", "An error occurred." : "אירעה שגיאה.", "Please reload the page." : "יש להעלות מחדש דף זה.", "The update was unsuccessful. For more information check our forum post covering this issue." : "העדכון בוצע בהצלחה. למידע נוסף ניתן לבדוק בהודעת הפורום שלנו המכסה נושא זו.", @@ -262,7 +278,9 @@ "Search" : "חיפוש", "Server side authentication failed!" : "אימות לצד שרת נכשל!", "Please contact your administrator." : "יש ליצור קשר עם המנהל.", + "An internal error occurred." : "אירעה שגיאה פנימית.", "Please try again or contact your administrator." : "יש לנסות שוב ליצור קשר עם המנהל שלך.", + "Username or email" : "שם משתמש או דואר אלקטרוני", "Log in" : "כניסה", "Wrong password. Reset it?" : "סיסמא שגוייה. האם לאפס אותה?", "Wrong password." : "סיסמא שגוייה.", @@ -276,6 +294,11 @@ "This means only administrators can use the instance." : "לפיכך רק מנהלים יכולים להשתמש בהפעלה זו.", "Contact your system administrator if this message persists or appeared unexpectedly." : "יש ליצור קשר עם מנהל המערכת אם הודעה שו נמשכת או מופיעה באופן בלתי צפוי. ", "Thank you for your patience." : "תודה על הסבלנות.", + "Two-step verification" : "אימות דו-שלבי", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "אבטחה מורחבת הופעלה בחשבון שלך. יש לאמת באמצעות גורם שני.", + "Cancel login" : "ביטול התחברות", + "Please authenticate using the selected factor." : "יש לאמת באמצעות גורם נבחר.", + "An error occured while verifying the token" : "שגיאה אירעה בזמן אימות המחרוזת", "You are accessing the server from an untrusted domain." : "נכנסת לשרת משם מתחם / דומיין שאינו מהימן.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "יש ליצור קשר עם המנהל שלך. אם הנך המנהל של הפעלה זו, יש להגדיר את הגדרות ה- \"trusted_domains\" של config/config.php. דוגמת תצורה ניתן לראות ב- config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "בהתאם לתצורה שלך, כמנהל יתכן ותוכל להשתמש בכפתור מטה להפיכת שם המתחם / דומיין למהימן.", @@ -288,6 +311,10 @@ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "יש לוודא שמסד הנתונים, תיקיית config ותיקיית data גובו לפני ההמשך.", "Start update" : "התחלת עדכון", "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "למניעת פסקי זמן בהתקנות גדולות, ניתן במקום להריץ את הפקודה הבאה בתיקיית ההתקנה שלך:", + "Detailed logs" : "לוג פרטים", + "Update needed" : "עדכון נדרש", + "Please use the command line updater because you have a big instance." : "יש להשתמש בעדכון על בסיס שורת פקודה כיוון שמדובר בעדכון גדול.", + "For help, see the documentation." : "לעזרה, ניתן לצפות במסמכי התיעוד.", "This %s instance is currently in maintenance mode, which may take a while." : "הפעלה %s זו כרגע במצב אחזקה, שתמשך זמן מה.", "This page will refresh itself when the %s instance is available again." : "עמוד זה ירענן את עצמו כשהפעלת %s תהיה זמינה שוב." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/lib/l10n/ca.js b/lib/l10n/ca.js index 3a7f21787e..2d6b88768f 100644 --- a/lib/l10n/ca.js +++ b/lib/l10n/ca.js @@ -18,6 +18,7 @@ OC.L10N.register( "_%n hour ago_::_%n hours ago_" : ["fa %n hora","fa %n hores"], "_%n minute ago_::_%n minutes ago_" : ["fa %n minut","fa %n minuts"], "seconds ago" : "segons enrere", + "File name contains at least one invalid character" : "El nom del fitxer conté al menys un caràcter invàlid", "App directory already exists" : "La carpeta de l'aplicació ja existeix", "Can't create app folder. Please fix permissions. %s" : "No es pot crear la carpeta de l'aplicació. Arregleu els permisos. %s", "No source specified when installing app" : "No heu especificat la font en instal·lar l'aplicació", diff --git a/lib/l10n/ca.json b/lib/l10n/ca.json index 255f5abbe3..2291b637c5 100644 --- a/lib/l10n/ca.json +++ b/lib/l10n/ca.json @@ -16,6 +16,7 @@ "_%n hour ago_::_%n hours ago_" : ["fa %n hora","fa %n hores"], "_%n minute ago_::_%n minutes ago_" : ["fa %n minut","fa %n minuts"], "seconds ago" : "segons enrere", + "File name contains at least one invalid character" : "El nom del fitxer conté al menys un caràcter invàlid", "App directory already exists" : "La carpeta de l'aplicació ja existeix", "Can't create app folder. Please fix permissions. %s" : "No es pot crear la carpeta de l'aplicació. Arregleu els permisos. %s", "No source specified when installing app" : "No heu especificat la font en instal·lar l'aplicació", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 9313e18f48..ce960b80f9 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -87,6 +87,8 @@ OC.L10N.register( "App update" : "Mise à jour", "No apps found for {query}" : "Aucune application trouvée pour {query}", "Disconnect" : "Déconnection", + "Error while loading browser sessions and device tokens" : "Erreur lors du chargement des jetons de la session du navigateur et de l'appareil", + "Error while creating device token" : "Erreur lors de la création du jeton de l'appareil", "Error while deleting the token" : "Erreur lors de la suppression du jeton", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Une erreur est survenue. Veuillez fournir un certificat PEM encodé au format ASCII.", "Valid until {date}" : "Valide jusqu'au {date}", @@ -116,6 +118,7 @@ OC.L10N.register( "__language_name__" : "Français", "Unlimited" : "Illimité", "Personal info" : "Informations personnelles", + "Devices" : "Appareils", "Sync clients" : "Clients de synchronisation", "Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)", "Info, warnings, errors and fatal issues" : "Informations, avertissements, erreurs et erreurs fatales", @@ -218,6 +221,7 @@ OC.L10N.register( "Documentation:" : "Documentation :", "User documentation" : "Documentation utilisateur", "Admin documentation" : "Documentation administrateur", + "Visit website" : "Visiter le site web", "Report a bug" : "Signaler un bogue", "Show description …" : "Afficher la description...", "Hide description …" : "Masquer la description", @@ -263,10 +267,12 @@ OC.L10N.register( "Current password" : "Mot de passe actuel", "New password" : "Nouveau mot de passe", "Change password" : "Changer de mot de passe", + "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Voici les clients web, de bureau et mobiles actuellement connectés à votre ownCloud.", "Browser" : "Navigateur", "Most recent activity" : "Activité la plus récente", "You've linked these devices." : "Vous avez liés ces périphériques.", "Name" : "Nom", + "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Un mot de passe d'un appareil est un code d'accès qui donne à une application ou à un appareil les droits d'accès à votre compte ownCloud.", "Language" : "Langue", "Help translate" : "Aidez à traduire", "Get the apps to sync your files" : "Obtenez les applications de synchronisation de vos fichiers", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 5531aeaf9d..6f4b747862 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -85,6 +85,8 @@ "App update" : "Mise à jour", "No apps found for {query}" : "Aucune application trouvée pour {query}", "Disconnect" : "Déconnection", + "Error while loading browser sessions and device tokens" : "Erreur lors du chargement des jetons de la session du navigateur et de l'appareil", + "Error while creating device token" : "Erreur lors de la création du jeton de l'appareil", "Error while deleting the token" : "Erreur lors de la suppression du jeton", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Une erreur est survenue. Veuillez fournir un certificat PEM encodé au format ASCII.", "Valid until {date}" : "Valide jusqu'au {date}", @@ -114,6 +116,7 @@ "__language_name__" : "Français", "Unlimited" : "Illimité", "Personal info" : "Informations personnelles", + "Devices" : "Appareils", "Sync clients" : "Clients de synchronisation", "Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)", "Info, warnings, errors and fatal issues" : "Informations, avertissements, erreurs et erreurs fatales", @@ -216,6 +219,7 @@ "Documentation:" : "Documentation :", "User documentation" : "Documentation utilisateur", "Admin documentation" : "Documentation administrateur", + "Visit website" : "Visiter le site web", "Report a bug" : "Signaler un bogue", "Show description …" : "Afficher la description...", "Hide description …" : "Masquer la description", @@ -261,10 +265,12 @@ "Current password" : "Mot de passe actuel", "New password" : "Nouveau mot de passe", "Change password" : "Changer de mot de passe", + "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Voici les clients web, de bureau et mobiles actuellement connectés à votre ownCloud.", "Browser" : "Navigateur", "Most recent activity" : "Activité la plus récente", "You've linked these devices." : "Vous avez liés ces périphériques.", "Name" : "Nom", + "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Un mot de passe d'un appareil est un code d'accès qui donne à une application ou à un appareil les droits d'accès à votre compte ownCloud.", "Language" : "Langue", "Help translate" : "Aidez à traduire", "Get the apps to sync your files" : "Obtenez les applications de synchronisation de vos fichiers", From 02e8021b1a8a97a41dfb66ff70b27a4717bb225c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Weigert?= Date: Wed, 15 Jun 2016 10:17:59 +0200 Subject: [PATCH 19/52] Update start-swift-ceph.sh (#25109) fix failing https://ci.owncloud.org/job/server-master-linux-externals/database=sqlite,external=swift-ceph,label=SLAVE/ --- apps/files_external/tests/env/start-swift-ceph.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/files_external/tests/env/start-swift-ceph.sh b/apps/files_external/tests/env/start-swift-ceph.sh index 1e417c6905..ba17b8f42d 100755 --- a/apps/files_external/tests/env/start-swift-ceph.sh +++ b/apps/files_external/tests/env/start-swift-ceph.sh @@ -24,6 +24,9 @@ docker_image=xenopathic/ceph-keystone echo "Fetch recent ${docker_image} docker image" docker pull ${docker_image} +# debian 8 default comes without loaded loop module. please run "sudo modprobe loop" if you get an error here: +lsmod | grep '^loop' || { echo "Error: kernel module loop not loaded. Needed by docker image ${docker_image}"; exit 1; } + # retrieve current folder to place the config in the parent folder thisFolder=`echo $0 | sed 's#env/start-swift-ceph\.sh##'` From 574b1e8d176050051ec5aee10b10ca51393ef5c5 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 2 Jun 2016 16:47:16 +0200 Subject: [PATCH 20/52] update icewind/streams to 0.4.1 --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index 12f9071624..071300aea2 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 12f9071624285bf465157730fc8d43d7a7d7fbd2 +Subproject commit 071300aea229e1bf72b5d8eaa0249cd10cd7a64d From 8dea26094b0d9abe59ef6dcfa20bc34b29bf8550 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 9 Jun 2016 17:10:52 +0200 Subject: [PATCH 21/52] update icewind/streams to 0.4.1 --- apps/files_external/3rdparty/composer.json | 2 +- apps/files_external/3rdparty/composer.lock | 14 +-- .../3rdparty/composer/autoload_classmap.php | 15 ---- .../3rdparty/composer/installed.json | 86 +++++++++---------- .../icewind/streams/src/RetryWrapper.php | 10 ++- 5 files changed, 57 insertions(+), 70 deletions(-) diff --git a/apps/files_external/3rdparty/composer.json b/apps/files_external/3rdparty/composer.json index 72335c8d89..158478741e 100644 --- a/apps/files_external/3rdparty/composer.json +++ b/apps/files_external/3rdparty/composer.json @@ -9,7 +9,7 @@ }, "require": { "icewind/smb": "1.1.0", - "icewind/streams": "0.4" + "icewind/streams": "0.4.1" } } diff --git a/apps/files_external/3rdparty/composer.lock b/apps/files_external/3rdparty/composer.lock index 7161ae19a2..8f324299ff 100644 --- a/apps/files_external/3rdparty/composer.lock +++ b/apps/files_external/3rdparty/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "8de0823d3d0a167ee24450a111cb67b9", - "content-hash": "6733058865c1765823b31cfbb24552e1", + "hash": "8ed3150b0b3e916ad66558242b4cf2a0", + "content-hash": "70722dcee13b3ac1c1951479b7431c97", "packages": [ { "name": "icewind/smb", @@ -51,16 +51,16 @@ }, { "name": "icewind/streams", - "version": "0.4.0", + "version": "0.4.1", "source": { "type": "git", "url": "https://github.com/icewind1991/Streams.git", - "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3" + "reference": "d3620e8dc410c86c2ba55579803679c4e0b289ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/Streams/zipball/9ca40274645a967ecc3408b0ca2e6255ead1d1d3", - "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3", + "url": "https://api.github.com/repos/icewind1991/Streams/zipball/d3620e8dc410c86c2ba55579803679c4e0b289ac", + "reference": "d3620e8dc410c86c2ba55579803679c4e0b289ac", "shasum": "" }, "require": { @@ -88,7 +88,7 @@ } ], "description": "A set of generic stream wrappers", - "time": "2016-03-17 12:32:25" + "time": "2016-06-02 14:37:52" } ], "packages-dev": [], diff --git a/apps/files_external/3rdparty/composer/autoload_classmap.php b/apps/files_external/3rdparty/composer/autoload_classmap.php index 942dbce733..0f9a43c6cd 100644 --- a/apps/files_external/3rdparty/composer/autoload_classmap.php +++ b/apps/files_external/3rdparty/composer/autoload_classmap.php @@ -42,13 +42,6 @@ return array( 'Icewind\\SMB\\Server' => $vendorDir . '/icewind/smb/src/Server.php', 'Icewind\\SMB\\Share' => $vendorDir . '/icewind/smb/src/Share.php', 'Icewind\\SMB\\System' => $vendorDir . '/icewind/smb/src/System.php', - 'Icewind\\SMB\\Test\\AbstractShare' => $vendorDir . '/icewind/smb/tests/AbstractShare.php', - 'Icewind\\SMB\\Test\\NativeShare' => $vendorDir . '/icewind/smb/tests/NativeShare.php', - 'Icewind\\SMB\\Test\\NativeStream' => $vendorDir . '/icewind/smb/tests/NativeStream.php', - 'Icewind\\SMB\\Test\\Parser' => $vendorDir . '/icewind/smb/tests/Parser.php', - 'Icewind\\SMB\\Test\\Server' => $vendorDir . '/icewind/smb/tests/Server.php', - 'Icewind\\SMB\\Test\\Share' => $vendorDir . '/icewind/smb/tests/Share.php', - 'Icewind\\SMB\\Test\\TestCase' => $vendorDir . '/icewind/smb/tests/TestCase.php', 'Icewind\\SMB\\TimeZoneProvider' => $vendorDir . '/icewind/smb/src/TimeZoneProvider.php', 'Icewind\\Streams\\CallbackWrapper' => $vendorDir . '/icewind/streams/src/CallbackWrapper.php', 'Icewind\\Streams\\Directory' => $vendorDir . '/icewind/streams/src/Directory.php', @@ -60,14 +53,6 @@ return array( 'Icewind\\Streams\\Path' => $vendorDir . '/icewind/streams/src/Path.php', 'Icewind\\Streams\\RetryWrapper' => $vendorDir . '/icewind/streams/src/RetryWrapper.php', 'Icewind\\Streams\\SeekableWrapper' => $vendorDir . '/icewind/streams/src/SeekableWrapper.php', - 'Icewind\\Streams\\Tests\\DirectoryFilter' => $vendorDir . '/icewind/streams/tests/DirectoryFilter.php', - 'Icewind\\Streams\\Tests\\DirectoryWrapper' => $vendorDir . '/icewind/streams/tests/DirectoryWrapper.php', - 'Icewind\\Streams\\Tests\\DirectoryWrapperDummy' => $vendorDir . '/icewind/streams/tests/DirectoryWrapper.php', - 'Icewind\\Streams\\Tests\\DirectoryWrapperNull' => $vendorDir . '/icewind/streams/tests/DirectoryWrapper.php', - 'Icewind\\Streams\\Tests\\PartialWrapper' => $vendorDir . '/icewind/streams/tests/RetryWrapper.php', - 'Icewind\\Streams\\Tests\\RetryWrapper' => $vendorDir . '/icewind/streams/tests/RetryWrapper.php', - 'Icewind\\Streams\\Tests\\SeekableWrapper' => $vendorDir . '/icewind/streams/tests/SeekableWrapper.php', - 'Icewind\\Streams\\Tests\\UrlCallBack' => $vendorDir . '/icewind/streams/tests/UrlCallBack.php', 'Icewind\\Streams\\Url' => $vendorDir . '/icewind/streams/src/Url.php', 'Icewind\\Streams\\UrlCallback' => $vendorDir . '/icewind/streams/src/UrlCallBack.php', 'Icewind\\Streams\\Wrapper' => $vendorDir . '/icewind/streams/src/Wrapper.php', diff --git a/apps/files_external/3rdparty/composer/installed.json b/apps/files_external/3rdparty/composer/installed.json index 31c602de3c..127d2bd3a1 100644 --- a/apps/files_external/3rdparty/composer/installed.json +++ b/apps/files_external/3rdparty/composer/installed.json @@ -1,47 +1,4 @@ [ - { - "name": "icewind/streams", - "version": "0.4.0", - "version_normalized": "0.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/icewind1991/Streams.git", - "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/icewind1991/Streams/zipball/9ca40274645a967ecc3408b0ca2e6255ead1d1d3", - "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^4.8", - "satooshi/php-coveralls": "v1.0.0" - }, - "time": "2016-03-17 12:32:25", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Icewind\\Streams\\Tests\\": "tests/", - "Icewind\\Streams\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Robin Appelman", - "email": "icewind@owncloud.com" - } - ], - "description": "A set of generic stream wrappers" - }, { "name": "icewind/smb", "version": "v1.1.0", @@ -85,5 +42,48 @@ } ], "description": "php wrapper for smbclient and libsmbclient-php" + }, + { + "name": "icewind/streams", + "version": "0.4.1", + "version_normalized": "0.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/icewind1991/Streams.git", + "reference": "d3620e8dc410c86c2ba55579803679c4e0b289ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/icewind1991/Streams/zipball/d3620e8dc410c86c2ba55579803679c4e0b289ac", + "reference": "d3620e8dc410c86c2ba55579803679c4e0b289ac", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^4.8", + "satooshi/php-coveralls": "v1.0.0" + }, + "time": "2016-06-02 14:37:52", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Icewind\\Streams\\Tests\\": "tests/", + "Icewind\\Streams\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Appelman", + "email": "icewind@owncloud.com" + } + ], + "description": "A set of generic stream wrappers" } ] diff --git a/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php b/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php index 84b43f6bd0..8238f19f7c 100644 --- a/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php +++ b/apps/files_external/3rdparty/icewind/streams/src/RetryWrapper.php @@ -44,7 +44,7 @@ class RetryWrapper extends Wrapper { $result = parent::stream_read($count); $bytesReceived = strlen($result); - while ($bytesReceived < $count && !$this->stream_eof()) { + while (strlen($result) > 0 && $bytesReceived < $count && !$this->stream_eof()) { $result .= parent::stream_read($count - $bytesReceived); $bytesReceived = strlen($result); } @@ -54,11 +54,13 @@ class RetryWrapper extends Wrapper { public function stream_write($data) { $bytesToSend = strlen($data); - $result = parent::stream_write($data); + $bytesWritten = parent::stream_write($data); + $result = $bytesWritten; - while ($result < $bytesToSend && !$this->stream_eof()) { + while ($bytesWritten > 0 && $result < $bytesToSend && !$this->stream_eof()) { $dataLeft = substr($data, $result); - $result += parent::stream_write($dataLeft); + $bytesWritten = parent::stream_write($dataLeft); + $result += $bytesWritten; } return $result; From 39a56c7bc165cc782142a0a92fe1ec8423ecfa3d Mon Sep 17 00:00:00 2001 From: David Toledo Date: Mon, 25 Apr 2016 14:00:19 +0000 Subject: [PATCH 22/52] Added favorites integration tests --- .../integration/features/bootstrap/WebDav.php | 40 ++++++++++++++++++- build/integration/features/favorites.feature | 23 +++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 build/integration/features/favorites.feature diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index cd9584ad18..a63e2a5921 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -434,5 +434,43 @@ trait WebDav { $this->response = $ex->getResponse(); } } -} + /* + * @When user "([^"]*)" favorites folder "([^"]*)" + * @param string $user + * @param string $path + * @param \Behat\Gherkin\Node\TableNode|null $propertiesTable + */ + public function userFavoritesFolder($user, $path, $propertiesTable) { + $properties = null; + if ($propertiesTable instanceof \Behat\Gherkin\Node\TableNode) { + foreach ($propertiesTable->getRows() as $row) { + $properties[] = $row[0]; + } + } + $this->response = $this->favFolder($user, $path, 0, $properties); + } + + /*Set the elements of a proppatch, $folderDepth requires 1 to see elements without children*/ + public function favFolder($user, $path, $folderDepth, $properties = null){ + $fullUrl = substr($this->baseUrl, 0, -4); + $settings = array( + 'baseUri' => $fullUrl, + 'userName' => $user, + ); + if ($user === 'admin') { + $settings['password'] = $this->adminUser[1]; + } else { + $settings['password'] = $this->regularUser; + } + $client = new SClient($settings); + if (!$properties) { + $properties = [ + '{http://owncloud.org/ns}favorite' + ]; + } + echo $properties, + $response = $client->proppatch($this->davPath . '/' . ltrim($path, '/'), $properties, $folderDepth); + return $response; + } +} diff --git a/build/integration/features/favorites.feature b/build/integration/features/favorites.feature new file mode 100644 index 0000000000..4b437d13bd --- /dev/null +++ b/build/integration/features/favorites.feature @@ -0,0 +1,23 @@ +Feature: favorite + Background: + Given using api version "1" + + Scenario: Retrieving favorite info of a folder + Given using dav path "remote.php/webdav" + And As an "admin" + And user "user0" exists + When user "user0" favorites folder "/" + |{http://owncloud.org/ns}favorite| + Then As "user0" gets properties of folder "/" with + |{http://owncloud.org/ns}favorite| + And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" + + Scenario: Retrieving favorite info of a file + Given using dav path "remote.php/webdav" + And As an "admin" + And user "user0" exists + When user "user0" favorites folder "/textfile0.txt" + |{http://owncloud.org/ns}favorite| + Then As "user0" gets properties of folder "/textfile0.txt" with + |{http://owncloud.org/ns}favorite| + And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" \ No newline at end of file From 4232458652d25afecd19783eb62db4e4d9517c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Bertol=C3=ADn?= Date: Tue, 14 Jun 2016 16:20:40 +0000 Subject: [PATCH 23/52] Fixing the tests --- .../integration/features/bootstrap/WebDav.php | 31 ++++++++++--------- build/integration/features/favorites.feature | 10 +++--- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index a63e2a5921..10bd05cbbb 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -435,20 +435,11 @@ trait WebDav { } } - /* - * @When user "([^"]*)" favorites folder "([^"]*)" - * @param string $user - * @param string $path - * @param \Behat\Gherkin\Node\TableNode|null $propertiesTable + /** + * @When user :user favorites element :path */ - public function userFavoritesFolder($user, $path, $propertiesTable) { - $properties = null; - if ($propertiesTable instanceof \Behat\Gherkin\Node\TableNode) { - foreach ($propertiesTable->getRows() as $row) { - $properties[] = $row[0]; - } - } - $this->response = $this->favFolder($user, $path, 0, $properties); + public function userFavoritesFolder($user, $path){ + $this->response = $this->favFolder($user, $path, 0, null); } /*Set the elements of a proppatch, $folderDepth requires 1 to see elements without children*/ @@ -466,11 +457,21 @@ trait WebDav { $client = new SClient($settings); if (!$properties) { $properties = [ - '{http://owncloud.org/ns}favorite' + '{http://owncloud.org/ns}favorite' => 1 ]; } - echo $properties, + $response = $client->proppatch($this->davPath . '/' . ltrim($path, '/'), $properties, $folderDepth); return $response; } + + /** + * @Then /^as "([^"]*)" gets properties of file "([^"]*)" with$/ + * @param string $user + * @param string $path + * @param \Behat\Gherkin\Node\TableNode|null $propertiesTable + */ + public function asGetsPropertiesOfFileWith($user, $path, $propertiesTable) { + $this->asGetsPropertiesOfFolderWith($user, $path, $propertiesTable); + } } diff --git a/build/integration/features/favorites.feature b/build/integration/features/favorites.feature index 4b437d13bd..8025f0834f 100644 --- a/build/integration/features/favorites.feature +++ b/build/integration/features/favorites.feature @@ -6,9 +6,8 @@ Feature: favorite Given using dav path "remote.php/webdav" And As an "admin" And user "user0" exists - When user "user0" favorites folder "/" - |{http://owncloud.org/ns}favorite| - Then As "user0" gets properties of folder "/" with + When user "user0" favorites element "/FOLDER" + Then as "user0" gets properties of folder "/FOLDER" with |{http://owncloud.org/ns}favorite| And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" @@ -16,8 +15,7 @@ Feature: favorite Given using dav path "remote.php/webdav" And As an "admin" And user "user0" exists - When user "user0" favorites folder "/textfile0.txt" - |{http://owncloud.org/ns}favorite| - Then As "user0" gets properties of folder "/textfile0.txt" with + When user "user0" favorites element "/textfile0.txt" + Then as "user0" gets properties of file "/textfile0.txt" with |{http://owncloud.org/ns}favorite| And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" \ No newline at end of file From 19b7ae673a8553621b3544aa57f153cf2b7c8ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Bertol=C3=ADn?= Date: Wed, 15 Jun 2016 10:16:27 +0000 Subject: [PATCH 24/52] Added unfavoriting tests and some rewording --- .../integration/features/bootstrap/WebDav.php | 17 ++++++++---- build/integration/features/favorites.feature | 27 ++++++++++++++++--- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 10bd05cbbb..0abb866773 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -214,7 +214,7 @@ trait WebDav { } $value = $keys[$key]; - if ($value !== $expectedValue) { + if ($value != $expectedValue) { throw new \Exception("Property \"$key\" found with value \"$value\", expected \"$expectedValue\""); } } @@ -438,12 +438,19 @@ trait WebDav { /** * @When user :user favorites element :path */ - public function userFavoritesFolder($user, $path){ - $this->response = $this->favFolder($user, $path, 0, null); + public function userFavoritesElement($user, $path){ + $this->response = $this->changeFavStateOfAnElement($user, $path, 1, 0, null); + } + + /** + * @When user :user unfavorites element :path + */ + public function userUnfavoritesElement($user, $path){ + $this->response = $this->changeFavStateOfAnElement($user, $path, 0, 0, null); } /*Set the elements of a proppatch, $folderDepth requires 1 to see elements without children*/ - public function favFolder($user, $path, $folderDepth, $properties = null){ + public function changeFavStateOfAnElement($user, $path, $favOrUnfav, $folderDepth, $properties = null){ $fullUrl = substr($this->baseUrl, 0, -4); $settings = array( 'baseUri' => $fullUrl, @@ -457,7 +464,7 @@ trait WebDav { $client = new SClient($settings); if (!$properties) { $properties = [ - '{http://owncloud.org/ns}favorite' => 1 + '{http://owncloud.org/ns}favorite' => $favOrUnfav ]; } diff --git a/build/integration/features/favorites.feature b/build/integration/features/favorites.feature index 8025f0834f..86643fdd1e 100644 --- a/build/integration/features/favorites.feature +++ b/build/integration/features/favorites.feature @@ -2,7 +2,7 @@ Feature: favorite Background: Given using api version "1" - Scenario: Retrieving favorite info of a folder + Scenario: Favorite a folder Given using dav path "remote.php/webdav" And As an "admin" And user "user0" exists @@ -11,11 +11,32 @@ Feature: favorite |{http://owncloud.org/ns}favorite| And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" - Scenario: Retrieving favorite info of a file + Scenario: Favorite and unfavorite a folder + Given using dav path "remote.php/webdav" + And As an "admin" + And user "user0" exists + When user "user0" favorites element "/FOLDER" + And user "user0" unfavorites element "/FOLDER" + Then as "user0" gets properties of folder "/FOLDER" with + |{http://owncloud.org/ns}favorite| + And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "" + + Scenario: Favorite a file Given using dav path "remote.php/webdav" And As an "admin" And user "user0" exists When user "user0" favorites element "/textfile0.txt" Then as "user0" gets properties of file "/textfile0.txt" with |{http://owncloud.org/ns}favorite| - And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" \ No newline at end of file + And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1" + + Scenario: Favorite and unfavorite a file + Given using dav path "remote.php/webdav" + And As an "admin" + And user "user0" exists + When user "user0" favorites element "/textfile0.txt" + And user "user0" unfavorites element "/textfile0.txt" + Then as "user0" gets properties of file "/textfile0.txt" with + |{http://owncloud.org/ns}favorite| + And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "" + From d08eee489ffe9b32110b88b4a5128f2f6188d111 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Thu, 16 Jun 2016 02:32:23 -0400 Subject: [PATCH 25/52] [tx-robot] updated from transifex --- settings/l10n/sq.js | 1 + settings/l10n/sq.json | 1 + 2 files changed, 2 insertions(+) diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index 67f0881efb..3572ee5a60 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -223,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Dokumentim:", "User documentation" : "Dokumentim për përdoruesit", "Admin documentation" : "Dokumentim për përgjegjësit", + "Visit website" : "Vizitoni sajtin", "Report a bug" : "Njoftoni një të metë", "Show description …" : "Shfaq përshkrim …", "Hide description …" : "Fshihe përshkrimin …", diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index 1ad565b3ab..15386e75ee 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -221,6 +221,7 @@ "Documentation:" : "Dokumentim:", "User documentation" : "Dokumentim për përdoruesit", "Admin documentation" : "Dokumentim për përgjegjësit", + "Visit website" : "Vizitoni sajtin", "Report a bug" : "Njoftoni një të metë", "Show description …" : "Shfaq përshkrim …", "Hide description …" : "Fshihe përshkrimin …", From a40d64ff7fdf65049a1a60196761fa743728e2da Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 16 Jun 2016 10:08:49 +0200 Subject: [PATCH 26/52] load 2FA provider apps before querying classes --- .../Authentication/TwoFactorAuth/Manager.php | 13 +++++++++++++ .../Authentication/TwoFactorAuth/ManagerTest.php | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/private/Authentication/TwoFactorAuth/Manager.php b/lib/private/Authentication/TwoFactorAuth/Manager.php index 805735bd1b..6ca4fd065a 100644 --- a/lib/private/Authentication/TwoFactorAuth/Manager.php +++ b/lib/private/Authentication/TwoFactorAuth/Manager.php @@ -24,6 +24,7 @@ namespace OC\Authentication\TwoFactorAuth; use Exception; use OC; use OC\App\AppManager; +use OC_App; use OCP\AppFramework\QueryException; use OCP\Authentication\TwoFactorAuth\IProvider; use OCP\IConfig; @@ -110,6 +111,7 @@ class Manager { $providerClasses = $info['two-factor-providers']; foreach ($providerClasses as $class) { try { + $this->loadTwoFactorApp($appId); $provider = OC::$server->query($class); $providers[$provider->getId()] = $provider; } catch (QueryException $exc) { @@ -125,6 +127,17 @@ class Manager { }); } + /** + * Load an app by ID if it has not been loaded yet + * + * @param string $appId + */ + protected function loadTwoFactorApp($appId) { + if (!OC_App::isAppLoaded($appId)) { + OC_App::loadApp($appId); + } + } + /** * Verify the given challenge * diff --git a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php index 363229b01b..283ba7f942 100644 --- a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php +++ b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php @@ -55,7 +55,10 @@ class ManagerTest extends TestCase { $this->session = $this->getMock('\OCP\ISession'); $this->config = $this->getMock('\OCP\IConfig'); - $this->manager = new Manager($this->appManager, $this->session, $this->config); + $this->manager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager') + ->setConstructorArgs([$this->appManager, $this->session, $this->config]) + ->setMethods(['loadTwoFactorApp']) // Do not actually load the apps + ->getMock(); $this->fakeProvider = $this->getMock('\OCP\Authentication\TwoFactorAuth\IProvider'); $this->fakeProvider->expects($this->any()) From 3521f974db2cf7bebac66ab4c987bb3c67d5d02f Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 16 Jun 2016 11:07:44 +0200 Subject: [PATCH 27/52] assert app is loaded in unit tests --- tests/lib/Authentication/TwoFactorAuth/ManagerTest.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php index 283ba7f942..586fd3aaa2 100644 --- a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php +++ b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php @@ -86,6 +86,10 @@ class ManagerTest extends TestCase { '\OCA\MyCustom2faApp\FakeProvider', ], ])); + + $this->manager->expects($this->once()) + ->method('loadTwoFactorApp') + ->with('mycustom2faapp'); } /** @@ -97,6 +101,9 @@ class ManagerTest extends TestCase { ->method('getEnabledAppsForUser') ->with($this->user) ->will($this->returnValue(['faulty2faapp'])); + $this->manager->expects($this->once()) + ->method('loadTwoFactorApp') + ->with('faulty2faapp'); $this->appManager->expects($this->once()) ->method('getAppInfo') From d36a1fed3e01bee25e9ed73fcf9a5ec881785ec6 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 16 Jun 2016 11:32:28 +0200 Subject: [PATCH 28/52] load authentication apps first (#25126) * load authentication apps first * load session apps before all other apps --- ocs/v1.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ocs/v1.php b/ocs/v1.php index 9a09efc1de..bbc2adf39b 100644 --- a/ocs/v1.php +++ b/ocs/v1.php @@ -43,6 +43,8 @@ use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Routing\Exception\MethodNotAllowedException; try { + OC_App::loadApps(['session']); + OC_App::loadApps(['authentication']); // load all apps to get all api routes properly setup OC_App::loadApps(); From 44910510f6f7947b8456b03f3e0c384e77b24644 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 16 Jun 2016 11:43:57 +0200 Subject: [PATCH 29/52] fix grouped input fields, make sure they take precedence --- core/css/styles.css | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 0d7a5576e0..32d4deb79e 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -374,26 +374,26 @@ a.two-factor-cancel { } #body-login .grouptop input, .grouptop input { - margin-bottom: 0; - border-bottom: 0; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; + margin-bottom: 0 !important; + border-bottom: 0 !important; + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; } #body-login .groupmiddle input, .groupmiddle input { - margin-top: 0; - margin-bottom: 0; - border-top: 0; - border-bottom: 0; - border-radius: 0; + margin-top: 0 !important; + margin-bottom: 0 !important; + border-top: 0 !important; + border-bottom: 0 !important; + border-radius: 0 !important; box-shadow: 0 1px 0 rgba(0,0,0,.1) inset !important; } #body-login .groupbottom input, .groupbottom input { - margin-top: 0; - border-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; + margin-top: 0 !important; + border-top: 0 !important; + border-top-right-radius: 0 !important; + border-top-left-radius: 0 !important; box-shadow: 0 1px 0 rgba(0,0,0,.1) inset !important; } #body-login .groupbottom input[type=submit] { From 4d7ca341bcc4e2e9e169e90489ceac4a6f8a7f25 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 16 Jun 2016 14:04:12 +0200 Subject: [PATCH 30/52] Update submodule for 3rdparty icewind/streams update --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index 071300aea2..509385e674 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 071300aea229e1bf72b5d8eaa0249cd10cd7a64d +Subproject commit 509385e674563e48a977bf8285c826963835528e From 592ac6f7da400969786fbed3a7b69356afd616a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 16 Jun 2016 14:17:06 +0200 Subject: [PATCH 31/52] emit correct signal when disabling an app --- lib/private/App/AppManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php index 475ecba2b8..636f43c8c5 100644 --- a/lib/private/App/AppManager.php +++ b/lib/private/App/AppManager.php @@ -257,7 +257,7 @@ class AppManager implements IAppManager { } unset($this->installedAppsCache[$appId]); $this->appConfig->setValue($appId, 'enabled', 'no'); - $this->dispatcher->dispatch(ManagerEvent::EVENT_APP_ENABLE, new ManagerEvent( + $this->dispatcher->dispatch(ManagerEvent::EVENT_APP_DISABLE, new ManagerEvent( ManagerEvent::EVENT_APP_DISABLE, $appId )); $this->clearAppsCache(); From 8485f5bcb1b1002e111aab12dd99827274102262 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Jun 2016 15:25:56 +0200 Subject: [PATCH 32/52] Prevent the advanced options toggle in the setup from acting as a link --- core/js/setup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/js/setup.js b/core/js/setup.js index cb29959745..636e41fdde 100644 --- a/core/js/setup.js +++ b/core/js/setup.js @@ -43,7 +43,8 @@ $(document).ready(function() { $('input[checked]').trigger('click'); - $('#showAdvanced').click(function() { + $('#showAdvanced').click(function(e) { + e.preventDefault(); $('#datadirContent').slideToggle(250); $('#databaseBackend').slideToggle(250); $('#databaseField').slideToggle(250); From 0b7685d326279fd822a161fb29c2256e2ad01c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 16 Jun 2016 16:14:28 +0200 Subject: [PATCH 33/52] Move birthday calendar generation to a live migration job (#25135) --- apps/dav/appinfo/info.xml | 3 + apps/dav/appinfo/install.php | 26 -------- apps/dav/appinfo/update.php | 26 -------- apps/dav/lib/AppInfo/Application.php | 25 +++---- apps/dav/lib/Migration/GenerateBirthdays.php | 70 ++++++++++++++++++++ 5 files changed, 84 insertions(+), 66 deletions(-) delete mode 100644 apps/dav/appinfo/install.php delete mode 100644 apps/dav/appinfo/update.php create mode 100644 apps/dav/lib/Migration/GenerateBirthdays.php diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index 26e37e6bb8..df147a032f 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -24,5 +24,8 @@ OCA\DAV\Migration\Classification + + OCA\DAV\Migration\GenerateBirthdays + diff --git a/apps/dav/appinfo/install.php b/apps/dav/appinfo/install.php deleted file mode 100644 index d2ee06cc9f..0000000000 --- a/apps/dav/appinfo/install.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @author Thomas Müller - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -use OCA\DAV\AppInfo\Application; - -$app = new Application(); -$app->generateBirthdays(); diff --git a/apps/dav/appinfo/update.php b/apps/dav/appinfo/update.php deleted file mode 100644 index d2ee06cc9f..0000000000 --- a/apps/dav/appinfo/update.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @author Thomas Müller - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -use OCA\DAV\AppInfo\Application; - -$app = new Application(); -$app->generateBirthdays(); diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index 9e0d2da4e1..de2056ebc3 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -32,6 +32,7 @@ use OCA\DAV\Connector\Sabre\Principal; use OCA\DAV\DAV\GroupPrincipalBackend; use OCA\DAV\HookManager; use OCA\DAV\Migration\Classification; +use OCA\DAV\Migration\GenerateBirthdays; use \OCP\AppFramework\App; use OCP\AppFramework\IAppContainer; use OCP\Contacts\IManager; @@ -116,6 +117,16 @@ class Application extends App { $c->getServer()->getUserManager() ); }); + + $container->registerService('OCA\DAV\Migration\GenerateBirthdays', function ($c) { + /** @var IAppContainer $c */ + /** @var BirthdayService $b */ + $b = $c->query('BirthdayService'); + return new GenerateBirthdays( + $b, + $c->getServer()->getUserManager() + ); + }); } /** @@ -164,18 +175,4 @@ class Application extends App { return $this->getContainer()->query('SyncService'); } - public function generateBirthdays() { - try { - /** @var BirthdayService $migration */ - $migration = $this->getContainer()->query('BirthdayService'); - $userManager = $this->getContainer()->getServer()->getUserManager(); - - $userManager->callForAllUsers(function($user) use($migration) { - /** @var IUser $user */ - $migration->syncUser($user->getUID()); - }); - } catch (\Exception $ex) { - $this->getContainer()->getServer()->getLogger()->logException($ex); - } - } } diff --git a/apps/dav/lib/Migration/GenerateBirthdays.php b/apps/dav/lib/Migration/GenerateBirthdays.php new file mode 100644 index 0000000000..dfc8838bcb --- /dev/null +++ b/apps/dav/lib/Migration/GenerateBirthdays.php @@ -0,0 +1,70 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\Migration; + +use OCA\DAV\CalDAV\BirthdayService; +use OCP\IUser; +use OCP\IUserManager; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +class GenerateBirthdays implements IRepairStep { + + /** @var BirthdayService */ + private $birthdayService; + + /** @var IUserManager */ + private $userManager; + + /** + * GenerateBirthdays constructor. + * + * @param BirthdayService $birthdayService + * @param IUserManager $userManager + */ + public function __construct(BirthdayService $birthdayService, IUserManager $userManager) { + $this->birthdayService = $birthdayService; + $this->userManager = $userManager; + } + + /** + * @inheritdoc + */ + public function getName() { + return 'Regenerate birthday calendar for all users'; + } + + /** + * @inheritdoc + */ + public function run(IOutput $output) { + + $output->startProgress(); + $this->userManager->callForAllUsers(function($user) use ($output) { + /** @var IUser $user */ + $output->advance(1, $user->getDisplayName()); + $this->birthdayService->syncUser($user->getUID()); + }); + $output->finishProgress(); + } +} From cc532bb14aed74c397efa29a19ba48a3eeeb0cf0 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Fri, 17 Jun 2016 02:00:01 -0400 Subject: [PATCH 34/52] [tx-robot] updated from transifex --- apps/comments/l10n/zh_CN.js | 3 +++ apps/comments/l10n/zh_CN.json | 3 +++ apps/encryption/l10n/zh_CN.js | 1 + apps/encryption/l10n/zh_CN.json | 1 + apps/federatedfilesharing/l10n/ca.js | 22 +++++++++++++++++++++- apps/federatedfilesharing/l10n/ca.json | 22 +++++++++++++++++++++- apps/federatedfilesharing/l10n/nl.js | 2 ++ apps/federatedfilesharing/l10n/nl.json | 2 ++ apps/files/l10n/nl.js | 9 +++++++++ apps/files/l10n/nl.json | 9 +++++++++ apps/files/l10n/zh_CN.js | 13 +++++++++++++ apps/files/l10n/zh_CN.json | 13 +++++++++++++ apps/files_external/l10n/nl.js | 3 +++ apps/files_external/l10n/nl.json | 3 +++ apps/systemtags/l10n/nl.js | 1 + apps/systemtags/l10n/nl.json | 1 + apps/updatenotification/l10n/nl.js | 6 +++++- apps/updatenotification/l10n/nl.json | 6 +++++- core/l10n/es.js | 2 +- core/l10n/es.json | 2 +- core/l10n/nl.js | 6 ++++++ core/l10n/nl.json | 6 ++++++ core/l10n/zh_CN.js | 6 ++++++ core/l10n/zh_CN.json | 6 ++++++ lib/l10n/zh_CN.js | 4 ++++ lib/l10n/zh_CN.json | 4 ++++ settings/l10n/nl.js | 13 +++++++++++++ settings/l10n/nl.json | 13 +++++++++++++ 28 files changed, 176 insertions(+), 6 deletions(-) diff --git a/apps/comments/l10n/zh_CN.js b/apps/comments/l10n/zh_CN.js index 6ae1c231ae..326fa6407a 100644 --- a/apps/comments/l10n/zh_CN.js +++ b/apps/comments/l10n/zh_CN.js @@ -14,7 +14,10 @@ OC.L10N.register( "Allowed characters {count} of {max}" : "当前字数: {count},最大允许:{max}", "{count} unread comments" : "{count} 条未读评论", "Comment" : "评论", + "Comments for files (always listed in stream)" : "文件的评论(始终在数据流中列出)", + "You commented" : "您的评论", "%1$s commented" : "%1$s 已评论", + "You commented on %2$s" : "你评论了 %2$s", "%1$s commented on %2$s" : "%1$s 评论了 %2$s" }, "nplurals=1; plural=0;"); diff --git a/apps/comments/l10n/zh_CN.json b/apps/comments/l10n/zh_CN.json index f5dab6f5ab..98aa243e1c 100644 --- a/apps/comments/l10n/zh_CN.json +++ b/apps/comments/l10n/zh_CN.json @@ -12,7 +12,10 @@ "Allowed characters {count} of {max}" : "当前字数: {count},最大允许:{max}", "{count} unread comments" : "{count} 条未读评论", "Comment" : "评论", + "Comments for files (always listed in stream)" : "文件的评论(始终在数据流中列出)", + "You commented" : "您的评论", "%1$s commented" : "%1$s 已评论", + "You commented on %2$s" : "你评论了 %2$s", "%1$s commented on %2$s" : "%1$s 评论了 %2$s" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/encryption/l10n/zh_CN.js b/apps/encryption/l10n/zh_CN.js index 93a1b13996..e2f9212c8c 100644 --- a/apps/encryption/l10n/zh_CN.js +++ b/apps/encryption/l10n/zh_CN.js @@ -15,6 +15,7 @@ OC.L10N.register( "Could not change the password. Maybe the old password was not correct." : "不能修改密码。旧密码可能不正确。", "Could not update the private key password." : "不能更新私有密钥。", "The old password was not correct, please try again." : "原始密码错误,请重试。", + "The current log-in password was not correct, please try again." : "当前登录密码不正确,请重试。", "Private key password successfully updated." : "私钥密码成功更新。", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "无效的私有密钥。请到您的个人配置里去更新私有密钥,来恢复对加密文件的访问。", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "加密应用被启用了,但是你的加密密钥没有初始化,请重新登出登录系统一次。", diff --git a/apps/encryption/l10n/zh_CN.json b/apps/encryption/l10n/zh_CN.json index 0fb653b232..8ac6c9eef0 100644 --- a/apps/encryption/l10n/zh_CN.json +++ b/apps/encryption/l10n/zh_CN.json @@ -13,6 +13,7 @@ "Could not change the password. Maybe the old password was not correct." : "不能修改密码。旧密码可能不正确。", "Could not update the private key password." : "不能更新私有密钥。", "The old password was not correct, please try again." : "原始密码错误,请重试。", + "The current log-in password was not correct, please try again." : "当前登录密码不正确,请重试。", "Private key password successfully updated." : "私钥密码成功更新。", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "无效的私有密钥。请到您的个人配置里去更新私有密钥,来恢复对加密文件的访问。", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "加密应用被启用了,但是你的加密密钥没有初始化,请重新登出登录系统一次。", diff --git a/apps/federatedfilesharing/l10n/ca.js b/apps/federatedfilesharing/l10n/ca.js index bc2ea1e51c..d56ab77a8f 100644 --- a/apps/federatedfilesharing/l10n/ca.js +++ b/apps/federatedfilesharing/l10n/ca.js @@ -1,7 +1,27 @@ OC.L10N.register( "federatedfilesharing", { + "Federated sharing" : "Compartició federada", + "Invalid Federated Cloud ID" : "ID de núvol federat invàlid", "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s", - "Open documentation" : "Obre la documentació" + "Not allowed to create a federated share with the same user" : "No està permés crear una compartició federada amb el mateix usuari", + "File is already shared with %s" : "El fitxer ja està compartit amb %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La compartició de %s ha fallat, no es pot trobar %s, potser el servidor està actualment innacessible.", + "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Has rebut \"/%3$s\" com una compartició remota des de %1$s (de part de %2$s)", + "You received \"/%3$s\" as a remote share from %1$s" : "Has rebut \"/%3$s\" com una compartició remota de %1$s", + "Accept" : "Acceptar", + "Decline" : "Denegar", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparteix amb mi a través del meu #ownCloud ID de Núvol Federat, consulteu %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Comparteix amb mi a través del meu #ownCloud ID de Núvol Federat", + "Federated Cloud Sharing" : "Compartició federada de núvol", + "Open documentation" : "Obre la documentació", + "Allow users on this server to send shares to other servers" : "Permet als usuaris d'aquest servidor enviar comparticions a d'altres servidors", + "Allow users on this server to receive shares from other servers" : "Permet als usuaris d'aquest servidor rebre comparticions a d'altres servidors", + "Federated Cloud" : "Núvol federat", + "Your Federated Cloud ID:" : "El teu ID de Núvol Federat:", + "Share it:" : "Comparteix-lo:", + "Add to your website" : "Afegeix a la teva pàgina web", + "Share with me via ownCloud" : "Comparteix amb mi amb ownCloud", + "HTML Code:" : "Codi HTML:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/ca.json b/apps/federatedfilesharing/l10n/ca.json index 9ac1be2442..782557f24a 100644 --- a/apps/federatedfilesharing/l10n/ca.json +++ b/apps/federatedfilesharing/l10n/ca.json @@ -1,5 +1,25 @@ { "translations": { + "Federated sharing" : "Compartició federada", + "Invalid Federated Cloud ID" : "ID de núvol federat invàlid", "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s", - "Open documentation" : "Obre la documentació" + "Not allowed to create a federated share with the same user" : "No està permés crear una compartició federada amb el mateix usuari", + "File is already shared with %s" : "El fitxer ja està compartit amb %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La compartició de %s ha fallat, no es pot trobar %s, potser el servidor està actualment innacessible.", + "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Has rebut \"/%3$s\" com una compartició remota des de %1$s (de part de %2$s)", + "You received \"/%3$s\" as a remote share from %1$s" : "Has rebut \"/%3$s\" com una compartició remota de %1$s", + "Accept" : "Acceptar", + "Decline" : "Denegar", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparteix amb mi a través del meu #ownCloud ID de Núvol Federat, consulteu %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Comparteix amb mi a través del meu #ownCloud ID de Núvol Federat", + "Federated Cloud Sharing" : "Compartició federada de núvol", + "Open documentation" : "Obre la documentació", + "Allow users on this server to send shares to other servers" : "Permet als usuaris d'aquest servidor enviar comparticions a d'altres servidors", + "Allow users on this server to receive shares from other servers" : "Permet als usuaris d'aquest servidor rebre comparticions a d'altres servidors", + "Federated Cloud" : "Núvol federat", + "Your Federated Cloud ID:" : "El teu ID de Núvol Federat:", + "Share it:" : "Comparteix-lo:", + "Add to your website" : "Afegeix a la teva pàgina web", + "Share with me via ownCloud" : "Comparteix amb mi amb ownCloud", + "HTML Code:" : "Codi HTML:" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/nl.js b/apps/federatedfilesharing/l10n/nl.js index 0e91c23c73..acaecc72bc 100644 --- a/apps/federatedfilesharing/l10n/nl.js +++ b/apps/federatedfilesharing/l10n/nl.js @@ -7,6 +7,8 @@ OC.L10N.register( "Not allowed to create a federated share with the same user" : "Het is niet toegestaan om een gefedereerde share met dezelfde gebruikersserver te maken", "File is already shared with %s" : "Bestand is al gedeeld met %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar.", + "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "U ontving \"/%3$s\" als een externe share van %1$s (namens %2$s)", + "You received \"/%3$s\" as a remote share from %1$s" : "U ontving \"/%3$s\" as een externe share van %1$s", "Accept" : "Accepteren", "Decline" : "Afwijzen", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deel met mij via mijn #ownCloud federated Cloud ID, zie %s", diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json index 00144dfcac..5504837a47 100644 --- a/apps/federatedfilesharing/l10n/nl.json +++ b/apps/federatedfilesharing/l10n/nl.json @@ -5,6 +5,8 @@ "Not allowed to create a federated share with the same user" : "Het is niet toegestaan om een gefedereerde share met dezelfde gebruikersserver te maken", "File is already shared with %s" : "Bestand is al gedeeld met %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar.", + "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "U ontving \"/%3$s\" als een externe share van %1$s (namens %2$s)", + "You received \"/%3$s\" as a remote share from %1$s" : "U ontving \"/%3$s\" as een externe share van %1$s", "Accept" : "Accepteren", "Decline" : "Afwijzen", "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deel met mij via mijn #ownCloud federated Cloud ID, zie %s", diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 971ca49f4c..974349d633 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -33,6 +33,15 @@ OC.L10N.register( "Could not get result from server." : "Kon het resultaat van de server niet terugkrijgen.", "Uploading..." : "Uploading...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} uur{plural_s} over", + "{hours}:{minutes}h" : "{hours}:{minutes}h", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minuten{plural_s} over", + "{minutes}:{seconds}m" : "{minutes}:{seconds}m", + "{seconds} second{plural_s} left" : "{seconds} seconden{plural_s} over", + "{seconds}s" : "{seconds}en", + "Any moment now..." : "Heel snel nu...", + "Soon..." : "Binnenkort...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", "Actions" : "Acties", "Download" : "Downloaden", diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 67ec790a59..6caa76f49c 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -31,6 +31,15 @@ "Could not get result from server." : "Kon het resultaat van de server niet terugkrijgen.", "Uploading..." : "Uploading...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} uur{plural_s} over", + "{hours}:{minutes}h" : "{hours}:{minutes}h", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minuten{plural_s} over", + "{minutes}:{seconds}m" : "{minutes}:{seconds}m", + "{seconds} second{plural_s} left" : "{seconds} seconden{plural_s} over", + "{seconds}s" : "{seconds}en", + "Any moment now..." : "Heel snel nu...", + "Soon..." : "Binnenkort...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", "Actions" : "Acties", "Download" : "Downloaden", diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index 4e5afe599d..632804a4fa 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "无效文件夹。", "Files" : "文件", "All files" : "全部文件", + "File could not be found" : "文件未找到", "Home" : "家庭", "Close" : "关闭", "Favorites" : "收藏", @@ -32,6 +33,15 @@ OC.L10N.register( "Could not get result from server." : "不能从服务器得到结果", "Uploading..." : "上传中...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间:{hours}:{minutes}:{seconds} ", + "{hours}:{minutes}h" : "{hours}:{minutes}", + "{minutes}:{seconds} minute{plural_s} left" : "剩余分钟:{minutes}:{seconds} ", + "{minutes}:{seconds}m" : "{minutes}:{seconds}", + "{seconds} second{plural_s} left" : "剩下{seconds} 秒", + "{seconds}s" : "{seconds}秒", + "Any moment now..." : "现在任何时候...", + "Soon..." : "很快...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。", "Actions" : "动作", "Download" : "下载", @@ -77,6 +87,7 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n 字节"], "Favorited" : "已收藏", "Favorite" : "收藏", + "Local link" : "本地链接", "Folder" : "文件夹", "New folder" : "增加文件夹", "{newname} already exists" : "{newname} 已经存在", @@ -107,7 +118,9 @@ OC.L10N.register( "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。", "Missing permissions to edit from here." : "没有从这里进行编辑的权限", "Settings" : "设置", + "Show hidden files" : "显示隐藏文件", "WebDAV" : "WebDAV", + "Use this address to access your Files via WebDAV" : "使用这个地址 通过 WebDAV 访问您的文件", "No files in here" : "无文件", "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!", "No entries found in this folder" : "此文件夹中无项目", diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json index a4cd89935f..60db09ade1 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -19,6 +19,7 @@ "Invalid directory." : "无效文件夹。", "Files" : "文件", "All files" : "全部文件", + "File could not be found" : "文件未找到", "Home" : "家庭", "Close" : "关闭", "Favorites" : "收藏", @@ -30,6 +31,15 @@ "Could not get result from server." : "不能从服务器得到结果", "Uploading..." : "上传中...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "剩余时间:{hours}:{minutes}:{seconds} ", + "{hours}:{minutes}h" : "{hours}:{minutes}", + "{minutes}:{seconds} minute{plural_s} left" : "剩余分钟:{minutes}:{seconds} ", + "{minutes}:{seconds}m" : "{minutes}:{seconds}", + "{seconds} second{plural_s} left" : "剩下{seconds} 秒", + "{seconds}s" : "{seconds}秒", + "Any moment now..." : "现在任何时候...", + "Soon..." : "很快...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。", "Actions" : "动作", "Download" : "下载", @@ -75,6 +85,7 @@ "_%n byte_::_%n bytes_" : ["%n 字节"], "Favorited" : "已收藏", "Favorite" : "收藏", + "Local link" : "本地链接", "Folder" : "文件夹", "New folder" : "增加文件夹", "{newname} already exists" : "{newname} 已经存在", @@ -105,7 +116,9 @@ "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。", "Missing permissions to edit from here." : "没有从这里进行编辑的权限", "Settings" : "设置", + "Show hidden files" : "显示隐藏文件", "WebDAV" : "WebDAV", + "Use this address to access your Files via WebDAV" : "使用这个地址 通过 WebDAV 访问您的文件", "No files in here" : "无文件", "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!", "No entries found in this folder" : "此文件夹中无项目", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 71c8d2aeac..26ff4881eb 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -7,6 +7,8 @@ OC.L10N.register( "Step 1 failed. Exception: %s" : "Stap 1 is mislukt. Uitzondering: %s", "Step 2 failed. Exception: %s" : "Stap 2 is mislukt. Uitzondering: %s", "External storage" : "Externe opslag", + "Dropbox App Configuration" : "Dropbox app configuratie", + "Google Drive App Configuration" : "Google Drive app configuratie", "Personal" : "Persoonlijk", "System" : "Systeem", "Grant access" : "Sta toegang toe", @@ -16,6 +18,7 @@ OC.L10N.register( "Error generating key pair" : "Fout bij genereren sleutelpaar", "All users. Type to select user or group." : "Alle gebruikers. Tikken om een gebruiker of groep te selecteren.", "(group)" : "(groep)", + "Compatibility with Mac NFD encoding (slow)" : "Compatibiliteit met Mac NFD encoding (traag)", "Admin defined" : "Beheerder gedefinieerd", "Saved" : "Bewaard", "Empty response from the server" : "Lege reactie van de server", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index 6603af23be..958d1f7059 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -5,6 +5,8 @@ "Step 1 failed. Exception: %s" : "Stap 1 is mislukt. Uitzondering: %s", "Step 2 failed. Exception: %s" : "Stap 2 is mislukt. Uitzondering: %s", "External storage" : "Externe opslag", + "Dropbox App Configuration" : "Dropbox app configuratie", + "Google Drive App Configuration" : "Google Drive app configuratie", "Personal" : "Persoonlijk", "System" : "Systeem", "Grant access" : "Sta toegang toe", @@ -14,6 +16,7 @@ "Error generating key pair" : "Fout bij genereren sleutelpaar", "All users. Type to select user or group." : "Alle gebruikers. Tikken om een gebruiker of groep te selecteren.", "(group)" : "(groep)", + "Compatibility with Mac NFD encoding (slow)" : "Compatibiliteit met Mac NFD encoding (traag)", "Admin defined" : "Beheerder gedefinieerd", "Saved" : "Bewaard", "Empty response from the server" : "Lege reactie van de server", diff --git a/apps/systemtags/l10n/nl.js b/apps/systemtags/l10n/nl.js index 3b4aa7eb56..567b14aa1f 100644 --- a/apps/systemtags/l10n/nl.js +++ b/apps/systemtags/l10n/nl.js @@ -21,6 +21,7 @@ OC.L10N.register( "%1$s assigned system tag %3$s to %2$s" : "%1$s wees systeem tag %3$s aan %2$s toe", "You unassigned system tag %3$s from %2$s" : "Je maakte toewijzing systeem tag %3$s van %2$s ongedaan", "%1$s unassigned system tag %3$s from %2$s" : "%1$s verwijderde systeem tag %3$s van %2$s", + "%s (restricted)" : "%s (beperkt)", "%s (invisible)" : "%s (onzichtbaar)", "No files in here" : "Hier geen bestanden", "No entries found in this folder" : "Niets gevonden in deze map", diff --git a/apps/systemtags/l10n/nl.json b/apps/systemtags/l10n/nl.json index f941ce3a4a..f7d83699c2 100644 --- a/apps/systemtags/l10n/nl.json +++ b/apps/systemtags/l10n/nl.json @@ -19,6 +19,7 @@ "%1$s assigned system tag %3$s to %2$s" : "%1$s wees systeem tag %3$s aan %2$s toe", "You unassigned system tag %3$s from %2$s" : "Je maakte toewijzing systeem tag %3$s van %2$s ongedaan", "%1$s unassigned system tag %3$s from %2$s" : "%1$s verwijderde systeem tag %3$s van %2$s", + "%s (restricted)" : "%s (beperkt)", "%s (invisible)" : "%s (onzichtbaar)", "No files in here" : "Hier geen bestanden", "No entries found in this folder" : "Niets gevonden in deze map", diff --git a/apps/updatenotification/l10n/nl.js b/apps/updatenotification/l10n/nl.js index b2e269835b..93b65f6976 100644 --- a/apps/updatenotification/l10n/nl.js +++ b/apps/updatenotification/l10n/nl.js @@ -1,8 +1,10 @@ OC.L10N.register( "updatenotification", { + "Update notifications" : "Bijwerken meldingen", "{version} is available. Get more information on how to update." : "{version} is beschikbaar. Meer informatie over het bijwerken.", "Updated channel" : "Bijgewerkt kanaal", + "ownCloud core" : "ownCloud core", "Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.", "Updater" : "Updater", "A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s", @@ -10,6 +12,8 @@ OC.L10N.register( "Your version is up to date." : "Uw versie is up to date.", "Checked on %s" : "Gecontroleerd op %s", "Update channel:" : "Bijwerkkanaal:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "U kunt altijd updaten naar een nieuwere versie of experimenteel kanaal. Maar terug naar een oudere versie of een stabieler kanaal is niet mogelijk." + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "U kunt altijd updaten naar een nieuwere versie of experimenteel kanaal. Maar terug naar een oudere versie of een stabieler kanaal is niet mogelijk.", + "Notify members of the following groups about available updates:" : "Geef een melding over beschikbare updates aan leden van de volgende groepen:", + "Only notification for app updates are available, because the selected update channel for ownCloud itself does not allow notifications." : "Er zin alleen meldingen voor app updates beschikbaar, omdat het geselecteerde ownCloud update kanaal zelf geen meldingen toestaat." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/nl.json b/apps/updatenotification/l10n/nl.json index 3a8c617fda..4c028cc596 100644 --- a/apps/updatenotification/l10n/nl.json +++ b/apps/updatenotification/l10n/nl.json @@ -1,6 +1,8 @@ { "translations": { + "Update notifications" : "Bijwerken meldingen", "{version} is available. Get more information on how to update." : "{version} is beschikbaar. Meer informatie over het bijwerken.", "Updated channel" : "Bijgewerkt kanaal", + "ownCloud core" : "ownCloud core", "Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.", "Updater" : "Updater", "A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s", @@ -8,6 +10,8 @@ "Your version is up to date." : "Uw versie is up to date.", "Checked on %s" : "Gecontroleerd op %s", "Update channel:" : "Bijwerkkanaal:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "U kunt altijd updaten naar een nieuwere versie of experimenteel kanaal. Maar terug naar een oudere versie of een stabieler kanaal is niet mogelijk." + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "U kunt altijd updaten naar een nieuwere versie of experimenteel kanaal. Maar terug naar een oudere versie of een stabieler kanaal is niet mogelijk.", + "Notify members of the following groups about available updates:" : "Geef een melding over beschikbare updates aan leden van de volgende groepen:", + "Only notification for app updates are available, because the selected update channel for ownCloud itself does not allow notifications." : "Er zin alleen meldingen voor app updates beschikbaar, omdat het geselecteerde ownCloud update kanaal zelf geen meldingen toestaat." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/core/l10n/es.js b/core/l10n/es.js index 917f73b308..3469d18201 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -130,7 +130,7 @@ OC.L10N.register( "Good password" : "Contraseña buena", "Strong password" : "Contraseña muy buena", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Su servidor web aún no está configurado adecuadamente para permitir sincronización de archivos ya que la interfaz WebDAV parece no estar funcionando.", - "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra documentation.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra documentación.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionan. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our documentation." : "La memoria caché no ha sido configurada. Para mejorar su desempeño, por favor, configure la memcache si está disponible. Puede encontrar más información en nuestra documentation", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our documentation." : "PHP no tiene acceso a /dev/urandom lo cual es desaconsejable por razones de seguridad. Puede encontrar más información en nuestra our documentation.", diff --git a/core/l10n/es.json b/core/l10n/es.json index d37b77e07a..8070e3f40f 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -128,7 +128,7 @@ "Good password" : "Contraseña buena", "Strong password" : "Contraseña muy buena", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Su servidor web aún no está configurado adecuadamente para permitir sincronización de archivos ya que la interfaz WebDAV parece no estar funcionando.", - "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra documentation.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra documentación.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionan. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our documentation." : "La memoria caché no ha sido configurada. Para mejorar su desempeño, por favor, configure la memcache si está disponible. Puede encontrar más información en nuestra documentation", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our documentation." : "PHP no tiene acceso a /dev/urandom lo cual es desaconsejable por razones de seguridad. Puede encontrar más información en nuestra our documentation.", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index e7ab738e3e..e291a8da92 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -195,6 +195,7 @@ OC.L10N.register( "Warning" : "Waarschuwing", "Error while sending notification" : "Fout bij versturen melding", "Non-existing tag #{tag}" : "Niet bestaande tag #{tag}", + "restricted" : "beperkt", "invisible" : "onzichtbaar", "({scope})" : "({scope})", "Delete" : "Verwijder", @@ -295,6 +296,11 @@ OC.L10N.register( "This means only administrators can use the instance." : "Dat betekent dat alleen beheerders deze installatie kunnen gebruiken.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Neem contact op met uw systeembeheerder als deze melding aanhoudt of onverwacht verscheen.", "Thank you for your patience." : "Bedankt voor uw geduld.", + "Two-step verification" : "Twee-staps verificatie", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Aanvullende beveiliging is ingeschakeld voor uw account. Log in met een tweede factor.", + "Cancel login" : "Inlog annuleren", + "Please authenticate using the selected factor." : "Log in met de geselecteerde factor.", + "An error occured while verifying the token" : "Er trad een fout op bij het verifiëren van het token", "You are accessing the server from an untrusted domain." : "U benadert de server vanaf een niet vertrouwd domein.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Neem contact op met uw beheerder. Als u de beheerder van deze service bent, configureer dan de \"trusted_domains\" instelling in config/config.php. Een voorbeeldconfiguratie is gegeven in config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Afhankelijk van uw configuratie zou u als beheerder ook de onderstaande knop kunnen gebruiken om dit domein te vertrouwen.", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index 270cf9e471..f2b0164df7 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -193,6 +193,7 @@ "Warning" : "Waarschuwing", "Error while sending notification" : "Fout bij versturen melding", "Non-existing tag #{tag}" : "Niet bestaande tag #{tag}", + "restricted" : "beperkt", "invisible" : "onzichtbaar", "({scope})" : "({scope})", "Delete" : "Verwijder", @@ -293,6 +294,11 @@ "This means only administrators can use the instance." : "Dat betekent dat alleen beheerders deze installatie kunnen gebruiken.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Neem contact op met uw systeembeheerder als deze melding aanhoudt of onverwacht verscheen.", "Thank you for your patience." : "Bedankt voor uw geduld.", + "Two-step verification" : "Twee-staps verificatie", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Aanvullende beveiliging is ingeschakeld voor uw account. Log in met een tweede factor.", + "Cancel login" : "Inlog annuleren", + "Please authenticate using the selected factor." : "Log in met de geselecteerde factor.", + "An error occured while verifying the token" : "Er trad een fout op bij het verifiëren van het token", "You are accessing the server from an untrusted domain." : "U benadert de server vanaf een niet vertrouwd domein.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Neem contact op met uw beheerder. Als u de beheerder van deze service bent, configureer dan de \"trusted_domains\" instelling in config/config.php. Een voorbeeldconfiguratie is gegeven in config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Afhankelijk van uw configuratie zou u als beheerder ook de onderstaande knop kunnen gebruiken om dit domein te vertrouwen.", diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index 9f3a554499..e3ca88348c 100644 --- a/core/l10n/zh_CN.js +++ b/core/l10n/zh_CN.js @@ -195,6 +195,7 @@ OC.L10N.register( "Warning" : "警告", "Error while sending notification" : "发送通知时出现错误", "Non-existing tag #{tag}" : "标签 #{tag} 不存在", + "restricted" : "受限", "invisible" : "不可见", "({scope})" : "({scope})", "Delete" : "删除", @@ -295,6 +296,11 @@ OC.L10N.register( "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。", "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。", "Thank you for your patience." : "感谢让你久等了。", + "Two-step verification" : "两步验证", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。", + "Cancel login" : "取消登录", + "Please authenticate using the selected factor." : "请使用所选择的因素验证。", + "An error occured while verifying the token" : "在验证令牌时出错", "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器。", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系你的系统管理员。如果你是系统管理员,配置 config/config.php 文件中参数 \"trusted_domain\" 设置。可以在 config/config.sample.php 文件中找到例子。", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于你的配置,作为系统管理员,你可能还能点击下面的按钮来信任这个域。", diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json index a8b39e0d37..5eb4c468ff 100644 --- a/core/l10n/zh_CN.json +++ b/core/l10n/zh_CN.json @@ -193,6 +193,7 @@ "Warning" : "警告", "Error while sending notification" : "发送通知时出现错误", "Non-existing tag #{tag}" : "标签 #{tag} 不存在", + "restricted" : "受限", "invisible" : "不可见", "({scope})" : "({scope})", "Delete" : "删除", @@ -293,6 +294,11 @@ "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。", "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。", "Thank you for your patience." : "感谢让你久等了。", + "Two-step verification" : "两步验证", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。", + "Cancel login" : "取消登录", + "Please authenticate using the selected factor." : "请使用所选择的因素验证。", + "An error occured while verifying the token" : "在验证令牌时出错", "You are accessing the server from an untrusted domain." : "您正在访问来自不信任域名的服务器。", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "请联系你的系统管理员。如果你是系统管理员,配置 config/config.php 文件中参数 \"trusted_domain\" 设置。可以在 config/config.sample.php 文件中找到例子。", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "基于你的配置,作为系统管理员,你可能还能点击下面的按钮来信任这个域。", diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js index 8951d48b5c..a29b4adaa1 100644 --- a/lib/l10n/zh_CN.js +++ b/lib/l10n/zh_CN.js @@ -2,8 +2,12 @@ OC.L10N.register( "lib", { "Cannot write into \"config\" directory!" : "无法写入“config”目录!", + "This can usually be fixed by giving the webserver write access to the config directory" : "给 WEB 服务器 Config 目录设置写权限可以修复这个问题。", "See %s" : "查看 %s", + "Sample configuration detected" : "示例配置检测", "PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。", + "The command line tool %s could not be found" : "命令行工具 %s 未找到", + "The library %s is not available." : "库文件 %s 不可用", "Unknown filetype" : "未知的文件类型", "Invalid image" : "无效的图像", "today" : "今天", diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json index c502c21ad8..9b5f0af074 100644 --- a/lib/l10n/zh_CN.json +++ b/lib/l10n/zh_CN.json @@ -1,7 +1,11 @@ { "translations": { "Cannot write into \"config\" directory!" : "无法写入“config”目录!", + "This can usually be fixed by giving the webserver write access to the config directory" : "给 WEB 服务器 Config 目录设置写权限可以修复这个问题。", "See %s" : "查看 %s", + "Sample configuration detected" : "示例配置检测", "PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。", + "The command line tool %s could not be found" : "命令行工具 %s 未找到", + "The library %s is not available." : "库文件 %s 不可用", "Unknown filetype" : "未知的文件类型", "Invalid image" : "无效的图像", "today" : "今天", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index 6fe8d296b8..859fd324b9 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -86,6 +86,10 @@ OC.L10N.register( "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is geactiveerd maar moet worden bijgewerkt. U wordt over 5 seconden doorgeleid naar de bijwerkpagina.", "App update" : "App update", "No apps found for {query}" : "Geen apps gevonden voor {query}", + "Disconnect" : "Verbreek verbinding", + "Error while loading browser sessions and device tokens" : "Fout bij laden browser sessies en apparaat-tokens", + "Error while creating device token" : "Fout bij creëren apparaat-token", + "Error while deleting the token" : "Fout bij verwijderen token", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Er trad een fout op. Upload als een ASCII-gecodeerd PEM certificaat.", "Valid until {date}" : "Geldig tot {date}", "Delete" : "Verwijder", @@ -114,6 +118,8 @@ OC.L10N.register( "__language_name__" : "Nederlands", "Unlimited" : "Ongelimiteerd", "Personal info" : "Persoonlijke info", + "Sessions" : "Sessies", + "Devices" : "Apparaten", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)", "Info, warnings, errors and fatal issues" : "Info, waarschuwingen, fouten en fatale problemen", @@ -131,6 +137,7 @@ OC.L10N.register( "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "De Alleen-lezen config is geactiveerd. Dit voorkomt het via de webinterface wijzigen van verschillende instellingen. Bovendien moet het bestand voor elke aanpassing handmatig op beschrijfbaar worden ingesteld.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP is blijkbaar zo ingesteld dat inline doc blokken worden gestript. Hierdoor worden verschillende kernmodules onbruikbaar.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dit wordt vermoedelijk veroorzaakt door een cache/accelerator, zoals Zend OPcache of eAccelerator.", + "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Uw database draait niet met \"READ COMMITED\" transactie isolatie niveau. Dit kan problemen opleveren als er meerdere acties tegelijkertijd worden uitgevoerd.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Uw server draait op Microsoft Windows. We adviseren om een linux server te gebruiken voor een optimale gebruikerservaring.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s lager dan versie %2$s geïnstalleerd, voor betere stabiliteit en prestaties adviseren wij om %1$s te upgraden naar een nieuwere versie.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "De PHP module 'fileinfo' ontbreekt. We adviseren met klem om deze module te activeren om de beste resultaten te bereiken voor mime-type detectie.", @@ -216,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Documentatie:", "User documentation" : "Gebruikersdocumentatie", "Admin documentation" : "Beheerdocumentatie", + "Visit website" : "Bezoek website", "Report a bug" : "Rapporteer een fout", "Show description …" : "Toon beschrijving ...", "Hide description …" : "Verberg beschrijving ...", @@ -261,7 +269,12 @@ OC.L10N.register( "Current password" : "Huidig wachtwoord", "New password" : "Nieuw", "Change password" : "Wijzig wachtwoord", + "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dit zijn de web, desktop en mobiele clients die momenteel zijn verbonden met uw ownCloud.", + "Browser" : "Browser", + "Most recent activity" : "Meest recente activiteit", + "You've linked these devices." : "U hebt deze apparaten gekoppeld.", "Name" : "Naam", + "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Een apparaat wachtwoord is een toegangscode waarmee een app of apparaat toegang krijgt om uw ownCloud account te gebruiken.", "Language" : "Taal", "Help translate" : "Help met vertalen", "Get the apps to sync your files" : "Download de apps om bestanden te synchroniseren", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index 56a765e7ef..f77d3c0809 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -84,6 +84,10 @@ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "De app is geactiveerd maar moet worden bijgewerkt. U wordt over 5 seconden doorgeleid naar de bijwerkpagina.", "App update" : "App update", "No apps found for {query}" : "Geen apps gevonden voor {query}", + "Disconnect" : "Verbreek verbinding", + "Error while loading browser sessions and device tokens" : "Fout bij laden browser sessies en apparaat-tokens", + "Error while creating device token" : "Fout bij creëren apparaat-token", + "Error while deleting the token" : "Fout bij verwijderen token", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Er trad een fout op. Upload als een ASCII-gecodeerd PEM certificaat.", "Valid until {date}" : "Geldig tot {date}", "Delete" : "Verwijder", @@ -112,6 +116,8 @@ "__language_name__" : "Nederlands", "Unlimited" : "Ongelimiteerd", "Personal info" : "Persoonlijke info", + "Sessions" : "Sessies", + "Devices" : "Apparaten", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)", "Info, warnings, errors and fatal issues" : "Info, waarschuwingen, fouten en fatale problemen", @@ -129,6 +135,7 @@ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "De Alleen-lezen config is geactiveerd. Dit voorkomt het via de webinterface wijzigen van verschillende instellingen. Bovendien moet het bestand voor elke aanpassing handmatig op beschrijfbaar worden ingesteld.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP is blijkbaar zo ingesteld dat inline doc blokken worden gestript. Hierdoor worden verschillende kernmodules onbruikbaar.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dit wordt vermoedelijk veroorzaakt door een cache/accelerator, zoals Zend OPcache of eAccelerator.", + "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Uw database draait niet met \"READ COMMITED\" transactie isolatie niveau. Dit kan problemen opleveren als er meerdere acties tegelijkertijd worden uitgevoerd.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Uw server draait op Microsoft Windows. We adviseren om een linux server te gebruiken voor een optimale gebruikerservaring.", "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s lager dan versie %2$s geïnstalleerd, voor betere stabiliteit en prestaties adviseren wij om %1$s te upgraden naar een nieuwere versie.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "De PHP module 'fileinfo' ontbreekt. We adviseren met klem om deze module te activeren om de beste resultaten te bereiken voor mime-type detectie.", @@ -214,6 +221,7 @@ "Documentation:" : "Documentatie:", "User documentation" : "Gebruikersdocumentatie", "Admin documentation" : "Beheerdocumentatie", + "Visit website" : "Bezoek website", "Report a bug" : "Rapporteer een fout", "Show description …" : "Toon beschrijving ...", "Hide description …" : "Verberg beschrijving ...", @@ -259,7 +267,12 @@ "Current password" : "Huidig wachtwoord", "New password" : "Nieuw", "Change password" : "Wijzig wachtwoord", + "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dit zijn de web, desktop en mobiele clients die momenteel zijn verbonden met uw ownCloud.", + "Browser" : "Browser", + "Most recent activity" : "Meest recente activiteit", + "You've linked these devices." : "U hebt deze apparaten gekoppeld.", "Name" : "Naam", + "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Een apparaat wachtwoord is een toegangscode waarmee een app of apparaat toegang krijgt om uw ownCloud account te gebruiken.", "Language" : "Taal", "Help translate" : "Help met vertalen", "Get the apps to sync your files" : "Download de apps om bestanden te synchroniseren", From 2fe67ecc3cec8325ac4a17c26a3e1f36b28ebf2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Bertol=C3=ADn?= Date: Fri, 17 Jun 2016 07:35:23 +0000 Subject: [PATCH 35/52] Changed global variable to local --- apps/federation/js/settings-admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/federation/js/settings-admin.js b/apps/federation/js/settings-admin.js index 45d5d62a5a..10fabbeb9b 100644 --- a/apps/federation/js/settings-admin.js +++ b/apps/federation/js/settings-admin.js @@ -60,7 +60,7 @@ $(document).ready(function () { // remove trusted server from list $( "#listOfTrustedServers" ).on('click', 'li > .icon-delete', function() { var $this = $(this).parent(); - id = $this.attr('id'); + var id = $this.attr('id'); $.ajax({ url: OC.generateUrl('/apps/federation/trusted-servers/' + id), type: 'DELETE', From a13caa0ea2f257faac5cabc19c38240418ab8043 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 17 Jun 2016 11:00:09 +0200 Subject: [PATCH 36/52] Delay files_sharing's registerMountProviders This moves registerMountProviders until after the sharing backends were registered. In some situations registerMountProviders will trigger listeners which might require filesystem access which itself would mount shares, which itself requires the sharing backends to be initialized. --- apps/files_sharing/appinfo/app.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index 5740574ec4..c6ae6903ee 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -32,14 +32,14 @@ $l = \OC::$server->getL10N('files_sharing'); \OC::$CLASSPATH['OC_Share_Backend_Folder'] = 'files_sharing/lib/share/folder.php'; \OC::$CLASSPATH['OC\Files\Storage\Shared'] = 'files_sharing/lib/sharedstorage.php'; -$application = new \OCA\Files_Sharing\AppInfo\Application(); -$application->registerMountProviders(); - \OCA\Files_Sharing\Helper::registerHooks(); \OCP\Share::registerBackend('file', 'OC_Share_Backend_File'); \OCP\Share::registerBackend('folder', 'OC_Share_Backend_Folder', 'file'); +$application = new \OCA\Files_Sharing\AppInfo\Application(); +$application->registerMountProviders(); + $eventDispatcher = \OC::$server->getEventDispatcher(); $eventDispatcher->addListener( 'OCA\Files::loadAdditionalScripts', From 82b50d126c5ea05db3e1cc846db2b410b54fd8fe Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 11:01:35 +0200 Subject: [PATCH 37/52] add PasswordLoginForbiddenException --- apps/dav/lib/Connector/Sabre/Auth.php | 19 +++++++--- .../tests/unit/Connector/Sabre/AuthTest.php | 16 ++++++++ .../Middleware/Security/CORSMiddleware.php | 9 ++++- .../PasswordLoginForbiddenException.php | 29 +++++++++++++++ lib/private/User/Session.php | 37 ++++++++++--------- .../Security/CORSMiddlewareTest.php | 25 +++++++++++++ tests/lib/User/SessionTest.php | 10 ++++- 7 files changed, 118 insertions(+), 27 deletions(-) create mode 100644 lib/private/Authentication/Exceptions/PasswordLoginForbiddenException.php diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php index 51f0acbe2e..a37ef787ba 100644 --- a/apps/dav/lib/Connector/Sabre/Auth.php +++ b/apps/dav/lib/Connector/Sabre/Auth.php @@ -31,6 +31,7 @@ namespace OCA\DAV\Connector\Sabre; use Exception; use OC\AppFramework\Http\Request; +use OC\Authentication\Exceptions\PasswordLoginForbiddenException; use OC\Authentication\TwoFactorAuth\Manager; use OC\User\Session; use OCP\IRequest; @@ -115,12 +116,18 @@ class Auth extends AbstractBasic { return true; } else { \OC_Util::setupFS(); //login hooks may need early access to the filesystem - if($this->userSession->logClientIn($username, $password, $this->request)) { - \OC_Util::setupFS($this->userSession->getUser()->getUID()); - $this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID()); - $this->session->close(); - return true; - } else { + try { + if ($this->userSession->logClientIn($username, $password, $this->request)) { + \OC_Util::setupFS($this->userSession->getUser()->getUID()); + $this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID()); + $this->session->close(); + return true; + } else { + $this->session->close(); + return false; + } + } catch (PasswordLoginForbiddenException $ex) { + // TODO: throw sabre exception $this->session->close(); return false; } diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php index 147a0c2b8c..60dbe6e722 100644 --- a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php @@ -208,6 +208,22 @@ class AuthTest extends TestCase { $this->assertFalse($this->invokePrivate($this->auth, 'validateUserPass', ['MyTestUser', 'MyTestPassword'])); } + public function testValidateUserPassWithPasswordLoginForbidden() { + $this->userSession + ->expects($this->once()) + ->method('isLoggedIn') + ->will($this->returnValue(false)); + $this->userSession + ->expects($this->once()) + ->method('logClientIn') + ->with('MyTestUser', 'MyTestPassword') + ->will($this->throwException(new \OC\Authentication\Exceptions\PasswordLoginForbiddenException())); + $this->session + ->expects($this->once()) + ->method('close'); + + $this->assertFalse($this->invokePrivate($this->auth, 'validateUserPass', ['MyTestUser', 'MyTestPassword'])); + } public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGet() { $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') diff --git a/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php index 69bfeb5e9b..32a507623e 100644 --- a/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php +++ b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php @@ -26,6 +26,7 @@ namespace OC\AppFramework\Middleware\Security; use OC\AppFramework\Middleware\Security\Exceptions\SecurityException; use OC\AppFramework\Utility\ControllerMethodReflector; +use OC\Authentication\Exceptions\PasswordLoginForbiddenException; use OC\User\Session; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; @@ -89,8 +90,12 @@ class CORSMiddleware extends Middleware { $pass = $this->request->server['PHP_AUTH_PW']; $this->session->logout(); - if(!$this->session->logClientIn($user, $pass, $this->request)) { - throw new SecurityException('CORS requires basic auth', Http::STATUS_UNAUTHORIZED); + try { + if (!$this->session->logClientIn($user, $pass, $this->request)) { + throw new SecurityException('CORS requires basic auth', Http::STATUS_UNAUTHORIZED); + } + } catch (PasswordLoginForbiddenException $ex) { + throw new SecurityException('Password login forbidden, use token instead', Http::STATUS_UNAUTHORIZED); } } } diff --git a/lib/private/Authentication/Exceptions/PasswordLoginForbiddenException.php b/lib/private/Authentication/Exceptions/PasswordLoginForbiddenException.php new file mode 100644 index 0000000000..2e9f9534db --- /dev/null +++ b/lib/private/Authentication/Exceptions/PasswordLoginForbiddenException.php @@ -0,0 +1,29 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OC\Authentication\Exceptions; + +use Exception; + +class PasswordLoginForbiddenException extends Exception { + +} diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 0cebb3e061..4e9c827448 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -33,6 +33,7 @@ namespace OC\User; use OC; use OC\Authentication\Exceptions\InvalidTokenException; use OC\Authentication\Exceptions\PasswordlessTokenException; +use OC\Authentication\Exceptions\PasswordLoginForbiddenException; use OC\Authentication\Token\IProvider; use OC\Authentication\Token\IToken; use OC\Hooks\Emitter; @@ -350,17 +351,16 @@ class Session implements IUserSession, Emitter { * @param string $password * @param IRequest $request * @throws LoginException + * @throws PasswordLoginForbiddenException * @return boolean */ public function logClientIn($user, $password, IRequest $request) { $isTokenPassword = $this->isTokenPassword($password); if (!$isTokenPassword && $this->isTokenAuthEnforced()) { - // TODO: throw LoginException instead (https://github.com/owncloud/core/pull/24616) - return false; + throw new PasswordLoginForbiddenException(); } if (!$isTokenPassword && $this->isTwoFactorEnforced($user)) { - // TODO: throw LoginException instead (https://github.com/owncloud/core/pull/24616) - return false; + throw new PasswordLoginForbiddenException(); } if (!$this->login($user, $password) ) { $users = $this->manager->getByEmail($user); @@ -442,19 +442,22 @@ class Session implements IUserSession, Emitter { */ public function tryBasicAuthLogin(IRequest $request) { if (!empty($request->server['PHP_AUTH_USER']) && !empty($request->server['PHP_AUTH_PW'])) { - $result = $this->logClientIn($request->server['PHP_AUTH_USER'], $request->server['PHP_AUTH_PW'], $request); - if ($result === true) { - /** - * Add DAV authenticated. This should in an ideal world not be - * necessary but the iOS App reads cookies from anywhere instead - * only the DAV endpoint. - * This makes sure that the cookies will be valid for the whole scope - * @see https://github.com/owncloud/core/issues/22893 - */ - $this->session->set( - Auth::DAV_AUTHENTICATED, $this->getUser()->getUID() - ); - return true; + try { + if ($this->logClientIn($request->server['PHP_AUTH_USER'], $request->server['PHP_AUTH_PW'], $request)) { + /** + * Add DAV authenticated. This should in an ideal world not be + * necessary but the iOS App reads cookies from anywhere instead + * only the DAV endpoint. + * This makes sure that the cookies will be valid for the whole scope + * @see https://github.com/owncloud/core/issues/22893 + */ + $this->session->set( + Auth::DAV_AUTHENTICATED, $this->getUser()->getUID() + ); + return true; + } + } catch (PasswordLoginForbiddenException $ex) { + // Nothing to do } } return false; diff --git a/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php b/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php index a398dc2320..54d2831d25 100644 --- a/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php +++ b/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php @@ -160,6 +160,31 @@ class CORSMiddlewareTest extends \Test\TestCase { $middleware->beforeController($this, __FUNCTION__, new Response()); } + /** + * @CORS + * @expectedException \OC\AppFramework\Middleware\Security\Exceptions\SecurityException + */ + public function testCORSShouldFailIfPasswordLoginIsForbidden() { + $request = new Request( + ['server' => [ + 'PHP_AUTH_USER' => 'user', + 'PHP_AUTH_PW' => 'pass' + ]], + $this->getMock('\OCP\Security\ISecureRandom'), + $this->getMock('\OCP\IConfig') + ); + $this->session->expects($this->once()) + ->method('logout'); + $this->session->expects($this->once()) + ->method('logClientIn') + ->with($this->equalTo('user'), $this->equalTo('pass')) + ->will($this->throwException(new \OC\Authentication\Exceptions\PasswordLoginForbiddenException)); + $this->reflector->reflect($this, __FUNCTION__); + $middleware = new CORSMiddleware($request, $this->reflector, $this->session); + + $middleware->beforeController($this, __FUNCTION__, new Response()); + } + /** * @CORS * @expectedException \OC\AppFramework\Middleware\Security\Exceptions\SecurityException diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 28f6b6a537..7a34d42a2b 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -306,6 +306,9 @@ class SessionTest extends \Test\TestCase { $userSession->login('foo', 'bar'); } + /** + * @expectedException \OC\Authentication\Exceptions\PasswordLoginForbiddenException + */ public function testLogClientInNoTokenPasswordWith2fa() { $manager = $this->getMockBuilder('\OC\User\Manager') ->disableOriginalConstructor() @@ -329,7 +332,7 @@ class SessionTest extends \Test\TestCase { ->with('token_auth_enforced', false) ->will($this->returnValue(true)); - $this->assertFalse($userSession->logClientIn('john', 'doe', $request)); + $userSession->logClientIn('john', 'doe', $request); } public function testLogClientInWithTokenPassword() { @@ -371,6 +374,9 @@ class SessionTest extends \Test\TestCase { $this->assertTrue($userSession->logClientIn('john', 'doe', $request)); } + /** + * @expectedException \OC\Authentication\Exceptions\PasswordLoginForbiddenException + */ public function testLogClientInNoTokenPasswordNo2fa() { $manager = $this->getMockBuilder('\OC\User\Manager') ->disableOriginalConstructor() @@ -399,7 +405,7 @@ class SessionTest extends \Test\TestCase { ->with('john') ->will($this->returnValue(true)); - $this->assertFalse($userSession->logClientIn('john', 'doe', $request)); + $userSession->logClientIn('john', 'doe', $request); } public function testRememberLoginValidToken() { From 73e284e1e136e3cbb1431d067f86c3ca02a4d4c7 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 17 Jun 2016 10:53:55 +0200 Subject: [PATCH 38/52] Use getLazyRootFolder from RemoveRootShares repair step This prevents the command registration to setup the FS too early when FS-related apps might need upgrading. --- lib/private/Repair.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/Repair.php b/lib/private/Repair.php index 96731fa9df..2b33dc413b 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -137,7 +137,7 @@ class Repair implements IOutput{ new SharePropagation(\OC::$server->getConfig()), new RemoveOldShares(\OC::$server->getDatabaseConnection()), new AvatarPermissions(\OC::$server->getDatabaseConnection()), - new RemoveRootShares(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager(), \OC::$server->getRootFolder()), + new RemoveRootShares(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager(), \OC::$server->getLazyRootFolder()), ]; } From a636078e6cfa12429ec780937c25e5034c185c0f Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 17 Jun 2016 11:11:59 +0200 Subject: [PATCH 39/52] Make getShareFolder use given view instead of static FS --- apps/files_sharing/lib/Helper.php | 12 ++++++++---- apps/files_sharing/lib/SharedMount.php | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/files_sharing/lib/Helper.php b/apps/files_sharing/lib/Helper.php index e4640f82eb..2353a281b7 100644 --- a/apps/files_sharing/lib/Helper.php +++ b/apps/files_sharing/lib/Helper.php @@ -277,19 +277,23 @@ class Helper { /** * get default share folder * + * @param \OC\Files\View * @return string */ - public static function getShareFolder() { + public static function getShareFolder($view = null) { + if ($view === null) { + $view = Filesystem::getView(); + } $shareFolder = \OC::$server->getConfig()->getSystemValue('share_folder', '/'); $shareFolder = Filesystem::normalizePath($shareFolder); - if (!Filesystem::file_exists($shareFolder)) { + if (!$view->file_exists($shareFolder)) { $dir = ''; $subdirs = explode('/', $shareFolder); foreach ($subdirs as $subdir) { $dir = $dir . '/' . $subdir; - if (!Filesystem::is_dir($dir)) { - Filesystem::mkdir($dir); + if (!$view->is_dir($dir)) { + $view->mkdir($dir); } } } diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index 83527053f4..2b066bd2d9 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -81,7 +81,7 @@ class SharedMount extends MountPoint implements MoveableMount { $parent = dirname($share->getTarget()); if (!$this->recipientView->is_dir($parent)) { - $parent = Helper::getShareFolder(); + $parent = Helper::getShareFolder($this->recipientView); } $newMountPoint = $this->generateUniqueTarget( From 5a8cfab68f147aa094a0e96ac03c6b41937c40e0 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 11:18:27 +0200 Subject: [PATCH 40/52] throw PasswordLoginForbidden on DAV --- apps/dav/lib/Connector/Sabre/Auth.php | 4 +- .../Exception/PasswordLoginForbidden.php | 54 +++++++++++++++++++ .../tests/unit/Connector/Sabre/AuthTest.php | 5 +- 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php index a37ef787ba..82c2711b56 100644 --- a/apps/dav/lib/Connector/Sabre/Auth.php +++ b/apps/dav/lib/Connector/Sabre/Auth.php @@ -34,6 +34,7 @@ use OC\AppFramework\Http\Request; use OC\Authentication\Exceptions\PasswordLoginForbiddenException; use OC\Authentication\TwoFactorAuth\Manager; use OC\User\Session; +use OCA\DAV\Connector\Sabre\Exception\PasswordLoginForbidden; use OCP\IRequest; use OCP\ISession; use Sabre\DAV\Auth\Backend\AbstractBasic; @@ -127,9 +128,8 @@ class Auth extends AbstractBasic { return false; } } catch (PasswordLoginForbiddenException $ex) { - // TODO: throw sabre exception $this->session->close(); - return false; + throw new PasswordLoginForbidden(); } } } diff --git a/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php b/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php new file mode 100644 index 0000000000..78b27d0544 --- /dev/null +++ b/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php @@ -0,0 +1,54 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\DAV\Connector\Sabre\Exception; + +use DOMElement; +use Sabre\DAV\Exception; +use Sabre\DAV\Server; + +class PasswordLoginForbidden extends Exception { + + const NS_OWNCLOUD = 'http://owncloud.org/ns'; + + public function getHTTPCode() { + return 401; + } + + /** + * This method allows the exception to include additional information + * into the WebDAV error response + * + * @param Server $server + * @param DOMElement $errorNode + * @return void + */ + public function serialize(Server $server, DOMElement $errorNode) { + + // set ownCloud namespace + $errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD); + + $error = $errorNode->ownerDocument->createElementNS('o:', 'o:hint', 'password login forbidden'); + $errorNode->appendChild($error); + } + +} diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php index 60dbe6e722..9564298f23 100644 --- a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php @@ -208,6 +208,9 @@ class AuthTest extends TestCase { $this->assertFalse($this->invokePrivate($this->auth, 'validateUserPass', ['MyTestUser', 'MyTestPassword'])); } + /** + * @expectedException \OCA\DAV\Connector\Sabre\Exception\PasswordLoginForbidden + */ public function testValidateUserPassWithPasswordLoginForbidden() { $this->userSession ->expects($this->once()) @@ -222,7 +225,7 @@ class AuthTest extends TestCase { ->expects($this->once()) ->method('close'); - $this->assertFalse($this->invokePrivate($this->auth, 'validateUserPass', ['MyTestUser', 'MyTestPassword'])); + $this->invokePrivate($this->auth, 'validateUserPass', ['MyTestUser', 'MyTestPassword']); } public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGet() { From 66560b8ed92a543b9b2f45807624d9c473f2145c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 17 Jun 2016 12:58:55 +0200 Subject: [PATCH 41/52] Capped cache for user config --- lib/private/AllConfig.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php index e082cea330..c8b2009fcc 100644 --- a/lib/private/AllConfig.php +++ b/lib/private/AllConfig.php @@ -27,6 +27,7 @@ */ namespace OC; +use OC\Cache\CappedMemoryCache; use OCP\IDBConnection; use OCP\PreConditionNotMetException; @@ -58,14 +59,15 @@ class AllConfig implements \OCP\IConfig { * - deleteAllUserValues * - deleteAppFromAllUsers * - * @var array $userCache + * @var CappedMemoryCache $userCache */ - private $userCache = array(); + private $userCache; /** * @param SystemConfig $systemConfig */ function __construct(SystemConfig $systemConfig) { + $this->userCache = new CappedMemoryCache(); $this->systemConfig = $systemConfig; } From 491e2654ebed82044f84d3adcc5f845dc471ae06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Bertol=C3=ADn?= Date: Fri, 17 Jun 2016 14:10:43 +0200 Subject: [PATCH 42/52] Added test with new endpoint (#23934) * Added test with new endpoint * Moved all scenarios using new dav endpoint to a new feature file * Removed extra slash in welcome.txt * some fixes * Incorrect user while downloading with range * Fixed Content-disposition --- build/integration/features/dav-v2.feature | 55 +++++++++++++++++++ .../features/webdav-related.feature | 37 ------------- 2 files changed, 55 insertions(+), 37 deletions(-) create mode 100644 build/integration/features/dav-v2.feature diff --git a/build/integration/features/dav-v2.feature b/build/integration/features/dav-v2.feature new file mode 100644 index 0000000000..2b3aeff945 --- /dev/null +++ b/build/integration/features/dav-v2.feature @@ -0,0 +1,55 @@ +Feature: dav-v2 + Background: + Given using api version "1" + + Scenario: moving a file new endpoint way + Given using dav path "remote.php/dav" + And As an "admin" + And user "user0" exists + When User "user0" moves file "/files/user0/textfile0.txt" to "/files/user0/FOLDER/textfile0.txt" + Then the HTTP status code should be "201" + + Scenario: download a file with range using new endpoint + Given using dav path "remote.php/dav" + And As an "admin" + And user "user0" exists + And As an "user0" + When Downloading file "/files/user0/welcome.txt" with range "bytes=51-77" + Then Downloaded content should be "example file for developers" + + Scenario: Downloading a file on the new endpoint should serve security headers + Given using dav path "remote.php/dav/files/admin/" + And As an "admin" + When Downloading file "welcome.txt" + Then The following headers should be set + |Content-Disposition|attachment; filename*=UTF-8''welcome.txt; filename="welcome.txt"| + |Content-Security-Policy|default-src 'none';| + |X-Content-Type-Options |nosniff| + |X-Download-Options|noopen| + |X-Frame-Options|Sameorigin| + |X-Permitted-Cross-Domain-Policies|none| + |X-Robots-Tag|none| + |X-XSS-Protection|1; mode=block| + And Downloaded content should start with "Welcome to your ownCloud account!" + + Scenario: Doing a GET with a web login should work without CSRF token on the new backend + Given Logging in using web as "admin" + When Sending a "GET" to "/remote.php/dav/files/admin/welcome.txt" without requesttoken + Then Downloaded content should start with "Welcome to your ownCloud account!" + Then the HTTP status code should be "200" + + Scenario: Doing a GET with a web login should work with CSRF token on the new backend + Given Logging in using web as "admin" + When Sending a "GET" to "/remote.php/dav/files/admin/welcome.txt" with requesttoken + Then Downloaded content should start with "Welcome to your ownCloud account!" + Then the HTTP status code should be "200" + + Scenario: Doing a PROPFIND with a web login should not work without CSRF token on the new backend + Given Logging in using web as "admin" + When Sending a "PROPFIND" to "/remote.php/dav/files/admin/welcome.txt" without requesttoken + Then the HTTP status code should be "401" + + Scenario: Doing a PROPFIND with a web login should work with CSRF token on the new backend + Given Logging in using web as "admin" + When Sending a "PROPFIND" to "/remote.php/dav/files/admin/welcome.txt" with requesttoken + Then the HTTP status code should be "207" diff --git a/build/integration/features/webdav-related.feature b/build/integration/features/webdav-related.feature index 14ff505463..06df280ea6 100644 --- a/build/integration/features/webdav-related.feature +++ b/build/integration/features/webdav-related.feature @@ -92,43 +92,6 @@ Feature: webdav-related |X-XSS-Protection|1; mode=block| And Downloaded content should start with "Welcome to your ownCloud account!" - Scenario: Downloading a file on the new endpoint should serve security headers - Given using dav path "remote.php/dav/files/admin/" - And As an "admin" - When Downloading file "/welcome.txt" - Then The following headers should be set - |Content-Disposition|attachment; filename*=UTF-8''welcome.txt; filename="welcome.txt"| - |Content-Security-Policy|default-src 'none';| - |X-Content-Type-Options |nosniff| - |X-Download-Options|noopen| - |X-Frame-Options|Sameorigin| - |X-Permitted-Cross-Domain-Policies|none| - |X-Robots-Tag|none| - |X-XSS-Protection|1; mode=block| - And Downloaded content should start with "Welcome to your ownCloud account!" - - Scenario: Doing a GET with a web login should work without CSRF token on the new backend - Given Logging in using web as "admin" - When Sending a "GET" to "/remote.php/dav/files/admin/welcome.txt" without requesttoken - Then Downloaded content should start with "Welcome to your ownCloud account!" - Then the HTTP status code should be "200" - - Scenario: Doing a GET with a web login should work with CSRF token on the new backend - Given Logging in using web as "admin" - When Sending a "GET" to "/remote.php/dav/files/admin/welcome.txt" with requesttoken - Then Downloaded content should start with "Welcome to your ownCloud account!" - Then the HTTP status code should be "200" - - Scenario: Doing a PROPFIND with a web login should not work without CSRF token on the new backend - Given Logging in using web as "admin" - When Sending a "PROPFIND" to "/remote.php/dav/files/admin/welcome.txt" without requesttoken - Then the HTTP status code should be "401" - - Scenario: Doing a PROPFIND with a web login should work with CSRF token on the new backend - Given Logging in using web as "admin" - When Sending a "PROPFIND" to "/remote.php/dav/files/admin/welcome.txt" with requesttoken - Then the HTTP status code should be "207" - Scenario: Doing a GET with a web login should work without CSRF token on the old backend Given Logging in using web as "admin" When Sending a "GET" to "/remote.php/webdav/welcome.txt" without requesttoken From 2340660a5b93402946a36645ca05836c06f5f816 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 17 Jun 2016 15:50:24 +0200 Subject: [PATCH 43/52] PasswordLoginForbidden must extend NotAuthenticated The auth code from Sabre will forward NotAuthenticated exceptions but in the case of a generic exception, it is packaged as "service not available". --- .../lib/Connector/Sabre/Exception/PasswordLoginForbidden.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php b/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php index 78b27d0544..6537da3d56 100644 --- a/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php +++ b/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php @@ -23,10 +23,10 @@ namespace OCA\DAV\Connector\Sabre\Exception; use DOMElement; -use Sabre\DAV\Exception; use Sabre\DAV\Server; +use Sabre\DAV\Exception\NotAuthenticated; -class PasswordLoginForbidden extends Exception { +class PasswordLoginForbidden extends NotAuthenticated { const NS_OWNCLOUD = 'http://owncloud.org/ns'; From b0f2878f6e06512f9e325374bd2cc9ca64143875 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 16:13:11 +0200 Subject: [PATCH 44/52] close cursor after loading a token --- lib/private/Authentication/Token/DefaultTokenMapper.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/private/Authentication/Token/DefaultTokenMapper.php b/lib/private/Authentication/Token/DefaultTokenMapper.php index c56a513b94..9450ed6b9f 100644 --- a/lib/private/Authentication/Token/DefaultTokenMapper.php +++ b/lib/private/Authentication/Token/DefaultTokenMapper.php @@ -77,6 +77,7 @@ class DefaultTokenMapper extends Mapper { ->execute(); $data = $result->fetch(); + $result->closeCursor(); if ($data === false) { throw new DoesNotExistException('token does not exist'); } From 111bd8e57d2ccb7e894e8c3d86daaed62b6fb618 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Wed, 15 Jun 2016 15:24:01 +0200 Subject: [PATCH 45/52] files_external: Keep checkbox and its label on one line #20032 #22655 Else the checkbox and the decription end up on different lines in my Chrome on OS X --- apps/files_external/js/settings.js | 4 ++-- apps/files_external/templates/settings.php | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 2477f513db..d210c158ec 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -854,7 +854,7 @@ MountConfigListView.prototype = _.extend({ this.configureAuthMechanism($tr, storageConfig.authMechanism, onCompletion); if (storageConfig.backendOptions) { - $td.children().each(function() { + $td.find('input, select').each(function() { var input = $(this); var val = storageConfig.backendOptions[input.data('parameter')]; if (val !== undefined) { @@ -1001,7 +1001,7 @@ MountConfigListView.prototype = _.extend({ newElement = $(''); } else if (placeholder.type === MountConfigListView.ParameterTypes.BOOLEAN) { var checkboxId = _.uniqueId('checkbox_'); - newElement = $(''); + newElement = $('
'); } else if (placeholder.type === MountConfigListView.ParameterTypes.HIDDEN) { newElement = $(''); } else { diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index c9cc40b0ba..6662f63703 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -51,13 +51,17 @@ break; case DefinitionParameter::VALUE_BOOLEAN: ?> +
+ +
From d65c56d7de0cd9f5916e8467fcda16cf9906b9bf Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sat, 18 Jun 2016 01:58:51 -0400 Subject: [PATCH 46/52] [tx-robot] updated from transifex --- apps/systemtags/l10n/ca.js | 21 +++++++++++++++++++++ apps/systemtags/l10n/ca.json | 21 +++++++++++++++++++++ apps/updatenotification/l10n/ca.js | 14 +++++++++++++- apps/updatenotification/l10n/ca.json | 14 +++++++++++++- 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/apps/systemtags/l10n/ca.js b/apps/systemtags/l10n/ca.js index 20ec2d4edb..46d9d40966 100644 --- a/apps/systemtags/l10n/ca.js +++ b/apps/systemtags/l10n/ca.js @@ -2,6 +2,27 @@ OC.L10N.register( "systemtags", { "Tags" : "Etiquetes", + "Tagged files" : "Fitxers marcats", + "Select tags to filter by" : "Selecciona les marques per filtrar-ne", + "Please select tags to filter by" : "Si us plau selecciona les marques per filtrar-ne", + "No files found for the selected tags" : "No s'han trobat fitxers per les marques sel·leccionades", + "System tags for a file have been modified" : "Les Marques de Sistema d'un fitxer s'han modificat", + "You assigned system tag %3$s" : "Has assignat la marca de sistema %3$s", + "%1$s assigned system tag %3$s" : "%1$s ha assignat la marca de sistema %3$s", + "You unassigned system tag %3$s" : "Has des-assignat la marca de sistema %3$s", + "%1$s unassigned system tag %3$s" : "%1$s ha des-assignat la marca de sistema %3$s", + "You created system tag %2$s" : "Has creat la marca de sistema %2$s", + "%1$s created system tag %2$s" : "%1$s ha creat la marca de sistema %2$s", + "You deleted system tag %2$s" : "Has esborrat la marca de sistema %2$s", + "%1$s deleted system tag %2$s" : "%1$s ha esborrat la marca de sistema %2$s", + "You updated system tag %3$s to %2$s" : "Has actualitzat les marques de sistema de la %3$s a la %2$s", + "%1$s updated system tag %3$s to %2$s" : "%1$s ha actualitzat les marques de sistema de la %3$s a la %2$s", + "You assigned system tag %3$s to %2$s" : "Has assignat les marques de sistema de la %3$s a la %2$s", + "%1$s assigned system tag %3$s to %2$s" : "%1$s ha assignat les marques de sistema de la %3$s a la %2$s", + "You unassigned system tag %3$s from %2$s" : "Has des-assignat les marques de sistema de la %3$s a la %2$s", + "%1$s unassigned system tag %3$s from %2$s" : "%1$s ha des-assignat les marques de sistema de la %3$s a la %2$s", + "%s (restricted)" : "%s (restringit)", + "%s (invisible)" : "%s (invisible)", "No files in here" : "No hi ha arxius", "No entries found in this folder" : "No hi ha entrades en aquesta carpeta", "Name" : "Nom", diff --git a/apps/systemtags/l10n/ca.json b/apps/systemtags/l10n/ca.json index 87c8c67876..9bb1d6fba8 100644 --- a/apps/systemtags/l10n/ca.json +++ b/apps/systemtags/l10n/ca.json @@ -1,5 +1,26 @@ { "translations": { "Tags" : "Etiquetes", + "Tagged files" : "Fitxers marcats", + "Select tags to filter by" : "Selecciona les marques per filtrar-ne", + "Please select tags to filter by" : "Si us plau selecciona les marques per filtrar-ne", + "No files found for the selected tags" : "No s'han trobat fitxers per les marques sel·leccionades", + "System tags for a file have been modified" : "Les Marques de Sistema d'un fitxer s'han modificat", + "You assigned system tag %3$s" : "Has assignat la marca de sistema %3$s", + "%1$s assigned system tag %3$s" : "%1$s ha assignat la marca de sistema %3$s", + "You unassigned system tag %3$s" : "Has des-assignat la marca de sistema %3$s", + "%1$s unassigned system tag %3$s" : "%1$s ha des-assignat la marca de sistema %3$s", + "You created system tag %2$s" : "Has creat la marca de sistema %2$s", + "%1$s created system tag %2$s" : "%1$s ha creat la marca de sistema %2$s", + "You deleted system tag %2$s" : "Has esborrat la marca de sistema %2$s", + "%1$s deleted system tag %2$s" : "%1$s ha esborrat la marca de sistema %2$s", + "You updated system tag %3$s to %2$s" : "Has actualitzat les marques de sistema de la %3$s a la %2$s", + "%1$s updated system tag %3$s to %2$s" : "%1$s ha actualitzat les marques de sistema de la %3$s a la %2$s", + "You assigned system tag %3$s to %2$s" : "Has assignat les marques de sistema de la %3$s a la %2$s", + "%1$s assigned system tag %3$s to %2$s" : "%1$s ha assignat les marques de sistema de la %3$s a la %2$s", + "You unassigned system tag %3$s from %2$s" : "Has des-assignat les marques de sistema de la %3$s a la %2$s", + "%1$s unassigned system tag %3$s from %2$s" : "%1$s ha des-assignat les marques de sistema de la %3$s a la %2$s", + "%s (restricted)" : "%s (restringit)", + "%s (invisible)" : "%s (invisible)", "No files in here" : "No hi ha arxius", "No entries found in this folder" : "No hi ha entrades en aquesta carpeta", "Name" : "Nom", diff --git a/apps/updatenotification/l10n/ca.js b/apps/updatenotification/l10n/ca.js index 5f6db3199a..10e7328cb0 100644 --- a/apps/updatenotification/l10n/ca.js +++ b/apps/updatenotification/l10n/ca.js @@ -1,7 +1,19 @@ OC.L10N.register( "updatenotification", { + "Update notifications" : "Notificacions d'actualització", "{version} is available. Get more information on how to update." : "Hi ha disponible la versió {version}. Obtingueu més informació sobre com actualitzar.", - "Updater" : "Actualitzador" + "Updated channel" : "Canal actualitzat", + "ownCloud core" : "Nucli d'ownCloud", + "Update for %1$s to version %2$s is available." : "L'actualització per %1$s a la versió %2$s està disponible.", + "Updater" : "Actualitzador", + "A new version is available: %s" : "Una nova versió està disponible: %s", + "Open updater" : "Obrir actualitzador", + "Your version is up to date." : "La teva versió està actualitzada.", + "Checked on %s" : "Comprovat en %s", + "Update channel:" : "Actualitzar canal:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sempre podràs actualitzar a una versió més recent / canal experimental. Però mai es pot fer un \"downgrade\" a un canal més estable.", + "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:", + "Only notification for app updates are available, because the selected update channel for ownCloud itself does not allow notifications." : "Només notificació d'actualitzacions d'aplicacions estan disponibles, degut a que el canal d'actualització per ownCloud seleccionat no permet les notificacions." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/ca.json b/apps/updatenotification/l10n/ca.json index 74b1a731e9..673db0accd 100644 --- a/apps/updatenotification/l10n/ca.json +++ b/apps/updatenotification/l10n/ca.json @@ -1,5 +1,17 @@ { "translations": { + "Update notifications" : "Notificacions d'actualització", "{version} is available. Get more information on how to update." : "Hi ha disponible la versió {version}. Obtingueu més informació sobre com actualitzar.", - "Updater" : "Actualitzador" + "Updated channel" : "Canal actualitzat", + "ownCloud core" : "Nucli d'ownCloud", + "Update for %1$s to version %2$s is available." : "L'actualització per %1$s a la versió %2$s està disponible.", + "Updater" : "Actualitzador", + "A new version is available: %s" : "Una nova versió està disponible: %s", + "Open updater" : "Obrir actualitzador", + "Your version is up to date." : "La teva versió està actualitzada.", + "Checked on %s" : "Comprovat en %s", + "Update channel:" : "Actualitzar canal:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sempre podràs actualitzar a una versió més recent / canal experimental. Però mai es pot fer un \"downgrade\" a un canal més estable.", + "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:", + "Only notification for app updates are available, because the selected update channel for ownCloud itself does not allow notifications." : "Només notificació d'actualitzacions d'aplicacions estan disponibles, degut a que el canal d'actualització per ownCloud seleccionat no permet les notificacions." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file From bd13353c4d246398d4ed31c6696338f8032221ae Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Mon, 20 Jun 2016 01:54:50 -0400 Subject: [PATCH 47/52] [tx-robot] updated from transifex --- apps/comments/l10n/pl.js | 3 +++ apps/comments/l10n/pl.json | 3 +++ apps/federatedfilesharing/l10n/pl.js | 1 + apps/federatedfilesharing/l10n/pl.json | 1 + apps/files/l10n/pl.js | 20 ++++++++++++++++++++ apps/files/l10n/pl.json | 20 ++++++++++++++++++++ apps/updatenotification/l10n/pl.js | 4 +++- apps/updatenotification/l10n/pl.json | 4 +++- apps/updatenotification/l10n/sl.js | 1 + apps/updatenotification/l10n/sl.json | 1 + core/l10n/pl.js | 18 ++++++++++++++++++ core/l10n/pl.json | 18 ++++++++++++++++++ lib/l10n/sl.js | 2 +- lib/l10n/sl.json | 2 +- settings/l10n/pl.js | 18 ++++++++++++++++++ settings/l10n/pl.json | 18 ++++++++++++++++++ 16 files changed, 130 insertions(+), 4 deletions(-) diff --git a/apps/comments/l10n/pl.js b/apps/comments/l10n/pl.js index d5e3f4b332..d4a492e1da 100644 --- a/apps/comments/l10n/pl.js +++ b/apps/comments/l10n/pl.js @@ -14,7 +14,10 @@ OC.L10N.register( "Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}", "{count} unread comments" : "{count} nieprzeczytanych komentarzy", "Comment" : "Komentarz", + "Comments for files (always listed in stream)" : "Komentarze dla plików (zawsze wypisane w strumieniu)", + "You commented" : "Skomentowałeś/łaś", "%1$s commented" : "%1$s skomentował", + "You commented on %2$s" : "Skomentowałeś/łaś %2$s", "%1$s commented on %2$s" : "%1$s skomentował %2$s" }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/comments/l10n/pl.json b/apps/comments/l10n/pl.json index 28bbf20817..78e9f0ff21 100644 --- a/apps/comments/l10n/pl.json +++ b/apps/comments/l10n/pl.json @@ -12,7 +12,10 @@ "Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}", "{count} unread comments" : "{count} nieprzeczytanych komentarzy", "Comment" : "Komentarz", + "Comments for files (always listed in stream)" : "Komentarze dla plików (zawsze wypisane w strumieniu)", + "You commented" : "Skomentowałeś/łaś", "%1$s commented" : "%1$s skomentował", + "You commented on %2$s" : "Skomentowałeś/łaś %2$s", "%1$s commented on %2$s" : "%1$s skomentował %2$s" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/pl.js b/apps/federatedfilesharing/l10n/pl.js index 1d8b949c74..4f65f44553 100644 --- a/apps/federatedfilesharing/l10n/pl.js +++ b/apps/federatedfilesharing/l10n/pl.js @@ -1,6 +1,7 @@ OC.L10N.register( "federatedfilesharing", { + "Federated sharing" : "Sfederowane udostępnianie", "Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s", "File is already shared with %s" : "Plik jest już współdzielony z %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny.", diff --git a/apps/federatedfilesharing/l10n/pl.json b/apps/federatedfilesharing/l10n/pl.json index c44eecbeeb..7b43ed3fce 100644 --- a/apps/federatedfilesharing/l10n/pl.json +++ b/apps/federatedfilesharing/l10n/pl.json @@ -1,4 +1,5 @@ { "translations": { + "Federated sharing" : "Sfederowane udostępnianie", "Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s", "File is already shared with %s" : "Plik jest już współdzielony z %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny.", diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index a366c6a967..c5273a36eb 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "Zła ścieżka.", "Files" : "Pliki", "All files" : "Wszystkie pliki", + "File could not be found" : "Nie można odnaleźć pliku", "Home" : "Dom", "Close" : "Zamknij", "Favorites" : "Ulubione", @@ -32,8 +33,15 @@ OC.L10N.register( "Could not get result from server." : "Nie można uzyskać wyniku z serwera.", "Uploading..." : "Wgrywanie....", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "Pozostało {hours}:{minutes}:{seconds} hour{plural_s} ", + "{hours}:{minutes}h" : "{hours}:{minutes}godz.", + "{minutes}:{seconds} minute{plural_s} left" : "Pozostało {minutes}:{seconds} minute{plural_s}", + "{minutes}:{seconds}m" : "{minutes}:{seconds}min.", "{seconds} second{plural_s} left" : "Pozostało sekund: {seconds}", "{seconds}s" : "{seconds} s", + "Any moment now..." : "Jeszcze chwilę...", + "Soon..." : "Wkrótce...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.", "Actions" : "Akcje", "Download" : "Pobierz", @@ -49,6 +57,10 @@ OC.L10N.register( "This directory is unavailable, please check the logs or contact the administrator" : "Ten folder jest niedostępny, proszę sprawdzić logi lub skontaktować się z administratorem.", "Could not move \"{file}\", target exists" : "Nie można było przenieść „{file}” – plik o takiej nazwie już istnieje", "Could not move \"{file}\"" : "Nie można było przenieść \"{file}\"", + "{newName} already exists" : "{newName} już istnieje", + "Could not rename \"{fileName}\", it does not exist any more" : "Nie można zmienić nazwy \"{fileName}\", plik nie istnieje", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nazwa \"{targetName}\" jest juz używana w folderze \"{dir}\". Proszę wybrać inną nazwę.", + "Could not rename \"{fileName}\"" : "Nie można zmienić nazwy \"{fileName}\"", "Could not create file \"{file}\"" : "Nie można było utworzyć pliku \"{file}\"", "Could not create file \"{file}\" because it already exists" : "Nie można było utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.", "Could not create folder \"{dir}\"" : "Nie można utworzyć folderu „{dir}”", @@ -71,8 +83,10 @@ OC.L10N.register( "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Miejsce dla {owner} jest na wyczerpaniu ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Twój magazyn jest prawie pełny ({usedSpacePercent}%)", "Path" : "Ścieżka", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów"], "Favorited" : "Ulubione", "Favorite" : "Ulubione", + "Local link" : "Lokalny odnośnik", "Folder" : "Folder", "New folder" : "Nowy folder", "{newname} already exists" : "{newname} już istnieje", @@ -80,6 +94,7 @@ OC.L10N.register( "An error occurred while trying to update the tags" : "Wystąpił błąd podczas aktualizacji tagów", "A new file or folder has been created" : "Nowy plik lub folder został utworzony", "A file or folder has been changed" : "Plik lub folder został zmieniony", + "Limit notifications about creation and changes to your favorite files (Stream only)" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich ulubionych plkow (Tylko w strumieniu aktywności)", "A file or folder has been deleted" : "Plik lub folder został usunięty", "A file or folder has been restored" : "Plik lub folder został przywrócy", "You created %1$s" : "Utworzyłeś %1$s", @@ -99,15 +114,20 @@ OC.L10N.register( "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", "max. possible: " : "maks. możliwy:", "Save" : "Zapisz", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Z PHP-FPM zastosowanie zmian może zająć 5 minut.", + "Missing permissions to edit from here." : "Brakuje uprawnień do edycji.", "Settings" : "Ustawienia", "Show hidden files" : "Pokaż ukryte pliki", "WebDAV" : "WebDAV", + "Use this address to access your Files via WebDAV" : "Użyj tego adresu aby uzyskać dostęp do swoich plików poprzez WebDAV", "No files in here" : "Brak plików", + "Upload some content or sync with your devices!" : "Wgraj coś, albo wykonaj synchronizację ze swoimi urządzeniami.", "No entries found in this folder" : "Brak wpisów w tym folderze", "Select all" : "Wybierz wszystko", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", "No favorites" : "Brak ulubionych", + "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj", "Text file" : "Plik tekstowy", "New text file.txt" : "Nowy plik tekstowy.txt" }, diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index 05b65b2f84..c0be569faf 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -19,6 +19,7 @@ "Invalid directory." : "Zła ścieżka.", "Files" : "Pliki", "All files" : "Wszystkie pliki", + "File could not be found" : "Nie można odnaleźć pliku", "Home" : "Dom", "Close" : "Zamknij", "Favorites" : "Ulubione", @@ -30,8 +31,15 @@ "Could not get result from server." : "Nie można uzyskać wyniku z serwera.", "Uploading..." : "Wgrywanie....", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "Pozostało {hours}:{minutes}:{seconds} hour{plural_s} ", + "{hours}:{minutes}h" : "{hours}:{minutes}godz.", + "{minutes}:{seconds} minute{plural_s} left" : "Pozostało {minutes}:{seconds} minute{plural_s}", + "{minutes}:{seconds}m" : "{minutes}:{seconds}min.", "{seconds} second{plural_s} left" : "Pozostało sekund: {seconds}", "{seconds}s" : "{seconds} s", + "Any moment now..." : "Jeszcze chwilę...", + "Soon..." : "Wkrótce...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.", "Actions" : "Akcje", "Download" : "Pobierz", @@ -47,6 +55,10 @@ "This directory is unavailable, please check the logs or contact the administrator" : "Ten folder jest niedostępny, proszę sprawdzić logi lub skontaktować się z administratorem.", "Could not move \"{file}\", target exists" : "Nie można było przenieść „{file}” – plik o takiej nazwie już istnieje", "Could not move \"{file}\"" : "Nie można było przenieść \"{file}\"", + "{newName} already exists" : "{newName} już istnieje", + "Could not rename \"{fileName}\", it does not exist any more" : "Nie można zmienić nazwy \"{fileName}\", plik nie istnieje", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nazwa \"{targetName}\" jest juz używana w folderze \"{dir}\". Proszę wybrać inną nazwę.", + "Could not rename \"{fileName}\"" : "Nie można zmienić nazwy \"{fileName}\"", "Could not create file \"{file}\"" : "Nie można było utworzyć pliku \"{file}\"", "Could not create file \"{file}\" because it already exists" : "Nie można było utworzyć pliku \"{file}\", ponieważ ten plik już istnieje.", "Could not create folder \"{dir}\"" : "Nie można utworzyć folderu „{dir}”", @@ -69,8 +81,10 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Miejsce dla {owner} jest na wyczerpaniu ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Twój magazyn jest prawie pełny ({usedSpacePercent}%)", "Path" : "Ścieżka", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów"], "Favorited" : "Ulubione", "Favorite" : "Ulubione", + "Local link" : "Lokalny odnośnik", "Folder" : "Folder", "New folder" : "Nowy folder", "{newname} already exists" : "{newname} już istnieje", @@ -78,6 +92,7 @@ "An error occurred while trying to update the tags" : "Wystąpił błąd podczas aktualizacji tagów", "A new file or folder has been created" : "Nowy plik lub folder został utworzony", "A file or folder has been changed" : "Plik lub folder został zmieniony", + "Limit notifications about creation and changes to your favorite files (Stream only)" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich ulubionych plkow (Tylko w strumieniu aktywności)", "A file or folder has been deleted" : "Plik lub folder został usunięty", "A file or folder has been restored" : "Plik lub folder został przywrócy", "You created %1$s" : "Utworzyłeś %1$s", @@ -97,15 +112,20 @@ "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", "max. possible: " : "maks. możliwy:", "Save" : "Zapisz", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Z PHP-FPM zastosowanie zmian może zająć 5 minut.", + "Missing permissions to edit from here." : "Brakuje uprawnień do edycji.", "Settings" : "Ustawienia", "Show hidden files" : "Pokaż ukryte pliki", "WebDAV" : "WebDAV", + "Use this address to access your Files via WebDAV" : "Użyj tego adresu aby uzyskać dostęp do swoich plików poprzez WebDAV", "No files in here" : "Brak plików", + "Upload some content or sync with your devices!" : "Wgraj coś, albo wykonaj synchronizację ze swoimi urządzeniami.", "No entries found in this folder" : "Brak wpisów w tym folderze", "Select all" : "Wybierz wszystko", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", "No favorites" : "Brak ulubionych", + "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj", "Text file" : "Plik tekstowy", "New text file.txt" : "Nowy plik tekstowy.txt" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" diff --git a/apps/updatenotification/l10n/pl.js b/apps/updatenotification/l10n/pl.js index d86fdf3c24..ffeb1b0601 100644 --- a/apps/updatenotification/l10n/pl.js +++ b/apps/updatenotification/l10n/pl.js @@ -12,6 +12,8 @@ OC.L10N.register( "Your version is up to date." : "Posiadasz aktualną wersję.", "Checked on %s" : "Sprawdzone na %s", "Update channel:" : "Kanał aktualizacji:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Możesz zawsze zaktualizować swoją wersję do nowego / ekperymentalnego kanału. Jednakże nie możesz powrócić do poprzedniej stabilniejszej wersji. " + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Możesz zawsze zaktualizować swoją wersję do nowego / ekperymentalnego kanału. Jednakże nie możesz powrócić do poprzedniej stabilniejszej wersji. ", + "Notify members of the following groups about available updates:" : "Powiadom członków następujących grup o dostępnych aktualizacjach: ", + "Only notification for app updates are available, because the selected update channel for ownCloud itself does not allow notifications." : "Tylko powiadomienia o aktualizacjach aplikacji są dostępne, gdyż wybrany kanał aktualizacji ownCloud nie zezwala na powiadomienia. " }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/updatenotification/l10n/pl.json b/apps/updatenotification/l10n/pl.json index b5d7132d9f..6f03b0105b 100644 --- a/apps/updatenotification/l10n/pl.json +++ b/apps/updatenotification/l10n/pl.json @@ -10,6 +10,8 @@ "Your version is up to date." : "Posiadasz aktualną wersję.", "Checked on %s" : "Sprawdzone na %s", "Update channel:" : "Kanał aktualizacji:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Możesz zawsze zaktualizować swoją wersję do nowego / ekperymentalnego kanału. Jednakże nie możesz powrócić do poprzedniej stabilniejszej wersji. " + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Możesz zawsze zaktualizować swoją wersję do nowego / ekperymentalnego kanału. Jednakże nie możesz powrócić do poprzedniej stabilniejszej wersji. ", + "Notify members of the following groups about available updates:" : "Powiadom członków następujących grup o dostępnych aktualizacjach: ", + "Only notification for app updates are available, because the selected update channel for ownCloud itself does not allow notifications." : "Tylko powiadomienia o aktualizacjach aplikacji są dostępne, gdyż wybrany kanał aktualizacji ownCloud nie zezwala na powiadomienia. " },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/updatenotification/l10n/sl.js b/apps/updatenotification/l10n/sl.js index 12ba787e5e..a59a58731f 100644 --- a/apps/updatenotification/l10n/sl.js +++ b/apps/updatenotification/l10n/sl.js @@ -4,6 +4,7 @@ OC.L10N.register( "Update notifications" : "Posodobi obvestila", "{version} is available. Get more information on how to update." : "Na voljo je nova različica {version}. Na voljo je več podrobnosti o nadgradnji.", "Updated channel" : "Posodobljen kanal", + "ownCloud core" : "Jedro ownCloud", "Update for %1$s to version %2$s is available." : "Posodobitev %1$s na različico %2$s je na voljo.", "Updater" : "Posodabljalnik", "A new version is available: %s" : "Na voljo je nova različica: %s", diff --git a/apps/updatenotification/l10n/sl.json b/apps/updatenotification/l10n/sl.json index ecc0e3519d..c96c9666fb 100644 --- a/apps/updatenotification/l10n/sl.json +++ b/apps/updatenotification/l10n/sl.json @@ -2,6 +2,7 @@ "Update notifications" : "Posodobi obvestila", "{version} is available. Get more information on how to update." : "Na voljo je nova različica {version}. Na voljo je več podrobnosti o nadgradnji.", "Updated channel" : "Posodobljen kanal", + "ownCloud core" : "Jedro ownCloud", "Update for %1$s to version %2$s is available." : "Posodobitev %1$s na različico %2$s je na voljo.", "Updater" : "Posodabljalnik", "A new version is available: %s" : "Na voljo je nova različica: %s", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index 0a83da4f4c..3b284163b4 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -13,6 +13,7 @@ OC.L10N.register( "No valid crop data provided" : "Brak danych do przycięcia", "Crop is not square" : "Przycięcie nie jest prostokątem", "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", + "Couldn't reset password because the token is expired" : "Nie można zresetować hasła, ponieważ token wygasł", "Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.", "%s password reset" : "%s reset hasła", "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", @@ -25,8 +26,11 @@ OC.L10N.register( "Error unfavoriting" : "Błąd przy usuwaniu z ulubionych", "Couldn't send mail to following users: %s " : "Nie można było wysłać wiadomości do następujących użytkowników: %s", "Preparing update" : "Przygotowuję aktualizację", + "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Ostrzeżenie naprawiania:", "Repair error: " : "Błąd naprawiania:", + "Please use the command line updater because automatic updating is disabled in the config.php." : "Użyj aktualizatora z linii poleceń, ponieważ automatyczna aktualizacja jest zablokowana w config.php.", + "[%d / %d]: Checking table %s" : "[%d / %d]: Sprawdzanie tabeli %s", "Turned on maintenance mode" : "Włączony tryb konserwacji", "Turned off maintenance mode" : "Wyłączony tryb konserwacji", "Maintenance mode is kept active" : "Tryb konserwacji pozostaje aktywny", @@ -91,6 +95,7 @@ OC.L10N.register( "Oct." : "Paź.", "Nov." : "Lis.", "Dec." : "Gru.", + "There were problems with the code integrity check. More information…" : "Sprawdzenie spójności kodu nie wykazało problemów. Więcej informacji…", "Settings" : "Ustawienia", "Problem loading page, reloading in 5 seconds" : "Błąd podczas ładowania strony, odświeżanie w ciągu 5 sekund.", "Saving..." : "Zapisywanie...", @@ -123,6 +128,8 @@ OC.L10N.register( "So-so password" : "Mało skomplikowane hasło", "Good password" : "Dobre hasło", "Strong password" : "Mocne hasło", + "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Serwer WWW nie jest jeszcze na tyle poprawnie skonfigurowany, aby umożliwić synchronizację plików, ponieważ interfejs WebDAV wydaje się być uszkodzony.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej dokumentacji.", "Error occurred while checking server setup" : "Pojawił się błąd podczas sprawdzania ustawień serwera", "Shared" : "Udostępniono", "Shared with {recipients}" : "Współdzielony z {recipients}", @@ -158,6 +165,8 @@ OC.L10N.register( "change" : "zmiany", "delete" : "usuń", "access control" : "kontrola dostępu", + "Could not unshare" : "Nie udało się usunąć udostępnienia", + "No users or groups found for {search}" : "Nie znaleziono użytkowników lub grup dla {search}", "No users found for {search}" : "Nie znaleziono użytkowników dla {search}", "An error occurred. Please try again" : "Wystąpił błąd. Proszę spróbować ponownie.", "Share" : "Udostępnij", @@ -165,9 +174,12 @@ OC.L10N.register( "Share with users…" : "Współdziel z użytkownikami...", "Share with users, groups or remote users…" : "Współdziel z użytkownikami, grupami lub zdalnym użytkownikiem...", "Share with users or groups…" : "Współdziel z użytkownikami lub grupami...", + "Share with users or remote users…" : "Współdziel z użytkownikami lub zdalnymi użytkownikami...", "Error removing share" : "Błąd podczas usuwania współdzielenia", "Warning" : "Ostrzeżenie", "Error while sending notification" : "Błąd podczas wysyłania powiadomienia", + "Non-existing tag #{tag}" : "Znacznik #{tag} nie istnieje", + "restricted" : "ograniczone", "invisible" : "niewidoczny", "Delete" : "Usuń", "Rename" : "Zmień nazwę", @@ -259,6 +271,11 @@ OC.L10N.register( "This means only administrators can use the instance." : "To oznacza, że tylko administratorzy mogą w tej chwili używać aplikacji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Skontaktuj się z administratorem, jeśli ten komunikat pojawił się nieoczekiwanie lub wyświetla się ciągle.", "Thank you for your patience." : "Dziękuję za cierpliwość.", + "Two-step verification" : "Weryfikacja dwuskładnikowa", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Dla Twojego konta uruchomiono wzmocnioną ochronę. Uwierzytelnij przy pomocy drugiego składnika.", + "Cancel login" : "Anuluj logowanie", + "Please authenticate using the selected factor." : "Uwierzytelnij przy pomocy wybranego składnika", + "An error occured while verifying the token" : "Wystąpił błąd podczas weryfikacji tokena", "You are accessing the server from an untrusted domain." : "Dostajesz się do serwera z niezaufanej domeny.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "W zależności od konfiguracji, jako administrator możesz także użyć poniższego przycisku aby zaufać tej domenie.", "Add \"%s\" as trusted domain" : "Dodaj \"%s\" jako domenę zaufaną", @@ -272,6 +289,7 @@ OC.L10N.register( "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Aby uniknąć timeout-ów przy większych instalacjach, możesz zamiast tego uruchomić następującą komendę w katalogu Twojej instalacji:", "Detailed logs" : "Szczegółowe logi", "Update needed" : "Wymagana aktualizacja", + "For help, see the documentation." : "Aby uzyskać pomoc, zajrzyj do dokumentacji.", "This page will refresh itself when the %s instance is available again." : "Strona odświeży się gdy instancja %s będzie ponownie dostępna." }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/core/l10n/pl.json b/core/l10n/pl.json index d839ef9184..6833611713 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -11,6 +11,7 @@ "No valid crop data provided" : "Brak danych do przycięcia", "Crop is not square" : "Przycięcie nie jest prostokątem", "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", + "Couldn't reset password because the token is expired" : "Nie można zresetować hasła, ponieważ token wygasł", "Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.", "%s password reset" : "%s reset hasła", "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", @@ -23,8 +24,11 @@ "Error unfavoriting" : "Błąd przy usuwaniu z ulubionych", "Couldn't send mail to following users: %s " : "Nie można było wysłać wiadomości do następujących użytkowników: %s", "Preparing update" : "Przygotowuję aktualizację", + "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Ostrzeżenie naprawiania:", "Repair error: " : "Błąd naprawiania:", + "Please use the command line updater because automatic updating is disabled in the config.php." : "Użyj aktualizatora z linii poleceń, ponieważ automatyczna aktualizacja jest zablokowana w config.php.", + "[%d / %d]: Checking table %s" : "[%d / %d]: Sprawdzanie tabeli %s", "Turned on maintenance mode" : "Włączony tryb konserwacji", "Turned off maintenance mode" : "Wyłączony tryb konserwacji", "Maintenance mode is kept active" : "Tryb konserwacji pozostaje aktywny", @@ -89,6 +93,7 @@ "Oct." : "Paź.", "Nov." : "Lis.", "Dec." : "Gru.", + "There were problems with the code integrity check. More information…" : "Sprawdzenie spójności kodu nie wykazało problemów. Więcej informacji…", "Settings" : "Ustawienia", "Problem loading page, reloading in 5 seconds" : "Błąd podczas ładowania strony, odświeżanie w ciągu 5 sekund.", "Saving..." : "Zapisywanie...", @@ -121,6 +126,8 @@ "So-so password" : "Mało skomplikowane hasło", "Good password" : "Dobre hasło", "Strong password" : "Mocne hasło", + "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Serwer WWW nie jest jeszcze na tyle poprawnie skonfigurowany, aby umożliwić synchronizację plików, ponieważ interfejs WebDAV wydaje się być uszkodzony.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our documentation." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej dokumentacji.", "Error occurred while checking server setup" : "Pojawił się błąd podczas sprawdzania ustawień serwera", "Shared" : "Udostępniono", "Shared with {recipients}" : "Współdzielony z {recipients}", @@ -156,6 +163,8 @@ "change" : "zmiany", "delete" : "usuń", "access control" : "kontrola dostępu", + "Could not unshare" : "Nie udało się usunąć udostępnienia", + "No users or groups found for {search}" : "Nie znaleziono użytkowników lub grup dla {search}", "No users found for {search}" : "Nie znaleziono użytkowników dla {search}", "An error occurred. Please try again" : "Wystąpił błąd. Proszę spróbować ponownie.", "Share" : "Udostępnij", @@ -163,9 +172,12 @@ "Share with users…" : "Współdziel z użytkownikami...", "Share with users, groups or remote users…" : "Współdziel z użytkownikami, grupami lub zdalnym użytkownikiem...", "Share with users or groups…" : "Współdziel z użytkownikami lub grupami...", + "Share with users or remote users…" : "Współdziel z użytkownikami lub zdalnymi użytkownikami...", "Error removing share" : "Błąd podczas usuwania współdzielenia", "Warning" : "Ostrzeżenie", "Error while sending notification" : "Błąd podczas wysyłania powiadomienia", + "Non-existing tag #{tag}" : "Znacznik #{tag} nie istnieje", + "restricted" : "ograniczone", "invisible" : "niewidoczny", "Delete" : "Usuń", "Rename" : "Zmień nazwę", @@ -257,6 +269,11 @@ "This means only administrators can use the instance." : "To oznacza, że tylko administratorzy mogą w tej chwili używać aplikacji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Skontaktuj się z administratorem, jeśli ten komunikat pojawił się nieoczekiwanie lub wyświetla się ciągle.", "Thank you for your patience." : "Dziękuję za cierpliwość.", + "Two-step verification" : "Weryfikacja dwuskładnikowa", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Dla Twojego konta uruchomiono wzmocnioną ochronę. Uwierzytelnij przy pomocy drugiego składnika.", + "Cancel login" : "Anuluj logowanie", + "Please authenticate using the selected factor." : "Uwierzytelnij przy pomocy wybranego składnika", + "An error occured while verifying the token" : "Wystąpił błąd podczas weryfikacji tokena", "You are accessing the server from an untrusted domain." : "Dostajesz się do serwera z niezaufanej domeny.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "W zależności od konfiguracji, jako administrator możesz także użyć poniższego przycisku aby zaufać tej domenie.", "Add \"%s\" as trusted domain" : "Dodaj \"%s\" jako domenę zaufaną", @@ -270,6 +287,7 @@ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Aby uniknąć timeout-ów przy większych instalacjach, możesz zamiast tego uruchomić następującą komendę w katalogu Twojej instalacji:", "Detailed logs" : "Szczegółowe logi", "Update needed" : "Wymagana aktualizacja", + "For help, see the documentation." : "Aby uzyskać pomoc, zajrzyj do dokumentacji.", "This page will refresh itself when the %s instance is available again." : "Strona odświeży się gdy instancja %s będzie ponownie dostępna." },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js index e8e861af3c..5e0e1fbcdb 100644 --- a/lib/l10n/sl.js +++ b/lib/l10n/sl.js @@ -157,7 +157,7 @@ OC.L10N.register( "Please check that the data directory contains a file \".ocdata\" in its root." : "Preverite, ali je v korenu podatkovne mape datoteka \".ocdata\".", "Could not obtain lock type %d on \"%s\"." : "Ni mogoče pridobiti zaklepa %d na \"%s\".", "Storage unauthorized. %s" : "Dostop do shrambe ni overjen. %s", - "Storage incomplete configuration. %s" : "Nepopolna konfiguracija shrambe. %s", + "Storage incomplete configuration. %s" : "Nepopolna nastavitev shrambe. %s", "Storage connection error. %s" : "Napaka povezave do shrambe. %s", "Storage not available" : "Shramba ni na voljo", "Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s" diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json index a05d62b1c3..48c9f69a86 100644 --- a/lib/l10n/sl.json +++ b/lib/l10n/sl.json @@ -155,7 +155,7 @@ "Please check that the data directory contains a file \".ocdata\" in its root." : "Preverite, ali je v korenu podatkovne mape datoteka \".ocdata\".", "Could not obtain lock type %d on \"%s\"." : "Ni mogoče pridobiti zaklepa %d na \"%s\".", "Storage unauthorized. %s" : "Dostop do shrambe ni overjen. %s", - "Storage incomplete configuration. %s" : "Nepopolna konfiguracija shrambe. %s", + "Storage incomplete configuration. %s" : "Nepopolna nastavitev shrambe. %s", "Storage connection error. %s" : "Napaka povezave do shrambe. %s", "Storage not available" : "Shramba ni na voljo", "Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s" diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index 79adbb0294..7278c7aa73 100644 --- a/settings/l10n/pl.js +++ b/settings/l10n/pl.js @@ -30,8 +30,10 @@ OC.L10N.register( "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Security & setup warnings" : "Ostrzeżenia bezpieczeństwa i konfiguracji", "Sharing" : "Udostępnianie", + "Server-side encryption" : "Szyfrowanie po stronie serwera", "External Storage" : "Zewnętrzna zasoby dyskowe", "Cron" : "Cron", + "Email server" : "Serwer pocztowy", "Log" : "Logi", "Updates" : "Aktualizacje", "Couldn't remove app." : "Nie można usunąć aplikacji.", @@ -43,6 +45,8 @@ OC.L10N.register( "Couldn't update app." : "Nie można uaktualnić aplikacji.", "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ę", + "Migration in progress. Please wait until the migration is finished" : "Trwa migracja. Proszę poczekać, aż migracja dobiegnie końca.", + "Migration started …" : "Migracja rozpoczęta...", "Sending..." : "Wysyłam...", "All" : "Wszystkie", "No apps found for your version" : "Nie znaleziono aplikacji dla twojej wersji", @@ -58,8 +62,12 @@ OC.L10N.register( "Uninstalling ...." : "Odinstalowywanie....", "Error while uninstalling app" : "Błąd przy odinstalowywaniu aplikacji", "Uninstall" : "Odinstaluj", + "Error while loading browser sessions and device tokens" : "Błąd podczas ładowania sesji przeglądarek i tokenów urządzeń", + "Error while creating device token" : "Błąd podczas tworzenia tokena urządzenia.", + "Error while deleting the token" : "Błąd podczas usuwania tokena.", "Valid until {date}" : "Ważny do {date}", "Delete" : "Usuń", + "An error occurred: {message}" : "Wystąpił błąd: {message}", "Select a profile picture" : "Wybierz zdjęcie profilu", "Very weak password" : "Bardzo słabe hasło", "Weak password" : "Słabe hasło", @@ -68,6 +76,7 @@ OC.L10N.register( "Strong password" : "Mocne hasło", "Groups" : "Grupy", "Unable to delete {objName}" : "Nie można usunąć {objName}", + "Error creating group: {message}" : "Błąd podczas tworzenia grupy: {message}", "A valid group name must be provided" : "Należy podać prawidłową nazwę grupy", "deleted {groupName}" : "usunięto {groupName}", "undo" : "cofnij", @@ -77,10 +86,15 @@ OC.L10N.register( "add group" : "dodaj grupę", "Changing the password will result in data loss, because data recovery is not available for this user" : "Zmiana hasła spowoduje utratę danych, ponieważ odzyskiwanie danych nie jest włączone dla tego użytkownika", "A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika", + "Error creating user: {message}" : "Błąd podczas tworzenia użytkownika: {message}", "A valid password must be provided" : "Należy podać prawidłowe hasło", "A valid email must be provided" : "Podaj poprawny adres email", "__language_name__" : "polski", "Unlimited" : "Bez limitu", + "Personal info" : "Informacje osobiste", + "Sessions" : "Sesje", + "Devices" : "Urządzenia", + "Sync clients" : "Klienty synchronizacji", "Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)", "Info, warnings, errors and fatal issues" : "Informacje, ostrzeżenia, błędy i poważne problemy", "Warnings, errors and fatal issues" : "Ostrzeżenia, błędy i poważne problemy", @@ -117,7 +131,11 @@ OC.L10N.register( "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.", + "Enable server-side encryption" : "Włącz szyfrowanie po stronie serwera", + "Be aware that encryption always increases the file size." : "Należy pamiętać, że szyfrowanie zawsze zwiększa rozmiar pliku.", + "This is the final warning: Do you really want to enable encryption?" : "To ostatnie ostrzeżenie: Czy na pewno chcesz włączyć szyfrowanie?", "Enable encryption" : "Włącz szyfrowanie", + "Select default encryption module:" : "Wybierz domyślny moduł szyfrujący:", "This is used for sending out notifications." : "To jest używane do wysyłania powiadomień", "Send mode" : "Tryb wysyłki", "Encryption" : "Szyfrowanie", diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json index a4608e9cd2..cc7022746c 100644 --- a/settings/l10n/pl.json +++ b/settings/l10n/pl.json @@ -28,8 +28,10 @@ "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Security & setup warnings" : "Ostrzeżenia bezpieczeństwa i konfiguracji", "Sharing" : "Udostępnianie", + "Server-side encryption" : "Szyfrowanie po stronie serwera", "External Storage" : "Zewnętrzna zasoby dyskowe", "Cron" : "Cron", + "Email server" : "Serwer pocztowy", "Log" : "Logi", "Updates" : "Aktualizacje", "Couldn't remove app." : "Nie można usunąć aplikacji.", @@ -41,6 +43,8 @@ "Couldn't update app." : "Nie można uaktualnić aplikacji.", "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ę", + "Migration in progress. Please wait until the migration is finished" : "Trwa migracja. Proszę poczekać, aż migracja dobiegnie końca.", + "Migration started …" : "Migracja rozpoczęta...", "Sending..." : "Wysyłam...", "All" : "Wszystkie", "No apps found for your version" : "Nie znaleziono aplikacji dla twojej wersji", @@ -56,8 +60,12 @@ "Uninstalling ...." : "Odinstalowywanie....", "Error while uninstalling app" : "Błąd przy odinstalowywaniu aplikacji", "Uninstall" : "Odinstaluj", + "Error while loading browser sessions and device tokens" : "Błąd podczas ładowania sesji przeglądarek i tokenów urządzeń", + "Error while creating device token" : "Błąd podczas tworzenia tokena urządzenia.", + "Error while deleting the token" : "Błąd podczas usuwania tokena.", "Valid until {date}" : "Ważny do {date}", "Delete" : "Usuń", + "An error occurred: {message}" : "Wystąpił błąd: {message}", "Select a profile picture" : "Wybierz zdjęcie profilu", "Very weak password" : "Bardzo słabe hasło", "Weak password" : "Słabe hasło", @@ -66,6 +74,7 @@ "Strong password" : "Mocne hasło", "Groups" : "Grupy", "Unable to delete {objName}" : "Nie można usunąć {objName}", + "Error creating group: {message}" : "Błąd podczas tworzenia grupy: {message}", "A valid group name must be provided" : "Należy podać prawidłową nazwę grupy", "deleted {groupName}" : "usunięto {groupName}", "undo" : "cofnij", @@ -75,10 +84,15 @@ "add group" : "dodaj grupę", "Changing the password will result in data loss, because data recovery is not available for this user" : "Zmiana hasła spowoduje utratę danych, ponieważ odzyskiwanie danych nie jest włączone dla tego użytkownika", "A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika", + "Error creating user: {message}" : "Błąd podczas tworzenia użytkownika: {message}", "A valid password must be provided" : "Należy podać prawidłowe hasło", "A valid email must be provided" : "Podaj poprawny adres email", "__language_name__" : "polski", "Unlimited" : "Bez limitu", + "Personal info" : "Informacje osobiste", + "Sessions" : "Sesje", + "Devices" : "Urządzenia", + "Sync clients" : "Klienty synchronizacji", "Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)", "Info, warnings, errors and fatal issues" : "Informacje, ostrzeżenia, błędy i poważne problemy", "Warnings, errors and fatal issues" : "Ostrzeżenia, błędy i poważne problemy", @@ -115,7 +129,11 @@ "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.", + "Enable server-side encryption" : "Włącz szyfrowanie po stronie serwera", + "Be aware that encryption always increases the file size." : "Należy pamiętać, że szyfrowanie zawsze zwiększa rozmiar pliku.", + "This is the final warning: Do you really want to enable encryption?" : "To ostatnie ostrzeżenie: Czy na pewno chcesz włączyć szyfrowanie?", "Enable encryption" : "Włącz szyfrowanie", + "Select default encryption module:" : "Wybierz domyślny moduł szyfrujący:", "This is used for sending out notifications." : "To jest używane do wysyłania powiadomień", "Send mode" : "Tryb wysyłki", "Encryption" : "Szyfrowanie", From 2951a70fcba24417e2873e0fe00696ed185ecf8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 20 Jun 2016 12:02:23 +0200 Subject: [PATCH 48/52] Update ExcludeFileByNameFilterIterator.php (#25184) Gentoo & derivatives use a tool named webapp-config which places two files in a webapp-config manager web application: 1: .webapp tag with more detailed info on the configuration done by webapp-config 2: .webapp-appname with the list of files installed by the tool to be able to later only delete stuff that was installed (in case of upgrade) and updated configurations. --- .../IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php b/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php index 1f31e84944..5c72bfaa57 100644 --- a/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php +++ b/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php @@ -39,6 +39,7 @@ class ExcludeFileByNameFilterIterator extends \RecursiveFilterIterator { '.DS_Store', // Mac OS X 'Thumbs.db', // Microsoft Windows '.directory', // Dolphin (KDE) + '.webapp', // Gentoo/Funtoo & derivatives use a tool known as webapp-config to manager wep-apps. ]; /** From bb24e40bf49a5982a85a4d4930771159cfa4c9dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Villaf=C3=A1=C3=B1ez?= Date: Fri, 17 Jun 2016 14:25:29 +0200 Subject: [PATCH 49/52] Fix conversion issues Change to phpdoc type for automatic conversion --- apps/files_external/lib/Controller/GlobalStoragesController.php | 1 + apps/files_external/lib/Controller/StoragesController.php | 2 ++ .../lib/Controller/UserGlobalStoragesController.php | 2 ++ apps/files_external/lib/Controller/UserStoragesController.php | 1 + 4 files changed, 6 insertions(+) diff --git a/apps/files_external/lib/Controller/GlobalStoragesController.php b/apps/files_external/lib/Controller/GlobalStoragesController.php index 471e3b5159..71bef7dc71 100644 --- a/apps/files_external/lib/Controller/GlobalStoragesController.php +++ b/apps/files_external/lib/Controller/GlobalStoragesController.php @@ -127,6 +127,7 @@ class GlobalStoragesController extends StoragesController { * @param array $applicableUsers users for which to mount the storage * @param array $applicableGroups groups for which to mount the storage * @param int $priority priority + * @param bool $testOnly whether to storage should only test the connection or do more things * * @return DataResponse */ diff --git a/apps/files_external/lib/Controller/StoragesController.php b/apps/files_external/lib/Controller/StoragesController.php index e50426f488..c1216008ff 100644 --- a/apps/files_external/lib/Controller/StoragesController.php +++ b/apps/files_external/lib/Controller/StoragesController.php @@ -237,6 +237,7 @@ abstract class StoragesController extends Controller { * on whether the remote storage is available or not. * * @param StorageConfig $storage storage configuration + * @param bool $testOnly whether to storage should only test the connection or do more things */ protected function updateStorageStatus(StorageConfig &$storage, $testOnly = true) { try { @@ -291,6 +292,7 @@ abstract class StoragesController extends Controller { * Get an external storage entry. * * @param int $id storage id + * @param bool $testOnly whether to storage should only test the connection or do more things * * @return DataResponse */ diff --git a/apps/files_external/lib/Controller/UserGlobalStoragesController.php b/apps/files_external/lib/Controller/UserGlobalStoragesController.php index f65e578507..3006e72666 100644 --- a/apps/files_external/lib/Controller/UserGlobalStoragesController.php +++ b/apps/files_external/lib/Controller/UserGlobalStoragesController.php @@ -107,6 +107,7 @@ class UserGlobalStoragesController extends StoragesController { * Get an external storage entry. * * @param int $id storage id + * @param bool $testOnly whether to storage should only test the connection or do more things * @return DataResponse * * @NoAdminRequired @@ -139,6 +140,7 @@ class UserGlobalStoragesController extends StoragesController { * * @param int $id storage id * @param array $backendOptions backend-specific options + * @param bool $testOnly whether to storage should only test the connection or do more things * * @return DataResponse * diff --git a/apps/files_external/lib/Controller/UserStoragesController.php b/apps/files_external/lib/Controller/UserStoragesController.php index 28663090e8..5dc23aad76 100644 --- a/apps/files_external/lib/Controller/UserStoragesController.php +++ b/apps/files_external/lib/Controller/UserStoragesController.php @@ -159,6 +159,7 @@ class UserStoragesController extends StoragesController { * @param string $authMechanism authentication mechanism identifier * @param array $backendOptions backend-specific options * @param array $mountOptions backend-specific mount options + * @param bool $testOnly whether to storage should only test the connection or do more things * * @return DataResponse * From dcee5284828bea459e69448ac5f3363a584cab73 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 20 Jun 2016 22:06:34 +0200 Subject: [PATCH 50/52] Don't send activity to non-admins when assigning invisible tags (#25192) --- apps/systemtags/lib/Activity/Listener.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/systemtags/lib/Activity/Listener.php b/apps/systemtags/lib/Activity/Listener.php index 9b6597119c..435109053b 100644 --- a/apps/systemtags/lib/Activity/Listener.php +++ b/apps/systemtags/lib/Activity/Listener.php @@ -188,6 +188,10 @@ class Listener { $activity->setAffectedUser($user); foreach ($tags as $tag) { + // don't publish activity for non-admins if tag is invisible + if (!$tag->isUserVisible() && !$this->groupManager->isAdmin($user)) { + continue; + } if ($event->getEvent() === MapperEvent::EVENT_ASSIGN) { $activity->setSubject(Extension::ASSIGN_TAG, [ $actor, From bb465a7ab45c897291deb27cf4329b06cc4857eb Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 20 Jun 2016 22:11:05 +0200 Subject: [PATCH 51/52] Catch exceptions while creating shared mounts (#25077) --- .../files_sharing/lib/AppInfo/Application.php | 3 +- apps/files_sharing/lib/MountProvider.php | 33 +++++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php index 2907ceaaea..fda16c7aca 100644 --- a/apps/files_sharing/lib/AppInfo/Application.php +++ b/apps/files_sharing/lib/AppInfo/Application.php @@ -115,7 +115,8 @@ class Application extends App { $server = $c->query('ServerContainer'); return new MountProvider( $server->getConfig(), - $server->getShareManager() + $server->getShareManager(), + $server->getLogger() ); }); diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index d8f355f2fd..a9ae48860c 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -26,6 +26,7 @@ namespace OCA\Files_Sharing; use OCP\Files\Config\IMountProvider; use OCP\Files\Storage\IStorageFactory; use OCP\IConfig; +use OCP\ILogger; use OCP\IUser; use OCP\Share\IManager; @@ -40,13 +41,20 @@ class MountProvider implements IMountProvider { */ protected $shareManager; + /** + * @var ILogger + */ + protected $logger; + /** * @param \OCP\IConfig $config * @param IManager $shareManager + * @param ILogger $logger */ - public function __construct(IConfig $config, IManager $shareManager) { + public function __construct(IConfig $config, IManager $shareManager, ILogger $logger) { $this->config = $config; $this->shareManager = $shareManager; + $this->logger = $logger; } @@ -67,15 +75,20 @@ class MountProvider implements IMountProvider { $mounts = []; foreach ($shares as $share) { - $mounts[] = new SharedMount( - '\OC\Files\Storage\Shared', - $mounts, - [ - 'user' => $user->getUID(), - 'newShare' => $share, - ], - $storageFactory - ); + try { + $mounts[] = new SharedMount( + '\OC\Files\Storage\Shared', + $mounts, + [ + 'user' => $user->getUID(), + 'newShare' => $share, + ], + $storageFactory + ); + } catch (\Exception $e) { + $this->logger->logException($e); + $this->logger->error('Error while trying to create shared mount'); + } } // array_filter removes the null values from the array From 0e575c7eeadc6c8eb11b0be2ed1d39cdcf6cfcb8 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Tue, 21 Jun 2016 03:49:50 -0400 Subject: [PATCH 52/52] [tx-robot] updated from transifex --- lib/l10n/ca.js | 3 +++ lib/l10n/ca.json | 3 +++ settings/l10n/ca.js | 1 + settings/l10n/ca.json | 1 + 4 files changed, 8 insertions(+) diff --git a/lib/l10n/ca.js b/lib/l10n/ca.js index 2d6b88768f..d84d728427 100644 --- a/lib/l10n/ca.js +++ b/lib/l10n/ca.js @@ -44,6 +44,7 @@ OC.L10N.register( "For the best results, please consider using a GNU/Linux server instead." : "Per millors resultats, millor considereu utilitzar un servidor GNU/Linux.", "Set an admin username." : "Establiu un nom d'usuari per l'administrador.", "Set an admin password." : "Establiu una contrasenya per l'administrador.", + "Invalid Federated Cloud ID" : "ID de núvol federat invàlid", "%s shared »%s« with you" : "%s ha compartit »%s« amb tu", "Sharing %s failed, because the file does not exist" : "Ha fallat en compartir %s, perquè el fitxer no existeix", "You are not allowed to share %s" : "No se us permet compartir %s", @@ -54,6 +55,8 @@ OC.L10N.register( "Sharing %s failed, because %s is not a member of the group %s" : "Ha fallat en compartir %s, perquè %s no és membre del grup %s", "You need to provide a password to create a public link, only protected links are allowed" : "Heu de proporcionar una contrasenya per crear un enllaç públic. Només es permeten enllaços segurs.", "Sharing %s failed, because sharing with links is not allowed" : "Ha fallat en compartir %s, perquè no es permet compartir amb enllaços", + "Not allowed to create a federated share with the same user" : "No està permés crear una compartició federada amb el mateix usuari", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La compartició de %s ha fallat, no es pot trobar %s, potser el servidor està actualment innacessible.", "Share type %s is not valid for %s" : "La compartició tipus %s no és vàlida per %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Ha fallat en establir els permisos per %s perquè aquests excedeixen els permesos per a %s", "Setting permissions for %s failed, because the item was not found" : "Ha fallat en establir els permisos per %s, perquè no s'ha trobat l'element", diff --git a/lib/l10n/ca.json b/lib/l10n/ca.json index 2291b637c5..ac6dd35ea1 100644 --- a/lib/l10n/ca.json +++ b/lib/l10n/ca.json @@ -42,6 +42,7 @@ "For the best results, please consider using a GNU/Linux server instead." : "Per millors resultats, millor considereu utilitzar un servidor GNU/Linux.", "Set an admin username." : "Establiu un nom d'usuari per l'administrador.", "Set an admin password." : "Establiu una contrasenya per l'administrador.", + "Invalid Federated Cloud ID" : "ID de núvol federat invàlid", "%s shared »%s« with you" : "%s ha compartit »%s« amb tu", "Sharing %s failed, because the file does not exist" : "Ha fallat en compartir %s, perquè el fitxer no existeix", "You are not allowed to share %s" : "No se us permet compartir %s", @@ -52,6 +53,8 @@ "Sharing %s failed, because %s is not a member of the group %s" : "Ha fallat en compartir %s, perquè %s no és membre del grup %s", "You need to provide a password to create a public link, only protected links are allowed" : "Heu de proporcionar una contrasenya per crear un enllaç públic. Només es permeten enllaços segurs.", "Sharing %s failed, because sharing with links is not allowed" : "Ha fallat en compartir %s, perquè no es permet compartir amb enllaços", + "Not allowed to create a federated share with the same user" : "No està permés crear una compartició federada amb el mateix usuari", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La compartició de %s ha fallat, no es pot trobar %s, potser el servidor està actualment innacessible.", "Share type %s is not valid for %s" : "La compartició tipus %s no és vàlida per %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Ha fallat en establir els permisos per %s perquè aquests excedeixen els permesos per a %s", "Setting permissions for %s failed, because the item was not found" : "Ha fallat en establir els permisos per %s, perquè no s'ha trobat l'element", diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js index c569f412b8..c89bafed90 100644 --- a/settings/l10n/ca.js +++ b/settings/l10n/ca.js @@ -10,6 +10,7 @@ OC.L10N.register( "Unable to change password" : "No es pot canviar la contrasenya", "Enabled" : "Activat", "Not enabled" : "Desactivat", + "Federated Cloud Sharing" : "Compartició federada de núvol", "A problem occurred, please check your log files (Error: %s)" : "S'ha produït un problema, si us plau revisi els arxius de registre (Error: %s)", "Migration Completed" : "Migració completada", "Group already exists." : "El grup ja existeix.", diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json index e8729fe872..6956f33912 100644 --- a/settings/l10n/ca.json +++ b/settings/l10n/ca.json @@ -8,6 +8,7 @@ "Unable to change password" : "No es pot canviar la contrasenya", "Enabled" : "Activat", "Not enabled" : "Desactivat", + "Federated Cloud Sharing" : "Compartició federada de núvol", "A problem occurred, please check your log files (Error: %s)" : "S'ha produït un problema, si us plau revisi els arxius de registre (Error: %s)", "Migration Completed" : "Migració completada", "Group already exists." : "El grup ja existeix.",