diff options
142 files changed, 1721 insertions, 262 deletions
diff --git a/3rdparty b/3rdparty -Subproject 12f9071624285bf465157730fc8d43d7a7d7fbd +Subproject 509385e674563e48a977bf8285c826963835528 diff --git a/apps/comments/l10n/pl.js b/apps/comments/l10n/pl.js index d5e3f4b3320..d4a492e1da2 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", + "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentarze</strong> dla plików <em>(zawsze wypisane w strumieniu)</em>", + "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 28bbf20817f..78e9f0ff210 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", + "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentarze</strong> dla plików <em>(zawsze wypisane w strumieniu)</em>", + "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/comments/l10n/zh_CN.js b/apps/comments/l10n/zh_CN.js index 6ae1c231ae0..326fa6407a4 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" : "评论", + "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "文件的<strong>评论</strong><em>(始终在数据流中列出)</em>", + "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 f5dab6f5ab1..98aa243e1c2 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" : "评论", + "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "文件的<strong>评论</strong><em>(始终在数据流中列出)</em>", + "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/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index 26e37e6bb86..df147a032fe 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -24,5 +24,8 @@ <post-migration> <job>OCA\DAV\Migration\Classification</job> </post-migration> + <live-migration> + <job>OCA\DAV\Migration\GenerateBirthdays</job> + </live-migration> </repair-steps> </info> diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index 9e0d2da4e17..de2056ebc35 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/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php index 653da10bc3c..82c2711b560 100644 --- a/apps/dav/lib/Connector/Sabre/Auth.php +++ b/apps/dav/lib/Connector/Sabre/Auth.php @@ -31,8 +31,10 @@ 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 OCA\DAV\Connector\Sabre\Exception\PasswordLoginForbidden; use OCP\IRequest; use OCP\ISession; use Sabre\DAV\Auth\Backend\AbstractBasic; @@ -115,15 +117,19 @@ 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); - \OC_Util::setupFS($this->userSession->getUser()->getUID()); - $this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID()); + 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) { $this->session->close(); - return true; - } else { - $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 00000000000..6537da3d56d --- /dev/null +++ b/apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php @@ -0,0 +1,54 @@ +<?php + +/** + * @author Christoph Wurst <christoph@owncloud.com> + * + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\Connector\Sabre\Exception; + +use DOMElement; +use Sabre\DAV\Server; +use Sabre\DAV\Exception\NotAuthenticated; + +class PasswordLoginForbidden extends NotAuthenticated { + + 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/lib/Migration/GenerateBirthdays.php b/apps/dav/lib/Migration/GenerateBirthdays.php new file mode 100644 index 00000000000..dfc8838bcbb --- /dev/null +++ b/apps/dav/lib/Migration/GenerateBirthdays.php @@ -0,0 +1,70 @@ +<?php +/** + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @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 <http://www.gnu.org/licenses/> + * + */ + + +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(); + } +} diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php index b3ab49a027e..9564298f23a 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') @@ -212,6 +208,25 @@ 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()) + ->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->invokePrivate($this->auth, 'validateUserPass', ['MyTestUser', 'MyTestPassword']); + } public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGet() { $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') @@ -626,17 +641,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/apps/encryption/l10n/zh_CN.js b/apps/encryption/l10n/zh_CN.js index 93a1b13996a..e2f9212c8cf 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 0fb653b232c..8ac6c9eef01 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 bc2ea1e51c6..d56ab77a8f2 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 9ac1be24429..782557f24a9 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 090c2a9f19d..364d540640a 100644 --- a/apps/federatedfilesharing/l10n/nl.js +++ b/apps/federatedfilesharing/l10n/nl.js @@ -5,7 +5,10 @@ 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.", + "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 #Nextcloud Federated Cloud ID, see %s" : "Deel met mij via mijn #Nextcloud federated Cloud ID, zie %s", diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json index 65b298df963..01e1579dbc8 100644 --- a/apps/federatedfilesharing/l10n/nl.json +++ b/apps/federatedfilesharing/l10n/nl.json @@ -3,7 +3,10 @@ "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.", + "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 #Nextcloud Federated Cloud ID, see %s" : "Deel met mij via mijn #Nextcloud federated Cloud ID, zie %s", diff --git a/apps/federatedfilesharing/l10n/pl.js b/apps/federatedfilesharing/l10n/pl.js index 1d8b949c74a..4f65f44553e 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 c44eecbeeb7..7b43ed3fce1 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/federation/js/settings-admin.js b/apps/federation/js/settings-admin.js index 45d5d62a5a3..10fabbeb9b9 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', diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index c0d1f22e74b..b2d6662a9ce 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 7db4cf95312..780ef364b9f 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/he.js b/apps/files/l10n/he.js index a0152b94d2e..13b0922efd2 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 c5e22507e04..57ecefe49b2 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/l10n/nl.js b/apps/files/l10n/nl.js index 94483ede498..974349d6333 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", @@ -32,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", @@ -86,7 +96,7 @@ OC.L10N.register( "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>", "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Beperk meldingen over aanmaken en wijzigen aan uw <strong>favoriete bestanden</strong> <em>(Alleen stream)</em>", "A file or folder has been <strong>deleted</strong>" : "Een bestand of map is <strong>verwijderd</strong>", - "A file or folder has been <strong>restored</strong>" : "Een bestand of een mmaps is <strong>hersteld</strong>", + "A file or folder has been <strong>restored</strong>" : "Een bestand of een map is <strong>hersteld</strong>", "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 524570f487e..6caa76f49c1 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", @@ -30,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", @@ -84,7 +94,7 @@ "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>", "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Beperk meldingen over aanmaken en wijzigen aan uw <strong>favoriete bestanden</strong> <em>(Alleen stream)</em>", "A file or folder has been <strong>deleted</strong>" : "Een bestand of map is <strong>verwijderd</strong>", - "A file or folder has been <strong>restored</strong>" : "Een bestand of een mmaps is <strong>hersteld</strong>", + "A file or folder has been <strong>restored</strong>" : "Een bestand of een map is <strong>hersteld</strong>", "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/pl.js b/apps/files/l10n/pl.js index a366c6a967c..c5273a36ebd 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 <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>", "A file or folder has been <strong>changed</strong>" : "Plik lub folder został <strong>zmieniony</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich <strong>ulubionych plkow</strong> <em>(Tylko w strumieniu aktywności)</em>", "A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>", "A file or folder has been <strong>restored</strong>" : "Plik lub folder został <strong>przywrócy</strong>", "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 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Użyj tego adresu aby uzyskać <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dostęp do swoich plików poprzez WebDAV</a>", "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 05b65b2f84a..c0be569faf6 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 <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>", "A file or folder has been <strong>changed</strong>" : "Plik lub folder został <strong>zmieniony</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich <strong>ulubionych plkow</strong> <em>(Tylko w strumieniu aktywności)</em>", "A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>", "A file or folder has been <strong>restored</strong>" : "Plik lub folder został <strong>przywrócy</strong>", "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 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Użyj tego adresu aby uzyskać <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dostęp do swoich plików poprzez WebDAV</a>", "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/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index 4e5afe599d2..632804a4fad 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 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">通过 WebDAV 访问您的文件</a>", "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 a4cd89935f6..60db09ade1a 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 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">通过 WebDAV 访问您的文件</a>", "No files in here" : "无文件", "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!", "No entries found in this folder" : "此文件夹中无项目", diff --git a/apps/files_external/3rdparty/composer.json b/apps/files_external/3rdparty/composer.json index 72335c8d891..158478741ec 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 7161ae19a2c..8f324299ff3 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 942dbce7336..0f9a43c6cd7 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 31c602de3ca..127d2bd3a19 100644 --- a/apps/files_external/3rdparty/composer/installed.json +++ b/apps/files_external/3rdparty/composer/installed.json @@ -1,33 +1,34 @@ [ { - "name": "icewind/streams", - "version": "0.4.0", - "version_normalized": "0.4.0.0", + "name": "icewind/smb", + "version": "v1.1.0", + "version_normalized": "1.1.0.0", "source": { "type": "git", - "url": "https://github.com/icewind1991/Streams.git", - "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3" + "url": "https://github.com/icewind1991/SMB.git", + "reference": "822f924967c68228555cea84ea44765f8e85c601" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/Streams/zipball/9ca40274645a967ecc3408b0ca2e6255ead1d1d3", - "reference": "9ca40274645a967ecc3408b0ca2e6255ead1d1d3", + "url": "https://api.github.com/repos/icewind1991/SMB/zipball/822f924967c68228555cea84ea44765f8e85c601", + "reference": "822f924967c68228555cea84ea44765f8e85c601", "shasum": "" }, "require": { + "icewind/streams": ">=0.2.0", "php": ">=5.3" }, "require-dev": { "phpunit/phpunit": "^4.8", "satooshi/php-coveralls": "v1.0.0" }, - "time": "2016-03-17 12:32:25", + "time": "2016-04-26 13:26:39", "type": "library", - "installation-source": "dist", + "installation-source": "source", "autoload": { "psr-4": { - "Icewind\\Streams\\Tests\\": "tests/", - "Icewind\\Streams\\": "src/" + "Icewind\\SMB\\": "src/", + "Icewind\\SMB\\Test\\": "tests/" } }, "notification-url": "https://packagist.org/downloads/", @@ -40,38 +41,37 @@ "email": "icewind@owncloud.com" } ], - "description": "A set of generic stream wrappers" + "description": "php wrapper for smbclient and libsmbclient-php" }, { - "name": "icewind/smb", - "version": "v1.1.0", - "version_normalized": "1.1.0.0", + "name": "icewind/streams", + "version": "0.4.1", + "version_normalized": "0.4.1.0", "source": { "type": "git", - "url": "https://github.com/icewind1991/SMB.git", - "reference": "822f924967c68228555cea84ea44765f8e85c601" + "url": "https://github.com/icewind1991/Streams.git", + "reference": "d3620e8dc410c86c2ba55579803679c4e0b289ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/SMB/zipball/822f924967c68228555cea84ea44765f8e85c601", - "reference": "822f924967c68228555cea84ea44765f8e85c601", + "url": "https://api.github.com/repos/icewind1991/Streams/zipball/d3620e8dc410c86c2ba55579803679c4e0b289ac", + "reference": "d3620e8dc410c86c2ba55579803679c4e0b289ac", "shasum": "" }, "require": { - "icewind/streams": ">=0.2.0", "php": ">=5.3" }, "require-dev": { "phpunit/phpunit": "^4.8", "satooshi/php-coveralls": "v1.0.0" }, - "time": "2016-04-26 13:26:39", + "time": "2016-06-02 14:37:52", "type": "library", - "installation-source": "source", + "installation-source": "dist", "autoload": { "psr-4": { - "Icewind\\SMB\\": "src/", - "Icewind\\SMB\\Test\\": "tests/" + "Icewind\\Streams\\Tests\\": "tests/", + "Icewind\\Streams\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -84,6 +84,6 @@ "email": "icewind@owncloud.com" } ], - "description": "php wrapper for smbclient and libsmbclient-php" + "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 84b43f6bd02..8238f19f7c9 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; diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 2477f513db3..d210c158ec1 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 = $('<input type="password" class="'+classes.join(' ')+'" data-parameter="'+parameter+'" placeholder="'+ trimmedPlaceholder+'" />'); } else if (placeholder.type === MountConfigListView.ParameterTypes.BOOLEAN) { var checkboxId = _.uniqueId('checkbox_'); - newElement = $('<input type="checkbox" id="'+checkboxId+'" class="'+classes.join(' ')+'" data-parameter="'+parameter+'" /><label for="'+checkboxId+'">'+ trimmedPlaceholder+'</label>'); + newElement = $('<div><label><input type="checkbox" id="'+checkboxId+'" class="'+classes.join(' ')+'" data-parameter="'+parameter+'" />'+ trimmedPlaceholder+'</label></div>'); } else if (placeholder.type === MountConfigListView.ParameterTypes.HIDDEN) { newElement = $('<input type="hidden" class="'+classes.join(' ')+'" data-parameter="'+parameter+'" />'); } else { diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 71c8d2aeac3..26ff4881eb3 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 6603af23bea..958d1f7059c 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/files_external/lib/Controller/GlobalStoragesController.php b/apps/files_external/lib/Controller/GlobalStoragesController.php index 471e3b51593..71bef7dc714 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 e50426f4888..c1216008ffa 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 f65e578507d..3006e72666d 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 28663090e89..5dc23aad769 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 * diff --git a/apps/files_external/lib/Lib/Storage/Dropbox.php b/apps/files_external/lib/Lib/Storage/Dropbox.php index f15cbba0469..f0f62f9f35a 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 diff --git a/apps/files_external/lib/Lib/Storage/Google.php b/apps/files_external/lib/Lib/Storage/Google.php index 96f12800c10..0b617aafe9d 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]); } } } diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index c9cc40b0ba0..6662f637039 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -51,13 +51,17 @@ break; case DefinitionParameter::VALUE_BOOLEAN: ?> <?php $checkboxId = uniqid("checkbox_"); ?> + <div> + <label> <input type="checkbox" id="<?php p($checkboxId); ?>" <?php if (!empty($classes)): ?> class="checkbox <?php p(implode(' ', $classes)); ?>"<?php endif; ?> data-parameter="<?php p($parameter->getName()); ?>" <?php if ($value === true): ?> checked="checked"<?php endif; ?> /> - <label for="<?php p($checkboxId); ?>"><?php p($placeholder); ?></label> + <?php p($placeholder); ?> + </label> + </div> <?php break; case DefinitionParameter::VALUE_HIDDEN: ?> diff --git a/apps/files_external/tests/env/start-swift-ceph.sh b/apps/files_external/tests/env/start-swift-ceph.sh index 1e417c69057..ba17b8f42dd 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##'` diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index 5740574ec4c..c6ae6903eec 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', diff --git a/apps/files_sharing/l10n/he.js b/apps/files_sharing/l10n/he.js index 32fe49005a1..985e5807e5a 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 <strong>shared</strong>" : "קובץ או תיקייה <strong>שותפו<strong/>", "A file or folder was shared from <strong>another server</strong>" : "קובץ או תיקייה שותפו מ- <strong>שרת אחר</strong>", "A public shared file or folder was <strong>downloaded</strong>" : "קובץ או תיקייה עם שיתוף ציבורי <strong>הורדו</strong>", diff --git a/apps/files_sharing/l10n/he.json b/apps/files_sharing/l10n/he.json index 4aa639d8e50..247c8e2239d 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 <strong>shared</strong>" : "קובץ או תיקייה <strong>שותפו<strong/>", "A file or folder was shared from <strong>another server</strong>" : "קובץ או תיקייה שותפו מ- <strong>שרת אחר</strong>", "A public shared file or folder was <strong>downloaded</strong>" : "קובץ או תיקייה עם שיתוף ציבורי <strong>הורדו</strong>", diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php index 2907ceaaea2..fda16c7acac 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/External/Storage.php b/apps/files_sharing/lib/External/Storage.php index a12b9597dbd..ca99393a1e0 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/dav/appinfo/update.php b/apps/files_sharing/lib/External/Watcher.php index d2ee06cc9fe..6be35bdeb3b 100644 --- a/apps/dav/appinfo/update.php +++ b/apps/files_sharing/lib/External/Watcher.php @@ -1,7 +1,6 @@ <?php /** - * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Robin Appelman <icewind@owncloud.com> * * @copyright Copyright (c) 2016, ownCloud, Inc. * @license AGPL-3.0 @@ -20,7 +19,15 @@ * */ -use OCA\DAV\AppInfo\Application; +namespace OCA\Files_Sharing\External; -$app = new Application(); -$app->generateBirthdays(); +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 + } +} diff --git a/apps/files_sharing/lib/Helper.php b/apps/files_sharing/lib/Helper.php index e4640f82eb6..2353a281b7e 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/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index d8f355f2fd3..a9ae48860c2 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; @@ -41,12 +42,19 @@ 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 diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index 83527053f43..2b066bd2d94 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( diff --git a/apps/systemtags/l10n/ca.js b/apps/systemtags/l10n/ca.js index 20ec2d4edb1..46d9d409662 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", + "<strong>System tags</strong> for a file have been modified" : "Les <strong>Marques de Sistema</strong> 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 87c8c678761..9bb1d6fba83 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", + "<strong>System tags</strong> for a file have been modified" : "Les <strong>Marques de Sistema</strong> 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/nl.js b/apps/systemtags/l10n/nl.js index 3b4aa7eb56d..567b14aa1f4 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 f941ce3a4a6..f7d83699c2d 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/systemtags/lib/Activity/Listener.php b/apps/systemtags/lib/Activity/Listener.php index 9b6597119c6..435109053bd 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, diff --git a/apps/updatenotification/l10n/ca.js b/apps/updatenotification/l10n/ca.js index 5f6db3199a6..10e7328cb07 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 74b1a731e90..673db0accd8 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 diff --git a/apps/updatenotification/l10n/nl.js b/apps/updatenotification/l10n/nl.js index d7bc20bcfea..93b65f6976d 100644 --- a/apps/updatenotification/l10n/nl.js +++ b/apps/updatenotification/l10n/nl.js @@ -1,14 +1,19 @@ 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", "Open updater" : "Open updater", "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 caecfa275f5..4c028cc5964 100644 --- a/apps/updatenotification/l10n/nl.json +++ b/apps/updatenotification/l10n/nl.json @@ -1,12 +1,17 @@ { "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", "Open updater" : "Open updater", "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/apps/updatenotification/l10n/pl.js b/apps/updatenotification/l10n/pl.js index d86fdf3c243..ffeb1b0601f 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 b5d7132d9f0..6f03b0105bf 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 12ba787e5e4..a59a58731fb 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 ecc0e3519d4..c96c9666fb1 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/apps/user_ldap/l10n/he.js b/apps/user_ldap/l10n/he.js index 385132a0b58..8ff1a2037e4 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 44e94a58702..0ad2d1fc61b 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/build/integration/composer.json b/build/integration/composer.json index 9e5335c4b24..29f73f2064a 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" } } diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index cd9584ad186..0abb8667739 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\""); } } @@ -434,5 +434,51 @@ trait WebDav { $this->response = $ex->getResponse(); } } -} + /** + * @When user :user favorites element :path + */ + 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 changeFavStateOfAnElement($user, $path, $favOrUnfav, $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' => $favOrUnfav + ]; + } + + $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/dav-v2.feature b/build/integration/features/dav-v2.feature new file mode 100644 index 00000000000..2b3aeff9454 --- /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/favorites.feature b/build/integration/features/favorites.feature new file mode 100644 index 00000000000..86643fdd1e2 --- /dev/null +++ b/build/integration/features/favorites.feature @@ -0,0 +1,42 @@ +Feature: favorite + Background: + Given using api version "1" + + Scenario: Favorite a folder + Given using dav path "remote.php/webdav" + And As an "admin" + And user "user0" exists + 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" + + 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" + + 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 "" + diff --git a/build/integration/features/webdav-related.feature b/build/integration/features/webdav-related.feature index 14ff505463c..06df280ea64 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 diff --git a/core/css/styles.css b/core/css/styles.css index 4f56a0d441e..d46e9700e87 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -376,26 +376,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] { diff --git a/core/js/setup.js b/core/js/setup.js index 96760e8ae61..1aad7663223 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); diff --git a/core/l10n/es.js b/core/l10n/es.js index 917f73b3087..3469d182018 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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</a>.", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP no tiene acceso a /dev/urandom lo cual es desaconsejable por razones de seguridad. Puede encontrar más información en nuestra our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.", diff --git a/core/l10n/es.json b/core/l10n/es.json index d37b77e07a1..8070e3f40ff 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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Su servidor no ha sido correctamente configurado para resolver \"{url}\". Puede encontrar más información en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</a>.", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP no tiene acceso a /dev/urandom lo cual es desaconsejable por razones de seguridad. Puede encontrar más información en nuestra our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index d43f7fe4739..b72796996f6 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 d96f83f804e..1edfbe71ab0 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 217dfe8cc0b..b37b9d0eee4 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." : "דצמ׳", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">קיימות בעיות עם בדיקת תקינות קוד. למידע נוסף…</a>", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "שרת האינטרנט שלך לא מוגדר כהלכה לפתור \"{url}\". מידע נוסף קיים <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">במסמכים</a> שלנו.", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "לא הוגדר זיכרון מטמון. על מנת לשפר את הביצועים יש להגדיר memcache אם קיים. מידע נוסף ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a>.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom אינו ניתן לקריאה על ידי PHP אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.", + "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "כרגע המערכת מריצה PHP {version}. מומלץ מאוד לשדרג את גרסת ה- PHP vשלך כדי לנצל את <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">עדכוני הביצועים והאבטחה המופקים על ידי קבוצת ה- PHP</a> ברגע שההפצה אליך תתמוך בזה.", + "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.", + "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached מוגדר כמטמון מופץ, אבל מותקן מודול PHP \"memcache\" מוטעה. רק \\OC\\Memcache\\Memcached תומך ב- \"memcached\" אבל לא ב- \"memcache\". ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki בנושא שני המודולים</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "חלק מהקבצים לא עברו את בדיקת השלמות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו. (<a href=\"{codeIntegrityDownloadEndpoint}\">רשימה של קבצים לא תקינים…</a> / <a href=\"{rescanEndpoint}\">סריקה מחדש…</a>)", "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 <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "כותרת HTTP \"Strict-Transport-Security\" אינה מוגדרת לפחות \"{seconds}\" שניות. להגברת האבטחה אנו ממליצים לאפשר HSTS כפי שמוסבר ב- <a href=\"{docUrl}\" rel=\"noreferrer\">טיפים לאבטחה</a> שלנו.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "הנך נכנס לאתר באמצעות פרוטוקול HTTP. אנו ממליצים מאוד להגדיר את השרת לעבוד עם פרוטוקול HTTPS במקום כפי שמוסבר ב- <a href=\"{docUrl}\">טיפים לאבטחה</a> שלנו.", "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 <a href=\"{url}\">check our forum post</a> covering this issue." : "העדכון בוצע בהצלחה. למידע נוסף <a href=\"{url}\">ניתן לבדוק בהודעת הפורום שלנו</a> המכסה נושא זו.", @@ -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 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "לעזרה, ניתן לצפות ב<a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">מסמכי התיעוד</a>.", "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 60bd0a33ca9..1824733eb8d 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." : "דצמ׳", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">קיימות בעיות עם בדיקת תקינות קוד. למידע נוסף…</a>", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "שרת האינטרנט שלך לא מוגדר כהלכה לפתור \"{url}\". מידע נוסף קיים <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">במסמכים</a> שלנו.", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "לא הוגדר זיכרון מטמון. על מנת לשפר את הביצועים יש להגדיר memcache אם קיים. מידע נוסף ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a>.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom אינו ניתן לקריאה על ידי PHP אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.", + "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "כרגע המערכת מריצה PHP {version}. מומלץ מאוד לשדרג את גרסת ה- PHP vשלך כדי לנצל את <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">עדכוני הביצועים והאבטחה המופקים על ידי קבוצת ה- PHP</a> ברגע שההפצה אליך תתמוך בזה.", + "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.", + "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached מוגדר כמטמון מופץ, אבל מותקן מודול PHP \"memcache\" מוטעה. רק \\OC\\Memcache\\Memcached תומך ב- \"memcached\" אבל לא ב- \"memcache\". ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki בנושא שני המודולים</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "חלק מהקבצים לא עברו את בדיקת השלמות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו. (<a href=\"{codeIntegrityDownloadEndpoint}\">רשימה של קבצים לא תקינים…</a> / <a href=\"{rescanEndpoint}\">סריקה מחדש…</a>)", "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 <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "כותרת HTTP \"Strict-Transport-Security\" אינה מוגדרת לפחות \"{seconds}\" שניות. להגברת האבטחה אנו ממליצים לאפשר HSTS כפי שמוסבר ב- <a href=\"{docUrl}\" rel=\"noreferrer\">טיפים לאבטחה</a> שלנו.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "הנך נכנס לאתר באמצעות פרוטוקול HTTP. אנו ממליצים מאוד להגדיר את השרת לעבוד עם פרוטוקול HTTPS במקום כפי שמוסבר ב- <a href=\"{docUrl}\">טיפים לאבטחה</a> שלנו.", "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 <a href=\"{url}\">check our forum post</a> covering this issue." : "העדכון בוצע בהצלחה. למידע נוסף <a href=\"{url}\">ניתן לבדוק בהודעת הפורום שלנו</a> המכסה נושא זו.", @@ -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 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "לעזרה, ניתן לצפות ב<a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">מסמכי התיעוד</a>.", "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/core/l10n/nl.js b/core/l10n/nl.js index e7ab738e3ee..e291a8da92d 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 270cf9e471f..f2b0164df79 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/pl.js b/core/l10n/pl.js index 0a83da4f4c9..3b284163b4f 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.", + "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Sprawdzenie spójności kodu nie wykazało problemów. Więcej informacji…</a>", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentacji</a>.", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Aby uzyskać pomoc, zajrzyj do <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentacji</a>.", "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 d839ef91846..6833611713d 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.", + "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Sprawdzenie spójności kodu nie wykazało problemów. Więcej informacji…</a>", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentacji</a>.", "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 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Aby uzyskać pomoc, zajrzyj do <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentacji</a>.", "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/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index 9f3a5544996..e3ca88348c2 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 a8b39e0d377..5eb4c468ffc 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/ca.js b/lib/l10n/ca.js index 3a7f21787ec..d84d7284275 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ó", @@ -43,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", @@ -53,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 255f5abbe38..ac6dd35ea1d 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ó", @@ -41,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", @@ -51,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/lib/l10n/he.js b/lib/l10n/he.js index 35d2593ffef..bad99d5c638 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 d60e0486572..73481766e09 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/lib/l10n/sl.js b/lib/l10n/sl.js index e8e861af3c4..5e0e1fbcdbd 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 a05d62b1c39..48c9f69a86d 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/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js index 8951d48b5c3..a29b4adaa1e 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 c502c21ad8a..9b5f0af0742 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/lib/private/AllConfig.php b/lib/private/AllConfig.php index e082cea3305..c8b2009fcc7 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; } diff --git a/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php index d84e9963436..32a507623e3 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)) { - 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/apps/dav/appinfo/install.php b/lib/private/Authentication/Exceptions/PasswordLoginForbiddenException.php index d2ee06cc9fe..2e9f9534dbd 100644 --- a/apps/dav/appinfo/install.php +++ b/lib/private/Authentication/Exceptions/PasswordLoginForbiddenException.php @@ -1,7 +1,7 @@ <?php + /** - * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Christoph Wurst <christoph@owncloud.com> * * @copyright Copyright (c) 2016, ownCloud, Inc. * @license AGPL-3.0 @@ -20,7 +20,10 @@ * */ -use OCA\DAV\AppInfo\Application; +namespace OC\Authentication\Exceptions; + +use Exception; + +class PasswordLoginForbiddenException extends Exception { -$app = new Application(); -$app->generateBirthdays(); +} diff --git a/lib/private/Authentication/Token/DefaultTokenMapper.php b/lib/private/Authentication/Token/DefaultTokenMapper.php index c56a513b94c..9450ed6b9f3 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'); } diff --git a/lib/private/Authentication/TwoFactorAuth/Manager.php b/lib/private/Authentication/TwoFactorAuth/Manager.php index 805735bd1b8..6ca4fd065a6 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) { @@ -126,6 +128,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 * * @param string $providerId diff --git a/lib/private/Files/Cache/Updater.php b/lib/private/Files/Cache/Updater.php index 4e17c4d778d..361db4b3f85 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); + } + } + } /** diff --git a/lib/private/Files/Config/LazyStorageMountInfo.php b/lib/private/Files/Config/LazyStorageMountInfo.php index 654c5b2b23e..5df04c4b78e 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 edb1525b276..bc6ad1b34f0 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) { @@ -124,12 +135,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) { diff --git a/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php b/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php index 1f31e849446..5c72bfaa57c 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. ]; /** diff --git a/lib/private/Preview.php b/lib/private/Preview.php index f5e2f6b57e1..8bc262d7047 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(); @@ -422,11 +426,12 @@ class Preview { // .ocTransferId*.part file from chunked file upload. if (!empty($fileId)) { $previewPath = $this->getPreviewPath($fileId); - $this->userView->deleteAll($previewPath); $this->userView->rmdir($previewPath); } } } + + $propagator->commitBatch(); } /** @@ -573,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; @@ -1113,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; @@ -1127,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 */ @@ -1261,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); diff --git a/lib/private/Repair.php b/lib/private/Repair.php index bb2967d7e6e..2b33dc413b4 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; @@ -127,7 +128,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()), @@ -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->getLazyRootFolder()), ]; } diff --git a/lib/private/Repair/CleanTags.php b/lib/private/Repair/CleanTags.php index 60ddeff08f3..4241fa6da3a 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,12 +64,59 @@ 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 */ protected function deleteOrphanFileEntries(IOutput $output) { diff --git a/lib/private/Repair/RemoveRootShares.php b/lib/private/Repair/RemoveRootShares.php new file mode 100644 index 00000000000..89f797e3ef0 --- /dev/null +++ b/lib/private/Repair/RemoveRootShares.php @@ -0,0 +1,157 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @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 <http://www.gnu.org/licenses/> + * + */ +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/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 5921bbc44c8..2857a394e1e 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\File; +use OCP\Files\Folder; use OCP\Files\IRootFolder; +use OCP\Files\Mount\IMountManager; 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\IGroupManager; use OCP\IL10N; use OCP\ILogger; -use OCP\Security\ISecureRandom; +use OCP\IUserManager; 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\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(); } /** @@ -1212,6 +1215,14 @@ class Manager implements IManager { * @return bool */ public function sharingDisabledForUser($userId) { + if ($userId === null) { + return false; + } + + 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); @@ -1227,10 +1238,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/private/User/Session.php b/lib/private/User/Session.php index f560bb4bfc0..4e9c827448d 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; @@ -348,18 +349,18 @@ class Session implements IUserSession, Emitter { * * @param string $user * @param string $password + * @param IRequest $request * @throws LoginException + * @throws PasswordLoginForbiddenException * @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) - 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); @@ -368,9 +369,22 @@ class Session implements IUserSession, Emitter { } return false; } + + 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); } @@ -428,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']); - 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/lib/public/Util.php b/lib/public/Util.php index eb573168e10..687f4e78f69 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,19 @@ 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(); + } + + $user = \OC::$server->getUserSession()->getUser(); + if ($user !== null) { + $user = $user->getUID(); + } + + return self::$shareManager->sharingDisabledForUser($user); } /** diff --git a/ocs/v1.php b/ocs/v1.php index 9a09efc1de9..bbc2adf39b6 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(); diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js index c569f412b80..c89bafed900 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 e8729fe8729..6956f339122 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.", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index c987fc21a40..7075dcfff20 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 20a2e6a7f47..64d2fb9af8b 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 37f107eddf5..d7571a61475 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 1e9def0a309..7860c26b07e 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 03b0db0ff55..8d6e0d5c140 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 03391b7ee11..4c05b2862ae 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 65325f0fc22..fb86eed826e 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 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, compruebe de nuevo las <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">guías de instalación ↗</a>, y comprueba por cualquier error o advertencia en el <a href=\"#log-section\">Registro</a>", "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 982556abc9c..2c67d870ccd 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 <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, compruebe de nuevo las <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">guías de instalación ↗</a>, y comprueba por cualquier error o advertencia en el <a href=\"#log-section\">Registro</a>", "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/fr.js b/settings/l10n/fr.js index 9d9b9ed4692..3ad530cd138 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 2d5d305f551..dd781fde08c 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", diff --git a/settings/l10n/he.js b/settings/l10n/he.js index 976d5b7c81f..1b6d4616cbf 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 518da4bea59..ae81455336c 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 4e4efbf1100..265605305ce 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 02cec21158e..1c689f921c9 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...", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index 14208db3e99..23a8052f114 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 e70a1db8b8d..edaa1313e0e 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", diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index 79adbb02948..7278c7aa73b 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 a4608e9cd26..cc7022746ca 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", diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index 76033f082af..aef86d2d43b 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 914639ad0e6..b909c617c29 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 …", diff --git a/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php b/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php index a398dc2320c..54d2831d25f 100644 --- a/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php +++ b/tests/lib/AppFramework/Middleware/Security/CORSMiddlewareTest.php @@ -164,6 +164,31 @@ class CORSMiddlewareTest extends \Test\TestCase { * @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 + */ public function testCORSShouldNotAllowCookieAuth() { $request = new Request( ['server' => [ diff --git a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php index 363229b01bc..586fd3aaa2e 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()) @@ -83,6 +86,10 @@ class ManagerTest extends TestCase { '\OCA\MyCustom2faApp\FakeProvider', ], ])); + + $this->manager->expects($this->once()) + ->method('loadTwoFactorApp') + ->with('mycustom2faapp'); } /** @@ -94,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') diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php index 59b17b83958..87feb63888d 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() { diff --git a/tests/lib/Repair/CleanTagsTest.php b/tests/lib/Repair/CleanTagsTest.php index 804fa4f66c9..ac79907c525 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), ]) diff --git a/tests/lib/Repair/RemoveRootSharesTest.php b/tests/lib/Repair/RemoveRootSharesTest.php new file mode 100644 index 00000000000..bf255fc7e9b --- /dev/null +++ b/tests/lib/Repair/RemoveRootSharesTest.php @@ -0,0 +1,194 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @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 <http://www.gnu.org/licenses/> + * + */ +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(); + } +} diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index eac38ebba16..7a34d42a2bc 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -306,16 +306,21 @@ class SessionTest extends \Test\TestCase { $userSession->login('foo', 'bar'); } + /** + * @expectedException \OC\Authentication\Exceptions\PasswordLoginForbiddenException + */ public function testLogClientInNoTokenPasswordWith2fa() { $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(['login']) + ->setMethods(['login', 'supportsCookies', 'createSessionToken', 'getUser']) ->getMock(); $this->tokenProvider->expects($this->once()) @@ -327,15 +332,58 @@ class SessionTest extends \Test\TestCase { ->with('token_auth_enforced', false) ->will($this->returnValue(true)); - $this->assertFalse($userSession->logClientIn('john', 'doe')); + $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)); } + /** + * @expectedException \OC\Authentication\Exceptions\PasswordLoginForbiddenException + */ public function testLogClientInNoTokenPasswordNo2fa() { $manager = $this->getMockBuilder('\OC\User\Manager') ->disableOriginalConstructor() ->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 +405,7 @@ class SessionTest extends \Test\TestCase { ->with('john') ->will($this->returnValue(true)); - $this->assertFalse($userSession->logClientIn('john', 'doe')); + $userSession->logClientIn('john', 'doe', $request); } public function testRememberLoginValidToken() { |