summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/lib/connector/sabre/file.php21
-rw-r--r--apps/dav/lib/connector/sabre/lockplugin.php4
-rw-r--r--apps/dav/tests/travis/litmus-v1.sh23
-rw-r--r--apps/dav/tests/travis/litmus-v2.sh23
-rw-r--r--apps/dav/tests/unit/connector/sabre/file.php10
-rw-r--r--apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php82
-rw-r--r--apps/encryption/appinfo/application.php3
-rw-r--r--apps/encryption/appinfo/routes.php5
-rw-r--r--apps/encryption/controller/settingscontroller.php21
-rw-r--r--apps/encryption/js/settings-admin.js9
-rw-r--r--apps/encryption/l10n/fr.js2
-rw-r--r--apps/encryption/l10n/fr.json2
-rw-r--r--apps/encryption/l10n/it.js2
-rw-r--r--apps/encryption/l10n/it.json2
-rw-r--r--apps/encryption/l10n/pt_BR.js2
-rw-r--r--apps/encryption/l10n/pt_BR.json2
-rw-r--r--apps/encryption/l10n/ru.js2
-rw-r--r--apps/encryption/l10n/ru.json2
-rw-r--r--apps/encryption/l10n/sq.js2
-rw-r--r--apps/encryption/l10n/sq.json2
-rw-r--r--apps/encryption/l10n/zh_TW.js31
-rw-r--r--apps/encryption/l10n/zh_TW.json31
-rw-r--r--apps/encryption/lib/crypto/encryption.php6
-rw-r--r--apps/encryption/lib/util.php42
-rw-r--r--apps/encryption/settings/settings-admin.php15
-rw-r--r--apps/encryption/templates/settings-admin.php103
-rw-r--r--apps/encryption/tests/controller/SettingsControllerTest.php16
-rw-r--r--apps/encryption/tests/lib/UtilTest.php52
-rw-r--r--apps/encryption/tests/lib/crypto/encryptionTest.php36
-rw-r--r--apps/files/l10n/lv.js2
-rw-r--r--apps/files/l10n/lv.json2
-rw-r--r--apps/files/l10n/oc.js11
-rw-r--r--apps/files/l10n/oc.json11
-rw-r--r--apps/files_external/l10n/fr.js2
-rw-r--r--apps/files_external/l10n/fr.json2
-rw-r--r--apps/files_external/l10n/ja.js3
-rw-r--r--apps/files_external/l10n/ja.json3
-rw-r--r--apps/files_external/l10n/lv.js1
-rw-r--r--apps/files_external/l10n/lv.json1
-rw-r--r--apps/files_external/l10n/ru.js1
-rw-r--r--apps/files_external/l10n/ru.json1
-rw-r--r--apps/files_external/l10n/zh_TW.js62
-rw-r--r--apps/files_external/l10n/zh_TW.json62
-rw-r--r--apps/files_external/lib/amazons3.php21
-rw-r--r--apps/files_external/lib/dropbox.php12
-rw-r--r--apps/files_external/lib/swift.php12
-rw-r--r--apps/files_sharing/l10n/ja.js13
-rw-r--r--apps/files_sharing/l10n/ja.json13
-rw-r--r--apps/files_sharing/l10n/lv.js1
-rw-r--r--apps/files_sharing/l10n/lv.json1
-rw-r--r--apps/files_sharing/l10n/zh_TW.js1
-rw-r--r--apps/files_sharing/l10n/zh_TW.json1
-rw-r--r--apps/files_trashbin/l10n/zh_TW.js6
-rw-r--r--apps/files_trashbin/l10n/zh_TW.json6
-rw-r--r--apps/user_ldap/lib/access.php3
-rw-r--r--apps/user_ldap/lib/user/user.php6
-rw-r--r--apps/user_ldap/tests/access.php16
-rw-r--r--apps/user_ldap/tests/user/user.php39
58 files changed, 734 insertions, 134 deletions
diff --git a/apps/dav/lib/connector/sabre/file.php b/apps/dav/lib/connector/sabre/file.php
index 9e515cdc687..961532daf50 100644
--- a/apps/dav/lib/connector/sabre/file.php
+++ b/apps/dav/lib/connector/sabre/file.php
@@ -349,6 +349,7 @@ class File extends Node implements IFile {
if (empty($info)) {
throw new NotImplemented('Invalid chunk name');
}
+
$chunk_handler = new \OC_FileChunking($info);
$bytesWritten = $chunk_handler->store($info['index'], $data);
@@ -376,15 +377,17 @@ class File extends Node implements IFile {
$exists = $this->fileView->file_exists($targetPath);
try {
- $this->emitPreHooks($exists, $targetPath);
+ $this->fileView->lockFile($targetPath, ILockingProvider::LOCK_SHARED);
- $this->changeLock(ILockingProvider::LOCK_EXCLUSIVE);
+ $this->emitPreHooks($exists, $targetPath);
+ $this->fileView->changeLock($targetPath, ILockingProvider::LOCK_EXCLUSIVE);
+ /** @var \OC\Files\Storage\Storage $targetStorage */
+ list($targetStorage, $targetInternalPath) = $this->fileView->resolvePath($targetPath);
if ($needsPartFile) {
// we first assembly the target file as a part file
$partFile = $path . '/' . $info['name'] . '.ocTransferId' . $info['transferid'] . '.part';
-
-
+ /** @var \OC\Files\Storage\Storage $targetStorage */
list($partStorage, $partInternalPath) = $this->fileView->resolvePath($partFile);
@@ -392,8 +395,7 @@ class File extends Node implements IFile {
// here is the final atomic rename
$renameOkay = $targetStorage->moveFromStorage($partStorage, $partInternalPath, $targetInternalPath);
-
- $fileExists = $this->fileView->file_exists($targetPath);
+ $fileExists = $targetStorage->file_exists($targetInternalPath);
if ($renameOkay === false || $fileExists === false) {
\OCP\Util::writeLog('webdav', '\OC\Files\Filesystem::rename() failed', \OCP\Util::ERROR);
// only delete if an error occurred and the target file was already created
@@ -403,7 +405,7 @@ class File extends Node implements IFile {
$partFile = null;
$targetStorage->unlink($targetInternalPath);
}
- $this->changeLock(ILockingProvider::LOCK_SHARED);
+ $this->fileView->changeLock($targetPath, ILockingProvider::LOCK_SHARED);
throw new Exception('Could not rename part file assembled from chunks');
}
} else {
@@ -419,7 +421,7 @@ class File extends Node implements IFile {
}
}
- $this->changeLock(ILockingProvider::LOCK_SHARED);
+ $this->fileView->changeLock($targetPath, ILockingProvider::LOCK_SHARED);
// since we skipped the view we need to scan and emit the hooks ourselves
$this->fileView->getUpdater()->update($targetPath);
@@ -427,6 +429,9 @@ class File extends Node implements IFile {
$this->emitPostHooks($exists, $targetPath);
$info = $this->fileView->getFileInfo($targetPath);
+
+ $this->fileView->unlockFile($targetPath, ILockingProvider::LOCK_SHARED);
+
return $info->getEtag();
} catch (\Exception $e) {
if ($partFile !== null) {
diff --git a/apps/dav/lib/connector/sabre/lockplugin.php b/apps/dav/lib/connector/sabre/lockplugin.php
index c564e066f8e..5840e59854c 100644
--- a/apps/dav/lib/connector/sabre/lockplugin.php
+++ b/apps/dav/lib/connector/sabre/lockplugin.php
@@ -62,7 +62,7 @@ class LockPlugin extends ServerPlugin {
public function getLock(RequestInterface $request) {
// we cant listen on 'beforeMethod:PUT' due to order of operations with setting up the tree
// so instead we limit ourselves to the PUT method manually
- if ($request->getMethod() !== 'PUT') {
+ if ($request->getMethod() !== 'PUT' || isset($_SERVER['HTTP_OC_CHUNKED'])) {
return;
}
try {
@@ -80,7 +80,7 @@ class LockPlugin extends ServerPlugin {
}
public function releaseLock(RequestInterface $request) {
- if ($request->getMethod() !== 'PUT') {
+ if ($request->getMethod() !== 'PUT' || isset($_SERVER['HTTP_OC_CHUNKED'])) {
return;
}
try {
diff --git a/apps/dav/tests/travis/litmus-v1.sh b/apps/dav/tests/travis/litmus-v1.sh
new file mode 100644
index 00000000000..ab0690f392e
--- /dev/null
+++ b/apps/dav/tests/travis/litmus-v1.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+SCRIPT=`realpath $0`
+SCRIPTPATH=`dirname $SCRIPT`
+
+
+# start the server
+php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../.." &
+
+
+# compile litmus
+if [ ! -f /tmp/litmus/litmus-0.13.tar.gz ]; then
+ mkdir -p /tmp/litmus
+ wget -O /tmp/litmus/litmus-0.13.tar.gz http://www.webdav.org/neon/litmus/litmus-0.13.tar.gz
+ cd /tmp/litmus
+ tar -xzf litmus-0.13.tar.gz
+ cd /tmp/litmus/litmus-0.13
+ ./configure
+ make
+fi
+
+# run the tests
+cd /tmp/litmus/litmus-0.13
+make URL=http://127.0.0.1:8888/remote.php/webdav CREDS="admin admin" TESTS="basic copymove props locks" check
diff --git a/apps/dav/tests/travis/litmus-v2.sh b/apps/dav/tests/travis/litmus-v2.sh
new file mode 100644
index 00000000000..892ad327d3b
--- /dev/null
+++ b/apps/dav/tests/travis/litmus-v2.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+SCRIPT=`realpath $0`
+SCRIPTPATH=`dirname $SCRIPT`
+
+
+# start the server
+php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../.." &
+
+
+# compile litmus
+if [ ! -f /tmp/litmus/litmus-0.13.tar.gz ]; then
+ mkdir -p /tmp/litmus
+ wget -O /tmp/litmus/litmus-0.13.tar.gz http://www.webdav.org/neon/litmus/litmus-0.13.tar.gz
+ cd /tmp/litmus
+ tar -xzf litmus-0.13.tar.gz
+ cd /tmp/litmus/litmus-0.13
+ ./configure
+ make
+fi
+
+# run the tests
+cd /tmp/litmus/litmus-0.13
+make URL=http://127.0.0.1:8888/remote.php/dav/files/admin CREDS="admin admin" TESTS="basic copymove props locks" check
diff --git a/apps/dav/tests/unit/connector/sabre/file.php b/apps/dav/tests/unit/connector/sabre/file.php
index 9171fc3b786..d874b7f33c2 100644
--- a/apps/dav/tests/unit/connector/sabre/file.php
+++ b/apps/dav/tests/unit/connector/sabre/file.php
@@ -200,7 +200,9 @@ class File extends \Test\TestCase {
$file = new \OCA\DAV\Connector\Sabre\File($view, $info);
// put first chunk
+ $file->acquireLock(ILockingProvider::LOCK_SHARED);
$this->assertNull($file->put('test data one'));
+ $file->releaseLock(ILockingProvider::LOCK_SHARED);
$info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-1', null, null, [
'permissions' => \OCP\Constants::PERMISSION_ALL
@@ -443,12 +445,12 @@ class File extends \Test\TestCase {
$thrown = false;
try {
// beforeMethod locks
- $view->lockFile('/test.txt', ILockingProvider::LOCK_SHARED);
+ $file->acquireLock(ILockingProvider::LOCK_SHARED);
$file->put($this->getStream('test data'));
// afterMethod unlocks
- $view->unlockFile('/test.txt', ILockingProvider::LOCK_SHARED);
+ $file->releaseLock(ILockingProvider::LOCK_SHARED);
} catch (\Sabre\DAV\Exception\BadRequest $e) {
$thrown = true;
}
@@ -505,7 +507,9 @@ class File extends \Test\TestCase {
'permissions' => \OCP\Constants::PERMISSION_ALL
], null);
$file = new \OCA\DAV\Connector\Sabre\File($view, $info);
+ $file->acquireLock(ILockingProvider::LOCK_SHARED);
$this->assertNull($file->put('test data one'));
+ $file->releaseLock(ILockingProvider::LOCK_SHARED);
$info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-1', null, null, [
'permissions' => \OCP\Constants::PERMISSION_ALL
@@ -515,7 +519,9 @@ class File extends \Test\TestCase {
// action
$thrown = false;
try {
+ $file->acquireLock(ILockingProvider::LOCK_SHARED);
$file->put($this->getStream('test data'));
+ $file->releaseLock(ILockingProvider::LOCK_SHARED);
} catch (\OCA\DAV\Connector\Sabre\Exception\FileLocked $e) {
$thrown = true;
}
diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php
index 9a067f230a3..a2a8326f4ff 100644
--- a/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php
+++ b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php
@@ -8,7 +8,9 @@
namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest;
-use OC\AppFramework\Http;
+use OC\Connector\Sabre\Exception\FileLocked;
+use OCP\AppFramework\Http;
+use OCP\Lock\ILockingProvider;
class UploadTest extends RequestTest {
public function testBasicUpload() {
@@ -43,6 +45,34 @@ class UploadTest extends RequestTest {
$this->assertEquals(3, $info->getSize());
}
+ /**
+ * @expectedException \OCA\DAV\Connector\Sabre\Exception\FileLocked
+ */
+ public function testUploadOverWriteReadLocked() {
+ $user = $this->getUniqueID();
+ $view = $this->setupUser($user, 'pass');
+
+ $view->file_put_contents('foo.txt', 'bar');
+
+ $view->lockFile('/foo.txt', ILockingProvider::LOCK_SHARED);
+
+ $this->request($view, $user, 'pass', 'PUT', '/foo.txt', 'asd');
+ }
+
+ /**
+ * @expectedException \OCA\DAV\Connector\Sabre\Exception\FileLocked
+ */
+ public function testUploadOverWriteWriteLocked() {
+ $user = $this->getUniqueID();
+ $view = $this->setupUser($user, 'pass');
+
+ $view->file_put_contents('foo.txt', 'bar');
+
+ $view->lockFile('/foo.txt', ILockingProvider::LOCK_EXCLUSIVE);
+
+ $this->request($view, $user, 'pass', 'PUT', '/foo.txt', 'asd');
+ }
+
public function testChunkedUpload() {
$user = $this->getUniqueID();
$view = $this->setupUser($user, 'pass');
@@ -107,4 +137,54 @@ class UploadTest extends RequestTest {
$this->assertInstanceOf('\OC\Files\FileInfo', $info);
$this->assertEquals(6, $info->getSize());
}
+
+ /**
+ * @expectedException \OCA\DAV\Connector\Sabre\Exception\FileLocked
+ */
+ public function testChunkedUploadOutOfOrderReadLocked() {
+ $user = $this->getUniqueID();
+ $view = $this->setupUser($user, 'pass');
+
+ $this->assertFalse($view->file_exists('foo.txt'));
+
+ $view->lockFile('/foo.txt', ILockingProvider::LOCK_SHARED);
+
+ try {
+ $response = $this->request($view, $user, 'pass', 'PUT', '/foo.txt-chunking-123-2-1', 'bar', ['OC-Chunked' => '1']);
+ } catch (\OCA\DAV\Connector\Sabre\Exception\FileLocked $e) {
+ $this->fail('Didn\'t expect locked error for the first chunk on read lock');
+ return;
+ }
+
+ $this->assertEquals(Http::STATUS_CREATED, $response->getStatus());
+ $this->assertFalse($view->file_exists('foo.txt'));
+
+ // last chunk should trigger the locked error since it tries to assemble
+ $this->request($view, $user, 'pass', 'PUT', '/foo.txt-chunking-123-2-0', 'asd', ['OC-Chunked' => '1']);
+ }
+
+ /**
+ * @expectedException \OCA\DAV\Connector\Sabre\Exception\FileLocked
+ */
+ public function testChunkedUploadOutOfOrderWriteLocked() {
+ $user = $this->getUniqueID();
+ $view = $this->setupUser($user, 'pass');
+
+ $this->assertFalse($view->file_exists('foo.txt'));
+
+ $view->lockFile('/foo.txt', ILockingProvider::LOCK_EXCLUSIVE);
+
+ try {
+ $response = $this->request($view, $user, 'pass', 'PUT', '/foo.txt-chunking-123-2-1', 'bar', ['OC-Chunked' => '1']);
+ } catch (\OCA\DAV\Connector\Sabre\Exception\FileLocked $e) {
+ $this->fail('Didn\'t expect locked error for the first chunk on write lock'); // maybe forbid this in the future for write locks only?
+ return;
+ }
+
+ $this->assertEquals(Http::STATUS_CREATED, $response->getStatus());
+ $this->assertFalse($view->file_exists('foo.txt'));
+
+ // last chunk should trigger the locked error since it tries to assemble
+ $this->request($view, $user, 'pass', 'PUT', '/foo.txt-chunking-123-2-0', 'asd', ['OC-Chunked' => '1']);
+ }
}
diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php
index 812f1042a8f..6275047252e 100644
--- a/apps/encryption/appinfo/application.php
+++ b/apps/encryption/appinfo/application.php
@@ -201,7 +201,8 @@ class Application extends \OCP\AppFramework\App {
$c->query('KeyManager'),
$c->query('Crypt'),
$c->query('Session'),
- $server->getSession()
+ $server->getSession(),
+ $c->query('Util')
);
});
diff --git a/apps/encryption/appinfo/routes.php b/apps/encryption/appinfo/routes.php
index 8fa163d0751..260337361e8 100644
--- a/apps/encryption/appinfo/routes.php
+++ b/apps/encryption/appinfo/routes.php
@@ -36,6 +36,11 @@ namespace OCA\Encryption\AppInfo;
'verb' => 'POST'
],
[
+ 'name' => 'Settings#setEncryptHomeStorage',
+ 'url' => '/ajax/setEncryptHomeStorage',
+ 'verb' => 'POST'
+ ],
+ [
'name' => 'Recovery#changeRecoveryPassword',
'url' => '/ajax/changeRecoveryPassword',
'verb' => 'POST'
diff --git a/apps/encryption/controller/settingscontroller.php b/apps/encryption/controller/settingscontroller.php
index e5bb79a1d40..59e23087b3a 100644
--- a/apps/encryption/controller/settingscontroller.php
+++ b/apps/encryption/controller/settingscontroller.php
@@ -25,6 +25,7 @@ namespace OCA\Encryption\Controller;
use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\KeyManager;
use OCA\Encryption\Session;
+use OCA\Encryption\Util;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
@@ -57,6 +58,9 @@ class SettingsController extends Controller {
/** @var ISession */
private $ocSession;
+ /** @var Util */
+ private $util;
+
/**
* @param string $AppName
* @param IRequest $request
@@ -67,6 +71,7 @@ class SettingsController extends Controller {
* @param Crypt $crypt
* @param Session $session
* @param ISession $ocSession
+ * @param Util $util
*/
public function __construct($AppName,
IRequest $request,
@@ -76,7 +81,9 @@ class SettingsController extends Controller {
KeyManager $keyManager,
Crypt $crypt,
Session $session,
- ISession $ocSession) {
+ ISession $ocSession,
+ Util $util
+) {
parent::__construct($AppName, $request);
$this->l = $l10n;
$this->userSession = $userSession;
@@ -85,6 +92,7 @@ class SettingsController extends Controller {
$this->crypt = $crypt;
$this->session = $session;
$this->ocSession = $ocSession;
+ $this->util = $util;
}
@@ -143,4 +151,15 @@ class SettingsController extends Controller {
}
}
+
+ /**
+ * @UseSession
+ *
+ * @param bool $encryptHomeStorage
+ * @return DataResponse
+ */
+ public function setEncryptHomeStorage($encryptHomeStorage) {
+ $this->util->setEncryptHomeStorage($encryptHomeStorage);
+ return new DataResponse();
+ }
}
diff --git a/apps/encryption/js/settings-admin.js b/apps/encryption/js/settings-admin.js
index 39923718c21..9b00a4ec627 100644
--- a/apps/encryption/js/settings-admin.js
+++ b/apps/encryption/js/settings-admin.js
@@ -76,4 +76,13 @@ $(document).ready(function () {
});
});
+ $('#encryptHomeStorage').change(function() {
+ $.post(
+ OC.generateUrl('/apps/encryption/ajax/setEncryptHomeStorage'),
+ {
+ encryptHomeStorage: this.checked
+ }
+ );
+ });
+
});
diff --git a/apps/encryption/l10n/fr.js b/apps/encryption/l10n/fr.js
index f6016cc3ce6..59a36a73d7b 100644
--- a/apps/encryption/l10n/fr.js
+++ b/apps/encryption/l10n/fr.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"The share will expire on %s." : "Le partage expirera le %s.",
"Cheers!" : "À bientôt !",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Bonjour,\n<br><br>\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe suivant :\n\n<p style=\"font-family: monospace;\"><b>%s</b></p>\n\n<p>\nVeuillez suivre ces instructions :\n<ol>\n<li>Connectez-vous à l'interface web et trouvez la section <em>\"Module de chiffrement de base d'ownCloud\"</em> dans vos paramètres personnels;</li>\n<li>Entrez le mot de passe fourni ci-dessus dans le champ <em>\"Ancien mot de passe de connexion\"</em>;</li>\n<li>Entrez le mot de passe que vous utilisez actuellement pour vous connecter dans le champ <em>\"Actuel mot de passe de connexion\"</em>;</li>\n<li>Validez en cliquant sur le bouton <em>\"Mettre à jour le mot de passe de votre clef privée\"</em>.</li>\n</ol>\n</p>",
+ "Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'activation de cette option chiffre tous les fichiers du stockage principal, sinon seuls les espaces de stockage externes seront chiffrés",
"Enable recovery key" : "Activer la clé de récupération",
"Disable recovery key" : "Désactiver la clé de récupération",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clé de récupération est une clé supplémentaire utilisée pour chiffrer les fichiers. Elle permet de récupérer les fichiers des utilisateurs s'ils oublient leur mot de passe.",
diff --git a/apps/encryption/l10n/fr.json b/apps/encryption/l10n/fr.json
index 54a7431db30..b1fcfb35b27 100644
--- a/apps/encryption/l10n/fr.json
+++ b/apps/encryption/l10n/fr.json
@@ -30,6 +30,8 @@
"The share will expire on %s." : "Le partage expirera le %s.",
"Cheers!" : "À bientôt !",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Bonjour,\n<br><br>\nL'administrateur a activé le chiffrement sur le serveur. Vos fichiers ont été chiffrés avec le mot de passe suivant :\n\n<p style=\"font-family: monospace;\"><b>%s</b></p>\n\n<p>\nVeuillez suivre ces instructions :\n<ol>\n<li>Connectez-vous à l'interface web et trouvez la section <em>\"Module de chiffrement de base d'ownCloud\"</em> dans vos paramètres personnels;</li>\n<li>Entrez le mot de passe fourni ci-dessus dans le champ <em>\"Ancien mot de passe de connexion\"</em>;</li>\n<li>Entrez le mot de passe que vous utilisez actuellement pour vous connecter dans le champ <em>\"Actuel mot de passe de connexion\"</em>;</li>\n<li>Validez en cliquant sur le bouton <em>\"Mettre à jour le mot de passe de votre clef privée\"</em>.</li>\n</ol>\n</p>",
+ "Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'activation de cette option chiffre tous les fichiers du stockage principal, sinon seuls les espaces de stockage externes seront chiffrés",
"Enable recovery key" : "Activer la clé de récupération",
"Disable recovery key" : "Désactiver la clé de récupération",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La clé de récupération est une clé supplémentaire utilisée pour chiffrer les fichiers. Elle permet de récupérer les fichiers des utilisateurs s'ils oublient leur mot de passe.",
diff --git a/apps/encryption/l10n/it.js b/apps/encryption/l10n/it.js
index 9f94b409f57..699e4babd01 100644
--- a/apps/encryption/l10n/it.js
+++ b/apps/encryption/l10n/it.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"The share will expire on %s." : "La condivisione scadrà il %s.",
"Cheers!" : "Saluti!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Ciao,<br><br>l'amministratore ha abilitato la cifratura lato server. I tuoi file sono stati cifrati utilizzando la password <strong>%s</strong>.<br><br>Accedi all'interfaccia web, vai alla sezione \"modulo di cifratura base di ownCloud\" dalle nelle tue impostazioni personali e aggiorna la tua password di cifratura digitando la password nel campo \"vecchia password di accesso\" e la tua nuova password.",
+ "Encrypt the home storage" : "Cifra l'archiviazione principale",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'abilitazione di questa opzione cifra tutti i file memorizzati sull'archiviazione principale, altrimenti saranno cifrati solo i file sull'archiviazione esterna.",
"Enable recovery key" : "Abilita chiave di ripristino",
"Disable recovery key" : "Disabilita chiave di ripristino",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La chiave di ripristino è una chiave di cifratura aggiuntiva utilizzata per cifrare i file. Consente di ripristinare i file di un utente se l'utente dimentica la propria password.",
diff --git a/apps/encryption/l10n/it.json b/apps/encryption/l10n/it.json
index a117af8a317..b86893303c2 100644
--- a/apps/encryption/l10n/it.json
+++ b/apps/encryption/l10n/it.json
@@ -30,6 +30,8 @@
"The share will expire on %s." : "La condivisione scadrà il %s.",
"Cheers!" : "Saluti!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Ciao,<br><br>l'amministratore ha abilitato la cifratura lato server. I tuoi file sono stati cifrati utilizzando la password <strong>%s</strong>.<br><br>Accedi all'interfaccia web, vai alla sezione \"modulo di cifratura base di ownCloud\" dalle nelle tue impostazioni personali e aggiorna la tua password di cifratura digitando la password nel campo \"vecchia password di accesso\" e la tua nuova password.",
+ "Encrypt the home storage" : "Cifra l'archiviazione principale",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'abilitazione di questa opzione cifra tutti i file memorizzati sull'archiviazione principale, altrimenti saranno cifrati solo i file sull'archiviazione esterna.",
"Enable recovery key" : "Abilita chiave di ripristino",
"Disable recovery key" : "Disabilita chiave di ripristino",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La chiave di ripristino è una chiave di cifratura aggiuntiva utilizzata per cifrare i file. Consente di ripristinare i file di un utente se l'utente dimentica la propria password.",
diff --git a/apps/encryption/l10n/pt_BR.js b/apps/encryption/l10n/pt_BR.js
index 09ed1910c1a..334bbf05282 100644
--- a/apps/encryption/l10n/pt_BR.js
+++ b/apps/encryption/l10n/pt_BR.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"The share will expire on %s." : "O compartilhamento irá expirar em %s.",
"Cheers!" : "Saúde!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador habilitou criptografia-lado-servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor faça o login para a interface da Web, vá para a seção 'ownCloud módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua atual senha-de-login..<br><br>",
+ "Encrypt the home storage" : "Criptografar a pasta de armazenamento home",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativar essa opção de criptografia para todos os arquivos armazenados no armazenamento principal, caso contrário, apenas arquivos no armazenamento externo serão criptografados",
"Enable recovery key" : "Habilitar recuperação de chave",
"Disable recovery key" : "Dasabilitar chave de recuperação",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar arquivos. Ela permite a recuperação de arquivos de um usuário esquecer sua senha.",
diff --git a/apps/encryption/l10n/pt_BR.json b/apps/encryption/l10n/pt_BR.json
index 1682ec44b28..794eb478c74 100644
--- a/apps/encryption/l10n/pt_BR.json
+++ b/apps/encryption/l10n/pt_BR.json
@@ -30,6 +30,8 @@
"The share will expire on %s." : "O compartilhamento irá expirar em %s.",
"Cheers!" : "Saúde!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador habilitou criptografia-lado-servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor faça o login para a interface da Web, vá para a seção 'ownCloud módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua atual senha-de-login..<br><br>",
+ "Encrypt the home storage" : "Criptografar a pasta de armazenamento home",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativar essa opção de criptografia para todos os arquivos armazenados no armazenamento principal, caso contrário, apenas arquivos no armazenamento externo serão criptografados",
"Enable recovery key" : "Habilitar recuperação de chave",
"Disable recovery key" : "Dasabilitar chave de recuperação",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar arquivos. Ela permite a recuperação de arquivos de um usuário esquecer sua senha.",
diff --git a/apps/encryption/l10n/ru.js b/apps/encryption/l10n/ru.js
index b326b71456d..ae2c1d1f4e0 100644
--- a/apps/encryption/l10n/ru.js
+++ b/apps/encryption/l10n/ru.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"The share will expire on %s." : "Доступ будет закрыт %s",
"Cheers!" : "Всего наилучшего!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Привет,<br><br>администратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы с помощью пароля <strong>%s</strong>.<br><br>Пожалуйста войдите в веб-приложение, в разделе \"ownCloud простой модуль шифрования\" в личных настройках вам нужно обновить пароль шифрования.<br><br>",
+ "Encrypt the home storage" : "Зашифровать домашнюю директорию",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Данный параметр позволяет зашифровать все файлы, хранящиеся в главном хранилище, иначе только файлы на внешних хранилищах будут зашифрованы",
"Enable recovery key" : "Включить ключ восстановления",
"Disable recovery key" : "Отключить ключ восстановления",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Ключ восстановления это дополнительный ключ, который используется для шифрования файлов. Он позволяет восстановить пользовательские файлы в случае утери пароля.",
diff --git a/apps/encryption/l10n/ru.json b/apps/encryption/l10n/ru.json
index f4a14cb841f..87cb27d1e4a 100644
--- a/apps/encryption/l10n/ru.json
+++ b/apps/encryption/l10n/ru.json
@@ -30,6 +30,8 @@
"The share will expire on %s." : "Доступ будет закрыт %s",
"Cheers!" : "Всего наилучшего!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Привет,<br><br>администратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы с помощью пароля <strong>%s</strong>.<br><br>Пожалуйста войдите в веб-приложение, в разделе \"ownCloud простой модуль шифрования\" в личных настройках вам нужно обновить пароль шифрования.<br><br>",
+ "Encrypt the home storage" : "Зашифровать домашнюю директорию",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Данный параметр позволяет зашифровать все файлы, хранящиеся в главном хранилище, иначе только файлы на внешних хранилищах будут зашифрованы",
"Enable recovery key" : "Включить ключ восстановления",
"Disable recovery key" : "Отключить ключ восстановления",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Ключ восстановления это дополнительный ключ, который используется для шифрования файлов. Он позволяет восстановить пользовательские файлы в случае утери пароля.",
diff --git a/apps/encryption/l10n/sq.js b/apps/encryption/l10n/sq.js
index d18e8bcbbfd..e608fb368f8 100644
--- a/apps/encryption/l10n/sq.js
+++ b/apps/encryption/l10n/sq.js
@@ -32,6 +32,8 @@ OC.L10N.register(
"The share will expire on %s." : "Ndarja do të skadojë më %s.",
"Cheers!" : "Gëzuar!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Njatjeta,<br><br>përgjegjësi aktivizoi fshehtëzim më anë shërbyesi. Kartelat tuaja qenë fshehtëzuar duke përdorur fjalëkalimin <strong>%s</strong>.<br><br>Ju lutemi, bëni hyrjen te ndërfaqja web, kaloni te ndarja \"modul i thjeshtë ownCloud për fshehtëzime\" e rregullimeve tuaja personale dhe përditësoni fjalëkalimin tuaj për fshehtëzime duke dhënë këtë fjalëkalim te fusha \"old log-in password\" dhe fjalëkalimin tuaj të tanishëm për hyrjet.<br><br>",
+ "Encrypt the home storage" : "Fshehtëzo depozitën bazë",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivizimi i kësaj mundësie fshehtëzon krejt kartelat e depozituara në depon bazë, përndryshe do të fshehtëzohen vetëm kartelat në depozitën e jashtme",
"Enable recovery key" : "Aktivizo kyç rimarrjesh",
"Disable recovery key" : "Çaktivizo kyç rimarrjesh",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kyçi i rimarrjeve është një kyç ekstra fshehtëzimesh që përdoret për të fshehtëzuar kartela. Ai lejon rimarrjen e një kartele të përdoruesit, nëse përdoruesi harron fjalëkalimin e vet.",
diff --git a/apps/encryption/l10n/sq.json b/apps/encryption/l10n/sq.json
index 7415195f955..2319f03ae4f 100644
--- a/apps/encryption/l10n/sq.json
+++ b/apps/encryption/l10n/sq.json
@@ -30,6 +30,8 @@
"The share will expire on %s." : "Ndarja do të skadojë më %s.",
"Cheers!" : "Gëzuar!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Njatjeta,<br><br>përgjegjësi aktivizoi fshehtëzim më anë shërbyesi. Kartelat tuaja qenë fshehtëzuar duke përdorur fjalëkalimin <strong>%s</strong>.<br><br>Ju lutemi, bëni hyrjen te ndërfaqja web, kaloni te ndarja \"modul i thjeshtë ownCloud për fshehtëzime\" e rregullimeve tuaja personale dhe përditësoni fjalëkalimin tuaj për fshehtëzime duke dhënë këtë fjalëkalim te fusha \"old log-in password\" dhe fjalëkalimin tuaj të tanishëm për hyrjet.<br><br>",
+ "Encrypt the home storage" : "Fshehtëzo depozitën bazë",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivizimi i kësaj mundësie fshehtëzon krejt kartelat e depozituara në depon bazë, përndryshe do të fshehtëzohen vetëm kartelat në depozitën e jashtme",
"Enable recovery key" : "Aktivizo kyç rimarrjesh",
"Disable recovery key" : "Çaktivizo kyç rimarrjesh",
"The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kyçi i rimarrjeve është një kyç ekstra fshehtëzimesh që përdoret për të fshehtëzuar kartela. Ai lejon rimarrjen e një kartele të përdoruesit, nëse përdoruesi harron fjalëkalimin e vet.",
diff --git a/apps/encryption/l10n/zh_TW.js b/apps/encryption/l10n/zh_TW.js
index 17893b44b67..d0c1e3dfee8 100644
--- a/apps/encryption/l10n/zh_TW.js
+++ b/apps/encryption/l10n/zh_TW.js
@@ -1,21 +1,52 @@
OC.L10N.register(
"encryption",
{
+ "Missing recovery key password" : "遺失還原金鑰密碼",
+ "Please repeat the recovery key password" : "請您再輸入新的還原金鑰密碼一次",
+ "Repeated recovery key password does not match the provided recovery key password" : "輸入的還原金鑰密碼與設定的並不相符",
"Recovery key successfully enabled" : "還原金鑰已成功開啟",
"Could not enable recovery key. Please check your recovery key password!" : "無法啟用還原金鑰。請檢查您的還原金鑰密碼!",
"Recovery key successfully disabled" : "還原金鑰已成功停用",
"Could not disable recovery key. Please check your recovery key password!" : "無法停用還原金鑰。請檢查您的還原金鑰密碼!",
+ "Missing parameters" : "遺失參數",
+ "Please provide the old recovery password" : "請提供舊的還原密碼",
+ "Please provide a new recovery password" : "請提供新的還原密碼",
+ "Please repeat the new recovery password" : "請您再輸入新的還原密碼",
"Password successfully changed." : "成功變更密碼。",
"Could not change the password. Maybe the old password was not correct." : "無法變更密碼,或許是輸入的舊密碼不正確。",
+ "Recovery Key disabled" : "還原金鑰停用",
+ "Recovery Key enabled" : "還原金鑰啟用",
+ "Could not enable the recovery key, please try again or contact your administrator" : "無法啟用還原金鑰功能,請重試或聯絡系統管理員",
+ "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." : "私人金鑰密碼已成功更新。",
+ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "您需要搬移您的加密鑰匙從舊版的加密 (ownCloud <= 8.0) 到新版,請執行 'occ encryption:migrate' 或是聯絡系統管理員",
"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" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次",
+ "Encryption App is enabled and ready" : "加密應用程式已經被啟用",
+ "one-time password for server-side-encryption" : "一次性密碼用於伺服器端的加密",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
+ "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法檢視這個檔案,或許這是分享的檔案,請詢問這個檔案的擁有者並請他重新分享給您。",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "嗨,請看這裡,\n\n系管理員啟用了伺服器端的加密功能,您的檔案將會使用密碼 '%s' 加密\n\n請從網頁登入,到 'ownCloud basic encryption module' 設置您的個人設定並透過更新加密密碼,將這個組密碼設定在 'old log-in password' 以及您的目前登入密碼\n",
"The share will expire on %s." : "這個分享將會於 %s 過期",
"Cheers!" : "太棒了!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "嗨,請看這裡,<br><br>系管理員啟用了伺服器端的加密功能,您的檔案將會使用密碼<strong> '%s' </strong>加密,請從網頁登入,到 'ownCloud basic encryption module' 設置您的個人設定並透過更新加密密碼,將這個組密碼設定在 'old log-in password' 以及您的目前登入密碼<br><br>",
+ "Encrypt the home storage" : "加密家目錄空間",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "請啟用這個功能以用來加密主要儲存空間的檔案,否則只有再外部儲存的檔案會加密",
+ "Enable recovery key" : "啟用還原金鑰",
+ "Disable recovery key" : "關閉還原金鑰",
+ "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "加密金鑰是另一種加密檔案方式,當使用者忘記密碼時,可以用還原金鑰來還原檔案",
"Recovery key password" : "還原金鑰密碼",
+ "Repeat recovery key password" : "再輸入還原金鑰密碼一次",
"Change recovery key password:" : "變更還原金鑰密碼:",
+ "Old recovery key password" : "舊的還原金鑰密碼",
+ "New recovery key password" : "新的還原金鑰密碼",
+ "Repeat new recovery key password" : "再輸入新的還原金鑰密碼一次",
"Change Password" : "變更密碼",
+ "ownCloud basic encryption module" : "ownCloud 基本加密模組",
+ "Your private key password no longer matches your log-in password." : "您的私人金鑰密碼不符合您的登入密碼",
+ "Set your old private key password to your current log-in password:" : "設定您的舊私人金鑰密碼到您現在的登入密碼:",
" If you don't remember your old password you can ask your administrator to recover your files." : "如果您忘記舊密碼,可以請求管理員協助取回檔案。",
"Old log-in password" : "舊登入密碼",
"Current log-in password" : "目前的登入密碼",
diff --git a/apps/encryption/l10n/zh_TW.json b/apps/encryption/l10n/zh_TW.json
index ce2e07228fc..feee736980f 100644
--- a/apps/encryption/l10n/zh_TW.json
+++ b/apps/encryption/l10n/zh_TW.json
@@ -1,19 +1,50 @@
{ "translations": {
+ "Missing recovery key password" : "遺失還原金鑰密碼",
+ "Please repeat the recovery key password" : "請您再輸入新的還原金鑰密碼一次",
+ "Repeated recovery key password does not match the provided recovery key password" : "輸入的還原金鑰密碼與設定的並不相符",
"Recovery key successfully enabled" : "還原金鑰已成功開啟",
"Could not enable recovery key. Please check your recovery key password!" : "無法啟用還原金鑰。請檢查您的還原金鑰密碼!",
"Recovery key successfully disabled" : "還原金鑰已成功停用",
"Could not disable recovery key. Please check your recovery key password!" : "無法停用還原金鑰。請檢查您的還原金鑰密碼!",
+ "Missing parameters" : "遺失參數",
+ "Please provide the old recovery password" : "請提供舊的還原密碼",
+ "Please provide a new recovery password" : "請提供新的還原密碼",
+ "Please repeat the new recovery password" : "請您再輸入新的還原密碼",
"Password successfully changed." : "成功變更密碼。",
"Could not change the password. Maybe the old password was not correct." : "無法變更密碼,或許是輸入的舊密碼不正確。",
+ "Recovery Key disabled" : "還原金鑰停用",
+ "Recovery Key enabled" : "還原金鑰啟用",
+ "Could not enable the recovery key, please try again or contact your administrator" : "無法啟用還原金鑰功能,請重試或聯絡系統管理員",
+ "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." : "私人金鑰密碼已成功更新。",
+ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "您需要搬移您的加密鑰匙從舊版的加密 (ownCloud <= 8.0) 到新版,請執行 'occ encryption:migrate' 或是聯絡系統管理員",
"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" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次",
+ "Encryption App is enabled and ready" : "加密應用程式已經被啟用",
+ "one-time password for server-side-encryption" : "一次性密碼用於伺服器端的加密",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
+ "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法檢視這個檔案,或許這是分享的檔案,請詢問這個檔案的擁有者並請他重新分享給您。",
+ "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "嗨,請看這裡,\n\n系管理員啟用了伺服器端的加密功能,您的檔案將會使用密碼 '%s' 加密\n\n請從網頁登入,到 'ownCloud basic encryption module' 設置您的個人設定並透過更新加密密碼,將這個組密碼設定在 'old log-in password' 以及您的目前登入密碼\n",
"The share will expire on %s." : "這個分享將會於 %s 過期",
"Cheers!" : "太棒了!",
+ "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "嗨,請看這裡,<br><br>系管理員啟用了伺服器端的加密功能,您的檔案將會使用密碼<strong> '%s' </strong>加密,請從網頁登入,到 'ownCloud basic encryption module' 設置您的個人設定並透過更新加密密碼,將這個組密碼設定在 'old log-in password' 以及您的目前登入密碼<br><br>",
+ "Encrypt the home storage" : "加密家目錄空間",
+ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "請啟用這個功能以用來加密主要儲存空間的檔案,否則只有再外部儲存的檔案會加密",
+ "Enable recovery key" : "啟用還原金鑰",
+ "Disable recovery key" : "關閉還原金鑰",
+ "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "加密金鑰是另一種加密檔案方式,當使用者忘記密碼時,可以用還原金鑰來還原檔案",
"Recovery key password" : "還原金鑰密碼",
+ "Repeat recovery key password" : "再輸入還原金鑰密碼一次",
"Change recovery key password:" : "變更還原金鑰密碼:",
+ "Old recovery key password" : "舊的還原金鑰密碼",
+ "New recovery key password" : "新的還原金鑰密碼",
+ "Repeat new recovery key password" : "再輸入新的還原金鑰密碼一次",
"Change Password" : "變更密碼",
+ "ownCloud basic encryption module" : "ownCloud 基本加密模組",
+ "Your private key password no longer matches your log-in password." : "您的私人金鑰密碼不符合您的登入密碼",
+ "Set your old private key password to your current log-in password:" : "設定您的舊私人金鑰密碼到您現在的登入密碼:",
" If you don't remember your old password you can ask your administrator to recover your files." : "如果您忘記舊密碼,可以請求管理員協助取回檔案。",
"Old log-in password" : "舊登入密碼",
"Current log-in password" : "目前的登入密碼",
diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php
index 1a05277e20d..d1140ce7cde 100644
--- a/apps/encryption/lib/crypto/encryption.php
+++ b/apps/encryption/lib/crypto/encryption.php
@@ -378,6 +378,12 @@ class Encryption implements IEncryptionModule {
* @return boolean
*/
public function shouldEncrypt($path) {
+ if ($this->util->shouldEncryptHomeStorage() === false) {
+ $storage = $this->util->getStorage($path);
+ if ($storage->instanceOfStorage('\OCP\Files\IHomeStorage')) {
+ return false;
+ }
+ }
$parts = explode('/', $path);
if (count($parts) < 4) {
return false;
diff --git a/apps/encryption/lib/util.php b/apps/encryption/lib/util.php
index a162dcde305..62c9dc6dc5f 100644
--- a/apps/encryption/lib/util.php
+++ b/apps/encryption/lib/util.php
@@ -94,12 +94,41 @@ class Util {
$recoveryMode = $this->config->getUserValue($uid,
'encryption',
'recoveryEnabled',
- 0);
+ '0');
return ($recoveryMode === '1');
}
/**
+ * check if the home storage should be encrypted
+ *
+ * @return bool
+ */
+ public function shouldEncryptHomeStorage() {
+ $encryptHomeStorage = $this->config->getAppValue(
+ 'encryption',
+ 'encryptHomeStorage',
+ '1'
+ );
+
+ return ($encryptHomeStorage === '1');
+ }
+
+ /**
+ * check if the home storage should be encrypted
+ *
+ * @param bool $encryptHomeStorage
+ */
+ public function setEncryptHomeStorage($encryptHomeStorage) {
+ $value = $encryptHomeStorage ? '1' : '0';
+ $this->config->setAppValue(
+ 'encryption',
+ 'encryptHomeStorage',
+ $value
+ );
+ }
+
+ /**
* check if master key is enabled
*
* @return bool
@@ -157,4 +186,15 @@ class Util {
return $owner;
}
+ /**
+ * get storage of path
+ *
+ * @param string $path
+ * @return \OC\Files\Storage\Storage
+ */
+ public function getStorage($path) {
+ $storage = $this->files->getMount($path)->getStorage();
+ return $storage;
+ }
+
}
diff --git a/apps/encryption/settings/settings-admin.php b/apps/encryption/settings/settings-admin.php
index c7ac8c09c6b..8d55d587fed 100644
--- a/apps/encryption/settings/settings-admin.php
+++ b/apps/encryption/settings/settings-admin.php
@@ -25,12 +25,27 @@
$tmpl = new OCP\Template('encryption', 'settings-admin');
+$crypt = new \OCA\Encryption\Crypto\Crypt(
+ \OC::$server->getLogger(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getConfig());
+
+$util = new \OCA\Encryption\Util(
+ new \OC\Files\View(),
+ $crypt,
+ \OC::$server->getLogger(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getConfig(),
+ \OC::$server->getUserManager());
+
// Check if an adminRecovery account is enabled for recovering files after lost pwd
$recoveryAdminEnabled = \OC::$server->getConfig()->getAppValue('encryption', 'recoveryAdminEnabled', '0');
$session = new \OCA\Encryption\Session(\OC::$server->getSession());
+$encryptHomeStorage = $util->shouldEncryptHomeStorage($user);
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
$tmpl->assign('initStatus', $session->getStatus());
+$tmpl->assign('encryptHomeStorage', $encryptHomeStorage);
return $tmpl->fetchPage();
diff --git a/apps/encryption/templates/settings-admin.php b/apps/encryption/templates/settings-admin.php
index 81c7f0607d8..e55aba6757c 100644
--- a/apps/encryption/templates/settings-admin.php
+++ b/apps/encryption/templates/settings-admin.php
@@ -9,56 +9,63 @@ style('encryption', 'settings-admin');
<?php if(!$_["initStatus"]): ?>
<?php p($l->t("Encryption App is enabled but your keys are not initialized, please log-out and log-in again")); ?>
<?php else: ?>
- <p id="encryptionSetRecoveryKey">
- <?php $_["recoveryEnabled"] === '0' ? p($l->t("Enable recovery key")) : p($l->t("Disable recovery key")); ?>
- <span class="msg"></span>
- <br/>
- <em>
- <?php p($l->t("The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password.")) ?>
- </em>
- <br/>
- <input type="password"
- name="encryptionRecoveryPassword"
- id="encryptionRecoveryPassword"
- placeholder="<?php p($l->t("Recovery key password")); ?>"/>
- <input type="password"
- name="encryptionRecoveryPassword"
- id="repeatEncryptionRecoveryPassword"
- placeholder="<?php p($l->t("Repeat recovery key password")); ?>"/>
- <input type="button"
- name="enableRecoveryKey"
- id="enableRecoveryKey"
- status="<?php p($_["recoveryEnabled"]) ?>"
- value="<?php $_["recoveryEnabled"] === '0' ? p($l->t("Enable recovery key")) : p($l->t("Disable recovery key")); ?>"/>
- </p>
- <br/><br/>
-
- <p name="changeRecoveryPasswordBlock" id="encryptionChangeRecoveryKey" <?php if($_['recoveryEnabled'] === '0') print_unescaped('class="hidden"');?>>
- <?php p($l->t("Change recovery key password:")); ?>
- <span class="msg"></span>
- <br/>
- <input
- type="password"
- name="changeRecoveryPassword"
- id="oldEncryptionRecoveryPassword"
- placeholder="<?php p($l->t("Old recovery key password")); ?>"/>
+ <p id="encryptHomeStorageSetting">
+ <input type="checkbox" class="checkbox" name="encrypt_home_storage" id="encryptHomeStorage"
+ value="1" <?php if ($_['encryptHomeStorage']) print_unescaped('checked="checked"'); ?> />
+ <label for="encryptHomeStorage"><?php p($l->t('Encrypt the home storage'));?></label></br>
+ <em><?php p( $l->t( "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" ) ); ?></em>
+ </p>
<br />
- <input
- type="password"
- name="changeRecoveryPassword"
- id="newEncryptionRecoveryPassword"
- placeholder="<?php p($l->t("New recovery key password")); ?>"/>
- <input
- type="password"
- name="changeRecoveryPassword"
- id="repeatedNewEncryptionRecoveryPassword"
- placeholder="<?php p($l->t("Repeat new recovery key password")); ?>"/>
+ <p id="encryptionSetRecoveryKey">
+ <?php $_["recoveryEnabled"] === '0' ? p($l->t("Enable recovery key")) : p($l->t("Disable recovery key")); ?>
+ <span class="msg"></span>
+ <br/>
+ <em>
+ <?php p($l->t("The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password.")) ?>
+ </em>
+ <br/>
+ <input type="password"
+ name="encryptionRecoveryPassword"
+ id="encryptionRecoveryPassword"
+ placeholder="<?php p($l->t("Recovery key password")); ?>"/>
+ <input type="password"
+ name="encryptionRecoveryPassword"
+ id="repeatEncryptionRecoveryPassword"
+ placeholder="<?php p($l->t("Repeat recovery key password")); ?>"/>
+ <input type="button"
+ name="enableRecoveryKey"
+ id="enableRecoveryKey"
+ status="<?php p($_["recoveryEnabled"]) ?>"
+ value="<?php $_["recoveryEnabled"] === '0' ? p($l->t("Enable recovery key")) : p($l->t("Disable recovery key")); ?>"/>
+ </p>
+ <br/><br/>
+
+ <p name="changeRecoveryPasswordBlock" id="encryptionChangeRecoveryKey" <?php if($_['recoveryEnabled'] === '0') print_unescaped('class="hidden"');?>>
+ <?php p($l->t("Change recovery key password:")); ?>
+ <span class="msg"></span>
+ <br/>
+ <input
+ type="password"
+ name="changeRecoveryPassword"
+ id="oldEncryptionRecoveryPassword"
+ placeholder="<?php p($l->t("Old recovery key password")); ?>"/>
+ <br />
+ <input
+ type="password"
+ name="changeRecoveryPassword"
+ id="newEncryptionRecoveryPassword"
+ placeholder="<?php p($l->t("New recovery key password")); ?>"/>
+ <input
+ type="password"
+ name="changeRecoveryPassword"
+ id="repeatedNewEncryptionRecoveryPassword"
+ placeholder="<?php p($l->t("Repeat new recovery key password")); ?>"/>
- <button
- type="button"
- name="submitChangeRecoveryKey">
+ <button
+ type="button"
+ name="submitChangeRecoveryKey">
<?php p($l->t("Change Password")); ?>
- </button>
- </p>
+ </button>
+ </p>
<?php endif; ?>
</form>
diff --git a/apps/encryption/tests/controller/SettingsControllerTest.php b/apps/encryption/tests/controller/SettingsControllerTest.php
index 724a01522af..3b30e61a45b 100644
--- a/apps/encryption/tests/controller/SettingsControllerTest.php
+++ b/apps/encryption/tests/controller/SettingsControllerTest.php
@@ -56,6 +56,9 @@ class SettingsControllerTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject */
private $ocSessionMock;
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $utilMock;
+
protected function setUp() {
parent::setUp();
@@ -106,6 +109,10 @@ class SettingsControllerTest extends TestCase {
$this->sessionMock = $this->getMockBuilder('OCA\Encryption\Session')
->disableOriginalConstructor()->getMock();
+ $this->utilMock = $this->getMockBuilder('OCA\Encryption\Util')
+ ->disableOriginalConstructor()
+ ->getMock();
+
$this->controller = new SettingsController(
'encryption',
$this->requestMock,
@@ -115,7 +122,8 @@ class SettingsControllerTest extends TestCase {
$this->keyManagerMock,
$this->cryptMock,
$this->sessionMock,
- $this->ocSessionMock
+ $this->ocSessionMock,
+ $this->utilMock
);
}
@@ -234,4 +242,10 @@ class SettingsControllerTest extends TestCase {
$data['message']);
}
+ function testSetEncryptHomeStorage() {
+ $value = true;
+ $this->utilMock->expects($this->once())->method('setEncryptHomeStorage')->with($value);
+ $this->controller->setEncryptHomeStorage($value);
+ }
+
}
diff --git a/apps/encryption/tests/lib/UtilTest.php b/apps/encryption/tests/lib/UtilTest.php
index 723cc9fb910..d55b6b50b3e 100644
--- a/apps/encryption/tests/lib/UtilTest.php
+++ b/apps/encryption/tests/lib/UtilTest.php
@@ -39,6 +39,9 @@ class UtilTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject */
private $userManagerMock;
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $mountMock;
+
/** @var Util */
private $instance;
@@ -65,6 +68,7 @@ class UtilTest extends TestCase {
protected function setUp() {
parent::setUp();
+ $this->mountMock = $this->getMock('\OCP\Files\Mount\IMountPoint');
$this->filesMock = $this->getMock('OC\Files\View');
$this->userManagerMock = $this->getMock('\OCP\IUserManager');
@@ -151,4 +155,52 @@ class UtilTest extends TestCase {
];
}
+ /**
+ * @dataProvider dataTestShouldEncryptHomeStorage
+ * @param $returnValue return value from getAppValue()
+ * @param $expected
+ */
+ public function testShouldEncryptHomeStorage($returnValue, $expected) {
+ $this->configMock->expects($this->once())->method('getAppValue')
+ ->with('encryption', 'encryptHomeStorage', '1')
+ ->willReturn($returnValue);
+
+ $this->assertSame($expected,
+ $this->instance->shouldEncryptHomeStorage());
+ }
+
+ public function dataTestShouldEncryptHomeStorage() {
+ return [
+ ['1', true],
+ ['0', false]
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestSetEncryptHomeStorage
+ * @param $value
+ * @param $expected
+ */
+ public function testSetEncryptHomeStorage($value, $expected) {
+ $this->configMock->expects($this->once())->method('setAppValue')
+ ->with('encryption', 'encryptHomeStorage', $expected);
+ $this->instance->setEncryptHomeStorage($value);
+ }
+
+ public function dataTestSetEncryptHomeStorage() {
+ return [
+ [true, '1'],
+ [false, '0']
+ ];
+ }
+
+ public function testGetStorage() {
+ $path = '/foo/bar.txt';
+ $this->filesMock->expects($this->once())->method('getMount')->with($path)
+ ->willReturn($this->mountMock);
+ $this->mountMock->expects($this->once())->method('getStorage')->willReturn(true);
+
+ $this->assertTrue($this->instance->getStorage($path));
+ }
+
}
diff --git a/apps/encryption/tests/lib/crypto/encryptionTest.php b/apps/encryption/tests/lib/crypto/encryptionTest.php
index f76bdfb6d61..138c1bc9446 100644
--- a/apps/encryption/tests/lib/crypto/encryptionTest.php
+++ b/apps/encryption/tests/lib/crypto/encryptionTest.php
@@ -55,9 +55,14 @@ class EncryptionTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject */
private $l10nMock;
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $storageMock;
+
public function setUp() {
parent::setUp();
+ $this->storageMock = $this->getMockBuilder('OCP\Files\Storage')
+ ->disableOriginalConstructor()->getMock();
$this->cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt')
->disableOriginalConstructor()
->getMock();
@@ -312,7 +317,17 @@ class EncryptionTest extends TestCase {
*
* @dataProvider dataTestShouldEncrypt
*/
- public function testShouldEncrypt($path, $expected) {
+ public function testShouldEncrypt($path, $shouldEncryptHomeStorage, $isHomeStorage, $expected) {
+ $this->utilMock->expects($this->once())->method('shouldEncryptHomeStorage')
+ ->willReturn($shouldEncryptHomeStorage);
+
+ if ($shouldEncryptHomeStorage === false) {
+ $this->storageMock->expects($this->once())->method('instanceOfStorage')
+ ->with('\OCP\Files\IHomeStorage')->willReturn($isHomeStorage);
+ $this->utilMock->expects($this->once())->method('getStorage')->with($path)
+ ->willReturn($this->storageMock);
+ }
+
$this->assertSame($expected,
$this->instance->shouldEncrypt($path)
);
@@ -320,14 +335,17 @@ class EncryptionTest extends TestCase {
public function dataTestShouldEncrypt() {
return array(
- array('/user1/files/foo.txt', true),
- array('/user1/files_versions/foo.txt', true),
- array('/user1/files_trashbin/foo.txt', true),
- array('/user1/some_folder/foo.txt', false),
- array('/user1/foo.txt', false),
- array('/user1/files', false),
- array('/user1/files_trashbin', false),
- array('/user1/files_versions', false),
+ array('/user1/files/foo.txt', true, true, true),
+ array('/user1/files_versions/foo.txt', true, true, true),
+ array('/user1/files_trashbin/foo.txt', true, true, true),
+ array('/user1/some_folder/foo.txt', true, true, false),
+ array('/user1/foo.txt', true, true, false),
+ array('/user1/files', true, true, false),
+ array('/user1/files_trashbin', true, true, false),
+ array('/user1/files_versions', true, true, false),
+ // test if shouldEncryptHomeStorage is set to false
+ array('/user1/files/foo.txt', false, true, false),
+ array('/user1/files_versions/foo.txt', false, false, true),
);
}
diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js
index fa5ddf4f402..f0d5b4212b0 100644
--- a/apps/files/l10n/lv.js
+++ b/apps/files/l10n/lv.js
@@ -30,10 +30,10 @@ OC.L10N.register(
"Favorites" : "Iecienītie",
"Home" : "Mājas",
"Close" : "Aizvērt",
+ "Upload cancelled." : "Augšupielāde ir atcelta.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturošs fails.",
"Total file size {size1} exceeds upload limit {size2}" : "Kopējais faila izmērs {size1} pārsniedz augšupielādes ierobežojumu {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}",
- "Upload cancelled." : "Augšupielāde ir atcelta.",
"Could not get result from server." : "Nevar saņemt rezultātus no servera",
"File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.",
"Actions" : "Darbības",
diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json
index b164c88e381..14d0b4093df 100644
--- a/apps/files/l10n/lv.json
+++ b/apps/files/l10n/lv.json
@@ -28,10 +28,10 @@
"Favorites" : "Iecienītie",
"Home" : "Mājas",
"Close" : "Aizvērt",
+ "Upload cancelled." : "Augšupielāde ir atcelta.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturošs fails.",
"Total file size {size1} exceeds upload limit {size2}" : "Kopējais faila izmērs {size1} pārsniedz augšupielādes ierobežojumu {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}",
- "Upload cancelled." : "Augšupielāde ir atcelta.",
"Could not get result from server." : "Nevar saņemt rezultātus no servera",
"File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.",
"Actions" : "Darbības",
diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js
index 4e1c7e0a011..6a0a05c782a 100644
--- a/apps/files/l10n/oc.js
+++ b/apps/files/l10n/oc.js
@@ -44,6 +44,8 @@ OC.L10N.register(
"Select" : "Seleccionar",
"Pending" : "En espèra",
"Unable to determine date" : "Impossible de determinar la data",
+ "This operation is forbidden" : "L'operacion es interdicha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
"Error moving file." : "Error al moment del desplaçament del fichièr.",
"Error moving file" : "Error al moment del desplaçament del fichièr",
"Error" : "Error",
@@ -64,11 +66,16 @@ OC.L10N.register(
"New" : "Novèl",
"\"{name}\" is an invalid file name." : "\"{name}\" es pas un nom de fichièr valid.",
"File name cannot be empty." : "Lo nom de fichièr pòt pas èsser void.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espaci d'emmagazinatge de {owner} es plen. Los fichièrs pòdon pas mai èsser meses a jorn o sincronizats !",
"Your storage is full, files can not be updated or synced anymore!" : "Vòstre espaci d'emmagazinatge es plen, los fichièrs pòdon pas mai èsser aponduts o sincronizats !",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "L'espaci d'emmagazinatge de {owner} es gaireben plen ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Vòstre espace d'emmagazinatge es gaireben plen ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["correspond a '{filter}'","correspondon a '{filter}'"],
+ "Path" : "Camin",
+ "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
"Favorited" : "Marcat coma favorit",
"Favorite" : "Favorit",
+ "{newname} already exists" : "{new_name} existís ja",
"Upload" : "Cargament",
"Text file" : "Fichièr tèxte",
"New text file.txt" : "Novèl fichièr tèxte .txt",
@@ -89,12 +96,16 @@ OC.L10N.register(
"%2$s deleted %1$s" : "%2$s a suprimit %1$s",
"You restored %1$s" : "Avètz restablit %1$s",
"%2$s restored %1$s" : "%2$s a restablit %1$s",
+ "Changed by %2$s" : "Modificat per %2$s",
+ "Deleted by %2$s" : "Suprimit per %2$s",
+ "Restored by %2$s" : "Restablit per %2$s",
"%s could not be renamed as it has been deleted" : "%s pòt pas èsser renomenat perque es estat suprimit ",
"%s could not be renamed" : "%s pòt pas èsser renomenat",
"Upload (max. %s)" : "Mandadís (max. %s)",
"File handling" : "Gestion de fichièrs",
"Maximum upload size" : "Talha max. de mandadís",
"max. possible: " : "Max. possible :",
+ "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Amb PHP-FPM, se pòdon passar fins a 5 minutas abans qu'aquesta valor siá aplicada.",
"Save" : "Salvar",
"Can not be edited from here due to insufficient permissions." : "Pòt pas èsser modificat aicí a causa de permissions insufisentas.",
"Settings" : "Paramètres",
diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json
index 108bc5d9de9..0577b75076a 100644
--- a/apps/files/l10n/oc.json
+++ b/apps/files/l10n/oc.json
@@ -42,6 +42,8 @@
"Select" : "Seleccionar",
"Pending" : "En espèra",
"Unable to determine date" : "Impossible de determinar la data",
+ "This operation is forbidden" : "L'operacion es interdicha",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator",
"Error moving file." : "Error al moment del desplaçament del fichièr.",
"Error moving file" : "Error al moment del desplaçament del fichièr",
"Error" : "Error",
@@ -62,11 +64,16 @@
"New" : "Novèl",
"\"{name}\" is an invalid file name." : "\"{name}\" es pas un nom de fichièr valid.",
"File name cannot be empty." : "Lo nom de fichièr pòt pas èsser void.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espaci d'emmagazinatge de {owner} es plen. Los fichièrs pòdon pas mai èsser meses a jorn o sincronizats !",
"Your storage is full, files can not be updated or synced anymore!" : "Vòstre espaci d'emmagazinatge es plen, los fichièrs pòdon pas mai èsser aponduts o sincronizats !",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "L'espaci d'emmagazinatge de {owner} es gaireben plen ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Vòstre espace d'emmagazinatge es gaireben plen ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["correspond a '{filter}'","correspondon a '{filter}'"],
+ "Path" : "Camin",
+ "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
"Favorited" : "Marcat coma favorit",
"Favorite" : "Favorit",
+ "{newname} already exists" : "{new_name} existís ja",
"Upload" : "Cargament",
"Text file" : "Fichièr tèxte",
"New text file.txt" : "Novèl fichièr tèxte .txt",
@@ -87,12 +94,16 @@
"%2$s deleted %1$s" : "%2$s a suprimit %1$s",
"You restored %1$s" : "Avètz restablit %1$s",
"%2$s restored %1$s" : "%2$s a restablit %1$s",
+ "Changed by %2$s" : "Modificat per %2$s",
+ "Deleted by %2$s" : "Suprimit per %2$s",
+ "Restored by %2$s" : "Restablit per %2$s",
"%s could not be renamed as it has been deleted" : "%s pòt pas èsser renomenat perque es estat suprimit ",
"%s could not be renamed" : "%s pòt pas èsser renomenat",
"Upload (max. %s)" : "Mandadís (max. %s)",
"File handling" : "Gestion de fichièrs",
"Maximum upload size" : "Talha max. de mandadís",
"max. possible: " : "Max. possible :",
+ "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Amb PHP-FPM, se pòdon passar fins a 5 minutas abans qu'aquesta valor siá aplicada.",
"Save" : "Salvar",
"Can not be edited from here due to insufficient permissions." : "Pòt pas èsser modificat aicí a causa de permissions insufisentas.",
"Settings" : "Paramètres",
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index 2ca3c2d2219..12738d841e4 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -83,7 +83,7 @@ OC.L10N.register(
"Username as share" : "Nom d'utilisateur comme nom de partage",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Nom du service",
- "Request timeout (seconds)" : "Timeout des requêtes (en secondes)",
+ "Request timeout (seconds)" : "Délai d'expiration des requêtes (en secondes)",
"<b>Note:</b> " : "<b>Attention :</b>",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index 5b36ff92741..425413b7e8d 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -81,7 +81,7 @@
"Username as share" : "Nom d'utilisateur comme nom de partage",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Nom du service",
- "Request timeout (seconds)" : "Timeout des requêtes (en secondes)",
+ "Request timeout (seconds)" : "Délai d'expiration des requêtes (en secondes)",
"<b>Note:</b> " : "<b>Attention :</b>",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js
index b4401e0e344..ac5d1bfe6f8 100644
--- a/apps/files_external/l10n/ja.js
+++ b/apps/files_external/l10n/ja.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Storage with id \"%i\" not found" : "ストレージID \"%i\" が見つかりません",
"Invalid mount point" : "無効なマウントポイント",
"Invalid storage backend \"%s\"" : "\"%s\" のストレージバックエンドが不正",
+ "Not permitted to use backend \"%s\"" : "バックエンド %s を使うための権限がありません",
+ "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です",
"Personal" : "個人",
"System" : "システム",
"Grant access" : "アクセスを許可",
@@ -69,6 +71,7 @@ OC.L10N.register(
"Username as share" : "共有名",
"OpenStack Object Storage" : "OpenStack ObjectStorage",
"Service name" : "サービス名",
+ "Request timeout (seconds)" : "リクエストがタイムアウトするまでの秒数",
"<b>Note:</b> " : "<b>注意:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにcURLのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにFTPのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。",
diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json
index fbabe2eeb0f..6664b3d97db 100644
--- a/apps/files_external/l10n/ja.json
+++ b/apps/files_external/l10n/ja.json
@@ -6,6 +6,8 @@
"Storage with id \"%i\" not found" : "ストレージID \"%i\" が見つかりません",
"Invalid mount point" : "無効なマウントポイント",
"Invalid storage backend \"%s\"" : "\"%s\" のストレージバックエンドが不正",
+ "Not permitted to use backend \"%s\"" : "バックエンド %s を使うための権限がありません",
+ "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です",
"Personal" : "個人",
"System" : "システム",
"Grant access" : "アクセスを許可",
@@ -67,6 +69,7 @@
"Username as share" : "共有名",
"OpenStack Object Storage" : "OpenStack ObjectStorage",
"Service name" : "サービス名",
+ "Request timeout (seconds)" : "リクエストがタイムアウトするまでの秒数",
"<b>Note:</b> " : "<b>注意:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにcURLのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにFTPのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。",
diff --git a/apps/files_external/l10n/lv.js b/apps/files_external/l10n/lv.js
index 7b4d94be6c7..6590706fa2a 100644
--- a/apps/files_external/l10n/lv.js
+++ b/apps/files_external/l10n/lv.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Personal" : "Personīgi",
"Grant access" : "Piešķirt pieeju",
"Access granted" : "Piešķirta pieeja",
+ "Enable encryption" : "Ieslēgt šifrēšanu",
"Saved" : "Saglabāts",
"None" : "Nav",
"Username" : "Lietotājvārds",
diff --git a/apps/files_external/l10n/lv.json b/apps/files_external/l10n/lv.json
index 7ad68595d73..4e27db77737 100644
--- a/apps/files_external/l10n/lv.json
+++ b/apps/files_external/l10n/lv.json
@@ -3,6 +3,7 @@
"Personal" : "Personīgi",
"Grant access" : "Piešķirt pieeju",
"Access granted" : "Piešķirta pieeja",
+ "Enable encryption" : "Ieslēgt šifrēšanu",
"Saved" : "Saglabāts",
"None" : "Nav",
"Username" : "Lietotājvārds",
diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js
index 5550ea780ab..dd8f5c9bdf5 100644
--- a/apps/files_external/l10n/ru.js
+++ b/apps/files_external/l10n/ru.js
@@ -101,6 +101,7 @@ OC.L10N.register(
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
"Add storage" : "Добавить хранилище",
+ "Allow users to mount external storages" : "Разрешить пользователям подключать внешние хранилища",
"Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json
index 52792a3f09a..04044274379 100644
--- a/apps/files_external/l10n/ru.json
+++ b/apps/files_external/l10n/ru.json
@@ -99,6 +99,7 @@
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
"Add storage" : "Добавить хранилище",
+ "Allow users to mount external storages" : "Разрешить пользователям подключать внешние хранилища",
"Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/zh_TW.js b/apps/files_external/l10n/zh_TW.js
index d94c98cc026..db7bf975017 100644
--- a/apps/files_external/l10n/zh_TW.js
+++ b/apps/files_external/l10n/zh_TW.js
@@ -1,39 +1,101 @@
OC.L10N.register(
"files_external",
{
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "請求失敗,請驗證您的應用程式金鑰及密碼是否正確",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "存取失敗,請驗證您的應用程式金鑰及密碼是否正確",
+ "Please provide a valid app key and secret." : "請提供有效的應用程式金鑰及密碼",
+ "Step 1 failed. Exception: %s" : "步驟 1 失敗,出現異常: %s",
+ "Step 2 failed. Exception: %s" : "步驟 2 失敗,出現異常: %s",
"External storage" : "外部儲存",
+ "Storage with id \"%i\" not found" : "沒有找到編號 \"%i\" 的儲存空間 ",
+ "Invalid backend or authentication mechanism class" : "無效的後端處理或是驗證方式",
+ "Invalid mount point" : "無效的掛載點",
+ "Objectstore forbidden" : "物件儲存禁止存取",
+ "Invalid storage backend \"%s\"" : "無效的後端儲存 \"%s\"",
+ "Not permitted to use backend \"%s\"" : "不被允許使用後端儲存 \"%s\"",
+ "Not permitted to use authentication mechanism \"%s\"" : "不被允許使用驗證機制 \"%s\"",
+ "Unsatisfied backend parameters" : "無法滿足後端所需的參數條件",
+ "Unsatisfied authentication mechanism parameters" : "無法滿足驗證機制所需的參數條件",
"Personal" : "個人",
"System" : "系統",
"Grant access" : "允許存取",
"Access granted" : "允許存取",
+ "Error configuring OAuth1" : "設定 OAuth1 時發生錯誤",
+ "Error configuring OAuth2" : "設定 OAuth2 時發生錯誤",
+ "Generate keys" : "產生金鑰",
+ "Error generating key pair" : "產生金鑰對錯誤",
"Enable encryption" : "啟用加密",
+ "Enable previews" : "啟動預覽",
+ "Check for changes" : "檢查變動",
+ "Never" : "絕不",
+ "Every time the filesystem is used" : "每當檔案系統使用時",
+ "All users. Type to select user or group." : "所有人都可以使用,或者選擇特定使用者、群組",
+ "(group)" : "(群組)",
"Saved" : "已儲存",
+ "Access key" : "存取金鑰",
+ "Secret key" : "私密金鑰",
"None" : "無",
+ "App key" : "App 金鑰",
+ "App secret" : "App 密碼",
+ "Client ID" : "客戶端ID",
+ "Client secret" : "客戶端密碼",
+ "OpenStack" : "OpenStack",
"Username" : "使用者名稱",
"Password" : "密碼",
+ "Tenant name" : "租戶/專案名稱",
+ "Identity endpoint URL" : "身份識別終端點 URL",
+ "Rackspace" : "Rackspace",
"API key" : "API金鑰",
+ "Username and password" : "使用者帳號和密碼",
+ "RSA public key" : "RSA 公開金鑰",
+ "Public key" : "公開金鑰",
"Amazon S3" : "Amazon S3",
+ "Bucket" : "Bucket",
+ "Hostname" : "主機名稱",
"Port" : "連接埠",
"Region" : "地區",
"Enable SSL" : "啟用 SSL",
+ "Enable Path Style" : "啟用路徑格式",
"WebDAV" : "WebDAV",
"URL" : "URL",
+ "Remote subfolder" : "遠端子資料夾",
+ "Secure https://" : "安全 https://",
+ "Dropbox" : "Dropbox",
+ "FTP" : "檔案傳輸協定-FTP",
"Host" : "主機",
+ "Secure ftps://" : "安全 ftps://",
+ "Google Drive" : "Google 雲端硬碟",
"Local" : "本地",
"Location" : "地點",
"ownCloud" : "ownCloud",
+ "SFTP" : "安全檔案傳輸協定-SFTP",
+ "SFTP with secret key login" : "以密碼金鑰登入SFTP",
+ "SMB / CIFS" : "伺服器訊息區塊-SMB/網路文件共享系統 (CIFS)",
"Share" : "分享",
+ "Domain" : "網域名稱",
+ "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登入",
+ "Username as share" : "以使用者名稱分享",
+ "OpenStack Object Storage" : "OpenStack 物件儲存",
+ "Service name" : "服務名稱",
+ "Request timeout (seconds)" : "請求超時 (秒)",
"<b>Note:</b> " : "<b>警告:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告:</b> PHP 並未啓用 Curl 的支援,因此無法掛載 %s 。請洽您的系統管理員將其安裝並啓用。",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>:PHP 並未啓用 FTP 的支援,因此無法掛載 %s,請洽您的系統管理員將其安裝並啓用。",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>並未安裝 \"%s\",因此無法掛載 %s。請洽您的系統管理員將其安裝並啓用。",
+ "No external storage configured" : "目前尚未配置任何外部儲存",
+ "You can add external storages in the personal settings" : "在個人設定裡您可以自行加入外部儲存設定",
"Name" : "名稱",
+ "Storage type" : "儲存類型",
+ "Scope" : "範圍",
"External Storage" : "外部儲存",
"Folder name" : "資料夾名稱",
+ "Authentication" : "驗證",
"Configuration" : "設定",
"Available for" : "可用的",
+ "Advanced settings" : "進階設定",
"Delete" : "刪除",
"Add storage" : "增加儲存區",
+ "Allow users to mount external storages" : "允許使用者能自行掛載外部儲存",
"Allow users to mount the following external storage" : "允許使用者自行掛載以下的外部儲存"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/zh_TW.json b/apps/files_external/l10n/zh_TW.json
index 0d1c184f63d..760ff7f5841 100644
--- a/apps/files_external/l10n/zh_TW.json
+++ b/apps/files_external/l10n/zh_TW.json
@@ -1,37 +1,99 @@
{ "translations": {
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "請求失敗,請驗證您的應用程式金鑰及密碼是否正確",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "存取失敗,請驗證您的應用程式金鑰及密碼是否正確",
+ "Please provide a valid app key and secret." : "請提供有效的應用程式金鑰及密碼",
+ "Step 1 failed. Exception: %s" : "步驟 1 失敗,出現異常: %s",
+ "Step 2 failed. Exception: %s" : "步驟 2 失敗,出現異常: %s",
"External storage" : "外部儲存",
+ "Storage with id \"%i\" not found" : "沒有找到編號 \"%i\" 的儲存空間 ",
+ "Invalid backend or authentication mechanism class" : "無效的後端處理或是驗證方式",
+ "Invalid mount point" : "無效的掛載點",
+ "Objectstore forbidden" : "物件儲存禁止存取",
+ "Invalid storage backend \"%s\"" : "無效的後端儲存 \"%s\"",
+ "Not permitted to use backend \"%s\"" : "不被允許使用後端儲存 \"%s\"",
+ "Not permitted to use authentication mechanism \"%s\"" : "不被允許使用驗證機制 \"%s\"",
+ "Unsatisfied backend parameters" : "無法滿足後端所需的參數條件",
+ "Unsatisfied authentication mechanism parameters" : "無法滿足驗證機制所需的參數條件",
"Personal" : "個人",
"System" : "系統",
"Grant access" : "允許存取",
"Access granted" : "允許存取",
+ "Error configuring OAuth1" : "設定 OAuth1 時發生錯誤",
+ "Error configuring OAuth2" : "設定 OAuth2 時發生錯誤",
+ "Generate keys" : "產生金鑰",
+ "Error generating key pair" : "產生金鑰對錯誤",
"Enable encryption" : "啟用加密",
+ "Enable previews" : "啟動預覽",
+ "Check for changes" : "檢查變動",
+ "Never" : "絕不",
+ "Every time the filesystem is used" : "每當檔案系統使用時",
+ "All users. Type to select user or group." : "所有人都可以使用,或者選擇特定使用者、群組",
+ "(group)" : "(群組)",
"Saved" : "已儲存",
+ "Access key" : "存取金鑰",
+ "Secret key" : "私密金鑰",
"None" : "無",
+ "App key" : "App 金鑰",
+ "App secret" : "App 密碼",
+ "Client ID" : "客戶端ID",
+ "Client secret" : "客戶端密碼",
+ "OpenStack" : "OpenStack",
"Username" : "使用者名稱",
"Password" : "密碼",
+ "Tenant name" : "租戶/專案名稱",
+ "Identity endpoint URL" : "身份識別終端點 URL",
+ "Rackspace" : "Rackspace",
"API key" : "API金鑰",
+ "Username and password" : "使用者帳號和密碼",
+ "RSA public key" : "RSA 公開金鑰",
+ "Public key" : "公開金鑰",
"Amazon S3" : "Amazon S3",
+ "Bucket" : "Bucket",
+ "Hostname" : "主機名稱",
"Port" : "連接埠",
"Region" : "地區",
"Enable SSL" : "啟用 SSL",
+ "Enable Path Style" : "啟用路徑格式",
"WebDAV" : "WebDAV",
"URL" : "URL",
+ "Remote subfolder" : "遠端子資料夾",
+ "Secure https://" : "安全 https://",
+ "Dropbox" : "Dropbox",
+ "FTP" : "檔案傳輸協定-FTP",
"Host" : "主機",
+ "Secure ftps://" : "安全 ftps://",
+ "Google Drive" : "Google 雲端硬碟",
"Local" : "本地",
"Location" : "地點",
"ownCloud" : "ownCloud",
+ "SFTP" : "安全檔案傳輸協定-SFTP",
+ "SFTP with secret key login" : "以密碼金鑰登入SFTP",
+ "SMB / CIFS" : "伺服器訊息區塊-SMB/網路文件共享系統 (CIFS)",
"Share" : "分享",
+ "Domain" : "網域名稱",
+ "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登入",
+ "Username as share" : "以使用者名稱分享",
+ "OpenStack Object Storage" : "OpenStack 物件儲存",
+ "Service name" : "服務名稱",
+ "Request timeout (seconds)" : "請求超時 (秒)",
"<b>Note:</b> " : "<b>警告:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告:</b> PHP 並未啓用 Curl 的支援,因此無法掛載 %s 。請洽您的系統管理員將其安裝並啓用。",
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>:PHP 並未啓用 FTP 的支援,因此無法掛載 %s,請洽您的系統管理員將其安裝並啓用。",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>並未安裝 \"%s\",因此無法掛載 %s。請洽您的系統管理員將其安裝並啓用。",
+ "No external storage configured" : "目前尚未配置任何外部儲存",
+ "You can add external storages in the personal settings" : "在個人設定裡您可以自行加入外部儲存設定",
"Name" : "名稱",
+ "Storage type" : "儲存類型",
+ "Scope" : "範圍",
"External Storage" : "外部儲存",
"Folder name" : "資料夾名稱",
+ "Authentication" : "驗證",
"Configuration" : "設定",
"Available for" : "可用的",
+ "Advanced settings" : "進階設定",
"Delete" : "刪除",
"Add storage" : "增加儲存區",
+ "Allow users to mount external storages" : "允許使用者能自行掛載外部儲存",
"Allow users to mount the following external storage" : "允許使用者自行掛載以下的外部儲存"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php
index 00915140bab..4b867c005a7 100644
--- a/apps/files_external/lib/amazons3.php
+++ b/apps/files_external/lib/amazons3.php
@@ -418,27 +418,6 @@ class AmazonS3 extends \OC\Files\Storage\Common {
return false;
}
- public function getMimeType($path) {
- $path = $this->normalizePath($path);
-
- if ($this->is_dir($path)) {
- return 'httpd/unix-directory';
- } else if ($this->file_exists($path)) {
- try {
- $result = $this->getConnection()->headObject(array(
- 'Bucket' => $this->bucket,
- 'Key' => $path
- ));
- } catch (S3Exception $e) {
- \OCP\Util::logException('files_external', $e);
- return false;
- }
-
- return $result['ContentType'];
- }
- return false;
- }
-
public function touch($path, $mtime = null) {
$path = $this->normalizePath($path);
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php
index 3b353b7777a..df8a0255134 100644
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/dropbox.php
@@ -299,18 +299,6 @@ class Dropbox extends \OC\Files\Storage\Common {
}
}
- public function getMimeType($path) {
- if ($this->filetype($path) == 'dir') {
- return 'httpd/unix-directory';
- } else {
- $metaData = $this->getDropBoxMetaData($path);
- if ($metaData) {
- return $metaData['mime_type'];
- }
- }
- return false;
- }
-
public function free_space($path) {
try {
$info = $this->dropbox->getAccountInfo();
diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php
index b9454b8d671..beb47ce0bce 100644
--- a/apps/files_external/lib/swift.php
+++ b/apps/files_external/lib/swift.php
@@ -361,18 +361,6 @@ class Swift extends \OC\Files\Storage\Common {
}
}
- public function getMimeType($path) {
- $path = $this->normalizePath($path);
-
- if ($this->is_dir($path)) {
- return 'httpd/unix-directory';
- } else if ($this->file_exists($path)) {
- $object = $this->getContainer()->getPartialObject($path);
- return $object->getContentType();
- }
- return false;
- }
-
public function touch($path, $mtime = null) {
$path = $this->normalizePath($path);
if (is_null($mtime)) {
diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js
index d2e3bc9b263..b80be0c3315 100644
--- a/apps/files_sharing/l10n/ja.js
+++ b/apps/files_sharing/l10n/ja.js
@@ -38,10 +38,23 @@ OC.L10N.register(
"Public shared file %1$s was downloaded" : "公開共有ファイル %1$s がダウンロードされました",
"You shared %1$s with %2$s" : "あなたは %1$s を %2$s と共有しました",
"You shared %1$s with group %2$s" : "あなたは %1$s をグループ %2$s と共有しました",
+ "%2$s shared %1$s with %3$s" : "%2$s は %1$s を %3$s と共有しました",
+ "%2$s shared %1$s with group %3$s" : "%2$s は %1$s をグループ %3$s と共有しました",
+ "%2$s shared %1$s via link" : "%2$s はリンク経由で %1$s を共有しました",
"%2$s shared %1$s with you" : "%2$s は %1$s をあなたと共有しました",
"You shared %1$s via link" : "リンク経由で %1$s を共有しています",
+ "Downloaded via public link" : "公開リンクからダウンロードしました",
+ "Shared with %2$s" : "%2$s と共有しました",
+ "Shared with group %2$s" : "%2$s グループと共有しました",
+ "Shared with %3$s by %2$s" : "%3$s と %2$s で共有しました",
+ "Shared with group %3$s by %2$s" : "%3$s グループと %2$s で共有しました",
+ "Shared via link by %2$s" : "リンク経由で %2$s が共有しました",
+ "Shared by %2$s" : "%2$s が共有",
+ "Shared via public link" : "公開リンク経由で共有中",
"Shares" : "共有",
+ "You received %2$s as a remote share from %1$s" : "%1$s からリモート共有として %2$s を受け取りました。",
"Accept" : "承諾",
+ "Decline" : "拒否《はてなキーワード》",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
"Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
"This share is password-protected" : "この共有はパスワードで保護されています",
diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json
index 16ca792e33d..8f9efffb782 100644
--- a/apps/files_sharing/l10n/ja.json
+++ b/apps/files_sharing/l10n/ja.json
@@ -36,10 +36,23 @@
"Public shared file %1$s was downloaded" : "公開共有ファイル %1$s がダウンロードされました",
"You shared %1$s with %2$s" : "あなたは %1$s を %2$s と共有しました",
"You shared %1$s with group %2$s" : "あなたは %1$s をグループ %2$s と共有しました",
+ "%2$s shared %1$s with %3$s" : "%2$s は %1$s を %3$s と共有しました",
+ "%2$s shared %1$s with group %3$s" : "%2$s は %1$s をグループ %3$s と共有しました",
+ "%2$s shared %1$s via link" : "%2$s はリンク経由で %1$s を共有しました",
"%2$s shared %1$s with you" : "%2$s は %1$s をあなたと共有しました",
"You shared %1$s via link" : "リンク経由で %1$s を共有しています",
+ "Downloaded via public link" : "公開リンクからダウンロードしました",
+ "Shared with %2$s" : "%2$s と共有しました",
+ "Shared with group %2$s" : "%2$s グループと共有しました",
+ "Shared with %3$s by %2$s" : "%3$s と %2$s で共有しました",
+ "Shared with group %3$s by %2$s" : "%3$s グループと %2$s で共有しました",
+ "Shared via link by %2$s" : "リンク経由で %2$s が共有しました",
+ "Shared by %2$s" : "%2$s が共有",
+ "Shared via public link" : "公開リンク経由で共有中",
"Shares" : "共有",
+ "You received %2$s as a remote share from %1$s" : "%1$s からリモート共有として %2$s を受け取りました。",
"Accept" : "承諾",
+ "Decline" : "拒否《はてなキーワード》",
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
"Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
"This share is password-protected" : "この共有はパスワードで保護されています",
diff --git a/apps/files_sharing/l10n/lv.js b/apps/files_sharing/l10n/lv.js
index 9c2f4d3fe48..f59a8d0b395 100644
--- a/apps/files_sharing/l10n/lv.js
+++ b/apps/files_sharing/l10n/lv.js
@@ -56,6 +56,7 @@ OC.L10N.register(
"Download %s" : "Lejupielādēt %s",
"Direct link" : "Tiešā saite",
"Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
+ "Open documentation" : "Atvērt dokumentāciju",
"Allow users on this server to send shares to other servers" : "Atļaut šī servera lietotājiem sūtīt koplietotnes uz citiem serveriem",
"Allow users on this server to receive shares from other servers" : "Atļaut šī servera lietotājiem saņem koplietotnes no citiem serveriem"
},
diff --git a/apps/files_sharing/l10n/lv.json b/apps/files_sharing/l10n/lv.json
index abc16e3ad68..7c7e43cce4b 100644
--- a/apps/files_sharing/l10n/lv.json
+++ b/apps/files_sharing/l10n/lv.json
@@ -54,6 +54,7 @@
"Download %s" : "Lejupielādēt %s",
"Direct link" : "Tiešā saite",
"Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
+ "Open documentation" : "Atvērt dokumentāciju",
"Allow users on this server to send shares to other servers" : "Atļaut šī servera lietotājiem sūtīt koplietotnes uz citiem serveriem",
"Allow users on this server to receive shares from other servers" : "Atļaut šī servera lietotājiem saņem koplietotnes no citiem serveriem"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
diff --git a/apps/files_sharing/l10n/zh_TW.js b/apps/files_sharing/l10n/zh_TW.js
index b7e7ca4f91f..eecbbf1f92e 100644
--- a/apps/files_sharing/l10n/zh_TW.js
+++ b/apps/files_sharing/l10n/zh_TW.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Cancel" : "取消",
"Add remote share" : "加入遠端分享",
"You can upload into this folder" : "你可以上傳內容到此資料夾",
+ "No ownCloud installation (7 or higher) found at {remote}" : "沒有在 {remote} 找到 ownCloud (本版7 或 更新版)",
"Invalid ownCloud url" : "無效的 ownCloud URL",
"Shared by" : "由...分享",
"Sharing" : "分享",
diff --git a/apps/files_sharing/l10n/zh_TW.json b/apps/files_sharing/l10n/zh_TW.json
index 944014926d0..14be4c11d55 100644
--- a/apps/files_sharing/l10n/zh_TW.json
+++ b/apps/files_sharing/l10n/zh_TW.json
@@ -19,6 +19,7 @@
"Cancel" : "取消",
"Add remote share" : "加入遠端分享",
"You can upload into this folder" : "你可以上傳內容到此資料夾",
+ "No ownCloud installation (7 or higher) found at {remote}" : "沒有在 {remote} 找到 ownCloud (本版7 或 更新版)",
"Invalid ownCloud url" : "無效的 ownCloud URL",
"Shared by" : "由...分享",
"Sharing" : "分享",
diff --git a/apps/files_trashbin/l10n/zh_TW.js b/apps/files_trashbin/l10n/zh_TW.js
index 85d0873eddf..e0ad6dbd723 100644
--- a/apps/files_trashbin/l10n/zh_TW.js
+++ b/apps/files_trashbin/l10n/zh_TW.js
@@ -5,13 +5,15 @@ OC.L10N.register(
"Couldn't restore %s" : "無法還原 %s",
"Deleted files" : "回收桶",
"Restore" : "還原",
+ "Delete" : "刪除",
"Delete permanently" : "永久刪除",
"Error" : "錯誤",
"restored" : "已還原",
+ "No deleted files" : "沒有已刪除的檔案",
+ "You will be able to recover deleted files from here" : "您可以從這裡還原已刪除的檔案",
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
"Name" : "名稱",
- "Deleted" : "已刪除",
- "Delete" : "刪除"
+ "Deleted" : "已刪除"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_trashbin/l10n/zh_TW.json b/apps/files_trashbin/l10n/zh_TW.json
index 5c744f828c9..6a313220b58 100644
--- a/apps/files_trashbin/l10n/zh_TW.json
+++ b/apps/files_trashbin/l10n/zh_TW.json
@@ -3,13 +3,15 @@
"Couldn't restore %s" : "無法還原 %s",
"Deleted files" : "回收桶",
"Restore" : "還原",
+ "Delete" : "刪除",
"Delete permanently" : "永久刪除",
"Error" : "錯誤",
"restored" : "已還原",
+ "No deleted files" : "沒有已刪除的檔案",
+ "You will be able to recover deleted files from here" : "您可以從這裡還原已刪除的檔案",
"No entries found in this folder" : "在此資料夾中沒有任何項目",
"Select all" : "全選",
"Name" : "名稱",
- "Deleted" : "已刪除",
- "Delete" : "刪除"
+ "Deleted" : "已刪除"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 32472c13b03..dd8ffe14bca 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -691,8 +691,9 @@ class Access extends LDAPUtility implements user\IUserTools {
* @param array $ldapRecords
*/
public function batchApplyUserAttributes(array $ldapRecords){
+ $displayNameAttribute = strtolower($this->connection->ldapUserDisplayName);
foreach($ldapRecords as $userRecord) {
- $ocName = $this->dn2ocname($userRecord['dn'][0], $userRecord[$this->connection->ldapUserDisplayName]);
+ $ocName = $this->dn2ocname($userRecord['dn'][0], $userRecord[$displayNameAttribute]);
$this->cacheUserExists($ocName);
$user = $this->userManager->get($ocName);
$user->processAttributes($userRecord);
diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php
index c77f7254c94..0dc3c8c0c26 100644
--- a/apps/user_ldap/lib/user/user.php
+++ b/apps/user_ldap/lib/user/user.php
@@ -417,9 +417,9 @@ class User {
}
//can be null
$quotaDefault = $this->connection->ldapQuotaDefault;
- $quota = !is_null($valueFromLDAP)
- ? $valueFromLDAP
- : $quotaDefault !== '' ? $quotaDefault : null;
+ $quota = $quotaDefault !== '' ? $quotaDefault : null;
+ $quota = !is_null($valueFromLDAP) ? $valueFromLDAP : $quota;
+
if(is_null($valueFromLDAP)) {
$quotaAttribute = $this->connection->ldapQuotaAttribute;
if(!empty($quotaAttribute)) {
diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php
index cb6dbf0cd5d..25e871d9b3d 100644
--- a/apps/user_ldap/tests/access.php
+++ b/apps/user_ldap/tests/access.php
@@ -230,24 +230,34 @@ class Test_Access extends \Test\TestCase {
$mapperMock = $this->getMockBuilder('\OCA\User_LDAP\Mapping\UserMapping')
->disableOriginalConstructor()
->getMock();
+
+ $mapperMock->expects($this->any())
+ ->method('getNameByDN')
+ ->will($this->returnValue('a_username'));
+
$userMock = $this->getMockBuilder('\OCA\user_ldap\lib\user\User')
->disableOriginalConstructor()
->getMock();
+ $access->connection->expects($this->any())
+ ->method('__get')
+ ->will($this->returnValue('displayName'));
+
$access->setUserMapper($mapperMock);
+ $displayNameAttribute = strtolower($access->connection->ldapUserDisplayName);
$data = array(
array(
'dn' => 'foobar',
- $con->ldapUserDisplayName => 'barfoo'
+ $displayNameAttribute => 'barfoo'
),
array(
'dn' => 'foo',
- $con->ldapUserDisplayName => 'bar'
+ $displayNameAttribute => 'bar'
),
array(
'dn' => 'raboof',
- $con->ldapUserDisplayName => 'oofrab'
+ $displayNameAttribute => 'oofrab'
)
);
diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php
index 1c41eb71ec2..19581d835d1 100644
--- a/apps/user_ldap/tests/user/user.php
+++ b/apps/user_ldap/tests/user/user.php
@@ -370,6 +370,45 @@ class Test_User_User extends \Test\TestCase {
$user->updateQuota();
}
+ public function testUpdateQuotaFromValue() {
+ list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) =
+ $this->getTestInstances();
+
+ list($access, $connection) =
+ $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc);
+
+ $readQuota = '19 GB';
+
+ $connection->expects($this->at(0))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaDefault'))
+ ->will($this->returnValue(''));
+
+ $connection->expects($this->once(1))
+ ->method('__get')
+ ->with($this->equalTo('ldapQuotaDefault'))
+ ->will($this->returnValue(null));
+
+ $access->expects($this->never())
+ ->method('readAttribute');
+
+ $config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->equalTo('alice'),
+ $this->equalTo('files'),
+ $this->equalTo('quota'),
+ $this->equalTo($readQuota))
+ ->will($this->returnValue(true));
+
+ $uid = 'alice';
+ $dn = 'uid=alice,dc=foo,dc=bar';
+
+ $user = new User(
+ $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr);
+
+ $user->updateQuota($readQuota);
+ }
+
//the testUpdateAvatar series also implicitely tests getAvatarImage
public function testUpdateAvatarJpegPhotoProvided() {
list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) =