aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/encryption/l10n/ko.js3
-rw-r--r--apps/encryption/l10n/ko.json3
-rw-r--r--apps/files/appinfo/update.php96
-rw-r--r--apps/files/appinfo/version2
-rw-r--r--apps/files/js/filelist.js4
-rw-r--r--apps/files/l10n/ko.js6
-rw-r--r--apps/files/l10n/ko.json6
-rw-r--r--apps/files/l10n/sr.js2
-rw-r--r--apps/files/l10n/sr.json2
-rw-r--r--apps/files_external/l10n/ko.js6
-rw-r--r--apps/files_external/l10n/ko.json6
-rw-r--r--apps/files_external/lib/smb.php5
-rw-r--r--apps/files_external/tests/backends/smb.php12
-rw-r--r--apps/files_sharing/l10n/hu_HU.js33
-rw-r--r--apps/files_sharing/l10n/hu_HU.json33
-rw-r--r--apps/files_sharing/l10n/ko.js11
-rw-r--r--apps/files_sharing/l10n/ko.json11
-rw-r--r--apps/files_trashbin/l10n/hu_HU.js2
-rw-r--r--apps/files_trashbin/l10n/hu_HU.json2
-rw-r--r--apps/user_ldap/l10n/ko.js7
-rw-r--r--apps/user_ldap/l10n/ko.json7
-rw-r--r--apps/user_ldap/l10n/sr.js1
-rw-r--r--apps/user_ldap/l10n/sr.json1
-rw-r--r--apps/user_ldap/lib/user/user.php8
-rw-r--r--apps/user_ldap/tests/integration/abstractintegrationtest.php137
-rw-r--r--apps/user_ldap/tests/integration/data/avatar-invalid.gifbin0 -> 48702 bytes
-rw-r--r--apps/user_ldap/tests/integration/data/avatar-valid.jpgbin0 -> 95495 bytes
-rw-r--r--apps/user_ldap/tests/integration/fakemanager.php33
-rw-r--r--apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php128
-rw-r--r--apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php128
-rwxr-xr-xapps/user_ldap/tests/integration/run-test.sh2
-rw-r--r--apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php2
-rwxr-xr-xautotest.sh55
-rw-r--r--build/OCPSinceChecker.php22
-rw-r--r--core/js/js.js1
-rw-r--r--core/js/setupchecks.js3
-rw-r--r--core/js/share.js21
-rw-r--r--core/js/tests/specs/shareSpec.js16
-rw-r--r--core/l10n/hu_HU.js12
-rw-r--r--core/l10n/hu_HU.json12
-rw-r--r--core/l10n/ko.js9
-rw-r--r--core/l10n/ko.json9
-rw-r--r--core/l10n/sr.js2
-rw-r--r--core/l10n/sr.json2
-rw-r--r--lib/l10n/ja.js2
-rw-r--r--lib/l10n/ja.json2
-rw-r--r--lib/l10n/ko.js7
-rw-r--r--lib/l10n/ko.json7
-rw-r--r--lib/l10n/sr.js3
-rw-r--r--lib/l10n/sr.json3
-rw-r--r--lib/private/files/storage/wrapper/encryption.php5
-rw-r--r--lib/private/files/type/detection.php127
-rw-r--r--lib/private/files/utils/scanner.php3
-rw-r--r--lib/private/helper.php99
-rw-r--r--lib/private/server.php15
-rw-r--r--lib/private/share/share.php13
-rw-r--r--lib/public/db/querybuilder/iliteral.php3
-rw-r--r--lib/public/db/querybuilder/iparameter.php3
-rw-r--r--lib/public/db/querybuilder/iqueryfunction.php3
-rw-r--r--lib/public/files/imimetypedetector.php78
-rw-r--r--lib/public/files/mount/imountmanager.php1
-rw-r--r--lib/public/iservercontainer.php9
-rw-r--r--lib/public/template.php2
-rw-r--r--settings/application.php3
-rw-r--r--settings/controller/checksetupcontroller.php70
-rw-r--r--settings/controller/encryptioncontroller.php39
-rw-r--r--settings/js/users/users.js4
-rw-r--r--settings/l10n/az.js1
-rw-r--r--settings/l10n/az.json1
-rw-r--r--settings/l10n/cs_CZ.js1
-rw-r--r--settings/l10n/cs_CZ.json1
-rw-r--r--settings/l10n/da.js2
-rw-r--r--settings/l10n/da.json2
-rw-r--r--settings/l10n/de.js1
-rw-r--r--settings/l10n/de.json1
-rw-r--r--settings/l10n/de_DE.js1
-rw-r--r--settings/l10n/de_DE.json1
-rw-r--r--settings/l10n/el.js1
-rw-r--r--settings/l10n/el.json1
-rw-r--r--settings/l10n/en_GB.js1
-rw-r--r--settings/l10n/en_GB.json1
-rw-r--r--settings/l10n/es.js1
-rw-r--r--settings/l10n/es.json1
-rw-r--r--settings/l10n/eu.js1
-rw-r--r--settings/l10n/eu.json1
-rw-r--r--settings/l10n/fi_FI.js1
-rw-r--r--settings/l10n/fi_FI.json1
-rw-r--r--settings/l10n/fr.js1
-rw-r--r--settings/l10n/fr.json1
-rw-r--r--settings/l10n/gl.js1
-rw-r--r--settings/l10n/gl.json1
-rw-r--r--settings/l10n/hu_HU.js6
-rw-r--r--settings/l10n/hu_HU.json6
-rw-r--r--settings/l10n/id.js1
-rw-r--r--settings/l10n/id.json1
-rw-r--r--settings/l10n/it.js1
-rw-r--r--settings/l10n/it.json1
-rw-r--r--settings/l10n/ja.js1
-rw-r--r--settings/l10n/ja.json1
-rw-r--r--settings/l10n/ko.js13
-rw-r--r--settings/l10n/ko.json13
-rw-r--r--settings/l10n/lt_LT.js1
-rw-r--r--settings/l10n/lt_LT.json1
-rw-r--r--settings/l10n/lv.js1
-rw-r--r--settings/l10n/lv.json1
-rw-r--r--settings/l10n/nb_NO.js1
-rw-r--r--settings/l10n/nb_NO.json1
-rw-r--r--settings/l10n/nl.js1
-rw-r--r--settings/l10n/nl.json1
-rw-r--r--settings/l10n/pt_BR.js1
-rw-r--r--settings/l10n/pt_BR.json1
-rw-r--r--settings/l10n/pt_PT.js1
-rw-r--r--settings/l10n/pt_PT.json1
-rw-r--r--settings/l10n/ru.js1
-rw-r--r--settings/l10n/ru.json1
-rw-r--r--settings/l10n/sk_SK.js1
-rw-r--r--settings/l10n/sk_SK.json1
-rw-r--r--settings/l10n/sl.js1
-rw-r--r--settings/l10n/sl.json1
-rw-r--r--settings/l10n/sr.js5
-rw-r--r--settings/l10n/sr.json5
-rw-r--r--settings/l10n/th_TH.js1
-rw-r--r--settings/l10n/th_TH.json1
-rw-r--r--settings/l10n/tr.js1
-rw-r--r--settings/l10n/tr.json1
-rw-r--r--settings/l10n/uk.js1
-rw-r--r--settings/l10n/uk.json1
-rw-r--r--settings/l10n/zh_CN.js1
-rw-r--r--settings/l10n/zh_CN.json1
-rw-r--r--tests/lib/files/storage/wrapper/encryption.php61
-rw-r--r--tests/lib/files/type/detection.php283
-rw-r--r--tests/lib/files/utils/scanner.php28
-rw-r--r--tests/lib/share/share.php36
-rw-r--r--tests/settings/controller/CheckSetupControllerTest.php156
-rw-r--r--tests/settings/controller/EncryptionControllerTest.php151
-rw-r--r--version.php2
136 files changed, 1944 insertions, 243 deletions
diff --git a/apps/encryption/l10n/ko.js b/apps/encryption/l10n/ko.js
index 9e82a7ff266..891265e8c91 100644
--- a/apps/encryption/l10n/ko.js
+++ b/apps/encryption/l10n/ko.js
@@ -21,9 +21,12 @@ OC.L10N.register(
"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" : "암호화 앱이 활성화되었고 준비됨",
"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." : "이 파일을 읽을 수 없습니다. 공유된 파일이라면 파일 소유자에게 연락하여 다시 공유해 달라고 요청하십시오.",
"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/ko.json b/apps/encryption/l10n/ko.json
index 5fcdae4cde3..0231412e29a 100644
--- a/apps/encryption/l10n/ko.json
+++ b/apps/encryption/l10n/ko.json
@@ -19,9 +19,12 @@
"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" : "암호화 앱이 활성화되었고 준비됨",
"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." : "이 파일을 읽을 수 없습니다. 공유된 파일이라면 파일 소유자에게 연락하여 다시 공유해 달라고 요청하십시오.",
"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/files/appinfo/update.php b/apps/files/appinfo/update.php
new file mode 100644
index 00000000000..2691c05c348
--- /dev/null
+++ b/apps/files/appinfo/update.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+$installedVersion = \OC::$server->getConfig()->getAppValue('files', 'installed_version');
+$ocVersion = explode('.', \OC::$server->getSystemConfig()->getValue('version'));
+
+/**
+ * In case encryption was not enabled, we accidently set encrypted = 1 for
+ * files inside mount points, since 8.1.0. This breaks opening the files in
+ * 8.1.1 because we fixed the code that checks if a file is encrypted.
+ * In order to fix the file, we need to reset the flag of the file. However,
+ * the flag might be set because the file is in fact encrypted because it was
+ * uploaded at a time where encryption was enabled.
+ *
+ * So we can only do this when:
+ * - Current version of ownCloud before the update is 8.1.0 or 8.2.0.(0-2)
+ * - Encryption is disabled
+ * - files_encryption is not known in the app config
+ *
+ * If the first two are not the case, we are save. However, if files_encryption
+ * values exist in the config, we might have a false negative here.
+ * Now if there is no file with unencrypted size greater 0, that means there are
+ * no files that are still encrypted with "files_encryption" encryption. So we
+ * can also safely reset the flag here.
+ *
+ * If this is not the case, we go with "better save then sorry" and don't change
+ * the flag but write a message to the ownCloud log file.
+ */
+
+/**
+ * @param \OCP\IDBConnection $conn
+ */
+function owncloud_reset_encrypted_flag(\OCP\IDBConnection $conn) {
+ $conn->executeUpdate('UPDATE `*PREFIX*filecache` SET `encrypted` = 0 WHERE `encrypted` = 1');
+}
+
+// Current version of ownCloud before the update is 8.1.0 or 8.2.0.(0-2)
+if ($installedVersion === '1.1.9' && (
+ // 8.1.0.x
+ (((int) $ocVersion[0]) === 8 && ((int) $ocVersion[1]) === 1 && ((int) $ocVersion[2]) === 0)
+ ||
+ // < 8.2.0.3
+ (((int) $ocVersion[0]) === 8 && ((int) $ocVersion[1]) === 2 && ((int) $ocVersion[2]) === 0 && ((int) $ocVersion[3]) < 3)
+ )) {
+
+ // Encryption is not enabled
+ if (!\OC::$server->getEncryptionManager()->isEnabled()) {
+ $conn = \OC::$server->getDatabaseConnection();
+
+ // Old encryption is not known in app config
+ $oldEncryption = \OC::$server->getConfig()->getAppKeys('files_encryption');
+ if (empty($oldEncryption)) {
+ owncloud_reset_encrypted_flag($conn);
+ } else {
+ $query = $conn->prepare('SELECT * FROM `*PREFIX*filecache` WHERE `encrypted` = 1 AND `unencrypted_size` > 0', 1);
+ $query->execute();
+ $empty = $query->fetch();
+
+ if (empty($empty)) {
+ owncloud_reset_encrypted_flag($conn);
+ } else {
+ /**
+ * Sorry in case you are a false positive, but we are not 100% that
+ * you don't have any encrypted files anymore, so we can not reset
+ * the value safely
+ */
+ \OC::$server->getLogger()->warning(
+ 'If you have a problem with files not being accessible and '
+ . 'you are not using encryption, please have a look at the following'
+ . 'issue: {issue}',
+ [
+ 'issue' => 'https://github.com/owncloud/core/issues/17846',
+ ]
+ );
+ }
+ }
+ }
+}
diff --git a/apps/files/appinfo/version b/apps/files/appinfo/version
index 512a1faa680..5ed5faa5f16 100644
--- a/apps/files/appinfo/version
+++ b/apps/files/appinfo/version
@@ -1 +1 @@
-1.1.9
+1.1.10
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 183b5e909a6..8236ef3b4ac 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -822,7 +822,9 @@
"class": "modified",
"title": formatted,
"style": 'color:rgb('+modifiedColor+','+modifiedColor+','+modifiedColor+')'
- }).text(text));
+ }).text(text)
+ .tooltip({placement: 'top'})
+ );
tr.find('.filesize').text(simpleSize);
tr.append(td);
return tr;
diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js
index b49fcd33bc5..a29ef613da3 100644
--- a/apps/files/l10n/ko.js
+++ b/apps/files/l10n/ko.js
@@ -47,6 +47,8 @@ OC.L10N.register(
"Select" : "선택",
"Pending" : "대기 중",
"Unable to determine date" : "날짜를 결정할 수 없음",
+ "This operation is forbidden" : "이 작업이 금지됨",
+ "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
"Error moving file." : "파일 이동 오류.",
"Error moving file" : "파일 이동 오류",
"Error" : "오류",
@@ -62,8 +64,10 @@ OC.L10N.register(
"_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"],
"\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.",
"File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
"Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
- "Your storage is almost full ({usedSpacePercent}%)" : "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner}의 저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)" : "저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["'{filter}'와(과) 일치"],
"{dirs} and {files}" : "{dirs} 그리고 {files}",
"Favorited" : "책갈피에 추가됨",
diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json
index b9611b185b5..fd001630161 100644
--- a/apps/files/l10n/ko.json
+++ b/apps/files/l10n/ko.json
@@ -45,6 +45,8 @@
"Select" : "선택",
"Pending" : "대기 중",
"Unable to determine date" : "날짜를 결정할 수 없음",
+ "This operation is forbidden" : "이 작업이 금지됨",
+ "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
"Error moving file." : "파일 이동 오류.",
"Error moving file" : "파일 이동 오류",
"Error" : "오류",
@@ -60,8 +62,10 @@
"_Uploading %n file_::_Uploading %n files_" : ["파일 %n개 업로드 중"],
"\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.",
"File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!",
"Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
- "Your storage is almost full ({usedSpacePercent}%)" : "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner}의 저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
+ "Your storage is almost full ({usedSpacePercent}%)" : "저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["'{filter}'와(과) 일치"],
"{dirs} and {files}" : "{dirs} 그리고 {files}",
"Favorited" : "책갈피에 추가됨",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 7a173fe694b..060ac4d506e 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -47,6 +47,8 @@ OC.L10N.register(
"Select" : "Изабери",
"Pending" : "На чекању",
"Unable to determine date" : "Не могу да одредим датум",
+ "This operation is forbidden" : "Ова радња је забрањена",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
"Error moving file." : "Грешка при премештању фајла.",
"Error moving file" : "Грешка при премештању фајла",
"Error" : "Грешка",
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index f535f4fb013..69fefcaf2b2 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -45,6 +45,8 @@
"Select" : "Изабери",
"Pending" : "На чекању",
"Unable to determine date" : "Не могу да одредим датум",
+ "This operation is forbidden" : "Ова радња је забрањена",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора",
"Error moving file." : "Грешка при премештању фајла.",
"Error moving file" : "Грешка при премештању фајла",
"Error" : "Грешка",
diff --git a/apps/files_external/l10n/ko.js b/apps/files_external/l10n/ko.js
index 79fe1e3f4bc..de1ca02820e 100644
--- a/apps/files_external/l10n/ko.js
+++ b/apps/files_external/l10n/ko.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"Username as share" : "사용자 이름으로 공유",
"URL" : "URL",
"Secure https://" : "보안 https://",
+ "SFTP with secret key login" : "비밀 키 로그인을 사용하는 SFTP",
"Public key" : "공개 키",
"Storage with id \"%i\" not found" : "ID가 \"%i\"인 저장소를 찾을 수 없음",
"Invalid mount point" : "잘못된 마운트 지점",
@@ -54,6 +55,11 @@ OC.L10N.register(
"Personal" : "개인",
"System" : "시스템",
"Enable encryption" : "암호화 사용",
+ "Enable previews" : "미리 보기 사용",
+ "Check for changes" : "변경 사항 감시",
+ "Never" : "하지 않음",
+ "Once every direct access" : "한 번 직접 접근할 때마다",
+ "Every time the filesystem is used" : "파일 시스템을 사용할 때마다",
"All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오",
"(group)" : "(그룹)",
"Saved" : "저장됨",
diff --git a/apps/files_external/l10n/ko.json b/apps/files_external/l10n/ko.json
index ef286b2b347..843a9dac051 100644
--- a/apps/files_external/l10n/ko.json
+++ b/apps/files_external/l10n/ko.json
@@ -41,6 +41,7 @@
"Username as share" : "사용자 이름으로 공유",
"URL" : "URL",
"Secure https://" : "보안 https://",
+ "SFTP with secret key login" : "비밀 키 로그인을 사용하는 SFTP",
"Public key" : "공개 키",
"Storage with id \"%i\" not found" : "ID가 \"%i\"인 저장소를 찾을 수 없음",
"Invalid mount point" : "잘못된 마운트 지점",
@@ -52,6 +53,11 @@
"Personal" : "개인",
"System" : "시스템",
"Enable encryption" : "암호화 사용",
+ "Enable previews" : "미리 보기 사용",
+ "Check for changes" : "변경 사항 감시",
+ "Never" : "하지 않음",
+ "Once every direct access" : "한 번 직접 접근할 때마다",
+ "Every time the filesystem is used" : "파일 시스템을 사용할 때마다",
"All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오",
"(group)" : "(그룹)",
"Saved" : "저장됨",
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index 4a2eebf20b1..f58cd9849f2 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -78,7 +78,10 @@ class SMB extends Common {
* @return string
*/
public function getId() {
- return 'smb::' . $this->server->getUser() . '@' . $this->server->getHost() . '/' . $this->share->getName() . '/' . $this->root;
+ // FIXME: double slash to keep compatible with the old storage ids,
+ // failure to do so will lead to creation of a new storage id and
+ // loss of shares from the storage
+ return 'smb::' . $this->server->getUser() . '@' . $this->server->getHost() . '//' . $this->share->getName() . '/' . $this->root;
}
/**
diff --git a/apps/files_external/tests/backends/smb.php b/apps/files_external/tests/backends/smb.php
index 9e60a9e06e0..0da86cb824f 100644
--- a/apps/files_external/tests/backends/smb.php
+++ b/apps/files_external/tests/backends/smb.php
@@ -61,4 +61,16 @@ class SMB extends Storage {
$this->assertTrue($result);
$this->assertTrue($this->instance->is_dir('foo bar'));
}
+
+ public function testStorageId() {
+ $this->instance = new \OC\Files\Storage\SMB([
+ 'host' => 'testhost',
+ 'user' => 'testuser',
+ 'password' => 'somepass',
+ 'share' => 'someshare',
+ 'root' => 'someroot',
+ ]);
+ $this->assertEquals('smb::testuser@testhost//someshare//someroot/', $this->instance->getId());
+ $this->instance = null;
+ }
}
diff --git a/apps/files_sharing/l10n/hu_HU.js b/apps/files_sharing/l10n/hu_HU.js
index 5bd977f9819..c035733d394 100644
--- a/apps/files_sharing/l10n/hu_HU.js
+++ b/apps/files_sharing/l10n/hu_HU.js
@@ -4,24 +4,45 @@ OC.L10N.register(
"Server to server sharing is not enabled on this server" : "A kiszolgálók közötti megosztás nincs engedélyezve ezen a kiszolgálón",
"The mountpoint name contains invalid characters." : "A csatlakozási pont neve érvénytelen karaktereket tartalmaz ",
"Invalid or untrusted SSL certificate" : "Érvénytelen vagy nem megbízható az SSL tanúsítvány",
+ "Could not authenticate to remote share, password might be wrong" : "Nem sikerült az azonosítás a távoli megosztáshoz. Lehet, hogy rossz a jelszó.",
+ "Storage not valid" : "Tároló nem érvényes",
"Couldn't add remote share" : "A távoli megosztás nem hozható létre",
"Shared with you" : "Velem osztották meg",
"Shared with others" : "Én osztottam meg másokkal",
"Shared by link" : "Linkkel osztottam meg",
+ "Nothing shared with you yet" : "Nincs még semmi megosztva Önnel",
+ "Files and folders others share with you will show up here" : "Mások által megosztott fájlok itt jelennek meg",
+ "Nothing shared yet" : "Nincs semmi megosztva",
+ "Files and folders you share will show up here" : "Az Ön által megosztott fáljok itt jelennek meg",
+ "No shared links" : "Nincs megosztott link",
+ "Files and folders you share by link will show up here" : "Link-el megosztott fájljai itt jelennek meg",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Használatba kívánja venni a {name} távoli megosztást, amit a {owner}@{remote} címről kapott?",
"Remote share" : "Távoli megosztás",
"Remote share password" : "Jelszó a távoli megosztáshoz",
"Cancel" : "Mégsem",
"Add remote share" : "Távoli megosztás létrehozása",
+ "You can upload into this folder" : "Ebbe a könyvtárba fel tud tölteni",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Nem található ownCloud telepítés (7 vagy nagyobb verzió) itt {remote}",
"Invalid ownCloud url" : "Érvénytelen ownCloud webcím",
"Share" : "Megosztás",
"Shared by" : "Megosztotta Önnel",
"A file or folder has been <strong>shared</strong>" : "Fájl vagy könyvtár <strong>megosztása</strong>",
+ "A file or folder was shared from <strong>another server</strong>" : "Egy fájl vagy könyvtár meg lett osztva egy <strong>másik szerverről</strong>",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Egy nyilvánosan megosztott fáljt vagy könyvtárat <strong>letöltöttek</strong>",
+ "You received a new remote share %2$s from %1$s" : "A %2$s távoli megosztás érkezett a %1$s -től",
+ "You received a new remote share from %s" : "Új távoli megosztás érkezett a %s -től",
+ "%1$s accepted remote share %2$s" : "%1$s elfogadta a távoli megosztást %2$s",
+ "%1$s declined remote share %2$s" : "%1$s visszavonta a távoli megosztást %2$s",
+ "%1$s unshared %2$s from you" : "%1$s megosztás visszavonva %2$s által",
+ "Public shared folder %1$s was downloaded" : "Nyilvánosan megosztott könyvtár %1$s le lett töltve",
+ "Public shared file %1$s was downloaded" : "Nyilvánosan megosztott fálj %1$s le lett töltve",
"You shared %1$s with %2$s" : "%1$s-t megosztottam ővele: %2$s",
"You shared %1$s with group %2$s" : "%1$s-t megosztottam ezzel a csoporttal: %2$s",
"%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s",
"You shared %1$s via link" : "Megosztottam link segítségével: %1$s",
"Shares" : "Megosztások",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
@@ -37,6 +58,16 @@ OC.L10N.register(
"Add to your ownCloud" : "Adjuk hozzá a saját ownCloudunkhoz",
"Download" : "Letöltés",
"Download %s" : "%s letöltése",
- "Direct link" : "Közvetlen link"
+ "Direct link" : "Közvetlen link",
+ "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
+ "Open documentation" : "Dokumentáció megnyitása",
+ "Allow users on this server to send shares to other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy fájlokat osszanak meg más szerverekkel.",
+ "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől",
+ "Federated Cloud" : "Egyesített felhő",
+ "Your Federated Cloud ID:" : "Egyesített felhő azonosító:",
+ "Share it:" : "Ossza meg:",
+ "Add it to your website:" : "Adja hozzá a saját weboldalához:",
+ "Share with me via ownCloud" : "Ossza meg velem ownCloud-on keresztül",
+ "HTML Code:" : "HTML Code:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/hu_HU.json b/apps/files_sharing/l10n/hu_HU.json
index 5261ba438e7..d35cf5f438d 100644
--- a/apps/files_sharing/l10n/hu_HU.json
+++ b/apps/files_sharing/l10n/hu_HU.json
@@ -2,24 +2,45 @@
"Server to server sharing is not enabled on this server" : "A kiszolgálók közötti megosztás nincs engedélyezve ezen a kiszolgálón",
"The mountpoint name contains invalid characters." : "A csatlakozási pont neve érvénytelen karaktereket tartalmaz ",
"Invalid or untrusted SSL certificate" : "Érvénytelen vagy nem megbízható az SSL tanúsítvány",
+ "Could not authenticate to remote share, password might be wrong" : "Nem sikerült az azonosítás a távoli megosztáshoz. Lehet, hogy rossz a jelszó.",
+ "Storage not valid" : "Tároló nem érvényes",
"Couldn't add remote share" : "A távoli megosztás nem hozható létre",
"Shared with you" : "Velem osztották meg",
"Shared with others" : "Én osztottam meg másokkal",
"Shared by link" : "Linkkel osztottam meg",
+ "Nothing shared with you yet" : "Nincs még semmi megosztva Önnel",
+ "Files and folders others share with you will show up here" : "Mások által megosztott fájlok itt jelennek meg",
+ "Nothing shared yet" : "Nincs semmi megosztva",
+ "Files and folders you share will show up here" : "Az Ön által megosztott fáljok itt jelennek meg",
+ "No shared links" : "Nincs megosztott link",
+ "Files and folders you share by link will show up here" : "Link-el megosztott fájljai itt jelennek meg",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Használatba kívánja venni a {name} távoli megosztást, amit a {owner}@{remote} címről kapott?",
"Remote share" : "Távoli megosztás",
"Remote share password" : "Jelszó a távoli megosztáshoz",
"Cancel" : "Mégsem",
"Add remote share" : "Távoli megosztás létrehozása",
+ "You can upload into this folder" : "Ebbe a könyvtárba fel tud tölteni",
+ "No ownCloud installation (7 or higher) found at {remote}" : "Nem található ownCloud telepítés (7 vagy nagyobb verzió) itt {remote}",
"Invalid ownCloud url" : "Érvénytelen ownCloud webcím",
"Share" : "Megosztás",
"Shared by" : "Megosztotta Önnel",
"A file or folder has been <strong>shared</strong>" : "Fájl vagy könyvtár <strong>megosztása</strong>",
+ "A file or folder was shared from <strong>another server</strong>" : "Egy fájl vagy könyvtár meg lett osztva egy <strong>másik szerverről</strong>",
+ "A public shared file or folder was <strong>downloaded</strong>" : "Egy nyilvánosan megosztott fáljt vagy könyvtárat <strong>letöltöttek</strong>",
+ "You received a new remote share %2$s from %1$s" : "A %2$s távoli megosztás érkezett a %1$s -től",
+ "You received a new remote share from %s" : "Új távoli megosztás érkezett a %s -től",
+ "%1$s accepted remote share %2$s" : "%1$s elfogadta a távoli megosztást %2$s",
+ "%1$s declined remote share %2$s" : "%1$s visszavonta a távoli megosztást %2$s",
+ "%1$s unshared %2$s from you" : "%1$s megosztás visszavonva %2$s által",
+ "Public shared folder %1$s was downloaded" : "Nyilvánosan megosztott könyvtár %1$s le lett töltve",
+ "Public shared file %1$s was downloaded" : "Nyilvánosan megosztott fálj %1$s le lett töltve",
"You shared %1$s with %2$s" : "%1$s-t megosztottam ővele: %2$s",
"You shared %1$s with group %2$s" : "%1$s-t megosztottam ezzel a csoporttal: %2$s",
"%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s",
"You shared %1$s via link" : "Megosztottam link segítségével: %1$s",
"Shares" : "Megosztások",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
@@ -35,6 +56,16 @@
"Add to your ownCloud" : "Adjuk hozzá a saját ownCloudunkhoz",
"Download" : "Letöltés",
"Download %s" : "%s letöltése",
- "Direct link" : "Közvetlen link"
+ "Direct link" : "Közvetlen link",
+ "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
+ "Open documentation" : "Dokumentáció megnyitása",
+ "Allow users on this server to send shares to other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy fájlokat osszanak meg más szerverekkel.",
+ "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől",
+ "Federated Cloud" : "Egyesített felhő",
+ "Your Federated Cloud ID:" : "Egyesített felhő azonosító:",
+ "Share it:" : "Ossza meg:",
+ "Add it to your website:" : "Adja hozzá a saját weboldalához:",
+ "Share with me via ownCloud" : "Ossza meg velem ownCloud-on keresztül",
+ "HTML Code:" : "HTML Code:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ko.js b/apps/files_sharing/l10n/ko.js
index 0373de3ca9d..a8d99ada8ed 100644
--- a/apps/files_sharing/l10n/ko.js
+++ b/apps/files_sharing/l10n/ko.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "파일이나 폴더가 <strong>공유됨</strong>",
"A file or folder was shared from <strong>another server</strong>" : "<strong>다른 서버</strong>에서 파일이나 폴더를 공유함",
"A public shared file or folder was <strong>downloaded</strong>" : "공개 공유된 파일이나 폴더가 <strong>다운로드됨</strong>",
+ "You received a new remote share %2$s from %1$s" : "%1$s에서 새 원격 공유 %2$s을(를) 받았습니다",
"You received a new remote share from %s" : "%s에서 원격 공유 요청을 받았습니다",
"%1$s accepted remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 수락함",
"%1$s declined remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 거절함",
@@ -40,6 +41,8 @@ OC.L10N.register(
"%2$s shared %1$s with you" : "%2$s 님이 내게 %1$s을(를) 공유함",
"You shared %1$s via link" : "내가 %1$s을(를) 링크로 공유함",
"Shares" : "공유",
+ "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" : "이 공유는 암호로 보호되어 있습니다",
"The password is wrong. Try again." : "암호가 잘못되었습니다. 다시 입력해 주십시오.",
"Password" : "암호",
@@ -59,6 +62,12 @@ OC.L10N.register(
"Federated Cloud Sharing" : "클라우드 연합 공유",
"Open documentation" : "문서 열기",
"Allow users on this server to send shares to other servers" : "이 서버의 사용자가 다른 서버와 공유할 수 있도록 허용",
- "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용"
+ "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용",
+ "Federated Cloud" : "연합 클라우드",
+ "Your Federated Cloud ID:" : "내 연합 클라우드 ID:",
+ "Share it:" : "공유하기:",
+ "Add it to your website:" : "웹 사이트에 다음을 추가하십시오:",
+ "Share with me via ownCloud" : "ownCloud로 나와 공유하기",
+ "HTML Code:" : "HTML 코드:"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/ko.json b/apps/files_sharing/l10n/ko.json
index 054194ee7a7..85d4543bb14 100644
--- a/apps/files_sharing/l10n/ko.json
+++ b/apps/files_sharing/l10n/ko.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "파일이나 폴더가 <strong>공유됨</strong>",
"A file or folder was shared from <strong>another server</strong>" : "<strong>다른 서버</strong>에서 파일이나 폴더를 공유함",
"A public shared file or folder was <strong>downloaded</strong>" : "공개 공유된 파일이나 폴더가 <strong>다운로드됨</strong>",
+ "You received a new remote share %2$s from %1$s" : "%1$s에서 새 원격 공유 %2$s을(를) 받았습니다",
"You received a new remote share from %s" : "%s에서 원격 공유 요청을 받았습니다",
"%1$s accepted remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 수락함",
"%1$s declined remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 거절함",
@@ -38,6 +39,8 @@
"%2$s shared %1$s with you" : "%2$s 님이 내게 %1$s을(를) 공유함",
"You shared %1$s via link" : "내가 %1$s을(를) 링크로 공유함",
"Shares" : "공유",
+ "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" : "이 공유는 암호로 보호되어 있습니다",
"The password is wrong. Try again." : "암호가 잘못되었습니다. 다시 입력해 주십시오.",
"Password" : "암호",
@@ -57,6 +60,12 @@
"Federated Cloud Sharing" : "클라우드 연합 공유",
"Open documentation" : "문서 열기",
"Allow users on this server to send shares to other servers" : "이 서버의 사용자가 다른 서버와 공유할 수 있도록 허용",
- "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용"
+ "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용",
+ "Federated Cloud" : "연합 클라우드",
+ "Your Federated Cloud ID:" : "내 연합 클라우드 ID:",
+ "Share it:" : "공유하기:",
+ "Add it to your website:" : "웹 사이트에 다음을 추가하십시오:",
+ "Share with me via ownCloud" : "ownCloud로 나와 공유하기",
+ "HTML Code:" : "HTML 코드:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_trashbin/l10n/hu_HU.js b/apps/files_trashbin/l10n/hu_HU.js
index 2863e8e6a68..0df2816a312 100644
--- a/apps/files_trashbin/l10n/hu_HU.js
+++ b/apps/files_trashbin/l10n/hu_HU.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"Delete permanently" : "Végleges törlés",
"Error" : "Hiba",
"restored" : "visszaállítva",
+ "No deleted files" : "Nincs törölt fájl",
+ "You will be able to recover deleted files from here" : "Innen vissza tudja állítani a törölt fáljait.",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
"Select all" : "Összes kijelölése",
"Name" : "Név",
diff --git a/apps/files_trashbin/l10n/hu_HU.json b/apps/files_trashbin/l10n/hu_HU.json
index 91c613d638d..331cd210721 100644
--- a/apps/files_trashbin/l10n/hu_HU.json
+++ b/apps/files_trashbin/l10n/hu_HU.json
@@ -6,6 +6,8 @@
"Delete permanently" : "Végleges törlés",
"Error" : "Hiba",
"restored" : "visszaállítva",
+ "No deleted files" : "Nincs törölt fájl",
+ "You will be able to recover deleted files from here" : "Innen vissza tudja állítani a törölt fáljait.",
"No entries found in this folder" : "Nincsenek bejegyzések ebben a könyvtárban",
"Select all" : "Összes kijelölése",
"Name" : "Név",
diff --git a/apps/user_ldap/l10n/ko.js b/apps/user_ldap/l10n/ko.js
index dab98051611..db5105165eb 100644
--- a/apps/user_ldap/l10n/ko.js
+++ b/apps/user_ldap/l10n/ko.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Failed to clear the mappings." : "매핑을 비울 수 없습니다.",
"Failed to delete the server configuration" : "서버 설정을 삭제할 수 없습니다.",
+ "The configuration is invalid: anonymous bind is not allowed." : "설정이 잘못되었습니다: 익명 연결은 허용되지 않습니다.",
"The configuration is valid and the connection could be established!" : "설정 정보가 올바르고 연결할 수 있습니다!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "설정 정보가 올바르지만 바인딩이 실패하였습니다. 서버 설정과 인증 정보를 확인하십시오.",
"The configuration is invalid. Please have a look at the logs for further details." : "설정이 올바르지 않습니다. 자세한 사항은 로그를 참고하십시오.",
@@ -11,6 +12,7 @@ OC.L10N.register(
"No data specified" : "데이터가 지정되지 않음",
" Could not set configuration %s" : " 설정 %s을(를) 지정할 수 없음",
"Action does not exist" : "동작이 존재하지 않음",
+ "The Base DN appears to be wrong" : "기본 DN이 올바르지 않습니다",
"Configuration incorrect" : "설정 올바르지 않음",
"Configuration incomplete" : "설정 불완전함",
"Configuration OK" : "설정 올바름",
@@ -29,6 +31,8 @@ OC.L10N.register(
"Confirm Deletion" : "삭제 확인",
"Mappings cleared successfully!" : "매핑을 삭제하였습니다!",
"Error while clearing the mappings." : "매핑을 삭제하는 중 오류가 발생하였습니다.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "익명 연결은 허용되지 않습니다. 사용자 DN과 암호를 입력하십시오.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP 작업 오류입니다. 익명 연결이 비활성화 되었을 수 있습니다.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "저장할 수 없습니다. 데이터베이스 상태를 확인하십시오. 계속하기 전에 새로 고치십시오.",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "모드를 전환하면 자동 LDAP 쿼리를 활성화합니다. LDAP 크기에 따라서 시간이 걸릴 수도 있습니다. 모드를 전환하시겠습니까?",
"Mode switch" : "모드 전환",
@@ -74,6 +78,9 @@ OC.L10N.register(
"Verify settings" : "설정 검사",
"1. Server" : "1. 서버",
"%s. Server:" : "%s. 서버:",
+ "Add a new and blank configuration" : "새 빈 설정 추가",
+ "Copy current configuration into new directory binding" : "현재 설정을 새 디렉터리 바인딩으로 복사",
+ "Delete the current configuration" : "현재 설정 삭제",
"Host" : "호스트",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "SSL을 사용하지 않으면 프로토콜을 입력하지 않아도 됩니다. SSL을 사용하려면 ldaps://를 입력하십시오.",
"Port" : "포트",
diff --git a/apps/user_ldap/l10n/ko.json b/apps/user_ldap/l10n/ko.json
index ef04a2c8d93..b2135d4e2a3 100644
--- a/apps/user_ldap/l10n/ko.json
+++ b/apps/user_ldap/l10n/ko.json
@@ -1,6 +1,7 @@
{ "translations": {
"Failed to clear the mappings." : "매핑을 비울 수 없습니다.",
"Failed to delete the server configuration" : "서버 설정을 삭제할 수 없습니다.",
+ "The configuration is invalid: anonymous bind is not allowed." : "설정이 잘못되었습니다: 익명 연결은 허용되지 않습니다.",
"The configuration is valid and the connection could be established!" : "설정 정보가 올바르고 연결할 수 있습니다!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "설정 정보가 올바르지만 바인딩이 실패하였습니다. 서버 설정과 인증 정보를 확인하십시오.",
"The configuration is invalid. Please have a look at the logs for further details." : "설정이 올바르지 않습니다. 자세한 사항은 로그를 참고하십시오.",
@@ -9,6 +10,7 @@
"No data specified" : "데이터가 지정되지 않음",
" Could not set configuration %s" : " 설정 %s을(를) 지정할 수 없음",
"Action does not exist" : "동작이 존재하지 않음",
+ "The Base DN appears to be wrong" : "기본 DN이 올바르지 않습니다",
"Configuration incorrect" : "설정 올바르지 않음",
"Configuration incomplete" : "설정 불완전함",
"Configuration OK" : "설정 올바름",
@@ -27,6 +29,8 @@
"Confirm Deletion" : "삭제 확인",
"Mappings cleared successfully!" : "매핑을 삭제하였습니다!",
"Error while clearing the mappings." : "매핑을 삭제하는 중 오류가 발생하였습니다.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "익명 연결은 허용되지 않습니다. 사용자 DN과 암호를 입력하십시오.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP 작업 오류입니다. 익명 연결이 비활성화 되었을 수 있습니다.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "저장할 수 없습니다. 데이터베이스 상태를 확인하십시오. 계속하기 전에 새로 고치십시오.",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "모드를 전환하면 자동 LDAP 쿼리를 활성화합니다. LDAP 크기에 따라서 시간이 걸릴 수도 있습니다. 모드를 전환하시겠습니까?",
"Mode switch" : "모드 전환",
@@ -72,6 +76,9 @@
"Verify settings" : "설정 검사",
"1. Server" : "1. 서버",
"%s. Server:" : "%s. 서버:",
+ "Add a new and blank configuration" : "새 빈 설정 추가",
+ "Copy current configuration into new directory binding" : "현재 설정을 새 디렉터리 바인딩으로 복사",
+ "Delete the current configuration" : "현재 설정 삭제",
"Host" : "호스트",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "SSL을 사용하지 않으면 프로토콜을 입력하지 않아도 됩니다. SSL을 사용하려면 ldaps://를 입력하십시오.",
"Port" : "포트",
diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js
index dd570c70e5c..89ec30d6afc 100644
--- a/apps/user_ldap/l10n/sr.js
+++ b/apps/user_ldap/l10n/sr.js
@@ -78,6 +78,7 @@ OC.L10N.register(
"Verify settings" : "Провери поставке",
"1. Server" : "1. сервер",
"%s. Server:" : "%s. Сервер:",
+ "Add a new and blank configuration" : "Додај нову празну поставу",
"Copy current configuration into new directory binding" : "Копирај тренутну поставу у везивање новог директоријума",
"Delete the current configuration" : "Обриши тренутне поставке",
"Host" : "Домаћин",
diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json
index 91d9520d3b6..20de66c500e 100644
--- a/apps/user_ldap/l10n/sr.json
+++ b/apps/user_ldap/l10n/sr.json
@@ -76,6 +76,7 @@
"Verify settings" : "Провери поставке",
"1. Server" : "1. сервер",
"%s. Server:" : "%s. Сервер:",
+ "Add a new and blank configuration" : "Додај нову празну поставу",
"Copy current configuration into new directory binding" : "Копирај тренутну поставу у везивање новог директоријума",
"Delete the current configuration" : "Обриши тренутне поставке",
"Host" : "Домаћин",
diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php
index 54ee7a9b543..ac5d8f5a374 100644
--- a/apps/user_ldap/lib/user/user.php
+++ b/apps/user_ldap/lib/user/user.php
@@ -342,7 +342,13 @@ class User {
}
$avatar = $this->avatarManager->getAvatar($this->uid);
- $avatar->set($this->image);
+ try {
+ $avatar->set($this->image);
+ } catch (\Exception $e) {
+ \OC::$server->getLogger()->notice(
+ 'Could not set avatar for ' . $this->dn . ', because: ' . $e->getMessage(),
+ ['app' => 'user_ldap']);
+ }
}
}
diff --git a/apps/user_ldap/tests/integration/abstractintegrationtest.php b/apps/user_ldap/tests/integration/abstractintegrationtest.php
new file mode 100644
index 00000000000..f0f5e2de0a4
--- /dev/null
+++ b/apps/user_ldap/tests/integration/abstractintegrationtest.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\user_ldap\tests\integration;
+
+use OCA\user_ldap\lib\Access;
+use OCA\user_ldap\lib\Connection;
+use OCA\user_ldap\lib\LDAP;
+use OCA\user_ldap\lib\user\Manager;
+
+abstract class AbstractIntegrationTest {
+ /** @var LDAP */
+ protected $ldap;
+
+ /** @var Connection */
+ protected $connection;
+
+ /** @var Access */
+ protected $access;
+
+ /** @var Manager */
+ protected $userManager;
+
+ /** @var string */
+ protected $base;
+
+ /** @var string[] */
+ protected $server;
+
+ public function __construct($host, $port, $bind, $pwd, $base) {
+ $this->base = $base;
+ $this->server = [
+ 'host' => $host,
+ 'port' => $port,
+ 'dn' => $bind,
+ 'pwd' => $pwd
+ ];
+ }
+
+ /**
+ * prepares the LDAP environment and sets up a test configuration for
+ * the LDAP backend.
+ */
+ public function init() {
+ $this->initLDAPWrapper();
+ $this->initConnection();
+ $this->initUserManager();
+ $this->initAccess();
+
+ }
+
+ /**
+ * initializes the test LDAP wrapper
+ */
+ protected function initLDAPWrapper() {
+ $this->ldap = new LDAP();
+ }
+
+ /**
+ * sets up the LDAP configuration to be used for the test
+ */
+ protected function initConnection() {
+ $this->connection = new Connection($this->ldap, '', null);
+ $this->connection->setConfiguration([
+ 'ldapHost' => $this->server['host'],
+ 'ldapPort' => $this->server['port'],
+ 'ldapBase' => $this->base,
+ 'ldapAgentName' => $this->server['dn'],
+ 'ldapAgentPassword' => $this->server['pwd'],
+ 'ldapUserFilter' => 'objectclass=inetOrgPerson',
+ 'ldapUserDisplayName' => 'cn',
+ 'ldapGroupDisplayName' => 'cn',
+ 'ldapLoginFilter' => '(|(uid=%uid)(samaccountname=%uid))',
+ 'ldapCacheTTL' => 0,
+ 'ldapConfigurationActive' => 1,
+ ]);
+ }
+
+ /**
+ * initializes an LDAP user manager instance
+ * @return Manager
+ */
+ protected function initUserManager() {
+ $this->userManager = new FakeManager();
+ }
+
+ /**
+ * initializes the Access test instance
+ */
+ protected function initAccess() {
+ $this->access = new Access($this->connection, $this->ldap, $this->userManager);
+ }
+
+ /**
+ * runs the test cases while outputting progress and result information
+ *
+ * If a test failed, the script is exited with return code 1.
+ */
+ public function run() {
+ $methods = get_class_methods($this);
+ $atLeastOneCaseRan = false;
+ foreach($methods as $method) {
+ if(strpos($method, 'case') === 0) {
+ print("running $method " . PHP_EOL);
+ if(!$this->$method()) {
+ print(PHP_EOL . '>>> !!! Test ' . $method . ' FAILED !!! <<<' . PHP_EOL . PHP_EOL);
+ exit(1);
+ }
+ $atLeastOneCaseRan = true;
+ }
+ }
+ if($atLeastOneCaseRan) {
+ print('Tests succeeded' . PHP_EOL);
+ } else {
+ print('No Test was available.' . PHP_EOL);
+ exit(1);
+ }
+ }
+}
diff --git a/apps/user_ldap/tests/integration/data/avatar-invalid.gif b/apps/user_ldap/tests/integration/data/avatar-invalid.gif
new file mode 100644
index 00000000000..000108834d8
--- /dev/null
+++ b/apps/user_ldap/tests/integration/data/avatar-invalid.gif
Binary files differ
diff --git a/apps/user_ldap/tests/integration/data/avatar-valid.jpg b/apps/user_ldap/tests/integration/data/avatar-valid.jpg
new file mode 100644
index 00000000000..61b5ec2e730
--- /dev/null
+++ b/apps/user_ldap/tests/integration/data/avatar-valid.jpg
Binary files differ
diff --git a/apps/user_ldap/tests/integration/fakemanager.php b/apps/user_ldap/tests/integration/fakemanager.php
new file mode 100644
index 00000000000..afc9c552a98
--- /dev/null
+++ b/apps/user_ldap/tests/integration/fakemanager.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\user_ldap\tests\integration;
+
+/**
+ * Class FakeManager
+ *
+ * this is a mock of \OCA\user_ldap\lib\user\Manager which is a dependency of
+ * Access, that pulls plenty more things in. Because it is not needed in the
+ * scope of these tests, we replace it with a mock.
+ */
+class FakeManager extends \OCA\user_ldap\lib\user\Manager {
+ public function __construct() {}
+}
diff --git a/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php b/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php
index 92035d94b4b..17d046187e8 100644
--- a/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php
+++ b/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php
@@ -1,72 +1,42 @@
<?php
/**
- * Created by PhpStorm.
- * User: blizzz
- * Date: 26.06.15
- * Time: 18:13
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
*/
-use OCA\user_ldap\lib\LDAP;
-
-require_once __DIR__ . '/../../../../../lib/base.php';
-
-class IntegrationTestAccessGroupsMatchFilter {
- /** @var LDAP */
- protected $ldap;
+namespace OCA\user_ldap\tests\integration\lib;
- /** @var \OCA\user_ldap\lib\Connection */
- protected $connection;
+use OCA\user_ldap\lib\Connection;
+use OCA\user_ldap\tests\integration\AbstractIntegrationTest;
- /** @var \OCA\user_ldap\lib\Access */
- protected $access;
-
- /** @var string */
- protected $base;
-
- /** @var string[] */
- protected $server;
+require_once __DIR__ . '/../../../../../lib/base.php';
- public function __construct($host, $port, $bind, $pwd, $base) {
- $this->base = $base;
- $this->server = [
- 'host' => $host,
- 'port' => $port,
- 'dn' => $bind,
- 'pwd' => $pwd
- ];
- }
+class IntegrationTestAccessGroupsMatchFilter extends AbstractIntegrationTest {
/**
- * prepares the LDAP environement and sets up a test configuration for
+ * prepares the LDAP environment and sets up a test configuration for
* the LDAP backend.
*/
public function init() {
- require('setup-scripts/createExplicitUsers.php');
- require('setup-scripts/createExplicitGroups.php');
- require('setup-scripts/createExplicitGroupsDifferentOU.php');
-
- $this->initLDAPWrapper();
- $this->initConnection();
- $this->initAccess();
- }
-
- /**
- * runs the test cases while outputting progress and result information
- *
- * If a test failed, the script is exited with return code 1.
- */
- public function run() {
- $cases = ['case1', 'case2', 'case3'];
-
- foreach ($cases as $case) {
- print("running $case " . PHP_EOL);
- if (!$this->$case()) {
- print(PHP_EOL . '>>> !!! Test ' . $case . ' FAILED !!! <<<' . PHP_EOL . PHP_EOL);
- exit(1);
- }
- }
-
- print('Tests succeeded' . PHP_EOL);
+ require(__DIR__ . '/../setup-scripts/createExplicitUsers.php');
+ require(__DIR__ . '/../setup-scripts/createExplicitGroups.php');
+ require(__DIR__ . '/../setup-scripts/createExplicitGroupsDifferentOU.php');
+ parent::init();
}
/**
@@ -75,7 +45,7 @@ class IntegrationTestAccessGroupsMatchFilter {
*
* @return bool
*/
- private function case1() {
+ protected function case1() {
$this->connection->setConfiguration(['ldapGroupFilter' => 'cn=RedGroup']);
$dns = ['cn=RedGroup,ou=Groups,' . $this->base];
@@ -89,7 +59,7 @@ class IntegrationTestAccessGroupsMatchFilter {
*
* @return bool
*/
- private function case2() {
+ protected function case2() {
$this->connection->setConfiguration(['ldapGroupFilter' => '(|(cn=RedGroup)(cn=PurpleGroup))']);
$dns = [
@@ -113,7 +83,7 @@ class IntegrationTestAccessGroupsMatchFilter {
*
* @return bool
*/
- private function case3() {
+ protected function case3() {
$this->connection->setConfiguration(['ldapGroupFilter' => '(objectclass=groupOfNames)']);
$dns = [
@@ -132,53 +102,21 @@ class IntegrationTestAccessGroupsMatchFilter {
}
/**
- * initializes the Access test instance
- */
- private function initAccess() {
- $this->access = new \OCA\user_ldap\lib\Access($this->connection, $this->ldap, new FakeManager());
- }
-
- /**
- * initializes the test LDAP wrapper
- */
- private function initLDAPWrapper() {
- $this->ldap = new LDAP();
- }
-
- /**
* sets up the LDAP configuration to be used for the test
*/
- private function initConnection() {
- $this->connection = new \OCA\user_ldap\lib\Connection($this->ldap, '', null);
+ protected function initConnection() {
+ parent::initConnection();
$this->connection->setConfiguration([
- 'ldapHost' => $this->server['host'],
- 'ldapPort' => $this->server['port'],
- 'ldapBase' => $this->base,
'ldapBaseGroups' => 'ou=Groups,' . $this->base,
- 'ldapAgentName' => $this->server['dn'],
- 'ldapAgentPassword' => $this->server['pwd'],
'ldapUserFilter' => 'objectclass=inetOrgPerson',
'ldapUserDisplayName' => 'displayName',
'ldapGroupDisplayName' => 'cn',
'ldapLoginFilter' => 'uid=%uid',
- 'ldapCacheTTL' => 0,
- 'ldapConfigurationActive' => 1,
]);
}
}
-/**
- * Class FakeManager
- *
- * this is a mock of \OCA\user_ldap\lib\user\Manager which is a dependency of
- * Access, that pulls plenty more things in. Because it is not needed in the
- * scope of these tests, we replace it with a mock.
- */
-class FakeManager extends \OCA\user_ldap\lib\user\Manager {
- public function __construct() {}
-}
-
-require_once('setup-scripts/config.php');
+require_once(__DIR__ . '/../setup-scripts/config.php');
$test = new IntegrationTestAccessGroupsMatchFilter($host, $port, $adn, $apwd, $bdn);
$test->init();
$test->run();
diff --git a/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php
new file mode 100644
index 00000000000..a03d6b0c0c6
--- /dev/null
+++ b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php
@@ -0,0 +1,128 @@
+<?php
+
+use OCA\user_ldap\lib\user\User;
+use OCA\User_LDAP\Mapping\UserMapping;
+use OCA\user_ldap\tests\integration\AbstractIntegrationTest;
+
+require_once __DIR__ . '/../../../../../../lib/base.php';
+
+class IntegrationTestUserAvatar extends AbstractIntegrationTest {
+ /** @var UserMapping */
+ protected $mapping;
+
+ /**
+ * prepares the LDAP environment and sets up a test configuration for
+ * the LDAP backend.
+ */
+ public function init() {
+ require(__DIR__ . '/../../setup-scripts/createExplicitUsers.php');
+ parent::init();
+ $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection());
+ $this->mapping->clear();
+ $this->access->setUserMapper($this->mapping);
+ $userBackend = new OCA\user_ldap\USER_LDAP($this->access, \OC::$server->getConfig());
+ \OC_User::useBackend($userBackend);
+ }
+
+ /**
+ * A method that does the common steps of test cases 1 and 2. The evaluation
+ * is not happening here.
+ *
+ * @param string $dn
+ * @param string $username
+ * @param string $image
+ */
+ private function execFetchTest($dn, $username, $image) {
+ $this->setJpegPhotoAttribute($dn, $image);
+
+ // assigns our self-picked oc username to the dn
+ $this->mapping->map($dn, $username, 'fakeUUID-' . $username);
+
+ // initialize home folder and make sure that the user will update
+ // also remove an possibly existing avatar
+ \OC_Util::tearDownFS();
+ \OC_Util::setupFS($username);
+ \OC::$server->getUserFolder($username);
+ \OC::$server->getConfig()->deleteUserValue($username, 'user_ldap', User::USER_PREFKEY_LASTREFRESH);
+ if(\OC::$server->getAvatarManager()->getAvatar($username)->exists()) {
+ \OC::$server->getAvatarManager()->getAvatar($username)->remove();
+ }
+
+ // finally attempt to get the avatar set
+ $user = $this->userManager->get($dn);
+ $user->updateAvatar();
+ }
+
+ /**
+ * tests whether an avatar can be retrieved from LDAP and stored correctly
+ *
+ * @return bool
+ */
+ protected function case1() {
+ $image = file_get_contents(__DIR__ . '/../../data/avatar-valid.jpg');
+ $dn = 'uid=alice,ou=Users,' . $this->base;
+ $username = 'alice1337';
+
+ $this->execFetchTest($dn, $username, $image);
+
+ return \OC::$server->getAvatarManager()->getAvatar($username)->exists();
+ }
+
+ /**
+ * tests whether an image received from LDAP which is of an invalid file
+ * type is dealt with properly (i.e. not set and not dying).
+ *
+ * @return bool
+ */
+ protected function case2() {
+ // gif by Pmspinner from https://commons.wikimedia.org/wiki/File:Avatar2469_3.gif
+ $image = file_get_contents(__DIR__ . '/../../data/avatar-invalid.gif');
+ $dn = 'uid=boris,ou=Users,' . $this->base;
+ $username = 'boris7844';
+
+ $this->execFetchTest($dn, $username, $image);
+
+ return !\OC::$server->getAvatarManager()->getAvatar($username)->exists();
+ }
+
+ /**
+ * This writes an image to the 'jpegPhoto' attribute on LDAP.
+ *
+ * @param string $dn
+ * @param string $image An image read via file_get_contents
+ * @throws \OC\ServerNotAvailableException
+ */
+ private function setJpegPhotoAttribute($dn, $image) {
+ $changeSet = ['jpegphoto' => $image];
+ ldap_mod_add($this->connection->getConnectionResource(), $dn, $changeSet);
+ }
+
+ protected function initUserManager() {
+ $this->userManager = new \OCA\user_ldap\lib\user\Manager(
+ \OC::$server->getConfig(),
+ new \OCA\user_ldap\lib\FilesystemHelper(),
+ new \OCA\user_ldap\lib\LogWrapper(),
+ \OC::$server->getAvatarManager(),
+ new \OCP\Image(),
+ \OC::$server->getDatabaseConnection()
+ );
+ }
+
+ /**
+ * sets up the LDAP configuration to be used for the test
+ */
+ protected function initConnection() {
+ parent::initConnection();
+ $this->connection->setConfiguration([
+ 'ldapUserFilter' => 'objectclass=inetOrgPerson',
+ 'ldapUserDisplayName' => 'displayName',
+ 'ldapGroupDisplayName' => 'cn',
+ 'ldapLoginFilter' => 'uid=%uid',
+ ]);
+ }
+}
+
+require_once(__DIR__ . '/../../setup-scripts/config.php');
+$test = new IntegrationTestUserAvatar($host, $port, $adn, $apwd, $bdn);
+$test->init();
+$test->run();
diff --git a/apps/user_ldap/tests/integration/run-test.sh b/apps/user_ldap/tests/integration/run-test.sh
index e07e9b43408..7a29db25670 100755
--- a/apps/user_ldap/tests/integration/run-test.sh
+++ b/apps/user_ldap/tests/integration/run-test.sh
@@ -13,5 +13,5 @@ fi
# sleep is necessary, otherwise the LDAP server cannot be connected to, yet.
-setup-scripts/start.sh && sleep 2 && php -f "$TESTSCRIPT"
+setup-scripts/start.sh && sleep 5 && php -f "$TESTSCRIPT"
setup-scripts/stop.sh
diff --git a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
index ac21d48fd16..bb784d60f7b 100644
--- a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
+++ b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
@@ -30,7 +30,7 @@ if (true) {
}
}
-$users = ['alice'];
+$users = ['alice', 'boris'];
foreach ($users as $uid) {
$newDN = 'uid=' . $uid . ',' . $ouDN;
diff --git a/autotest.sh b/autotest.sh
index e9327c8f83e..0e112bfda32 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -21,7 +21,7 @@ DATABASEHOST=localhost
ADMINLOGIN=admin$EXECUTOR_NUMBER
BASEDIR=$PWD
-DBCONFIGS="sqlite mysql pgsql oci"
+DBCONFIGS="sqlite mysql mariadb pgsql oci"
# $PHP_EXE is run through 'which' and as such e.g. 'php' or 'hhvm' is usually
# sufficient. Due to the behaviour of 'which', $PHP_EXE may also be a path
@@ -127,7 +127,8 @@ fi
echo "Using database $DATABASENAME"
function execute_tests {
- echo "Setup environment for $1 testing ..."
+ DB=$1
+ echo "Setup environment for $DB testing ..."
# back to root folder
cd "$BASEDIR"
@@ -140,11 +141,43 @@ function execute_tests {
cp tests/preseed-config.php config/config.php
+ _DB=$DB
+
# drop database
- if [ "$1" == "mysql" ] ; then
+ if [ "$DB" == "mysql" ] ; then
mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
fi
- if [ "$1" == "pgsql" ] ; then
+ if [ "$DB" == "mariadb" ] ; then
+ if [ ! -z "$USEDOCKER" ] ; then
+ echo "Fire up the mariadb docker"
+ DOCKER_CONTAINER_ID=$(docker run \
+ -e MYSQL_ROOT_PASSWORD=owncloud \
+ -e MYSQL_USER="$DATABASEUSER" \
+ -e MYSQL_PASSWORD=owncloud \
+ -e MYSQL_DATABASE="$DATABASENAME" \
+ -d rullzer/mariadb-owncloud)
+ DATABASEHOST=$(docker inspect "$DOCKER_CONTAINER_ID" | grep IPAddress | cut -d '"' -f 4)
+
+ echo "Waiting for MariaDB initialisation ..."
+
+ # grep exits on the first match and then the script continues
+ timeout 30 docker logs -f $DOCKER_CONTAINER_ID 2>&1 | grep -q "mysqld: ready for connections."
+
+ echo "MariaDB is up."
+
+ else
+ if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ] ; then
+ echo "Your mysql binary is not provided by MariaDB"
+ echo "To use the docker container set the USEDOCKER enviroment variable"
+ exit -1
+ fi
+ mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
+ fi
+
+ #Reset _DB to mysql since that is what we use internally
+ _DB="mysql"
+ fi
+ if [ "$DB" == "pgsql" ] ; then
if [ ! -z "$USEDOCKER" ] ; then
echo "Fire up the postgres docker"
DOCKER_CONTAINER_ID=$(docker run -e POSTGRES_USER="$DATABASEUSER" -e POSTGRES_PASSWORD=owncloud -d postgres)
@@ -160,7 +193,7 @@ function execute_tests {
dropdb -U "$DATABASEUSER" "$DATABASENAME" || true
fi
fi
- if [ "$1" == "oci" ] ; then
+ if [ "$DB" == "oci" ] ; then
echo "Fire up the oracle docker"
DOCKER_CONTAINER_ID=$(docker run -d deepdiver/docker-oracle-xe-11g)
DATABASEHOST=$(docker inspect "$DOCKER_CONTAINER_ID" | grep IPAddress | cut -d '"' -f 4)
@@ -176,20 +209,20 @@ function execute_tests {
# trigger installation
echo "Installing ...."
- "$PHP" ./occ maintenance:install --database="$1" --database-name="$DATABASENAME" --database-host="$DATABASEHOST" --database-user="$DATABASEUSER" --database-pass=owncloud --database-table-prefix=oc_ --admin-user="$ADMINLOGIN" --admin-pass=admin --data-dir="$DATADIR"
+ "$PHP" ./occ maintenance:install --database="$_DB" --database-name="$DATABASENAME" --database-host="$DATABASEHOST" --database-user="$DATABASEUSER" --database-pass=owncloud --database-table-prefix=oc_ --admin-user="$ADMINLOGIN" --admin-pass=admin --data-dir="$DATADIR"
#test execution
- echo "Testing with $1 ..."
+ echo "Testing with $DB ..."
cd tests
- rm -rf "coverage-html-$1"
- mkdir "coverage-html-$1"
+ rm -rf "coverage-html-$DB"
+ mkdir "coverage-html-$DB"
"$PHP" -f enable_all.php | grep -i -C9999 error && echo "Error during setup" && exit 101
if [ -z "$NOCOVERAGE" ]; then
- "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$1.xml" --coverage-clover "autotest-clover-$1.xml" --coverage-html "coverage-html-$1" "$2" "$3"
+ "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$DB.xml" --coverage-clover "autotest-clover-$DB.xml" --coverage-html "coverage-html-$DB" "$2" "$3"
RESULT=$?
else
echo "No coverage"
- "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$1.xml" "$2" "$3"
+ "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$DB.xml" "$2" "$3"
RESULT=$?
fi
diff --git a/build/OCPSinceChecker.php b/build/OCPSinceChecker.php
index c059b687393..0eb1c54f0b8 100644
--- a/build/OCPSinceChecker.php
+++ b/build/OCPSinceChecker.php
@@ -54,12 +54,22 @@ class SinceTagCheckVisitor extends \PhpParser\NodeVisitorAbstract {
/** @var \PhpParser\Comment\Doc[] $comments */
$comments = $node->getAttribute('comments');
- if(count($comments) !== 0) {
- $comment = $comments[count($comments) - 1];
- $text = $comment->getText();
- if(strpos($text, '@deprecated') !== false) {
- $this->deprecatedClass = true;
- }
+
+ if(count($comments) === 0) {
+ $this->errors[] = 'PHPDoc is needed for ' . $this->namespace . '\\' . $this->className . '::' . $node->name;
+ return;
+ }
+
+ $comment = $comments[count($comments) - 1];
+ $text = $comment->getText();
+ if(strpos($text, '@deprecated') !== false) {
+ $this->deprecatedClass = true;
+ }
+
+ if($this->deprecatedClass === false && strpos($text, '@since') === false && strpos($text, '@deprecated') === false) {
+ $type = $node instanceof \PhpParser\Node\Stmt\Interface_ ? 'interface' : 'class';
+ $this->errors[] = '@since or @deprecated tag is needed in PHPDoc for ' . $type . ' ' . $this->namespace . '\\' . $this->className;
+ return;
}
}
diff --git a/core/js/js.js b/core/js/js.js
index 5f7df5fb551..8380d56e31e 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1245,7 +1245,6 @@ function initCore() {
$('.selectedActions a').tipsy({gravity:'s', live:true});
$('a.action.delete').tipsy({gravity:'e', live:true});
$('a.action').tipsy({gravity:'s', live:true});
- $('td .modified').tipsy({gravity:'s', live:true});
$('td.lastLogin').tipsy({gravity:'s', html:true});
$('input').tipsy({gravity:'w'});
$('.extra-data').tipsy({gravity:'w', live:true});
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
index 02d7ef94b7e..35f24b188fa 100644
--- a/core/js/setupchecks.js
+++ b/core/js/setupchecks.js
@@ -69,6 +69,9 @@
t('core', '/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href="{docLink}">documentation</a>.', {docLink: data.securityDocs})
);
}
+ if(data.isUsedTlsLibOutdated) {
+ messages.push(data.isUsedTlsLibOutdated);
+ }
} else {
messages.push(t('core', 'Error occurred while checking server setup'));
}
diff --git a/core/js/share.js b/core/js/share.js
index d730d3bbf6e..99fd08c6411 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -820,6 +820,25 @@ OC.Share={
return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, '');
},
/**
+ * Parses a string to an valid integer (unix timestamp)
+ * @param time
+ * @returns {*}
+ * @internal Only used to work around a bug in the backend
+ */
+ _parseTime: function(time) {
+ if (_.isString(time)) {
+ // skip empty strings and hex values
+ if (time === '' || (time.length > 1 && time[0] === '0' && time[1] === 'x')) {
+ return null;
+ }
+ time = parseInt(time, 10);
+ if(isNaN(time)) {
+ time = null;
+ }
+ }
+ return time;
+ },
+ /**
* Displays the expiration date field
*
* @param {Date} date current expiration date
@@ -834,6 +853,8 @@ OC.Share={
minDate: minDate,
maxDate: null
};
+ // TODO: hack: backend returns string instead of integer
+ shareTime = OC.Share._parseTime(shareTime);
if (_.isNumber(shareTime)) {
shareTime = new Date(shareTime * 1000);
}
diff --git a/core/js/tests/specs/shareSpec.js b/core/js/tests/specs/shareSpec.js
index 4e12f3bb0cf..3dc25134f59 100644
--- a/core/js/tests/specs/shareSpec.js
+++ b/core/js/tests/specs/shareSpec.js
@@ -1316,5 +1316,21 @@ describe('OC.Share tests', function() {
});
});
});
+ describe('OC.Share utils', function() {
+ it('parseTime should properly parse strings', function() {
+
+ _.each([
+ [ '123456', 123456],
+ [ 123456 , 123456],
+ ['0123456', 123456],
+ ['abcdefg', null],
+ ['0x12345', null],
+ [ '', null],
+ ], function(value) {
+ expect(OC.Share._parseTime(value[0])).toEqual(value[1]);
+ });
+
+ });
+ });
});
diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js
index cf4bee74044..54a327fe04e 100644
--- a/core/l10n/hu_HU.js
+++ b/core/l10n/hu_HU.js
@@ -76,6 +76,9 @@ OC.L10N.register(
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Nem lett gyorsítótár memória beállítva. A teljesítmény növeléséhez kérem állítson be gyorsítótárat, ha lehetséges. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "a /dev/urandom eszköz nem elérhető PHP-ből, ami nagyon nagy biztonsági problémát jelent. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.",
"Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Nagyon ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
"Shared" : "Megosztott",
"Shared with {recipients}" : "Megosztva ővelük: {recipients}",
"Share" : "Megosztás",
@@ -192,19 +195,27 @@ OC.L10N.register(
"Configure the database" : "Adatbázis konfigurálása",
"Only %s is available." : "Csak %s érhető el.",
"Install and activate additional PHP modules to choose other database types." : "Telepítse és aktiválja a bővített PHP modulokat, hogy tudjon más adatbázis típust is kiválasztani.",
+ "For more details check out the documentation." : "További részletekért kérem ellenőrizze a dokumentációt.",
"Database user" : "Adatbázis felhasználónév",
"Database password" : "Adatbázis jelszó",
"Database name" : "Az adatbázis neve",
"Database tablespace" : "Az adatbázis táblázattér (tablespace)",
"Database host" : "Adatbázis szerver",
"Performance warning" : "Teljesítménybeli figyelmeztetés",
+ "SQLite will be used as database." : "SQLite lesz adatbázisként használva.",
+ "For larger installations we recommend to choose a different database backend." : "Nagyobb telepítésekhez ajánlott egy másik adatbázis háttérkiszolgáló használata.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.",
"Finish setup" : "A beállítások befejezése",
"Finishing …" : "Befejezés ...",
+ "Need help?" : "Segítségre van szüksége?",
+ "See the documentation" : "Nézze meg a dokumentációt",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Az alkalmazás megfelelő működéséhez JavaScript szükséges. Kérem {linkstart}engedélyezze a JavaScript-et{linkend} és frissítse a lapot.",
"Log out" : "Kilépés",
"Search" : "Keresés",
"Server side authentication failed!" : "A szerveroldali hitelesítés sikertelen!",
"Please contact your administrator." : "Kérjük, lépjen kapcsolatba a rendszergazdával.",
"An internal error occured." : "Belső hiba történt.",
+ "Please try again or contact your administrator." : "Kérem próbálja újra, vagy vegye fel a kapcsolatot a rendszergazdával.",
"Forgot your password? Reset it!" : "Elfelejtette a jelszavát? Állítsa vissza!",
"remember" : "emlékezzen",
"Log in" : "Bejelentkezés",
@@ -224,6 +235,7 @@ OC.L10N.register(
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Kérjük gondoskodjon róla, hogy elmentse az adatbázist, a konfigurációs mappa és az adatamappa tartalmát, mielőtt folytatja.",
"Start update" : "A frissítés megkezdése",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Nagyobb telepítések esetén úgy kerülhetők el az időtúllépések, ha inkább a következő parancsot adja ki a telepítési alkönyvtárban:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Ez a %s folyamat éppen karbantartó üzemmódban van, ami eltarthat egy darabig.",
"This page will refresh itself when the %s instance is available again." : "Ez az oldal frissíteni fogja magát amint a %s példány ismét elérhető."
},
"nplurals=2; plural=(n != 1);");
diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json
index 0576663eb58..15e476cf28a 100644
--- a/core/l10n/hu_HU.json
+++ b/core/l10n/hu_HU.json
@@ -74,6 +74,9 @@
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "Nem lett gyorsítótár memória beállítva. A teljesítmény növeléséhez kérem állítson be gyorsítótárat, ha lehetséges. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "a /dev/urandom eszköz nem elérhető PHP-ből, ami nagyon nagy biztonsági problémát jelent. További információ található az alábbi <a href=\"{docLink}\">dokumentációban</a>.",
"Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Nagyon ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
"Shared" : "Megosztott",
"Shared with {recipients}" : "Megosztva ővelük: {recipients}",
"Share" : "Megosztás",
@@ -190,19 +193,27 @@
"Configure the database" : "Adatbázis konfigurálása",
"Only %s is available." : "Csak %s érhető el.",
"Install and activate additional PHP modules to choose other database types." : "Telepítse és aktiválja a bővített PHP modulokat, hogy tudjon más adatbázis típust is kiválasztani.",
+ "For more details check out the documentation." : "További részletekért kérem ellenőrizze a dokumentációt.",
"Database user" : "Adatbázis felhasználónév",
"Database password" : "Adatbázis jelszó",
"Database name" : "Az adatbázis neve",
"Database tablespace" : "Az adatbázis táblázattér (tablespace)",
"Database host" : "Adatbázis szerver",
"Performance warning" : "Teljesítménybeli figyelmeztetés",
+ "SQLite will be used as database." : "SQLite lesz adatbázisként használva.",
+ "For larger installations we recommend to choose a different database backend." : "Nagyobb telepítésekhez ajánlott egy másik adatbázis háttérkiszolgáló használata.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.",
"Finish setup" : "A beállítások befejezése",
"Finishing …" : "Befejezés ...",
+ "Need help?" : "Segítségre van szüksége?",
+ "See the documentation" : "Nézze meg a dokumentációt",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Az alkalmazás megfelelő működéséhez JavaScript szükséges. Kérem {linkstart}engedélyezze a JavaScript-et{linkend} és frissítse a lapot.",
"Log out" : "Kilépés",
"Search" : "Keresés",
"Server side authentication failed!" : "A szerveroldali hitelesítés sikertelen!",
"Please contact your administrator." : "Kérjük, lépjen kapcsolatba a rendszergazdával.",
"An internal error occured." : "Belső hiba történt.",
+ "Please try again or contact your administrator." : "Kérem próbálja újra, vagy vegye fel a kapcsolatot a rendszergazdával.",
"Forgot your password? Reset it!" : "Elfelejtette a jelszavát? Állítsa vissza!",
"remember" : "emlékezzen",
"Log in" : "Bejelentkezés",
@@ -222,6 +233,7 @@
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Kérjük gondoskodjon róla, hogy elmentse az adatbázist, a konfigurációs mappa és az adatamappa tartalmát, mielőtt folytatja.",
"Start update" : "A frissítés megkezdése",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Nagyobb telepítések esetén úgy kerülhetők el az időtúllépések, ha inkább a következő parancsot adja ki a telepítési alkönyvtárban:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Ez a %s folyamat éppen karbantartó üzemmódban van, ami eltarthat egy darabig.",
"This page will refresh itself when the %s instance is available again." : "Ez az oldal frissíteni fogja magát amint a %s példány ismét elérhető."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/core/l10n/ko.js b/core/l10n/ko.js
index 203e944ced3..c5e4197590d 100644
--- a/core/l10n/ko.js
+++ b/core/l10n/ko.js
@@ -4,6 +4,7 @@ OC.L10N.register(
"Couldn't send mail to following users: %s " : "%s 님에게 메일을 보낼 수 없습니다.",
"Turned on maintenance mode" : "유지 보수 모드 켜짐",
"Turned off maintenance mode" : "유지 보수 모드 꺼짐",
+ "Maintenance mode is kept active" : "유지 보수 모드가 켜져 있음",
"Updated database" : "데이터베이스 업데이트 됨",
"Checked database schema update" : "데이터베이스 스키마 업데이트 확인됨",
"Checked database schema update for apps" : "앱용 데이터베이스 스키마 업데이트 확인됨",
@@ -11,6 +12,7 @@ OC.L10N.register(
"Repair warning: " : "수리 경고:",
"Repair error: " : "수리 오류:",
"Following incompatible apps have been disabled: %s" : "다음 호환되지 않는 앱이 비활성화되었습니다: %s",
+ "Following apps have been disabled: %s" : "다음 앱이 비활성화되었습니다: %s",
"Invalid file provided" : "잘못된 파일 지정됨",
"No image or file provided" : "사진이나 파일이 없음",
"Unknown filetype" : "알려지지 않은 파일 형식",
@@ -72,8 +74,11 @@ OC.L10N.register(
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "서버에서 인터넷 연결을 사용할 수 없습니다. 외부 저장소 마운트, 업데이트 알림, 제 3자 앱 설치 등 기능을 사용할 수 없습니다. 원격에서 파일에 접근하거나, 알림 이메일을 보내지 못할 수도 있습니다. 모든 기능을 사용하려면 인터넷에 연결하는 것을 추천합니다.",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "인터넷에서 데이터 디렉터리와 파일에 접근할 수 있습니다. .htaccess 파일이 작동하지 않습니다. 웹 서버 설정을 변경하여 데이터 디렉터리에 직접 접근할 수 없도록 하거나, 데이터 디렉터리를 웹 서버 문서 경로 바깥에 두십시오.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "메모리 캐시가 설정되지 않았습니다. 성능을 향상시키려면 사용 가능한 경우 메모리 캐시를 설정하십시오. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "PHP에서 /dev/urandom을 읽을 수 없으며, 보안상의 이유로 권장되지 않습니다. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.",
"Error occurred while checking server setup" : "서버 설정을 확인하는 중 오류 발생",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 헤더가 \"{expected}\"와(과) 같이 설정되지 않았습니다. 잠재적인 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 헤더 \"Strict-Transport-Security\"가 최소한 \"{seconds}\"초 이상으로 설정되어야 합니다. 강화된 보안을 위해서 <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 HSTS를 활성화하는 것을 추천합니다.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "이 사이트를 HTTP로 접근하고 있습니다. <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 서버 설정을 변경하여 HTTPS를 사용하는 것을 강력히 추천합니다.",
"Shared" : "공유됨",
"Shared with {recipients}" : "{recipients} 님과 공유됨",
"Share" : "공유",
@@ -135,6 +140,7 @@ OC.L10N.register(
"Updating {productName} to version {version}, this may take a while." : "{productName}을(를) 버전 {version}으로 업데이트하고 있습니다. 시간이 걸릴 수 있습니다.",
"Please reload the page." : "페이지를 새로 고치십시오.",
"The update was unsuccessful. " : "업데이트가 실패하였습니다. ",
+ "The update was successful. There were warnings." : "업데이트가 성공하였습니다. 일부 경고가 있습니다.",
"The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공하였습니다. ownCloud로 돌아갑니다.",
"Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다",
"Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.",
@@ -145,6 +151,7 @@ OC.L10N.register(
"New Password" : "새 암호",
"Reset password" : "암호 재설정",
"Searching other places" : "다른 장소 찾는 중",
+ "No search results in other places" : "다른 장소의 검색 결과 없음",
"_{count} search result in other places_::_{count} search results in other places_" : ["다른 장소 검색 결과 {count}개"],
"Personal" : "개인",
"Users" : "사용자",
@@ -187,6 +194,8 @@ OC.L10N.register(
"Data folder" : "데이터 폴더",
"Configure the database" : "데이터베이스 설정",
"Only %s is available." : "%s만 사용 가능합니다.",
+ "Install and activate additional PHP modules to choose other database types." : "다른 데이터베이스 종류를 사용하려면 추가 PHP 모듈을 설치 및 활성화하십시오.",
+ "For more details check out the documentation." : "자세한 정보를 보려면 문서를 참고하십시오.",
"Database user" : "데이터베이스 사용자",
"Database password" : "데이터베이스 암호",
"Database name" : "데이터베이스 이름",
diff --git a/core/l10n/ko.json b/core/l10n/ko.json
index d1bf81e44a6..2a96b77b81e 100644
--- a/core/l10n/ko.json
+++ b/core/l10n/ko.json
@@ -2,6 +2,7 @@
"Couldn't send mail to following users: %s " : "%s 님에게 메일을 보낼 수 없습니다.",
"Turned on maintenance mode" : "유지 보수 모드 켜짐",
"Turned off maintenance mode" : "유지 보수 모드 꺼짐",
+ "Maintenance mode is kept active" : "유지 보수 모드가 켜져 있음",
"Updated database" : "데이터베이스 업데이트 됨",
"Checked database schema update" : "데이터베이스 스키마 업데이트 확인됨",
"Checked database schema update for apps" : "앱용 데이터베이스 스키마 업데이트 확인됨",
@@ -9,6 +10,7 @@
"Repair warning: " : "수리 경고:",
"Repair error: " : "수리 오류:",
"Following incompatible apps have been disabled: %s" : "다음 호환되지 않는 앱이 비활성화되었습니다: %s",
+ "Following apps have been disabled: %s" : "다음 앱이 비활성화되었습니다: %s",
"Invalid file provided" : "잘못된 파일 지정됨",
"No image or file provided" : "사진이나 파일이 없음",
"Unknown filetype" : "알려지지 않은 파일 형식",
@@ -70,8 +72,11 @@
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "서버에서 인터넷 연결을 사용할 수 없습니다. 외부 저장소 마운트, 업데이트 알림, 제 3자 앱 설치 등 기능을 사용할 수 없습니다. 원격에서 파일에 접근하거나, 알림 이메일을 보내지 못할 수도 있습니다. 모든 기능을 사용하려면 인터넷에 연결하는 것을 추천합니다.",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "인터넷에서 데이터 디렉터리와 파일에 접근할 수 있습니다. .htaccess 파일이 작동하지 않습니다. 웹 서버 설정을 변경하여 데이터 디렉터리에 직접 접근할 수 없도록 하거나, 데이터 디렉터리를 웹 서버 문서 경로 바깥에 두십시오.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "메모리 캐시가 설정되지 않았습니다. 성능을 향상시키려면 사용 가능한 경우 메모리 캐시를 설정하십시오. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "PHP에서 /dev/urandom을 읽을 수 없으며, 보안상의 이유로 권장되지 않습니다. 더 많은 정보를 보려면 <a href=\"{docLink}\">문서</a>를 참고하십시오.",
"Error occurred while checking server setup" : "서버 설정을 확인하는 중 오류 발생",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 헤더가 \"{expected}\"와(과) 같이 설정되지 않았습니다. 잠재적인 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 헤더 \"Strict-Transport-Security\"가 최소한 \"{seconds}\"초 이상으로 설정되어야 합니다. 강화된 보안을 위해서 <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 HSTS를 활성화하는 것을 추천합니다.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "이 사이트를 HTTP로 접근하고 있습니다. <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 서버 설정을 변경하여 HTTPS를 사용하는 것을 강력히 추천합니다.",
"Shared" : "공유됨",
"Shared with {recipients}" : "{recipients} 님과 공유됨",
"Share" : "공유",
@@ -133,6 +138,7 @@
"Updating {productName} to version {version}, this may take a while." : "{productName}을(를) 버전 {version}으로 업데이트하고 있습니다. 시간이 걸릴 수 있습니다.",
"Please reload the page." : "페이지를 새로 고치십시오.",
"The update was unsuccessful. " : "업데이트가 실패하였습니다. ",
+ "The update was successful. There were warnings." : "업데이트가 성공하였습니다. 일부 경고가 있습니다.",
"The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공하였습니다. ownCloud로 돌아갑니다.",
"Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다",
"Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.",
@@ -143,6 +149,7 @@
"New Password" : "새 암호",
"Reset password" : "암호 재설정",
"Searching other places" : "다른 장소 찾는 중",
+ "No search results in other places" : "다른 장소의 검색 결과 없음",
"_{count} search result in other places_::_{count} search results in other places_" : ["다른 장소 검색 결과 {count}개"],
"Personal" : "개인",
"Users" : "사용자",
@@ -185,6 +192,8 @@
"Data folder" : "데이터 폴더",
"Configure the database" : "데이터베이스 설정",
"Only %s is available." : "%s만 사용 가능합니다.",
+ "Install and activate additional PHP modules to choose other database types." : "다른 데이터베이스 종류를 사용하려면 추가 PHP 모듈을 설치 및 활성화하십시오.",
+ "For more details check out the documentation." : "자세한 정보를 보려면 문서를 참고하십시오.",
"Database user" : "데이터베이스 사용자",
"Database password" : "데이터베이스 암호",
"Database name" : "데이터베이스 이름",
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index 4a645b1f1dd..50603a4caa2 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"Repair warning: " : "Упозорење о поправци :",
"Repair error: " : "Грешка поправке:",
"Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s",
+ "Following apps have been disabled: %s" : "Следеће апликације су искључене: %s",
"Invalid file provided" : "Понуђени фајл је неисправан",
"No image or file provided" : "Није дата ни слика ни фајл",
"Unknown filetype" : "Непознат тип фајла",
@@ -137,6 +138,7 @@ OC.L10N.register(
"Updating {productName} to version {version}, this may take a while." : "Надограђујем {productName} на издање {version}. Ово би могло да потраје.",
"Please reload the page." : "Поново учитајте страницу.",
"The update was unsuccessful. " : "Ажурирање није успело.",
+ "The update was successful. There were warnings." : "Ажурирање је успело. Било је упозорења.",
"The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.",
"Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи",
"Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index a788d7633f3..ead0e061b96 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -10,6 +10,7 @@
"Repair warning: " : "Упозорење о поправци :",
"Repair error: " : "Грешка поправке:",
"Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s",
+ "Following apps have been disabled: %s" : "Следеће апликације су искључене: %s",
"Invalid file provided" : "Понуђени фајл је неисправан",
"No image or file provided" : "Није дата ни слика ни фајл",
"Unknown filetype" : "Непознат тип фајла",
@@ -135,6 +136,7 @@
"Updating {productName} to version {version}, this may take a while." : "Надограђујем {productName} на издање {version}. Ово би могло да потраје.",
"Please reload the page." : "Поново учитајте страницу.",
"The update was unsuccessful. " : "Ажурирање није успело.",
+ "The update was successful. There were warnings." : "Ажурирање је успело. Било је упозорења.",
"The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.",
"Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи",
"Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index ef5fa0356a1..ca7558b7141 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "%s ライブラリーは、%s よりも古いバージョンが必要です。利用可能なバージョンは、 %s です。",
"Following platforms are supported: %s" : "次のプラットフォームをサポートしています: %s",
"ownCloud %s or higher is required." : "ownCloud %s 以上が必要です。",
+ "ownCloud %s or lower is required." : "ownCloud %s 以下が必要です。",
"Help" : "ヘルプ",
"Personal" : "個人",
"Users" : "ユーザー",
@@ -85,6 +86,7 @@ OC.L10N.register(
"Set an admin username." : "管理者のユーザー名を設定",
"Set an admin password." : "管理者のパスワードを設定。",
"Can't create or write into the data directory %s" : "%s データディレクトリに作成、書き込みができません",
+ "Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
"%s shared »%s« with you" : "%sが あなたと »%s«を共有しました",
"%s via %s" : "%s に %s から",
"Sharing %s failed, because the backend does not allow shares from type %i" : "%s の共有に失敗しました。%i タイプからの共有は許可されていないからです。",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index 3555295f80c..b2020de8590 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -14,6 +14,7 @@
"Library %s with a version lower than %s is required - available version %s." : "%s ライブラリーは、%s よりも古いバージョンが必要です。利用可能なバージョンは、 %s です。",
"Following platforms are supported: %s" : "次のプラットフォームをサポートしています: %s",
"ownCloud %s or higher is required." : "ownCloud %s 以上が必要です。",
+ "ownCloud %s or lower is required." : "ownCloud %s 以下が必要です。",
"Help" : "ヘルプ",
"Personal" : "個人",
"Users" : "ユーザー",
@@ -83,6 +84,7 @@
"Set an admin username." : "管理者のユーザー名を設定",
"Set an admin password." : "管理者のパスワードを設定。",
"Can't create or write into the data directory %s" : "%s データディレクトリに作成、書き込みができません",
+ "Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
"%s shared »%s« with you" : "%sが あなたと »%s«を共有しました",
"%s via %s" : "%s に %s から",
"Sharing %s failed, because the backend does not allow shares from type %i" : "%s の共有に失敗しました。%i タイプからの共有は許可されていないからです。",
diff --git a/lib/l10n/ko.js b/lib/l10n/ko.js
index e51702ab243..e16b479b5ff 100644
--- a/lib/l10n/ko.js
+++ b/lib/l10n/ko.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "%s 라이브러리의 버전 %s 미만이 필요합니다. 사용 가능한 버전은 %s입니다.",
"Following platforms are supported: %s" : "다음 플랫폼을 지원합니다: %s",
"ownCloud %s or higher is required." : "ownCloud 버전 %s 이상이 필요합니다.",
+ "ownCloud %s or lower is required." : "ownCloud %s 이하가 필요합니다.",
"Help" : "도움말",
"Personal" : "개인",
"Users" : "사용자",
@@ -37,12 +38,15 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["%n분 전"],
"seconds ago" : "초 전",
"web services under your control" : "내가 관리하는 웹 서비스",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "id: %s인 모듈이 존재하지 않습니다. 앱 설정에서 활성화하거나 관리자에게 연락하십시오.",
"Empty filename is not allowed" : "파일 이름을 비워 둘 수 없음",
"Dot files are not allowed" : "점으로 시작하는 파일은 허용되지 않음",
"4-byte characters are not supported in file names" : "파일 이름에 4바이트 글자를 사용할 수 없음",
"File name is a reserved word" : "파일 이름이 예약된 단어임",
"File name contains at least one invalid character" : "파일 이름에 잘못된 글자가 한 자 이상 있음",
"File name is too long" : "파일 이름이 너무 김",
+ "File is currently busy, please try again later" : "파일이 현재 사용 중, 나중에 다시 시도하십시오",
+ "Can't read file" : "파일을 읽을 수 없음",
"App directory already exists" : "앱 디렉터리가 이미 존재합니다.",
"Can't create app folder. Please fix permissions. %s" : "앱 폴더를 만들 수 없습니다. 권한을 수정하십시오. %s",
"No source specified when installing app" : "앱을 설치할 때 소스가 지정되지 않았습니다.",
@@ -82,6 +86,7 @@ OC.L10N.register(
"Set an admin username." : "관리자의 사용자 이름을 설정합니다.",
"Set an admin password." : "관리자의 암호를 설정합니다.",
"Can't create or write into the data directory %s" : "데이터 디렉터리 %s을(를) 만들거나 기록할 수 없음",
+ "Invalid Federated Cloud ID" : "잘못된 연합 클라우드 ID",
"%s shared »%s« with you" : "%s 님이 %s을(를) 공유하였습니다",
"%s via %s" : "%s(%s 경유)",
"Sharing %s failed, because the backend does not allow shares from type %i" : "%s을(를) 공유할 수 없습니다. 백엔드에서 %i 형식의 공유를 허용하지 않습니다",
@@ -130,7 +135,9 @@ OC.L10N.register(
"PHP module %s not installed." : "PHP 모듈 %s이(가) 설치되지 않았습니다.",
"PHP setting \"%s\" is not set to \"%s\"." : "PHP 설정 \"%s\"이(가) \"%s\"(으)로 설정되어 있지 않습니다.",
"Adjusting this setting in php.ini will make ownCloud run again" : "php.ini에서 이 설정을 변경하면 ownCloud가 다시 실행됩니다",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 값이 \"%s\"(으)로 설정되어 있으나 \"0\"으로 설정해야 함",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "이 문제를 해결하려면 php.ini에서 <code>mbstring.func_overload</code> 값을 <code>0</code>으로 설정하십시오",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP에서 인라인 문서 블록을 삭제하도록 설정되어 있습니다. 일부 코어 앱을 사용하지 못할 수도 있습니다.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Zend OPcache, eAccelerator 같은 캐시/가속기 문제일 수도 있습니다.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP 모듈이 설치되었지만 여전히 없는 것으로 나타납니까?",
"Please ask your server administrator to restart the web server." : "서버 관리자에게 웹 서버 재시작을 요청하십시오.",
diff --git a/lib/l10n/ko.json b/lib/l10n/ko.json
index a0b042a7f3a..9919a2d96f5 100644
--- a/lib/l10n/ko.json
+++ b/lib/l10n/ko.json
@@ -14,6 +14,7 @@
"Library %s with a version lower than %s is required - available version %s." : "%s 라이브러리의 버전 %s 미만이 필요합니다. 사용 가능한 버전은 %s입니다.",
"Following platforms are supported: %s" : "다음 플랫폼을 지원합니다: %s",
"ownCloud %s or higher is required." : "ownCloud 버전 %s 이상이 필요합니다.",
+ "ownCloud %s or lower is required." : "ownCloud %s 이하가 필요합니다.",
"Help" : "도움말",
"Personal" : "개인",
"Users" : "사용자",
@@ -35,12 +36,15 @@
"_%n minute ago_::_%n minutes ago_" : ["%n분 전"],
"seconds ago" : "초 전",
"web services under your control" : "내가 관리하는 웹 서비스",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "id: %s인 모듈이 존재하지 않습니다. 앱 설정에서 활성화하거나 관리자에게 연락하십시오.",
"Empty filename is not allowed" : "파일 이름을 비워 둘 수 없음",
"Dot files are not allowed" : "점으로 시작하는 파일은 허용되지 않음",
"4-byte characters are not supported in file names" : "파일 이름에 4바이트 글자를 사용할 수 없음",
"File name is a reserved word" : "파일 이름이 예약된 단어임",
"File name contains at least one invalid character" : "파일 이름에 잘못된 글자가 한 자 이상 있음",
"File name is too long" : "파일 이름이 너무 김",
+ "File is currently busy, please try again later" : "파일이 현재 사용 중, 나중에 다시 시도하십시오",
+ "Can't read file" : "파일을 읽을 수 없음",
"App directory already exists" : "앱 디렉터리가 이미 존재합니다.",
"Can't create app folder. Please fix permissions. %s" : "앱 폴더를 만들 수 없습니다. 권한을 수정하십시오. %s",
"No source specified when installing app" : "앱을 설치할 때 소스가 지정되지 않았습니다.",
@@ -80,6 +84,7 @@
"Set an admin username." : "관리자의 사용자 이름을 설정합니다.",
"Set an admin password." : "관리자의 암호를 설정합니다.",
"Can't create or write into the data directory %s" : "데이터 디렉터리 %s을(를) 만들거나 기록할 수 없음",
+ "Invalid Federated Cloud ID" : "잘못된 연합 클라우드 ID",
"%s shared »%s« with you" : "%s 님이 %s을(를) 공유하였습니다",
"%s via %s" : "%s(%s 경유)",
"Sharing %s failed, because the backend does not allow shares from type %i" : "%s을(를) 공유할 수 없습니다. 백엔드에서 %i 형식의 공유를 허용하지 않습니다",
@@ -128,7 +133,9 @@
"PHP module %s not installed." : "PHP 모듈 %s이(가) 설치되지 않았습니다.",
"PHP setting \"%s\" is not set to \"%s\"." : "PHP 설정 \"%s\"이(가) \"%s\"(으)로 설정되어 있지 않습니다.",
"Adjusting this setting in php.ini will make ownCloud run again" : "php.ini에서 이 설정을 변경하면 ownCloud가 다시 실행됩니다",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 값이 \"%s\"(으)로 설정되어 있으나 \"0\"으로 설정해야 함",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "이 문제를 해결하려면 php.ini에서 <code>mbstring.func_overload</code> 값을 <code>0</code>으로 설정하십시오",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP에서 인라인 문서 블록을 삭제하도록 설정되어 있습니다. 일부 코어 앱을 사용하지 못할 수도 있습니다.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Zend OPcache, eAccelerator 같은 캐시/가속기 문제일 수도 있습니다.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP 모듈이 설치되었지만 여전히 없는 것으로 나타납니까?",
"Please ask your server administrator to restart the web server." : "서버 관리자에게 웹 서버 재시작을 요청하십시오.",
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index 5e3e3858950..cb36007723b 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "Библиотека %s издања нижег од %s је потребна - доступно издање %s.",
"Following platforms are supported: %s" : "Следеће платформе су подржане: %s",
"ownCloud %s or higher is required." : "оунКлауд %s или новији је потребан.",
+ "ownCloud %s or lower is required." : "оунКлауд %s или старији је потребан.",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
@@ -44,6 +45,7 @@ OC.L10N.register(
"File name is a reserved word" : "Назив фајла је резервисана реч",
"File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
"File name is too long" : "Назив фајла је предугачак",
+ "File is currently busy, please try again later" : "Фајл је тренутно заузет, покушајте поново касније",
"Can't read file" : "Не могу да читам фајл",
"App directory already exists" : "Директоријум апликација већ постоји",
"Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s",
@@ -84,6 +86,7 @@ OC.L10N.register(
"Set an admin username." : "Поставите име за администратора.",
"Set an admin password." : "Поставите лозинку за администратора.",
"Can't create or write into the data directory %s" : "Не могу креирати или уписивати у директоријум података %s",
+ "Invalid Federated Cloud ID" : "Неисправан ИД Здруженог облака",
"%s shared »%s« with you" : "%s подели „%s“ са вама",
"%s via %s" : "%s путем %s",
"Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i",
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index 5efb7613a42..2cc9f4de390 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -14,6 +14,7 @@
"Library %s with a version lower than %s is required - available version %s." : "Библиотека %s издања нижег од %s је потребна - доступно издање %s.",
"Following platforms are supported: %s" : "Следеће платформе су подржане: %s",
"ownCloud %s or higher is required." : "оунКлауд %s или новији је потребан.",
+ "ownCloud %s or lower is required." : "оунКлауд %s или старији је потребан.",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
@@ -42,6 +43,7 @@
"File name is a reserved word" : "Назив фајла је резервисана реч",
"File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
"File name is too long" : "Назив фајла је предугачак",
+ "File is currently busy, please try again later" : "Фајл је тренутно заузет, покушајте поново касније",
"Can't read file" : "Не могу да читам фајл",
"App directory already exists" : "Директоријум апликација већ постоји",
"Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s",
@@ -82,6 +84,7 @@
"Set an admin username." : "Поставите име за администратора.",
"Set an admin password." : "Поставите лозинку за администратора.",
"Can't create or write into the data directory %s" : "Не могу креирати или уписивати у директоријум података %s",
+ "Invalid Federated Cloud ID" : "Неисправан ИД Здруженог облака",
"%s shared »%s« with you" : "%s подели „%s“ са вама",
"%s via %s" : "%s путем %s",
"Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i",
diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php
index 61290791faa..51aa13065c1 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/files/storage/wrapper/encryption.php
@@ -419,10 +419,11 @@ class Encryption extends Wrapper {
}
if ($shouldEncrypt === true && $encryptionModule !== null) {
+ $headerSize = $this->getHeaderSize($path);
$source = $this->storage->fopen($path, $mode);
$handle = \OC\Files\Stream\Encryption::wrap($source, $path, $fullPath, $header,
$this->uid, $encryptionModule, $this->storage, $this, $this->util, $this->fileHelper, $mode,
- $size, $unencryptedSize, $this->getHeaderSize($path));
+ $size, $unencryptedSize, $headerSize);
return $handle;
}
@@ -521,7 +522,7 @@ class Encryption extends Wrapper {
if ($preserveMtime) {
$this->touch($targetInternalPath, $sourceStorage->filemtime($sourceInternalPath));
}
- $isEncrypted = $this->mount->getOption('encrypt', true) ? 1 : 0;
+ $isEncrypted = $this->encryptionManager->isEnabled() && $this->mount->getOption('encrypt', true) ? 1 : 0;
// in case of a rename we need to manipulate the source cache because
// this information will be kept for the new target
diff --git a/lib/private/files/type/detection.php b/lib/private/files/type/detection.php
index 3287375bc79..ba286637df3 100644
--- a/lib/private/files/type/detection.php
+++ b/lib/private/files/type/detection.php
@@ -4,6 +4,7 @@
* @author Jens-Christian Fischer <jens-christian.fischer@switch.ch>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <icewind@owncloud.com>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Tanghus <thomas@tanghus.net>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
@@ -25,6 +26,9 @@
namespace OC\Files\Type;
+use OCP\Files\IMimeTypeDetector;
+use OCP\IURLGenerator;
+
/**
* Class Detection
*
@@ -32,9 +36,28 @@ namespace OC\Files\Type;
*
* @package OC\Files\Type
*/
-class Detection {
- protected $mimetypes = array();
- protected $secureMimeTypes = array();
+class Detection implements IMimeTypeDetector {
+ protected $mimetypes = [];
+ protected $secureMimeTypes = [];
+
+ protected $mimetypeIcons = [];
+ /** @var string[] */
+ protected $mimeTypeAlias = [];
+
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ /** @var string */
+ private $configDir;
+
+ /**
+ * @param IURLGenerator $urlGenerator
+ * @param string $configDir
+ */
+ public function __construct(IURLGenerator $urlGenerator, $configDir) {
+ $this->urlGenerator = $urlGenerator;
+ $this->configDir = $configDir;
+ }
/**
* Add an extension -> mimetype mapping
@@ -71,12 +94,52 @@ class Detection {
}
/**
+ * Add the mimetype aliases if they are not yet present
+ */
+ private function loadAliases() {
+ if (!empty($this->mimeTypeAlias)) {
+ return;
+ }
+
+ $file = file_get_contents($this->configDir . '/mimetypealiases.dist.json');
+ $this->mimeTypeAlias = get_object_vars(json_decode($file));
+
+ if (file_exists($this->configDir . '/mimetypealiases.json')) {
+ $custom = get_object_vars(json_decode(file_get_contents($this->configDir . '/mimetypealiases.json')));
+ $this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom);
+ }
+ }
+
+ /**
+ * Add mimetype mappings if they are not yet present
+ */
+ private function loadMappings() {
+ if (!empty($this->mimetypes)) {
+ return;
+ }
+
+ $dist = file_get_contents($this->configDir . '/mimetypemapping.dist.json');
+ $mimetypemapping = get_object_vars(json_decode($dist));
+
+ //Check if need to load custom mappings
+ if (file_exists($this->configDir . '/mimetypemapping.json')) {
+ $custom = file_get_contents($this->configDir . '/mimetypemapping.json');
+ $custom_mapping = get_object_vars(json_decode($custom));
+ $mimetypemapping = array_merge($mimetypemapping, $custom_mapping);
+ }
+
+ $this->registerTypeArray($mimetypemapping);
+ }
+
+ /**
* detect mimetype only based on filename, content of file is not used
*
* @param string $path
* @return string
*/
public function detectPath($path) {
+ $this->loadMappings();
+
if (strpos($path, '.')) {
//try to guess the type by the file extension
$extension = strtolower(strrchr(basename($path), "."));
@@ -96,6 +159,8 @@ class Detection {
* @return string
*/
public function detect($path) {
+ $this->loadMappings();
+
if (@is_dir($path)) {
// directories are easy
return "httpd/unix-directory";
@@ -166,8 +231,64 @@ class Detection {
* @return string
*/
public function getSecureMimeType($mimeType) {
+ $this->loadMappings();
+
return isset($this->secureMimeTypes[$mimeType])
? $this->secureMimeTypes[$mimeType]
: 'application/octet-stream';
}
+
+ /**
+ * Get path to the icon of a file type
+ * @param string $mimeType the MIME type
+ * @return string the url
+ */
+ public function mimeTypeIcon($mimetype) {
+ $this->loadAliases();
+
+ if (isset($this->mimeTypeAlias[$mimetype])) {
+ $mimetype = $this->mimeTypeAlias[$mimetype];
+ }
+ if (isset($this->mimetypeIcons[$mimetype])) {
+ return $this->mimetypeIcons[$mimetype];
+ }
+
+ // Replace slash and backslash with a minus
+ $icon = str_replace('/', '-', $mimetype);
+ $icon = str_replace('\\', '-', $icon);
+
+ // Is it a dir?
+ if ($mimetype === 'dir') {
+ $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder.png');
+ return $this->mimetypeIcons[$mimetype];
+ }
+ if ($mimetype === 'dir-shared') {
+ $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-shared.png');
+ return $this->mimetypeIcons[$mimetype];
+ }
+ if ($mimetype === 'dir-external') {
+ $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-external.png');
+ return $this->mimetypeIcons[$mimetype];
+ }
+
+ // Icon exists?
+ try {
+ $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $icon . '.png');
+ return $this->mimetypeIcons[$mimetype];
+ } catch (\RuntimeException $e) {
+ // Specified image not found
+ }
+
+ // Try only the first part of the filetype
+ $mimePart = substr($icon, 0, strpos($icon, '-'));
+ try {
+ $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $mimePart . '.png');
+ return $this->mimetypeIcons[$mimetype];
+ } catch (\RuntimeException $e) {
+ // Image for the first part of the mimetype not found
+ }
+
+ $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/file.png');
+ return $this->mimetypeIcons[$mimetype];
+ }
}
diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php
index 3d68eb530a2..c70f4beb31d 100644
--- a/lib/private/files/utils/scanner.php
+++ b/lib/private/files/utils/scanner.php
@@ -131,6 +131,9 @@ class Scanner extends PublicEmitter {
* @throws \OC\ForbiddenException
*/
public function scan($dir = '') {
+ if (!Filesystem::isValidPath($dir)) {
+ throw new \InvalidArgumentException('Invalid path to scan');
+ }
$mounts = $this->getMounts($dir);
foreach ($mounts as $mount) {
if (is_null($mount->getStorage())) {
diff --git a/lib/private/helper.php b/lib/private/helper.php
index ed954f87630..b8e4b451835 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -50,11 +50,7 @@ use Symfony\Component\Process\ExecutableFinder;
* Collection of useful functions
*/
class OC_Helper {
- private static $mimetypeIcons = array();
- private static $mimetypeDetector;
private static $templateManager;
- /** @var string[] */
- private static $mimeTypeAlias = [];
/**
* Creates an url using a defined route
@@ -183,64 +179,10 @@ class OC_Helper {
* @return string the url
*
* Returns the path to the image of this file type.
+ * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->mimeTypeIcon($mimetype)
*/
public static function mimetypeIcon($mimetype) {
-
- // On first access load the list of mimetype aliases
- if (empty(self::$mimeTypeAlias)) {
- $file = file_get_contents(OC::$SERVERROOT . '/config/mimetypealiases.dist.json');
- self::$mimeTypeAlias = get_object_vars(json_decode($file));
-
- if (file_exists(\OC::$SERVERROOT . '/config/mimetypealiases.json')) {
- $custom = get_object_vars(json_decode(file_get_contents(\OC::$SERVERROOT . '/config/mimetypealiases.json')));
- self::$mimeTypeAlias = array_merge(self::$mimeTypeAlias, $custom);
- }
- }
-
- if (isset(self::$mimeTypeAlias[$mimetype])) {
- $mimetype = self::$mimeTypeAlias[$mimetype];
- }
- if (isset(self::$mimetypeIcons[$mimetype])) {
- return self::$mimetypeIcons[$mimetype];
- }
-
- // Replace slash and backslash with a minus
- $icon = str_replace('/', '-', $mimetype);
- $icon = str_replace('\\', '-', $icon);
-
- // Is it a dir?
- if ($mimetype === 'dir') {
- self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/folder.png');
- return self::$mimetypeIcons[$mimetype];
- }
- if ($mimetype === 'dir-shared') {
- self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/folder-shared.png');
- return self::$mimetypeIcons[$mimetype];
- }
- if ($mimetype === 'dir-external') {
- self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/folder-external.png');
- return self::$mimetypeIcons[$mimetype];
- }
-
- // Icon exists?
- try {
- self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/' . $icon . '.png');
- return self::$mimetypeIcons[$mimetype];
- } catch (\RuntimeException $e) {
- // Specified image not found
- }
-
- // Try only the first part of the filetype
- $mimePart = substr($icon, 0, strpos($icon, '-'));
- try {
- self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/' . $mimePart . '.png');
- return self::$mimetypeIcons[$mimetype];
- } catch (\RuntimeException $e) {
- // Image for the first part of the mimetype not found
- }
-
- self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/file.png');
- return self::$mimetypeIcons[$mimetype];
+ return \OC::$server->getMimeTypeDetector()->mimeTypeIcon($mimetype);
}
/**
@@ -431,23 +373,10 @@ class OC_Helper {
/**
* @return \OC\Files\Type\Detection
+ * @deprecated 8.2.0 use \OC::$server->getMimeTypeDetector()
*/
static public function getMimetypeDetector() {
- if (!self::$mimetypeDetector) {
- $dist = file_get_contents(OC::$configDir . '/mimetypemapping.dist.json');
- $mimetypemapping = get_object_vars(json_decode($dist));
-
- //Check if need to load custom mappings
- if (file_exists(OC::$configDir . '/mimetypemapping.json')) {
- $custom = file_get_contents(OC::$configDir . '/mimetypemapping.json');
- $custom_mapping = get_object_vars(json_decode($custom));
- $mimetypemapping = array_merge($mimetypemapping, $custom_mapping);
- }
-
- self::$mimetypeDetector = new \OC\Files\Type\Detection();
- self::$mimetypeDetector->registerTypeArray($mimetypemapping);
- }
- return self::$mimetypeDetector;
+ return \OC::$server->getMimeTypeDetector();
}
/**
@@ -465,9 +394,10 @@ class OC_Helper {
*
* @param string $path
* @return string
+ * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->detectPath($path)
*/
static public function getFileNameMimeType($path) {
- return self::getMimetypeDetector()->detectPath($path);
+ return \OC::$server->getMimeTypeDetector()->detectPath($path);
}
/**
@@ -476,9 +406,10 @@ class OC_Helper {
* @param string $path
* @return string
* does NOT work for ownClouds filesystem, use OC_FileSystem::getMimeType instead
+ * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->detect($path)
*/
static function getMimeType($path) {
- return self::getMimetypeDetector()->detect($path);
+ return \OC::$server->getMimeTypeDetector()->detect($path);
}
/**
@@ -486,9 +417,10 @@ class OC_Helper {
*
* @param string $mimeType
* @return string
+ * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->getSecureMimeType($mimeType)
*/
static function getSecureMimeType($mimeType) {
- return self::getMimetypeDetector()->getSecureMimeType($mimeType);
+ return \OC::$server->getMimeTypeDetector()->getSecureMimeType($mimeType);
}
/**
@@ -496,20 +428,13 @@ class OC_Helper {
*
* @param string $data
* @return string
+ * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->detectString($data)
*/
static function getStringMimeType($data) {
- return self::getMimetypeDetector()->detectString($data);
+ return \OC::$server->getMimeTypeDetector()->detectString($data);
}
/**
- * Checks $_REQUEST contains a var for the $s key. If so, returns the html-escaped value of this var; otherwise returns the default value provided by $d.
- * @param string $s name of the var to escape, if set.
- * @param string $d default value.
- * @return string the print-safe value.
- *
- */
-
- /**
* detect if a given program is found in the search PATH
*
* @param string $name
diff --git a/lib/private/server.php b/lib/private/server.php
index 53949b53df7..12981fe7f19 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -12,6 +12,7 @@
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <icewind@owncloud.com>
* @author Robin McCorkell <rmccorkell@karoshi.org.uk>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Sander <brantje@gmail.com>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Thomas Tanghus <thomas@tanghus.net>
@@ -443,6 +444,11 @@ class Server extends SimpleContainer implements IServerContainer {
$this->registerService('MountManager', function () {
return new \OC\Files\Mount\Manager();
});
+ $this->registerService('MimeTypeDetector', function(Server $c) {
+ return new \OC\Files\Type\Detection(
+ $c->getURLGenerator(),
+ \OC::$configDir);
+ });
}
/**
@@ -930,4 +936,13 @@ class Server extends SimpleContainer implements IServerContainer {
function getMountManager() {
return $this->query('MountManager');
}
+
+ /*
+ * Get the MimeTypeDetector
+ *
+ * @return \OCP\Files\IMimeTypeDetector
+ */
+ public function getMimeTypeDetector() {
+ return $this->query('MimeTypeDetector');
+ }
}
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index c0285125234..40fcc59f219 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -782,6 +782,19 @@ class Share extends Constants {
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::ERROR);
throw new \Exception($message_t);
} else if ($shareType === self::SHARE_TYPE_REMOTE) {
+
+ /*
+ * Check if file is not already shared with the remote user
+ */
+ if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_REMOTE,
+ $shareWith, $uidOwner, self::FORMAT_NONE, null, 1, true, true)) {
+ $message = 'Sharing %s failed, because this item is already shared with %s';
+ $message_t = $l->t('Sharing %s failed, because this item is already shared with %s', array($itemSourceName, $shareWith));
+ \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR);
+ throw new \Exception($message_t);
+ }
+
+
$token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(self::TOKEN_LENGTH, \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER .
\OCP\Security\ISecureRandom::CHAR_DIGITS);
diff --git a/lib/public/db/querybuilder/iliteral.php b/lib/public/db/querybuilder/iliteral.php
index a09b25bb2b9..f5db1ce0456 100644
--- a/lib/public/db/querybuilder/iliteral.php
+++ b/lib/public/db/querybuilder/iliteral.php
@@ -20,6 +20,9 @@
*/
namespace OCP\DB\QueryBuilder;
+/**
+ * @since 8.2.0
+ */
interface ILiteral {
/**
* @return string
diff --git a/lib/public/db/querybuilder/iparameter.php b/lib/public/db/querybuilder/iparameter.php
index 0eb525b3522..f597163ba00 100644
--- a/lib/public/db/querybuilder/iparameter.php
+++ b/lib/public/db/querybuilder/iparameter.php
@@ -20,6 +20,9 @@
*/
namespace OCP\DB\QueryBuilder;
+/**
+ * @since 8.2.0
+ */
interface IParameter {
/**
* @return string
diff --git a/lib/public/db/querybuilder/iqueryfunction.php b/lib/public/db/querybuilder/iqueryfunction.php
index 499b6e1efcc..4e8c163f777 100644
--- a/lib/public/db/querybuilder/iqueryfunction.php
+++ b/lib/public/db/querybuilder/iqueryfunction.php
@@ -20,6 +20,9 @@
*/
namespace OCP\DB\QueryBuilder;
+/**
+ * @since 8.2.0
+ */
interface IQueryFunction {
/**
* @return string
diff --git a/lib/public/files/imimetypedetector.php b/lib/public/files/imimetypedetector.php
new file mode 100644
index 00000000000..79ed8a4fac9
--- /dev/null
+++ b/lib/public/files/imimetypedetector.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+// use OCP namespace for all classes that are considered public.
+// This means that they should be used by apps instead of the internal ownCloud classes
+namespace OCP\Files;
+
+
+/**
+ * Interface IMimeTypeDetector
+ * @package OCP\Files
+ * @since 8.2.0
+ *
+ * Interface to handle mimetypes (detection and icon retrieval)
+ **/
+interface IMimeTypeDetector {
+
+ /**
+ * detect mimetype only based on filename, content of file is not used
+ * @param string $path
+ * @return string
+ * @since 8.2.0
+ **/
+ public function detectPath($path);
+
+ /**
+ * detect mimetype based on both filename and content
+ *
+ * @param string $path
+ * @return string
+ * @since 8.2.0
+ */
+ public function detect($path);
+
+ /**
+ * Get a secure mimetype that won't expose potential XSS.
+ *
+ * @param string $mimeType
+ * @return string
+ * @since 8.2.0
+ */
+ public function getSecureMimeType($mimeType);
+
+ /**
+ * detect mimetype based on the content of a string
+ *
+ * @param string $data
+ * @return string
+ * @since 8.2.0
+ */
+ public function detectString($data);
+
+ /**
+ * Get path to the icon of a file type
+ * @param string $mimeType the MIME type
+ * @return string the url
+ * @since 8.2.0
+ */
+ public function mimeTypeIcon($mimeType);
+}
diff --git a/lib/public/files/mount/imountmanager.php b/lib/public/files/mount/imountmanager.php
index 96ec1e11ad3..1eb9b66dad8 100644
--- a/lib/public/files/mount/imountmanager.php
+++ b/lib/public/files/mount/imountmanager.php
@@ -25,6 +25,7 @@ namespace OCP\Files\Mount;
* Interface IMountManager
*
* Manages all mounted storages in the system
+ * @since 8.2.0
*/
interface IMountManager {
diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php
index 95ee853d84c..f3165db33da 100644
--- a/lib/public/iservercontainer.php
+++ b/lib/public/iservercontainer.php
@@ -9,6 +9,7 @@
* @author Lukas Reschke <lukas@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <icewind@owncloud.com>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Thomas Tanghus <thomas@tanghus.net>
*
@@ -429,4 +430,12 @@ interface IServerContainer {
* @since 8.2.0
*/
public function getMountManager();
+
+ /**
+ * Get the MimeTypeDetector
+ *
+ * @return \OCP\Files\IMimeTypeDetector
+ * @since 8.2.0
+ */
+ public function getMimeTypeDetector();
}
diff --git a/lib/public/template.php b/lib/public/template.php
index cc91bff2528..b308240306d 100644
--- a/lib/public/template.php
+++ b/lib/public/template.php
@@ -137,6 +137,8 @@ function html_select_options($options, $selected, $params=array()) {
/**
* This class provides the template system for owncloud. You can use it to load
* specific templates, add data and generate the html code
+ *
+ * @since 8.0.0
*/
class Template extends \OC_Template {
/**
diff --git a/settings/application.php b/settings/application.php
index a2f25935e12..8da835c18d2 100644
--- a/settings/application.php
+++ b/settings/application.php
@@ -154,7 +154,8 @@ class Application extends App {
$c->query('Config'),
$c->query('ClientService'),
$c->query('URLGenerator'),
- $c->query('Util')
+ $c->query('Util'),
+ $c->query('L10N')
);
});
diff --git a/settings/controller/checksetupcontroller.php b/settings/controller/checksetupcontroller.php
index 0b4c72acab7..f849e3ed565 100644
--- a/settings/controller/checksetupcontroller.php
+++ b/settings/controller/checksetupcontroller.php
@@ -23,10 +23,12 @@
namespace OC\Settings\Controller;
+use GuzzleHttp\Exception\ClientException;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\DataResponse;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
+use OCP\IL10N;
use OCP\IRequest;
use OC_Util;
use OCP\IURLGenerator;
@@ -43,6 +45,8 @@ class CheckSetupController extends Controller {
private $util;
/** @var IURLGenerator */
private $urlGenerator;
+ /** @var IL10N */
+ private $l10n;
/**
* @param string $AppName
@@ -51,18 +55,21 @@ class CheckSetupController extends Controller {
* @param IClientService $clientService
* @param IURLGenerator $urlGenerator
* @param \OC_Util $util
+ * @param IL10N $l10n
*/
public function __construct($AppName,
IRequest $request,
IConfig $config,
IClientService $clientService,
IURLGenerator $urlGenerator,
- \OC_Util $util) {
+ \OC_Util $util,
+ IL10N $l10n) {
parent::__construct($AppName, $request);
$this->config = $config;
$this->clientService = $clientService;
$this->util = $util;
$this->urlGenerator = $urlGenerator;
+ $this->l10n = $l10n;
}
/**
@@ -110,6 +117,66 @@ class CheckSetupController extends Controller {
}
/**
+ * Public for the sake of unit-testing
+ *
+ * @return array
+ */
+ public function getCurlVersion() {
+ return curl_version();
+ }
+
+ /**
+ * Check if the used SSL lib is outdated. Older OpenSSL and NSS versions do
+ * have multiple bugs which likely lead to problems in combination with
+ * functionalities required by ownCloud such as SNI.
+ *
+ * @link https://github.com/owncloud/core/issues/17446#issuecomment-122877546
+ * @link https://bugzilla.redhat.com/show_bug.cgi?id=1241172
+ * @return string
+ */
+ private function isUsedTlsLibOutdated() {
+ $versionString = $this->getCurlVersion();
+ if(isset($versionString['ssl_version'])) {
+ $versionString = $versionString['ssl_version'];
+ } else {
+ return '';
+ }
+
+ $features = (string)$this->l10n->t('installing and updating apps via the app store or Federated Cloud Sharing');
+ if(OC_Util::getEditionString() !== '') {
+ $features = (string)$this->l10n->t('Federated Cloud Sharing');
+ }
+
+ // Check if at least OpenSSL after 1.01d or 1.0.2b
+ if(strpos($versionString, 'OpenSSL/') === 0) {
+ $majorVersion = substr($versionString, 8, 5);
+ $patchRelease = substr($versionString, 13, 6);
+
+ if(($majorVersion === '1.0.1' && ord($patchRelease) < ord('d')) ||
+ ($majorVersion === '1.0.2' && ord($patchRelease) < ord('b'))) {
+ return (string) $this->l10n->t('cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably.', ['OpenSSL', $versionString, $features]);
+ }
+ }
+
+ // Check if NSS and perform heuristic check
+ if(strpos($versionString, 'NSS/') === 0) {
+ try {
+ $firstClient = $this->clientService->newClient();
+ $firstClient->get('https://www.owncloud.org/');
+
+ $secondClient = $this->clientService->newClient();
+ $secondClient->get('https://owncloud.org/');
+ } catch (ClientException $e) {
+ if($e->getResponse()->getStatusCode() === 400) {
+ return (string) $this->l10n->t('cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably.', ['NSS', $versionString, $features]);
+ }
+ }
+ }
+
+ return '';
+ }
+
+ /**
* @return DataResponse
*/
public function check() {
@@ -121,6 +188,7 @@ class CheckSetupController extends Controller {
'memcacheDocs' => $this->urlGenerator->linkToDocs('admin-performance'),
'isUrandomAvailable' => $this->isUrandomAvailable(),
'securityDocs' => $this->urlGenerator->linkToDocs('admin-security'),
+ 'isUsedTlsLibOutdated' => $this->isUsedTlsLibOutdated(),
]
);
}
diff --git a/settings/controller/encryptioncontroller.php b/settings/controller/encryptioncontroller.php
index 7c952962c1a..7aaf184482f 100644
--- a/settings/controller/encryptioncontroller.php
+++ b/settings/controller/encryptioncontroller.php
@@ -78,6 +78,21 @@ class EncryptionController extends Controller {
$this->connection = $connection;
$this->view = $view;
$this->userManager = $userManager;
+ $this->logger = $logger;
+ }
+
+ /**
+ * @param IConfig $config
+ * @param View $view
+ * @param Connection $connection
+ * @param ILogger $logger
+ * @return Migration
+ */
+ protected function getMigration(IConfig $config,
+ View $view,
+ Connection $connection,
+ ILogger $logger) {
+ return new Migration($config, $view, $connection, $logger);
}
/**
@@ -91,12 +106,11 @@ class EncryptionController extends Controller {
try {
- $migration = new Migration($this->config, $this->view, $this->connection, $this->logger);
+ $migration = $this->getMigration($this->config, $this->view, $this->connection, $this->logger);
$migration->reorganizeSystemFolderStructure();
$migration->updateDB();
foreach ($this->userManager->getBackends() as $backend) {
-
$limit = 500;
$offset = 0;
do {
@@ -111,21 +125,20 @@ class EncryptionController extends Controller {
$migration->finalCleanUp();
} catch (\Exception $e) {
- return array(
- 'data' => array(
+ return [
+ 'data' => [
'message' => (string)$this->l10n->t('A problem occurred, please check your log files (Error: %s)', [$e->getMessage()]),
- ),
+ ],
'status' => 'error',
- );
+ ];
}
- return array('data' =>
- array('message' =>
- (string) $this->l10n->t('Migration Completed')
- ),
- 'status' => 'success'
- );
-
+ return [
+ 'data' => [
+ 'message' => (string) $this->l10n->t('Migration Completed'),
+ ],
+ 'status' => 'success',
+ ];
}
}
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 5fd4e9d235b..3b25bcd5b5f 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -880,4 +880,8 @@ $(document).ready(function () {
// trigger loading of users on startup
UserList.update(UserList.currentGid, initialUserCountLimit);
+ _.defer(function() {
+ $('#app-content').trigger($.Event('apprendered'));
+ });
+
});
diff --git a/settings/l10n/az.js b/settings/l10n/az.js
index 0880b291444..23805b8c88b 100644
--- a/settings/l10n/az.js
+++ b/settings/l10n/az.js
@@ -25,6 +25,7 @@ OC.L10N.register(
"Unable to change password" : "Şifrəni dəyişmək olmur",
"Enabled" : "İşə salınıb",
"Not enabled" : "İşə salınıb",
+ "Federated Cloud Sharing" : "Federal Cloud Paylaşım",
"Group already exists." : "Qrup artılq mövcduddur.",
"Unable to add group." : "Qrupu əlavə etmək mümkün deyil. ",
"Unable to delete group." : "Qrupu silmək mümkün deyil.",
diff --git a/settings/l10n/az.json b/settings/l10n/az.json
index c1b7f69b2d4..84ad2602e15 100644
--- a/settings/l10n/az.json
+++ b/settings/l10n/az.json
@@ -23,6 +23,7 @@
"Unable to change password" : "Şifrəni dəyişmək olmur",
"Enabled" : "İşə salınıb",
"Not enabled" : "İşə salınıb",
+ "Federated Cloud Sharing" : "Federal Cloud Paylaşım",
"Group already exists." : "Qrup artılq mövcduddur.",
"Unable to add group." : "Qrupu əlavə etmək mümkün deyil. ",
"Unable to delete group." : "Qrupu silmək mümkün deyil.",
diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js
index 68d6c315524..87ca48a0e9e 100644
--- a/settings/l10n/cs_CZ.js
+++ b/settings/l10n/cs_CZ.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Změna hesla se nezdařila",
"Enabled" : "Povoleno",
"Not enabled" : "Vypnuto",
+ "Federated Cloud Sharing" : "Propojené cloudové sdílení",
"A problem occurred, please check your log files (Error: %s)" : "Došlo k chybě, zkontrolujte prosím log (Chyba: %s)",
"Migration Completed" : "Migrace dokončena",
"Group already exists." : "Skupina již existuje.",
diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json
index b6fab6f0d50..523be1eaba6 100644
--- a/settings/l10n/cs_CZ.json
+++ b/settings/l10n/cs_CZ.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Změna hesla se nezdařila",
"Enabled" : "Povoleno",
"Not enabled" : "Vypnuto",
+ "Federated Cloud Sharing" : "Propojené cloudové sdílení",
"A problem occurred, please check your log files (Error: %s)" : "Došlo k chybě, zkontrolujte prosím log (Chyba: %s)",
"Migration Completed" : "Migrace dokončena",
"Group already exists." : "Skupina již existuje.",
diff --git a/settings/l10n/da.js b/settings/l10n/da.js
index e72c465fffd..27d146c46d6 100644
--- a/settings/l10n/da.js
+++ b/settings/l10n/da.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Kunne ikke ændre kodeord",
"Enabled" : "Aktiveret",
"Not enabled" : "Slået fra",
+ "Federated Cloud Sharing" : "Sammensluttet Cloud deling",
"A problem occurred, please check your log files (Error: %s)" : "Der opstod en fejl - tjek venligst dine logfiler (fejl: %s)",
"Migration Completed" : "Overflytning blev fuldført",
"Group already exists." : "Gruppen findes allerede.",
@@ -196,6 +197,7 @@ OC.L10N.register(
"licensed" : "licenseret",
"Documentation:" : "Dokumentation:",
"User documentation" : "Brugerdokumentation",
+ "Admin documentation" : "Admin-dokumentation",
"Show description …" : "Vis beskrivelse",
"Hide description …" : "Skjul beskrivelse",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Dette program kan ikke installeres, da følgende afhængigheder ikke imødekommes:",
diff --git a/settings/l10n/da.json b/settings/l10n/da.json
index d7b7368ddad..9b343d50b28 100644
--- a/settings/l10n/da.json
+++ b/settings/l10n/da.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Kunne ikke ændre kodeord",
"Enabled" : "Aktiveret",
"Not enabled" : "Slået fra",
+ "Federated Cloud Sharing" : "Sammensluttet Cloud deling",
"A problem occurred, please check your log files (Error: %s)" : "Der opstod en fejl - tjek venligst dine logfiler (fejl: %s)",
"Migration Completed" : "Overflytning blev fuldført",
"Group already exists." : "Gruppen findes allerede.",
@@ -194,6 +195,7 @@
"licensed" : "licenseret",
"Documentation:" : "Dokumentation:",
"User documentation" : "Brugerdokumentation",
+ "Admin documentation" : "Admin-dokumentation",
"Show description …" : "Vis beskrivelse",
"Hide description …" : "Skjul beskrivelse",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Dette program kan ikke installeres, da følgende afhængigheder ikke imødekommes:",
diff --git a/settings/l10n/de.js b/settings/l10n/de.js
index 46c37cf70cd..4d3d3e09b74 100644
--- a/settings/l10n/de.js
+++ b/settings/l10n/de.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Passwort konnte nicht geändert werden",
"Enabled" : "Aktiviert",
"Not enabled" : "Nicht aktiviert",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfe Deine Logdateien (Fehler: %s)",
"Migration Completed" : "Migration komplett",
"Group already exists." : "Gruppe existiert bereits.",
diff --git a/settings/l10n/de.json b/settings/l10n/de.json
index 11fc2c49c83..e1bfd5ae679 100644
--- a/settings/l10n/de.json
+++ b/settings/l10n/de.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Passwort konnte nicht geändert werden",
"Enabled" : "Aktiviert",
"Not enabled" : "Nicht aktiviert",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfe Deine Logdateien (Fehler: %s)",
"Migration Completed" : "Migration komplett",
"Group already exists." : "Gruppe existiert bereits.",
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index 2f4bc02c4f3..aa2d887a914 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Passwort konnte nicht geändert werden",
"Enabled" : "Aktiviert",
"Not enabled" : "Nicht aktiviert",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfen Sie Ihre Logdateien (Fehler: %s)",
"Migration Completed" : "Migration abgeschlossen",
"Group already exists." : "Gruppe existiert bereits.",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index 1790af8a9cb..e064a689a4a 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Passwort konnte nicht geändert werden",
"Enabled" : "Aktiviert",
"Not enabled" : "Nicht aktiviert",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfen Sie Ihre Logdateien (Fehler: %s)",
"Migration Completed" : "Migration abgeschlossen",
"Group already exists." : "Gruppe existiert bereits.",
diff --git a/settings/l10n/el.js b/settings/l10n/el.js
index b62562297f0..cb425992190 100644
--- a/settings/l10n/el.js
+++ b/settings/l10n/el.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Αδυναμία αλλαγής συνθηματικού",
"Enabled" : "Ενεργοποιημένο",
"Not enabled" : "Μη ενεργοποιημένο",
+ "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ",
"A problem occurred, please check your log files (Error: %s)" : "Παρουσιάστηκε πρόβλημα, παρακαλώ ελέγξτε τα αρχεία καταγραφής σας (Σφάλμα: %s)",
"Migration Completed" : "Η μετάβαση ολοκληρώθηκε",
"Group already exists." : "Η ομάδα υπάρχει ήδη.",
diff --git a/settings/l10n/el.json b/settings/l10n/el.json
index 1052d3606c5..962d6f3f60b 100644
--- a/settings/l10n/el.json
+++ b/settings/l10n/el.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Αδυναμία αλλαγής συνθηματικού",
"Enabled" : "Ενεργοποιημένο",
"Not enabled" : "Μη ενεργοποιημένο",
+ "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ",
"A problem occurred, please check your log files (Error: %s)" : "Παρουσιάστηκε πρόβλημα, παρακαλώ ελέγξτε τα αρχεία καταγραφής σας (Σφάλμα: %s)",
"Migration Completed" : "Η μετάβαση ολοκληρώθηκε",
"Group already exists." : "Η ομάδα υπάρχει ήδη.",
diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js
index 0d13ce67970..da437fa2a25 100644
--- a/settings/l10n/en_GB.js
+++ b/settings/l10n/en_GB.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Unable to change password" : "Unable to change password",
"Enabled" : "Enabled",
"Not enabled" : "Not enabled",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "A problem occurred, please check your log files (Error: %s)",
"Migration Completed" : "Migration Completed",
"Group already exists." : "Group already exists.",
diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json
index 9070f665b2d..6983ecaac1c 100644
--- a/settings/l10n/en_GB.json
+++ b/settings/l10n/en_GB.json
@@ -27,6 +27,7 @@
"Unable to change password" : "Unable to change password",
"Enabled" : "Enabled",
"Not enabled" : "Not enabled",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "A problem occurred, please check your log files (Error: %s)",
"Migration Completed" : "Migration Completed",
"Group already exists." : "Group already exists.",
diff --git a/settings/l10n/es.js b/settings/l10n/es.js
index 2b317d5f0d3..f6ad23bfe92 100644
--- a/settings/l10n/es.js
+++ b/settings/l10n/es.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "No se ha podido cambiar la contraseña",
"Enabled" : "Habilitado",
"Not enabled" : "No habilitado",
+ "Federated Cloud Sharing" : "Compartido en Cloud Federado",
"A problem occurred, please check your log files (Error: %s)" : "Ocurrió un problema, por favor verifique los archivos de registro (Error: %s)",
"Migration Completed" : "Migración finalizada",
"Group already exists." : "El grupo ya existe.",
diff --git a/settings/l10n/es.json b/settings/l10n/es.json
index 07df8452971..79139bc4cbd 100644
--- a/settings/l10n/es.json
+++ b/settings/l10n/es.json
@@ -29,6 +29,7 @@
"Unable to change password" : "No se ha podido cambiar la contraseña",
"Enabled" : "Habilitado",
"Not enabled" : "No habilitado",
+ "Federated Cloud Sharing" : "Compartido en Cloud Federado",
"A problem occurred, please check your log files (Error: %s)" : "Ocurrió un problema, por favor verifique los archivos de registro (Error: %s)",
"Migration Completed" : "Migración finalizada",
"Group already exists." : "El grupo ya existe.",
diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js
index 3640ae249ee..94ea7e6312a 100644
--- a/settings/l10n/eu.js
+++ b/settings/l10n/eu.js
@@ -23,6 +23,7 @@ OC.L10N.register(
"Unable to change password" : "Ezin izan da pasahitza aldatu",
"Enabled" : "Gaitua",
"Not enabled" : "Gaitu gabe",
+ "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea",
"Group already exists." : "Taldea dagoeneko existitzen da",
"Unable to add group." : "Ezin izan da taldea gehitu.",
"Unable to delete group." : "Ezin izan da taldea ezabatu.",
diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json
index 6a7b1399a6c..ce14381a46c 100644
--- a/settings/l10n/eu.json
+++ b/settings/l10n/eu.json
@@ -21,6 +21,7 @@
"Unable to change password" : "Ezin izan da pasahitza aldatu",
"Enabled" : "Gaitua",
"Not enabled" : "Gaitu gabe",
+ "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea",
"Group already exists." : "Taldea dagoeneko existitzen da",
"Unable to add group." : "Ezin izan da taldea gehitu.",
"Unable to delete group." : "Ezin izan da taldea ezabatu.",
diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js
index b5e561c2798..c5399c6149f 100644
--- a/settings/l10n/fi_FI.js
+++ b/settings/l10n/fi_FI.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Salasanan vaihto ei onnistunut",
"Enabled" : "Käytössä",
"Not enabled" : "Ei käytössä",
+ "Federated Cloud Sharing" : "Federoitu pilvijakaminen",
"A problem occurred, please check your log files (Error: %s)" : "Tapahtui virhe, tarkista lokitiedostot (Virhe: %s)",
"Migration Completed" : "Migraatio valmistui",
"Group already exists." : "Ryhmä on jo olemassa.",
diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json
index f7227702bbd..cd20309e2b7 100644
--- a/settings/l10n/fi_FI.json
+++ b/settings/l10n/fi_FI.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Salasanan vaihto ei onnistunut",
"Enabled" : "Käytössä",
"Not enabled" : "Ei käytössä",
+ "Federated Cloud Sharing" : "Federoitu pilvijakaminen",
"A problem occurred, please check your log files (Error: %s)" : "Tapahtui virhe, tarkista lokitiedostot (Virhe: %s)",
"Migration Completed" : "Migraatio valmistui",
"Group already exists." : "Ryhmä on jo olemassa.",
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index 55b14d9f41b..2cbde857389 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Impossible de modifier le mot de passe",
"Enabled" : "Activées",
"Not enabled" : "Désactivées",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Une erreur est survenue, veuillez vérifier vos fichiers de log (Erreur: %s)",
"Migration Completed" : "Migration terminée",
"Group already exists." : "Ce groupe existe déjà.",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index b8d871dbaeb..85a45b36867 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Impossible de modifier le mot de passe",
"Enabled" : "Activées",
"Not enabled" : "Désactivées",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Une erreur est survenue, veuillez vérifier vos fichiers de log (Erreur: %s)",
"Migration Completed" : "Migration terminée",
"Group already exists." : "Ce groupe existe déjà.",
diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js
index 7e2c0228af1..947436001a8 100644
--- a/settings/l10n/gl.js
+++ b/settings/l10n/gl.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Non é posíbel cambiar o contrasinal",
"Enabled" : "Activado",
"Not enabled" : "Non activado",
+ "Federated Cloud Sharing" : "Compartición de nube federada",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu un problema revise os ficheiros de rexistro (Erro: %s)",
"Migration Completed" : "Completouse a migración",
"Group already exists." : "Xa existe o grupo.",
diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json
index 53a7e57a28c..dbe24dc7df8 100644
--- a/settings/l10n/gl.json
+++ b/settings/l10n/gl.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Non é posíbel cambiar o contrasinal",
"Enabled" : "Activado",
"Not enabled" : "Non activado",
+ "Federated Cloud Sharing" : "Compartición de nube federada",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu un problema revise os ficheiros de rexistro (Erro: %s)",
"Migration Completed" : "Completouse a migración",
"Group already exists." : "Xa existe o grupo.",
diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js
index 1a6a717824f..23ffd4adf4c 100644
--- a/settings/l10n/hu_HU.js
+++ b/settings/l10n/hu_HU.js
@@ -22,6 +22,7 @@ OC.L10N.register(
"Wrong admin recovery password. Please check the password and try again." : "Hibás admin helyreállítási jelszó. Ellenőrizze a jelszót és próbálja újra!",
"Unable to change password" : "Nem sikerült megváltoztatni a jelszót",
"Enabled" : "Bekapcsolva",
+ "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
"Saved" : "Elmentve",
"test email settings" : "e-mail beállítások ellenőrzése",
"Email sent" : "Az e-mailt elküldtük",
@@ -79,6 +80,7 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "A 'fileinfo' PHP modul hiányzik. Erősen javasolt ennek a modulnak a telepítése, mert ezzel lényegesen jobb a MIME-típusok felismerése.",
"System locale can not be set to a one which supports UTF-8." : "A rendszer lokalizációs állományai között nem sikerült olyat beállítani, ami támogatja az UTF-8-at.",
"This means that there might be problems with certain characters in file names." : "Ez azt jelenti, hogy probléma lehet bizonyos karakterekkel a fájlnevekben.",
+ "Open documentation" : "Dokumentáció megnyitása",
"Allow apps to use the Share API" : "Lehetővé teszi, hogy a programmodulok is használhassák a megosztást",
"Allow users to share via link" : "Engedjük meg az állományok linkekkel történő megosztását",
"Enforce password protection" : "Legyen kötelező a linkek jelszóval való védelme",
@@ -113,6 +115,7 @@ OC.L10N.register(
"Log level" : "Naplózási szint",
"More" : "Több",
"Less" : "Kevesebb",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.",
"Version" : "Verzió",
"by" : "közreadta:",
"Documentation:" : "Leírások:",
@@ -121,6 +124,9 @@ OC.L10N.register(
"Cheers!" : "Üdv.",
"Forum" : "Fórum",
"Get the apps to sync your files" : "Töltse le az állományok szinkronizációjához szükséges programokat!",
+ "Desktop client" : "Asztali kliens",
+ "Android app" : "Android applikáció",
+ "iOS app" : "IOS applikáció",
"Show First Run Wizard again" : "Nézzük meg újra az első bejelentkezéskori segítséget!",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Az Ön tárterület-felhasználása jelenleg: <strong>%s</strong>. Maximálisan ennyi áll rendelkezésére: <strong>%s</strong>",
"Password" : "Jelszó",
diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json
index 32c37053a22..fdb1c9d3ee1 100644
--- a/settings/l10n/hu_HU.json
+++ b/settings/l10n/hu_HU.json
@@ -20,6 +20,7 @@
"Wrong admin recovery password. Please check the password and try again." : "Hibás admin helyreállítási jelszó. Ellenőrizze a jelszót és próbálja újra!",
"Unable to change password" : "Nem sikerült megváltoztatni a jelszót",
"Enabled" : "Bekapcsolva",
+ "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
"Saved" : "Elmentve",
"test email settings" : "e-mail beállítások ellenőrzése",
"Email sent" : "Az e-mailt elküldtük",
@@ -77,6 +78,7 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "A 'fileinfo' PHP modul hiányzik. Erősen javasolt ennek a modulnak a telepítése, mert ezzel lényegesen jobb a MIME-típusok felismerése.",
"System locale can not be set to a one which supports UTF-8." : "A rendszer lokalizációs állományai között nem sikerült olyat beállítani, ami támogatja az UTF-8-at.",
"This means that there might be problems with certain characters in file names." : "Ez azt jelenti, hogy probléma lehet bizonyos karakterekkel a fájlnevekben.",
+ "Open documentation" : "Dokumentáció megnyitása",
"Allow apps to use the Share API" : "Lehetővé teszi, hogy a programmodulok is használhassák a megosztást",
"Allow users to share via link" : "Engedjük meg az állományok linkekkel történő megosztását",
"Enforce password protection" : "Legyen kötelező a linkek jelszóval való védelme",
@@ -111,6 +113,7 @@
"Log level" : "Naplózási szint",
"More" : "Több",
"Less" : "Kevesebb",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.",
"Version" : "Verzió",
"by" : "közreadta:",
"Documentation:" : "Leírások:",
@@ -119,6 +122,9 @@
"Cheers!" : "Üdv.",
"Forum" : "Fórum",
"Get the apps to sync your files" : "Töltse le az állományok szinkronizációjához szükséges programokat!",
+ "Desktop client" : "Asztali kliens",
+ "Android app" : "Android applikáció",
+ "iOS app" : "IOS applikáció",
"Show First Run Wizard again" : "Nézzük meg újra az első bejelentkezéskori segítséget!",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Az Ön tárterület-felhasználása jelenleg: <strong>%s</strong>. Maximálisan ennyi áll rendelkezésére: <strong>%s</strong>",
"Password" : "Jelszó",
diff --git a/settings/l10n/id.js b/settings/l10n/id.js
index 116152e0eb8..20e07bfb90f 100644
--- a/settings/l10n/id.js
+++ b/settings/l10n/id.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Tidak dapat mengubah sandi",
"Enabled" : "Diaktifkan",
"Not enabled" : "Tidak diaktifkan",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Terjadi masalah, mohon periksa berkas log Anda (Kesalahan: %s)",
"Migration Completed" : "Migrasi Selesai",
"Group already exists." : "Grup sudah ada.",
diff --git a/settings/l10n/id.json b/settings/l10n/id.json
index d989fa24fa8..c150230b468 100644
--- a/settings/l10n/id.json
+++ b/settings/l10n/id.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Tidak dapat mengubah sandi",
"Enabled" : "Diaktifkan",
"Not enabled" : "Tidak diaktifkan",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Terjadi masalah, mohon periksa berkas log Anda (Kesalahan: %s)",
"Migration Completed" : "Migrasi Selesai",
"Group already exists." : "Grup sudah ada.",
diff --git a/settings/l10n/it.js b/settings/l10n/it.js
index a5f493257b3..3258ab1a9a2 100644
--- a/settings/l10n/it.js
+++ b/settings/l10n/it.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Impossibile cambiare la password",
"Enabled" : "Abilitata",
"Not enabled" : "Non abilitata",
+ "Federated Cloud Sharing" : "Condivisione cloud federata",
"A problem occurred, please check your log files (Error: %s)" : "Si è verificato un problema, controlla i tuoi file di log (Errore: %s)",
"Migration Completed" : "Migrazione completata",
"Group already exists." : "Il gruppo esiste già.",
diff --git a/settings/l10n/it.json b/settings/l10n/it.json
index aca18e60db8..ae2c56ba7eb 100644
--- a/settings/l10n/it.json
+++ b/settings/l10n/it.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Impossibile cambiare la password",
"Enabled" : "Abilitata",
"Not enabled" : "Non abilitata",
+ "Federated Cloud Sharing" : "Condivisione cloud federata",
"A problem occurred, please check your log files (Error: %s)" : "Si è verificato un problema, controlla i tuoi file di log (Errore: %s)",
"Migration Completed" : "Migrazione completata",
"Group already exists." : "Il gruppo esiste già.",
diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js
index 988b0fea9f6..6d36075e713 100644
--- a/settings/l10n/ja.js
+++ b/settings/l10n/ja.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "パスワードを変更できません",
"Enabled" : "有効",
"Not enabled" : "無効",
+ "Federated Cloud Sharing" : "統合されたクラウド共有",
"A problem occurred, please check your log files (Error: %s)" : "問題が発生しました。ログファイルを確認してください。(Error: %s)",
"Migration Completed" : "移行が完了しました",
"Group already exists." : "グループはすでに存在しています",
diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json
index 91faef72de4..771c4787b98 100644
--- a/settings/l10n/ja.json
+++ b/settings/l10n/ja.json
@@ -29,6 +29,7 @@
"Unable to change password" : "パスワードを変更できません",
"Enabled" : "有効",
"Not enabled" : "無効",
+ "Federated Cloud Sharing" : "統合されたクラウド共有",
"A problem occurred, please check your log files (Error: %s)" : "問題が発生しました。ログファイルを確認してください。(Error: %s)",
"Migration Completed" : "移行が完了しました",
"Group already exists." : "グループはすでに存在しています",
diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js
index c63e31bb3ec..dd7a09bff39 100644
--- a/settings/l10n/ko.js
+++ b/settings/l10n/ko.js
@@ -1,6 +1,8 @@
OC.L10N.register(
"settings",
{
+ "APCu" : "APCu",
+ "Redis" : "Redis",
"Security & setup warnings" : "보안 및 설치 경고",
"Sharing" : "공유",
"Server-side encryption" : "서버 측 암호화",
@@ -8,6 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "이메일 서버",
"Log" : "로그",
+ "Server Status" : "서버 상태",
"Tips & tricks" : "팁과 추가 정보",
"Updates" : "업데이트",
"Authentication error" : "인증 오류",
@@ -28,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "암호를 변경할 수 없음",
"Enabled" : "활성",
"Not enabled" : "비활성",
+ "Federated Cloud Sharing" : "클라우드 연합 공유",
"A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)",
"Migration Completed" : "이전 완료됨",
"Group already exists." : "그룹이 이미 존재합니다.",
@@ -53,9 +57,13 @@ OC.L10N.register(
"Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오",
"Migration started …" : "이전 시작됨...",
"Sending..." : "보내는 중...",
+ "Official" : "공식",
+ "Approved" : "승인됨",
+ "Experimental" : "실험적",
"All" : "모두",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "공식 앱은 ownCloud 커뮤니티 내에서 개발됩니다. ownCloud의 주요 기능을 제공하며 상용 환경에서 사용 가능합니다.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과하였습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.",
+ "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "이 앱의 보안 문제가 점검되지 않았고, 출시된 지 얼마 지나지 않았거나 아직 불안정합니다. 본인 책임 하에 설치하십시오.",
"Update to %s" : "%s(으)로 업데이트",
"Please wait...." : "기다려 주십시오....",
"Error while disabling app" : "앱을 비활성화하는 중 오류 발생",
@@ -113,6 +121,7 @@ OC.L10N.register(
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP에서 인라인 doc 블록을 삭제하도록 설정되어 있습니다. 일부 코어 앱에 접근할 수 없을 수도 있습니다.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Zend OPcache, eAccelerator 같은 캐시/가속기 문제일 수도 있습니다.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "서버가 Microsoft Windows 환경에서 동작하고 있습니다. 최적의 사용자 경험을 위해서는 리눅스를 사용할 것을 권장합니다.",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s의 버전 %2$s 이하가 설치되어 있습니다. 안정성 및 성능 개선을 위하여 %1$s의 새 버전을 설치하는 것을 추천합니다.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 모듈 'fileinfo'가 존재하지 않습니다. MIME 형식 감지 결과를 향상시키기 위하여 이 모듈을 활성화하는 것을 추천합니다.",
"System locale can not be set to a one which supports UTF-8." : "UTF-8을 지원하는 시스템 로캘을 사용할 수 없습니다.",
"This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.",
@@ -146,6 +155,7 @@ OC.L10N.register(
"Enable encryption" : "암호화 사용",
"No encryption module loaded, please enable an encryption module in the app menu." : "암호화 모듈을 불러오지 않았습니다. 앱 메뉴에서 암호화 모듈을 활성화하십시오.",
"Select default encryption module:" : "기본 암호화 모듈 선택:",
+ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "과거에 사용하였던(ownCloud <= 8.0) 암호화된 데이터에서 키를 이전해야 합니다. \"기본 암호화 모듈\"을 활성화한 다음 'occ encryption:migrate'를 실행하십시오",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "ownCloud 8.0 이하에서 사용한 이전 암호화 키를 새 키로 이전해야 합니다.",
"Start migration" : "이전 시작",
"This is used for sending out notifications." : "알림을 보낼 때 사용됩니다.",
@@ -177,6 +187,8 @@ OC.L10N.register(
"Improving the config.php" : "config.php 개선",
"Theming" : "테마 꾸미기",
"Hardening and security guidance" : "보안 강화 지침",
+ "Transactional File Locking is enabled." : "트랜잭션 기반 파일 잠금이 활성화 되었습니다.",
+ "Transactional File Locking is disabled." : "트랜잭션 기반 파일 잠금이 비활성화 되었습니다.",
"Version" : "버전",
"Developer documentation" : "개발자 문서",
"Experimental applications ahead" : "실험적인 앱 사용 예정",
@@ -185,6 +197,7 @@ OC.L10N.register(
"licensed" : "라이선스:",
"Documentation:" : "문서:",
"User documentation" : "사용자 문서",
+ "Admin documentation" : "관리 문서",
"Show description …" : "설명 보기...",
"Hide description …" : "설명 숨기기...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "다음 의존성을 만족할 수 없기 때문에 이 앱을 설치할 수 없습니다:",
diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json
index 40ae2f551cf..955396bff17 100644
--- a/settings/l10n/ko.json
+++ b/settings/l10n/ko.json
@@ -1,4 +1,6 @@
{ "translations": {
+ "APCu" : "APCu",
+ "Redis" : "Redis",
"Security & setup warnings" : "보안 및 설치 경고",
"Sharing" : "공유",
"Server-side encryption" : "서버 측 암호화",
@@ -6,6 +8,7 @@
"Cron" : "Cron",
"Email server" : "이메일 서버",
"Log" : "로그",
+ "Server Status" : "서버 상태",
"Tips & tricks" : "팁과 추가 정보",
"Updates" : "업데이트",
"Authentication error" : "인증 오류",
@@ -26,6 +29,7 @@
"Unable to change password" : "암호를 변경할 수 없음",
"Enabled" : "활성",
"Not enabled" : "비활성",
+ "Federated Cloud Sharing" : "클라우드 연합 공유",
"A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)",
"Migration Completed" : "이전 완료됨",
"Group already exists." : "그룹이 이미 존재합니다.",
@@ -51,9 +55,13 @@
"Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오",
"Migration started …" : "이전 시작됨...",
"Sending..." : "보내는 중...",
+ "Official" : "공식",
+ "Approved" : "승인됨",
+ "Experimental" : "실험적",
"All" : "모두",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "공식 앱은 ownCloud 커뮤니티 내에서 개발됩니다. ownCloud의 주요 기능을 제공하며 상용 환경에서 사용 가능합니다.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "승인된 앱은 신뢰할 수 있는 개발자가 개발하며 보안 검사를 통과하였습니다. 열린 코드 저장소에서 관리되며 일반적인 환경에서 사용할 수 있는 수준으로 관리됩니다.",
+ "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "이 앱의 보안 문제가 점검되지 않았고, 출시된 지 얼마 지나지 않았거나 아직 불안정합니다. 본인 책임 하에 설치하십시오.",
"Update to %s" : "%s(으)로 업데이트",
"Please wait...." : "기다려 주십시오....",
"Error while disabling app" : "앱을 비활성화하는 중 오류 발생",
@@ -111,6 +119,7 @@
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP에서 인라인 doc 블록을 삭제하도록 설정되어 있습니다. 일부 코어 앱에 접근할 수 없을 수도 있습니다.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Zend OPcache, eAccelerator 같은 캐시/가속기 문제일 수도 있습니다.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "서버가 Microsoft Windows 환경에서 동작하고 있습니다. 최적의 사용자 경험을 위해서는 리눅스를 사용할 것을 권장합니다.",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s의 버전 %2$s 이하가 설치되어 있습니다. 안정성 및 성능 개선을 위하여 %1$s의 새 버전을 설치하는 것을 추천합니다.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP 모듈 'fileinfo'가 존재하지 않습니다. MIME 형식 감지 결과를 향상시키기 위하여 이 모듈을 활성화하는 것을 추천합니다.",
"System locale can not be set to a one which supports UTF-8." : "UTF-8을 지원하는 시스템 로캘을 사용할 수 없습니다.",
"This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.",
@@ -144,6 +153,7 @@
"Enable encryption" : "암호화 사용",
"No encryption module loaded, please enable an encryption module in the app menu." : "암호화 모듈을 불러오지 않았습니다. 앱 메뉴에서 암호화 모듈을 활성화하십시오.",
"Select default encryption module:" : "기본 암호화 모듈 선택:",
+ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "과거에 사용하였던(ownCloud <= 8.0) 암호화된 데이터에서 키를 이전해야 합니다. \"기본 암호화 모듈\"을 활성화한 다음 'occ encryption:migrate'를 실행하십시오",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "ownCloud 8.0 이하에서 사용한 이전 암호화 키를 새 키로 이전해야 합니다.",
"Start migration" : "이전 시작",
"This is used for sending out notifications." : "알림을 보낼 때 사용됩니다.",
@@ -175,6 +185,8 @@
"Improving the config.php" : "config.php 개선",
"Theming" : "테마 꾸미기",
"Hardening and security guidance" : "보안 강화 지침",
+ "Transactional File Locking is enabled." : "트랜잭션 기반 파일 잠금이 활성화 되었습니다.",
+ "Transactional File Locking is disabled." : "트랜잭션 기반 파일 잠금이 비활성화 되었습니다.",
"Version" : "버전",
"Developer documentation" : "개발자 문서",
"Experimental applications ahead" : "실험적인 앱 사용 예정",
@@ -183,6 +195,7 @@
"licensed" : "라이선스:",
"Documentation:" : "문서:",
"User documentation" : "사용자 문서",
+ "Admin documentation" : "관리 문서",
"Show description …" : "설명 보기...",
"Hide description …" : "설명 숨기기...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "다음 의존성을 만족할 수 없기 때문에 이 앱을 설치할 수 없습니다:",
diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js
index 72eb0fa5e3b..08676dd9156 100644
--- a/settings/l10n/lt_LT.js
+++ b/settings/l10n/lt_LT.js
@@ -47,6 +47,7 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūksta PHP modulio „fileinfo“. Labai rekomenduojame įjungti šį modulį, kad gauti geriausius rezultatus nustatant mime-tipą.",
"Allow apps to use the Share API" : "Leidžia programoms naudoti Share API",
"Allow public uploads" : "Leisti viešus įkėlimus",
+ "days" : "dienos",
"Allow resharing" : "Leisti dalintis",
"Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php yra registruotas tinklapio suplanuotų užduočių paslaugose, kad iškviesti cron.php kas 15 minučių per http.",
diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json
index dd5c1ebe8b9..bff0df74f08 100644
--- a/settings/l10n/lt_LT.json
+++ b/settings/l10n/lt_LT.json
@@ -45,6 +45,7 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūksta PHP modulio „fileinfo“. Labai rekomenduojame įjungti šį modulį, kad gauti geriausius rezultatus nustatant mime-tipą.",
"Allow apps to use the Share API" : "Leidžia programoms naudoti Share API",
"Allow public uploads" : "Leisti viešus įkėlimus",
+ "days" : "dienos",
"Allow resharing" : "Leisti dalintis",
"Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu",
"cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php yra registruotas tinklapio suplanuotų užduočių paslaugose, kad iškviesti cron.php kas 15 minučių per http.",
diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js
index dfda986fb44..52a554b9e22 100644
--- a/settings/l10n/lv.js
+++ b/settings/l10n/lv.js
@@ -22,6 +22,7 @@ OC.L10N.register(
"Unable to change password" : "Nav iespējams nomainīt paroli",
"Enabled" : "Pievienots",
"Not enabled" : "Nav pievienots",
+ "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
"Group already exists." : "Grupa jau eksistē.",
"Unable to add group." : "Nevar pievienot grupu.",
"Unable to delete group." : "Nevar izdzēst grupu.",
diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json
index 01325e10e17..f92b1196f80 100644
--- a/settings/l10n/lv.json
+++ b/settings/l10n/lv.json
@@ -20,6 +20,7 @@
"Unable to change password" : "Nav iespējams nomainīt paroli",
"Enabled" : "Pievienots",
"Not enabled" : "Nav pievienots",
+ "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
"Group already exists." : "Grupa jau eksistē.",
"Unable to add group." : "Nevar pievienot grupu.",
"Unable to delete group." : "Nevar izdzēst grupu.",
diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js
index bbe8b137881..805f1f0c328 100644
--- a/settings/l10n/nb_NO.js
+++ b/settings/l10n/nb_NO.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Kunne ikke endre passord",
"Enabled" : "Aktiv",
"Not enabled" : "Ikke aktivert",
+ "Federated Cloud Sharing" : "Sammenknyttet sky-deling",
"A problem occurred, please check your log files (Error: %s)" : "Det oppstod et problem. Sjekk loggfilene (Feil: %s)",
"Migration Completed" : "Migrering ferdig",
"Group already exists." : "Gruppe finnes allerede.",
diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json
index c1ad9f48886..3e92a23ec75 100644
--- a/settings/l10n/nb_NO.json
+++ b/settings/l10n/nb_NO.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Kunne ikke endre passord",
"Enabled" : "Aktiv",
"Not enabled" : "Ikke aktivert",
+ "Federated Cloud Sharing" : "Sammenknyttet sky-deling",
"A problem occurred, please check your log files (Error: %s)" : "Det oppstod et problem. Sjekk loggfilene (Feil: %s)",
"Migration Completed" : "Migrering ferdig",
"Group already exists." : "Gruppe finnes allerede.",
diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js
index c34c978b9fb..2898cf5d5a6 100644
--- a/settings/l10n/nl.js
+++ b/settings/l10n/nl.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Kan wachtwoord niet wijzigen",
"Enabled" : "Geactiveerd",
"Not enabled" : "Niet ingeschakeld",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Er trad een een probleem op, controleer uw logbestanden (Fout: %s).",
"Migration Completed" : "Migratie gereed",
"Group already exists." : "Groep bestaat al.",
diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json
index b2668ca461e..5f4b4dc208b 100644
--- a/settings/l10n/nl.json
+++ b/settings/l10n/nl.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Kan wachtwoord niet wijzigen",
"Enabled" : "Geactiveerd",
"Not enabled" : "Niet ingeschakeld",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
"A problem occurred, please check your log files (Error: %s)" : "Er trad een een probleem op, controleer uw logbestanden (Fout: %s).",
"Migration Completed" : "Migratie gereed",
"Group already exists." : "Groep bestaat al.",
diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js
index 332cefa3e1e..2d76cb44f6c 100644
--- a/settings/l10n/pt_BR.js
+++ b/settings/l10n/pt_BR.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Impossível modificar senha",
"Enabled" : "Habilitado",
"Not enabled" : "Desabilitado",
+ "Federated Cloud Sharing" : "Compartilhamento de Nuvem Conglomerada",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)",
"Migration Completed" : "Migração Concluida",
"Group already exists." : "O Grupo já existe.",
diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json
index e61fdfa7a90..f9df769ac35 100644
--- a/settings/l10n/pt_BR.json
+++ b/settings/l10n/pt_BR.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Impossível modificar senha",
"Enabled" : "Habilitado",
"Not enabled" : "Desabilitado",
+ "Federated Cloud Sharing" : "Compartilhamento de Nuvem Conglomerada",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)",
"Migration Completed" : "Migração Concluida",
"Group already exists." : "O Grupo já existe.",
diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js
index 66a9314608b..d2ab73ce4ed 100644
--- a/settings/l10n/pt_PT.js
+++ b/settings/l10n/pt_PT.js
@@ -26,6 +26,7 @@ OC.L10N.register(
"Unable to change password" : "Não foi possível alterar a sua palavra-passe ",
"Enabled" : "Ativada",
"Not enabled" : "Desativada",
+ "Federated Cloud Sharing" : "Partilha de Cloud Federada",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)",
"Migration Completed" : "Migração Concluída",
"Group already exists." : "O grupo já existe.",
diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json
index 70d2eeadb9f..1ab8808031e 100644
--- a/settings/l10n/pt_PT.json
+++ b/settings/l10n/pt_PT.json
@@ -24,6 +24,7 @@
"Unable to change password" : "Não foi possível alterar a sua palavra-passe ",
"Enabled" : "Ativada",
"Not enabled" : "Desativada",
+ "Federated Cloud Sharing" : "Partilha de Cloud Federada",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)",
"Migration Completed" : "Migração Concluída",
"Group already exists." : "O grupo já existe.",
diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js
index 2383ae2ecc7..64df7664ee4 100644
--- a/settings/l10n/ru.js
+++ b/settings/l10n/ru.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Невозможно изменить пароль",
"Enabled" : "Включено",
"Not enabled" : "Не включено",
+ "Federated Cloud Sharing" : "Объединение облачных хранилищ",
"A problem occurred, please check your log files (Error: %s)" : "Возникла проблема, пожалуйста, проверьте ваши файлы журнала (Ошибка: %s)",
"Migration Completed" : "Миграция завершена",
"Group already exists." : "Группа уже существует.",
diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json
index 64e1fe74410..7dc52767c7b 100644
--- a/settings/l10n/ru.json
+++ b/settings/l10n/ru.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Невозможно изменить пароль",
"Enabled" : "Включено",
"Not enabled" : "Не включено",
+ "Federated Cloud Sharing" : "Объединение облачных хранилищ",
"A problem occurred, please check your log files (Error: %s)" : "Возникла проблема, пожалуйста, проверьте ваши файлы журнала (Ошибка: %s)",
"Migration Completed" : "Миграция завершена",
"Group already exists." : "Группа уже существует.",
diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js
index a253e3bedcd..b09ea77607e 100644
--- a/settings/l10n/sk_SK.js
+++ b/settings/l10n/sk_SK.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Zmena hesla sa nepodarila",
"Enabled" : "Povolené",
"Not enabled" : "Zakázané",
+ "Federated Cloud Sharing" : "Združené cloudové zdieľanie",
"A problem occurred, please check your log files (Error: %s)" : "Nastala chyba, skontrolujte prosím váš log súbor (Chyba: %s)",
"Migration Completed" : "Migrácia ukončená",
"Group already exists." : "Skupina už existuje.",
diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json
index bf5497ad5ab..0d11a98c6e1 100644
--- a/settings/l10n/sk_SK.json
+++ b/settings/l10n/sk_SK.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Zmena hesla sa nepodarila",
"Enabled" : "Povolené",
"Not enabled" : "Zakázané",
+ "Federated Cloud Sharing" : "Združené cloudové zdieľanie",
"A problem occurred, please check your log files (Error: %s)" : "Nastala chyba, skontrolujte prosím váš log súbor (Chyba: %s)",
"Migration Completed" : "Migrácia ukončená",
"Group already exists." : "Skupina už existuje.",
diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js
index 3635394c026..e4fc35cd30a 100644
--- a/settings/l10n/sl.js
+++ b/settings/l10n/sl.js
@@ -30,6 +30,7 @@ OC.L10N.register(
"Unable to change password" : "Ni mogoče spremeniti gesla",
"Enabled" : "Omogočeno",
"Not enabled" : "Ni omogočeno",
+ "Federated Cloud Sharing" : "Upravljana souporaba oblaka",
"A problem occurred, please check your log files (Error: %s)" : "Pojavila se je težava. Prosimo, preverite dnevniške zapise (Napaka: %s)",
"Migration Completed" : "Selitev zaključena",
"Group already exists." : "Skupina že obstaja.",
diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json
index 0f7a4982610..3d01ae0bc55 100644
--- a/settings/l10n/sl.json
+++ b/settings/l10n/sl.json
@@ -28,6 +28,7 @@
"Unable to change password" : "Ni mogoče spremeniti gesla",
"Enabled" : "Omogočeno",
"Not enabled" : "Ni omogočeno",
+ "Federated Cloud Sharing" : "Upravljana souporaba oblaka",
"A problem occurred, please check your log files (Error: %s)" : "Pojavila se je težava. Prosimo, preverite dnevniške zapise (Napaka: %s)",
"Migration Completed" : "Selitev zaključena",
"Group already exists." : "Skupina že obstaja.",
diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js
index 3b4cfcda616..ea20901670c 100644
--- a/settings/l10n/sr.js
+++ b/settings/l10n/sr.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Не могу да променим лозинку",
"Enabled" : "Укључено",
"Not enabled" : "Искључено",
+ "Federated Cloud Sharing" : "Здружено дељење у облаку",
"A problem occurred, please check your log files (Error: %s)" : "Појавио се проблем. Проверите записнике (грешка: %s)",
"Migration Completed" : "Пресељење завршено",
"Group already exists." : "Група већ постоји.",
@@ -62,6 +63,7 @@ OC.L10N.register(
"All" : "Све",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Званичнe апликације су развиjене од стране и унутар оунКлауд заједнице. Оне пружају главне функционалности и спремне су и стабилне за свакодневну употребу.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Одобрене апликације су развили проверени програмери и апликације су прошле основне безбедносне провере. Оне се активно одржавају у репозиторијуму за апликације отвореног кода и њихови одржаватељи сматрају да су стабилне за уобичајену употребу.",
+ "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ова апликација није проверена по питању безбедности и нова је или зна да буде нестабилна. Инсталирате је на сопствену одговорност.",
"Update to %s" : "Ажурирај на %s",
"Please wait...." : "Сачекајте…",
"Error while disabling app" : "Грешка при искључивању апликације",
@@ -185,6 +187,8 @@ OC.L10N.register(
"Improving the config.php" : "Побољшање фајла поставки",
"Theming" : "Теме",
"Hardening and security guidance" : "Ојачавање система и безбедносне препоруке",
+ "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.",
+ "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.",
"Version" : "Верзија",
"Developer documentation" : "Програмерска документација",
"Experimental applications ahead" : "Експериментална апликација",
@@ -193,6 +197,7 @@ OC.L10N.register(
"licensed" : "лиценцирано",
"Documentation:" : "Документација:",
"User documentation" : "Корисничка документација",
+ "Admin documentation" : "Администраторска документација",
"Show description …" : "Прикажи опис…",
"Hide description …" : "Сакриј опис…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:",
diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json
index e75f5404d6d..7ba90354f39 100644
--- a/settings/l10n/sr.json
+++ b/settings/l10n/sr.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Не могу да променим лозинку",
"Enabled" : "Укључено",
"Not enabled" : "Искључено",
+ "Federated Cloud Sharing" : "Здружено дељење у облаку",
"A problem occurred, please check your log files (Error: %s)" : "Појавио се проблем. Проверите записнике (грешка: %s)",
"Migration Completed" : "Пресељење завршено",
"Group already exists." : "Група већ постоји.",
@@ -60,6 +61,7 @@
"All" : "Све",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Званичнe апликације су развиjене од стране и унутар оунКлауд заједнице. Оне пружају главне функционалности и спремне су и стабилне за свакодневну употребу.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Одобрене апликације су развили проверени програмери и апликације су прошле основне безбедносне провере. Оне се активно одржавају у репозиторијуму за апликације отвореног кода и њихови одржаватељи сматрају да су стабилне за уобичајену употребу.",
+ "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ова апликација није проверена по питању безбедности и нова је или зна да буде нестабилна. Инсталирате је на сопствену одговорност.",
"Update to %s" : "Ажурирај на %s",
"Please wait...." : "Сачекајте…",
"Error while disabling app" : "Грешка при искључивању апликације",
@@ -183,6 +185,8 @@
"Improving the config.php" : "Побољшање фајла поставки",
"Theming" : "Теме",
"Hardening and security guidance" : "Ојачавање система и безбедносне препоруке",
+ "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.",
+ "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.",
"Version" : "Верзија",
"Developer documentation" : "Програмерска документација",
"Experimental applications ahead" : "Експериментална апликација",
@@ -191,6 +195,7 @@
"licensed" : "лиценцирано",
"Documentation:" : "Документација:",
"User documentation" : "Корисничка документација",
+ "Admin documentation" : "Администраторска документација",
"Show description …" : "Прикажи опис…",
"Hide description …" : "Сакриј опис…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:",
diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js
index 7716b7d50e3..2ceba16a84b 100644
--- a/settings/l10n/th_TH.js
+++ b/settings/l10n/th_TH.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน",
"Enabled" : "เปิดการใช้งาน",
"Not enabled" : "ใช้งานไม่ได้",
+ "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
"A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)",
"Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์",
"Group already exists." : "มีกลุ่มนี้อยู่แล้ว",
diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json
index d3d8dfdcd39..c0fbabfc5b7 100644
--- a/settings/l10n/th_TH.json
+++ b/settings/l10n/th_TH.json
@@ -29,6 +29,7 @@
"Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน",
"Enabled" : "เปิดการใช้งาน",
"Not enabled" : "ใช้งานไม่ได้",
+ "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
"A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)",
"Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์",
"Group already exists." : "มีกลุ่มนี้อยู่แล้ว",
diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js
index dd6ec872144..bd6e254d3ec 100644
--- a/settings/l10n/tr.js
+++ b/settings/l10n/tr.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Unable to change password" : "Parola değiştirilemiyor",
"Enabled" : "Etkin",
"Not enabled" : "Etkin değil",
+ "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
"A problem occurred, please check your log files (Error: %s)" : "Bir problem oluştu, lütfen log dosyalarını kontrol edin (Hata: %s)",
"Migration Completed" : "Taşınma Tamamlandı",
"Group already exists." : "Grup zaten mevcut.",
diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json
index 413b3c0e3ab..f4a8fb93b57 100644
--- a/settings/l10n/tr.json
+++ b/settings/l10n/tr.json
@@ -29,6 +29,7 @@
"Unable to change password" : "Parola değiştirilemiyor",
"Enabled" : "Etkin",
"Not enabled" : "Etkin değil",
+ "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
"A problem occurred, please check your log files (Error: %s)" : "Bir problem oluştu, lütfen log dosyalarını kontrol edin (Hata: %s)",
"Migration Completed" : "Taşınma Tamamlandı",
"Group already exists." : "Grup zaten mevcut.",
diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js
index 724bdf53875..093e9a57e57 100644
--- a/settings/l10n/uk.js
+++ b/settings/l10n/uk.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Unable to change password" : "Неможливо змінити пароль",
"Enabled" : "Увімкнено",
"Not enabled" : "Вимкнено",
+ "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
"A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)",
"Migration Completed" : "Міграцію завершено",
"Group already exists." : "Група вже існує.",
diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json
index ac96928b8ad..d63210e88e3 100644
--- a/settings/l10n/uk.json
+++ b/settings/l10n/uk.json
@@ -27,6 +27,7 @@
"Unable to change password" : "Неможливо змінити пароль",
"Enabled" : "Увімкнено",
"Not enabled" : "Вимкнено",
+ "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
"A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)",
"Migration Completed" : "Міграцію завершено",
"Group already exists." : "Група вже існує.",
diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js
index 9a25ee9d267..f769e00142d 100644
--- a/settings/l10n/zh_CN.js
+++ b/settings/l10n/zh_CN.js
@@ -27,6 +27,7 @@ OC.L10N.register(
"Unable to change password" : "不能更改密码",
"Enabled" : "开启",
"Not enabled" : "未启用",
+ "Federated Cloud Sharing" : "联合云共享",
"Migration Completed" : "迁移完成",
"Saved" : "已保存",
"test email settings" : "测试电子邮件设置",
diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json
index 35ccf89f8fa..d70e7045458 100644
--- a/settings/l10n/zh_CN.json
+++ b/settings/l10n/zh_CN.json
@@ -25,6 +25,7 @@
"Unable to change password" : "不能更改密码",
"Enabled" : "开启",
"Not enabled" : "未启用",
+ "Federated Cloud Sharing" : "联合云共享",
"Migration Completed" : "迁移完成",
"Saved" : "已保存",
"test email settings" : "测试电子邮件设置",
diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php
index 677bbffc3d2..612cf827975 100644
--- a/tests/lib/files/storage/wrapper/encryption.php
+++ b/tests/lib/files/storage/wrapper/encryption.php
@@ -139,7 +139,15 @@ class Encryption extends \Test\Files\Storage\Storage {
->disableOriginalConstructor()
->setMethods(['getOption'])
->getMock();
- $this->mount->expects($this->any())->method('getOption')->willReturn(true);
+ $this->mount->expects($this->any())->method('getOption')->willReturnCallback(function ($option, $default) {
+ if ($option === 'encrypt' && $default === true) {
+ global $mockedMountPointEncryptionEnabled;
+ if ($mockedMountPointEncryptionEnabled !== null) {
+ return $mockedMountPointEncryptionEnabled;
+ }
+ }
+ return true;
+ });
$this->cache = $this->getMockBuilder('\OC\Files\Cache\Cache')
->disableOriginalConstructor()->getMock();
@@ -542,4 +550,55 @@ class Encryption extends \Test\Files\Storage\Storage {
];
}
+ public function dataCopyBetweenStorage() {
+ return [
+ [true, true, true],
+ [true, false, false],
+ [false, true, false],
+ [false, false, false],
+ ];
+ }
+
+ /**
+ * @dataProvider dataCopyBetweenStorage
+ *
+ * @param bool $encryptionEnabled
+ * @param bool $mountPointEncryptionEnabled
+ * @param bool $expectedEncrypted
+ */
+ public function testCopyBetweenStorage($encryptionEnabled, $mountPointEncryptionEnabled, $expectedEncrypted) {
+ $storage2 = $this->getMockBuilder('OCP\Files\Storage')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $sourceInternalPath = $targetInternalPath = 'file.txt';
+ $preserveMtime = $isRename = false;
+
+ $storage2->expects($this->any())
+ ->method('fopen')
+ ->willReturnCallback(function($path, $mode) {
+ $temp = \OC::$server->getTempManager();
+ return fopen($temp->getTemporaryFile(), $mode);
+ });
+
+ $this->encryptionManager->expects($this->any())
+ ->method('isEnabled')
+ ->willReturn($encryptionEnabled);
+
+ // FIXME can not overwrite the return after definition
+// $this->mount->expects($this->at(0))
+// ->method('getOption')
+// ->with('encrypt', true)
+// ->willReturn($mountPointEncryptionEnabled);
+ global $mockedMountPointEncryptionEnabled;
+ $mockedMountPointEncryptionEnabled = $mountPointEncryptionEnabled;
+
+ $this->cache->expects($this->once())
+ ->method('put')
+ ->with($sourceInternalPath, ['encrypted' => $expectedEncrypted]);
+
+ $this->invokePrivate($this->instance, 'copyBetweenStorage', [$storage2, $sourceInternalPath, $targetInternalPath, $preserveMtime, $isRename]);
+
+ $this->assertFalse(false);
+ }
}
diff --git a/tests/lib/files/type/detection.php b/tests/lib/files/type/detection.php
new file mode 100644
index 00000000000..1997fa4dfd6
--- /dev/null
+++ b/tests/lib/files/type/detection.php
@@ -0,0 +1,283 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Files\Type;
+
+use \OC\Files\Type\Detection;
+
+class DetectionTest extends \Test\TestCase {
+
+ public function testDetect() {
+ $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir);
+ $dir = \OC::$SERVERROOT.'/tests/data';
+
+ $result = $detection->detect($dir."/");
+ $expected = 'httpd/unix-directory';
+ $this->assertEquals($expected, $result);
+
+ $result = $detection->detect($dir."/data.tar.gz");
+ $expected = 'application/x-gzip';
+ $this->assertEquals($expected, $result);
+
+ $result = $detection->detect($dir."/data.zip");
+ $expected = 'application/zip';
+ $this->assertEquals($expected, $result);
+
+ $result = $detection->detect($dir."/testimagelarge.svg");
+ $expected = 'image/svg+xml';
+ $this->assertEquals($expected, $result);
+
+ $result = $detection->detect($dir."/testimage.png");
+ $expected = 'image/png';
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testGetSecureMimeType() {
+ $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir);
+
+ $result = $detection->getSecureMimeType('image/svg+xml');
+ $expected = 'text/plain';
+ $this->assertEquals($expected, $result);
+
+ $result = $detection->getSecureMimeType('image/png');
+ $expected = 'image/png';
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testDetectPath() {
+ $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir);
+
+ $this->assertEquals('text/plain', $detection->detectPath('foo.txt'));
+ $this->assertEquals('image/png', $detection->detectPath('foo.png'));
+ $this->assertEquals('image/png', $detection->detectPath('foo.bar.png'));
+ $this->assertEquals('application/octet-stream', $detection->detectPath('.png'));
+ $this->assertEquals('application/octet-stream', $detection->detectPath('foo'));
+ $this->assertEquals('application/octet-stream', $detection->detectPath(''));
+ }
+
+ public function testDetectString() {
+ if (\OC_Util::runningOnWindows()) {
+ $this->markTestSkipped('[Windows] Strings have mimetype application/octet-stream on Windows');
+ }
+
+ $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir);
+
+ $result = $detection->detectString("/data/data.tar.gz");
+ $expected = 'text/plain; charset=us-ascii';
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testMimeTypeIcon() {
+ if (!class_exists('org\\bovigo\\vfs\\vfsStream')) {
+ $this->markTestSkipped('Pacakge vfsStream not installed');
+ }
+ $confDir = \org\bovigo\vfs\vfsStream::setup();
+ $mimetypealiases_dist = \org\bovigo\vfs\vfsStream::newFile('mimetypealiases.dist.json')->at($confDir);
+
+ //Empty alias file
+ $mimetypealiases_dist->setContent(json_encode([], JSON_FORCE_OBJECT));
+
+
+ /*
+ * Test dir mimetype
+ */
+
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->once())
+ ->method('imagePath')
+ ->with($this->equalTo('core'), $this->equalTo('filetypes/folder.png'))
+ ->willReturn('folder.svg');
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('dir');
+ $this->assertEquals('folder.svg', $mimeType);
+
+
+ /*
+ * Test dir-shareed mimetype
+ */
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->once())
+ ->method('imagePath')
+ ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-shared.png'))
+ ->willReturn('folder-shared.svg');
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('dir-shared');
+ $this->assertEquals('folder-shared.svg', $mimeType);
+
+
+ /*
+ * Test dir external
+ */
+
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->once())
+ ->method('imagePath')
+ ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-external.png'))
+ ->willReturn('folder-external.svg');
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('dir-external');
+ $this->assertEquals('folder-external.svg', $mimeType);
+
+
+ /*
+ * Test complete mimetype
+ */
+
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->once())
+ ->method('imagePath')
+ ->with($this->equalTo('core'), $this->equalTo('filetypes/my-type.png'))
+ ->willReturn('my-type.svg');
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('my-type');
+ $this->assertEquals('my-type.svg', $mimeType);
+
+
+ /*
+ * Test subtype
+ */
+
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->exactly(2))
+ ->method('imagePath')
+ ->withConsecutive(
+ [$this->equalTo('core'), $this->equalTo('filetypes/my-type.png')],
+ [$this->equalTo('core'), $this->equalTo('filetypes/my.png')]
+ )
+ ->will($this->returnCallback(
+ function($appName, $file) {
+ if ($file === 'filetypes/my.png') {
+ return 'my.svg';
+ }
+ throw new \RuntimeException();
+ }
+ ));
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('my-type');
+ $this->assertEquals('my.svg', $mimeType);
+
+
+ /*
+ * Test default mimetype
+ */
+
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->exactly(3))
+ ->method('imagePath')
+ ->withConsecutive(
+ [$this->equalTo('core'), $this->equalTo('filetypes/foo-bar.png')],
+ [$this->equalTo('core'), $this->equalTo('filetypes/foo.png')],
+ [$this->equalTo('core'), $this->equalTo('filetypes/file.png')]
+ )
+ ->will($this->returnCallback(
+ function($appName, $file) {
+ if ($file === 'filetypes/file.png') {
+ return 'file.svg';
+ }
+ throw new \RuntimeException();
+ }
+ ));
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('foo-bar');
+ $this->assertEquals('file.svg', $mimeType);
+
+ /*
+ * Test chaching
+ */
+
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->once())
+ ->method('imagePath')
+ ->with($this->equalTo('core'), $this->equalTo('filetypes/foo-bar.png'))
+ ->willReturn('foo-bar.svg');
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('foo-bar');
+ $this->assertEquals('foo-bar.svg', $mimeType);
+ $mimeType = $detection->mimeTypeIcon('foo-bar');
+ $this->assertEquals('foo-bar.svg', $mimeType);
+
+
+
+ /*
+ * Test aliases
+ */
+
+ //Put alias
+ $mimetypealiases_dist->setContent(json_encode(['foo' => 'foobar/baz'], JSON_FORCE_OBJECT));
+
+ //Mock UrlGenerator
+ $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ //Only call the url generator once
+ $urlGenerator->expects($this->once())
+ ->method('imagePath')
+ ->with($this->equalTo('core'), $this->equalTo('filetypes/foobar-baz.png'))
+ ->willReturn('foobar-baz.svg');
+
+ $detection = new Detection($urlGenerator, $confDir->url());
+ $mimeType = $detection->mimeTypeIcon('foo');
+ $this->assertEquals('foobar-baz.svg', $mimeType);
+ }
+}
diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php
index ca64b1db72e..75cd75ee3f5 100644
--- a/tests/lib/files/utils/scanner.php
+++ b/tests/lib/files/utils/scanner.php
@@ -189,4 +189,32 @@ class Scanner extends \Test\TestCase {
$newInfo = $cache->get('');
$this->assertNotEquals($oldInfo['etag'], $newInfo['etag']);
}
+
+ /**
+ * @return array
+ */
+ public function invalidPathProvider() {
+ return [
+ [
+ '../',
+ ],
+ [
+ '..\\',
+ ],
+ [
+ '../..\\../',
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider invalidPathProvider
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Invalid path to scan
+ * @param string $invalidPath
+ */
+ public function testInvalidPathScanning($invalidPath) {
+ $scanner = new TestScanner('', \OC::$server->getDatabaseConnection());
+ $scanner->scan($invalidPath);
+ }
}
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index 52511810efa..b6d3e16826d 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -1531,6 +1531,42 @@ class Test_Share extends \Test\TestCase {
\OC\Share\Share::setPassword($userSession, $connection, $config, 1, 'pass');
}
+ /**
+ * Make sure that a user cannot have multiple identical shares to remote users
+ */
+ public function testOnlyOneRemoteShare() {
+ $oldHttpHelper = \OC::$server->query('HTTPHelper');
+ $httpHelperMock = $this->getMockBuilder('OC\HttpHelper')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->setHttpHelper($httpHelperMock);
+
+ $httpHelperMock->expects($this->at(0))
+ ->method('post')
+ ->with($this->stringStartsWith('https://localhost/ocs/v1.php/cloud/shares'), $this->anything())
+ ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]);
+
+ \OCP\Share::shareItem('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost', \OCP\Constants::PERMISSION_READ);
+ $shares = \OCP\Share::getItemShared('test', 'test.txt');
+ $share = array_shift($shares);
+
+ //Try share again
+ try {
+ \OCP\Share::shareItem('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost', \OCP\Constants::PERMISSION_READ);
+ $this->fail('Identical remote shares are not allowed');
+ } catch (\Exception $e) {
+ $this->assertEquals('Sharing test.txt failed, because this item is already shared with foo@localhost', $e->getMessage());
+ }
+
+ $httpHelperMock->expects($this->at(0))
+ ->method('post')
+ ->with($this->stringStartsWith('https://localhost/ocs/v1.php/cloud/shares/' . $share['id'] . '/unshare'), $this->anything())
+ ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]);
+
+ \OCP\Share::unshare('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost');
+ $this->setHttpHelper($oldHttpHelper);
+ }
+
}
class DummyShareClass extends \OC\Share\Share {
diff --git a/tests/settings/controller/CheckSetupControllerTest.php b/tests/settings/controller/CheckSetupControllerTest.php
index b39d13ac26b..6096aae8652 100644
--- a/tests/settings/controller/CheckSetupControllerTest.php
+++ b/tests/settings/controller/CheckSetupControllerTest.php
@@ -24,6 +24,7 @@ namespace OC\Settings\Controller;
use OCP\AppFramework\Http\DataResponse;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
+use OCP\IL10N;
use OCP\IRequest;
use OCP\IURLGenerator;
use OC_Util;
@@ -47,6 +48,8 @@ class CheckSetupControllerTest extends TestCase {
private $urlGenerator;
/** @var OC_Util */
private $util;
+ /** @var IL10N */
+ private $l10n;
public function setUp() {
parent::setUp();
@@ -63,15 +66,24 @@ class CheckSetupControllerTest extends TestCase {
->disableOriginalConstructor()->getMock();
$this->urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
->disableOriginalConstructor()->getMock();
-
- $this->checkSetupController = new CheckSetupController(
- 'settings',
- $this->request,
- $this->config,
- $this->clientService,
- $this->urlGenerator,
- $this->util
- );
+ $this->l10n = $this->getMockBuilder('\OCP\IL10N')
+ ->disableOriginalConstructor()->getMock();
+ $this->l10n->expects($this->any())
+ ->method('t')
+ ->will($this->returnCallback(function($message, array $replace) {
+ return vsprintf($message, $replace);
+ }));
+ $this->checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController')
+ ->setConstructorArgs([
+ 'settings',
+ $this->request,
+ $this->config,
+ $this->clientService,
+ $this->urlGenerator,
+ $this->util,
+ $this->l10n,
+ ])
+ ->setMethods(['getCurlVersion'])->getMock();
}
public function testIsInternetConnectionWorkingDisabledViaConfig() {
@@ -241,8 +253,134 @@ class CheckSetupControllerTest extends TestCase {
'memcacheDocs' => 'http://doc.owncloud.org/server/go.php?to=admin-performance',
'isUrandomAvailable' => self::invokePrivate($this->checkSetupController, 'isUrandomAvailable'),
'securityDocs' => 'https://doc.owncloud.org/server/8.1/admin_manual/configuration_server/hardening.html',
+ 'isUsedTlsLibOutdated' => '',
]
);
$this->assertEquals($expected, $this->checkSetupController->check());
}
+
+ public function testGetCurlVersion() {
+ $checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController')
+ ->setConstructorArgs([
+ 'settings',
+ $this->request,
+ $this->config,
+ $this->clientService,
+ $this->urlGenerator,
+ $this->util,
+ $this->l10n,
+ ])
+ ->setMethods(null)->getMock();
+
+ $this->assertArrayHasKey('ssl_version', $checkSetupController->getCurlVersion());
+ }
+
+ public function testIsUsedTlsLibOutdatedWithAnotherLibrary() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue(['ssl_version' => 'SSLlib']));
+ $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
+
+ public function testIsUsedTlsLibOutdatedWithMisbehavingCurl() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue([]));
+ $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
+
+ public function testIsUsedTlsLibOutdatedWithOlderOpenSsl() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.1c']));
+ $this->assertSame('cURL is using an outdated OpenSSL version (OpenSSL/1.0.1c). Please update your operating system or features such as installing and updating apps via the app store or Federated Cloud Sharing will not work reliably.', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
+
+ public function testIsUsedTlsLibOutdatedWithOlderOpenSsl1() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.2a']));
+ $this->assertSame('cURL is using an outdated OpenSSL version (OpenSSL/1.0.2a). Please update your operating system or features such as installing and updating apps via the app store or Federated Cloud Sharing will not work reliably.', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
+
+ public function testIsUsedTlsLibOutdatedWithMatchingOpenSslVersion() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.1d']));
+ $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
+
+ public function testIsUsedTlsLibOutdatedWithMatchingOpenSslVersion1() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.2b']));
+ $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
+
+ public function testIsBuggyNss400() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue(['ssl_version' => 'NSS/1.0.2b']));
+ $client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+ ->disableOriginalConstructor()->getMock();
+ $exception = $this->getMockBuilder('\GuzzleHttp\Exception\ClientException')
+ ->disableOriginalConstructor()->getMock();
+ $response = $this->getMockBuilder('\GuzzleHttp\Message\ResponseInterface')
+ ->disableOriginalConstructor()->getMock();
+ $response->expects($this->once())
+ ->method('getStatusCode')
+ ->will($this->returnValue(400));
+ $exception->expects($this->once())
+ ->method('getResponse')
+ ->will($this->returnValue($response));
+
+ $client->expects($this->at(0))
+ ->method('get')
+ ->with('https://www.owncloud.org/', [])
+ ->will($this->throwException($exception));
+
+ $this->clientService->expects($this->once())
+ ->method('newClient')
+ ->will($this->returnValue($client));
+
+ $this->assertSame('cURL is using an outdated NSS version (NSS/1.0.2b). Please update your operating system or features such as installing and updating apps via the app store or Federated Cloud Sharing will not work reliably.', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
+
+
+ public function testIsBuggyNss200() {
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('getCurlVersion')
+ ->will($this->returnValue(['ssl_version' => 'NSS/1.0.2b']));
+ $client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+ ->disableOriginalConstructor()->getMock();
+ $exception = $this->getMockBuilder('\GuzzleHttp\Exception\ClientException')
+ ->disableOriginalConstructor()->getMock();
+ $response = $this->getMockBuilder('\GuzzleHttp\Message\ResponseInterface')
+ ->disableOriginalConstructor()->getMock();
+ $response->expects($this->once())
+ ->method('getStatusCode')
+ ->will($this->returnValue(200));
+ $exception->expects($this->once())
+ ->method('getResponse')
+ ->will($this->returnValue($response));
+
+ $client->expects($this->at(0))
+ ->method('get')
+ ->with('https://www.owncloud.org/', [])
+ ->will($this->throwException($exception));
+
+ $this->clientService->expects($this->once())
+ ->method('newClient')
+ ->will($this->returnValue($client));
+
+ $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated'));
+ }
}
diff --git a/tests/settings/controller/EncryptionControllerTest.php b/tests/settings/controller/EncryptionControllerTest.php
new file mode 100644
index 00000000000..2446b8c7b9e
--- /dev/null
+++ b/tests/settings/controller/EncryptionControllerTest.php
@@ -0,0 +1,151 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Settings\Controller;
+
+use OC\DB\Connection;
+use OC\Files\View;
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\ILogger;
+use OCP\IRequest;
+use OCP\IUserManager;
+use Test\TestCase;
+
+/**
+ * Class EncryptionControllerTest
+ *
+ * @package OC\Settings\Controller
+ */
+class EncryptionControllerTest extends TestCase {
+ /** @var IRequest */
+ private $request;
+ /** @var IL10N */
+ private $l10n;
+ /** @var IConfig */
+ private $config;
+ /** @var Connection */
+ private $connection;
+ /** @var IUserManager */
+ private $userManager;
+ /** @var View */
+ private $view;
+ /** @var ILogger */
+ private $logger;
+ /** @var EncryptionController */
+ private $encryptionController;
+
+ public function setUp() {
+ $this->request = $this->getMockBuilder('\\OCP\\IRequest')
+ ->disableOriginalConstructor()->getMock();
+ $this->l10n = $this->getMockBuilder('\\OCP\\IL10N')
+ ->disableOriginalConstructor()->getMock();
+ $this->l10n->expects($this->any())
+ ->method('t')
+ ->will($this->returnCallback(function($message, array $replace) {
+ return vsprintf($message, $replace);
+ }));
+ $this->config = $this->getMockBuilder('\\OCP\\IConfig')
+ ->disableOriginalConstructor()->getMock();
+ $this->connection = $this->getMockBuilder('\\OC\\DB\\Connection')
+ ->disableOriginalConstructor()->getMock();
+ $this->userManager = $this->getMockBuilder('\\OCP\\IUserManager')
+ ->disableOriginalConstructor()->getMock();
+ $this->view = $this->getMockBuilder('\\OC\\Files\\View')
+ ->disableOriginalConstructor()->getMock();
+ $this->logger = $this->getMockBuilder('\\OCP\\ILogger')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->encryptionController = $this->getMockBuilder('\\OC\\Settings\\Controller\\EncryptionController')
+ ->setConstructorArgs([
+ 'settings',
+ $this->request,
+ $this->l10n,
+ $this->config,
+ $this->connection,
+ $this->userManager,
+ $this->view,
+ $this->logger,
+ ])
+ ->setMethods(['getMigration'])
+ ->getMock();
+ }
+
+ public function testStartMigrationSuccessful() {
+ $migration = $this->getMockBuilder('\\OCA\\Encryption\\Migration')
+ ->disableOriginalConstructor()->getMock();
+ $this->encryptionController
+ ->expects($this->once())
+ ->method('getMigration')
+ ->with($this->config, $this->view, $this->connection, $this->logger)
+ ->will($this->returnValue($migration));
+ $migration
+ ->expects($this->once())
+ ->method('reorganizeSystemFolderStructure');
+ $migration
+ ->expects($this->once())
+ ->method('updateDB');
+ $backend = $this->getMockBuilder('\OCP\UserInterface')
+ ->getMock();
+ $this->userManager
+ ->expects($this->once())
+ ->method('getBackends')
+ ->will($this->returnValue([$backend]));
+ $backend
+ ->expects($this->once())
+ ->method('getUsers')
+ ->will($this->returnValue(['User 1', 'User 2']));
+ $migration
+ ->expects($this->exactly(2))
+ ->method('reorganizeFolderStructureForUser')
+ ->withConsecutive(
+ ['User 1'],
+ ['User 2']
+ );
+ $migration
+ ->expects($this->once())
+ ->method('finalCleanUp');
+
+ $expected = [
+ 'data' => [
+ 'message' => 'Migration Completed',
+ ],
+ 'status' => 'success',
+ ];
+ $this->assertSame($expected, $this->encryptionController->startMigration());
+ }
+
+ public function testStartMigrationException() {
+ $this->encryptionController
+ ->expects($this->once())
+ ->method('getMigration')
+ ->with($this->config, $this->view, $this->connection, $this->logger)
+ ->will($this->throwException(new \Exception('My error message')));
+
+ $expected = [
+ 'data' => [
+ 'message' => 'A problem occurred, please check your log files (Error: My error message)',
+ ],
+ 'status' => 'error',
+ ];
+ $this->assertSame($expected, $this->encryptionController->startMigration());
+ }
+}
diff --git a/version.php b/version.php
index 03593c47160..7ccd2e6b548 100644
--- a/version.php
+++ b/version.php
@@ -22,7 +22,7 @@
// We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades
// between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel
// when updating major/minor version number.
-$OC_Version=array(8, 2, 0, 2);
+$OC_Version=array(8, 2, 0, 3);
// The human readable string
$OC_VersionString='8.2 pre alpha';