summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.htaccess4
-rw-r--r--apps/encryption/appinfo/app.php (renamed from apps/files_encryption/exception/multikeyencryptexception.php)19
-rw-r--r--apps/encryption/appinfo/application.php192
-rw-r--r--apps/encryption/appinfo/info.xml36
-rw-r--r--apps/encryption/appinfo/routes.php45
-rw-r--r--apps/encryption/controller/recoverycontroller.php161
-rw-r--r--apps/encryption/css/settings-personal.css (renamed from apps/files_encryption/css/settings-personal.css)0
-rw-r--r--apps/encryption/hooks/contracts/ihook.php (renamed from apps/files_encryption/exception/multikeydecryptexception.php)22
-rw-r--r--apps/encryption/hooks/userhooks.php288
-rw-r--r--apps/encryption/img/app.svg (renamed from apps/files_encryption/img/app.svg)0
-rw-r--r--apps/encryption/js/detect-migration.js (renamed from apps/files_encryption/js/detect-migration.js)0
-rw-r--r--apps/encryption/js/encryption.js (renamed from apps/files_encryption/js/encryption.js)0
-rw-r--r--apps/encryption/js/settings-admin.js (renamed from apps/files_encryption/js/settings-admin.js)4
-rw-r--r--apps/encryption/js/settings-personal.js (renamed from apps/files_encryption/js/settings-personal.js)31
-rw-r--r--apps/encryption/l10n/.gitkeep (renamed from apps/files_encryption/l10n/.gitkeep)0
-rw-r--r--apps/encryption/lib/crypto/crypt.php459
-rw-r--r--apps/encryption/lib/crypto/encryption.php341
-rw-r--r--apps/encryption/lib/exceptions/multikeydecryptexception.php (renamed from apps/files_encryption/appinfo/register_command.php)9
-rw-r--r--apps/encryption/lib/exceptions/multikeyencryptexception.php27
-rw-r--r--apps/encryption/lib/exceptions/privatekeymissingexception.php40
-rw-r--r--apps/encryption/lib/exceptions/publickeymissingexception.php37
-rw-r--r--apps/encryption/lib/hookmanager.php67
-rw-r--r--apps/encryption/lib/keymanager.php531
-rw-r--r--apps/encryption/lib/recovery.php317
-rw-r--r--apps/encryption/lib/session.php113
-rw-r--r--apps/encryption/lib/users/setup.php85
-rw-r--r--apps/encryption/lib/util.php118
-rw-r--r--apps/encryption/settings/settings-admin.php (renamed from apps/files_encryption/settings-admin.php)20
-rw-r--r--apps/encryption/settings/settings-personal.php73
-rw-r--r--apps/encryption/templates/settings-admin.php (renamed from apps/files_encryption/templates/settings-admin.php)10
-rw-r--r--apps/encryption/templates/settings-personal.php (renamed from apps/files_encryption/templates/settings-personal.php)142
-rw-r--r--apps/encryption/tests/hooks/UserHooksTest.php217
-rw-r--r--apps/encryption/tests/lib/HookManagerTest.php74
-rw-r--r--apps/encryption/tests/lib/KeyManagerTest.php300
-rw-r--r--apps/encryption/tests/lib/RecoveryTest.php265
-rw-r--r--apps/encryption/tests/lib/SessionTest.php141
-rw-r--r--apps/encryption/tests/lib/UtilTest.php128
-rw-r--r--apps/encryption/tests/lib/crypto/encryptionTest.php76
-rw-r--r--apps/encryption/tests/lib/users/SetupTest.php81
-rw-r--r--apps/encryption_dummy/img/app.svg51
-rw-r--r--apps/encryption_dummy/lib/dummymodule.php30
-rw-r--r--apps/files/download.php2
-rw-r--r--apps/files/index.php8
-rw-r--r--apps/files/js/files.js23
-rw-r--r--apps/files/l10n/az.js1
-rw-r--r--apps/files/l10n/az.json1
-rw-r--r--apps/files/l10n/da.js1
-rw-r--r--apps/files/l10n/da.json1
-rw-r--r--apps/files/l10n/fr.js1
-rw-r--r--apps/files/l10n/fr.json1
-rw-r--r--apps/files/l10n/nb_NO.js2
-rw-r--r--apps/files/l10n/nb_NO.json2
-rw-r--r--apps/files/l10n/pt_BR.js1
-rw-r--r--apps/files/l10n/pt_BR.json1
-rw-r--r--apps/files/l10n/sl.js2
-rw-r--r--apps/files/l10n/sl.json2
-rw-r--r--apps/files/l10n/sr.js3
-rw-r--r--apps/files/l10n/sr.json3
-rw-r--r--apps/files/l10n/tr.js1
-rw-r--r--apps/files/l10n/tr.json1
-rw-r--r--apps/files/templates/appnavigation.php2
-rw-r--r--apps/files/templates/index.php2
-rw-r--r--apps/files/tests/ajax_rename.php11
-rw-r--r--apps/files/tests/controller/apicontrollertest.php6
-rw-r--r--apps/files_encryption/ajax/adminrecovery.php91
-rw-r--r--apps/files_encryption/ajax/changeRecoveryPassword.php92
-rw-r--r--apps/files_encryption/ajax/getMigrationStatus.php44
-rw-r--r--apps/files_encryption/ajax/updatePrivateKeyPassword.php81
-rw-r--r--apps/files_encryption/ajax/userrecovery.php63
-rw-r--r--apps/files_encryption/appinfo/app.php57
-rw-r--r--apps/files_encryption/appinfo/info.xml25
-rw-r--r--apps/files_encryption/appinfo/routes.php39
-rw-r--r--apps/files_encryption/appinfo/spec.txt77
-rw-r--r--apps/files_encryption/appinfo/version1
-rw-r--r--apps/files_encryption/command/migratekeys.php95
-rw-r--r--apps/files_encryption/exception/encryptionexception.php50
-rw-r--r--apps/files_encryption/files/error.php75
-rw-r--r--apps/files_encryption/l10n/ar.js40
-rw-r--r--apps/files_encryption/l10n/ar.json38
-rw-r--r--apps/files_encryption/l10n/ast.js41
-rw-r--r--apps/files_encryption/l10n/ast.json39
-rw-r--r--apps/files_encryption/l10n/az.js53
-rw-r--r--apps/files_encryption/l10n/az.json51
-rw-r--r--apps/files_encryption/l10n/bg_BG.js53
-rw-r--r--apps/files_encryption/l10n/bg_BG.json51
-rw-r--r--apps/files_encryption/l10n/bn_BD.js22
-rw-r--r--apps/files_encryption/l10n/bn_BD.json20
-rw-r--r--apps/files_encryption/l10n/bs.js9
-rw-r--r--apps/files_encryption/l10n/bs.json7
-rw-r--r--apps/files_encryption/l10n/ca.js42
-rw-r--r--apps/files_encryption/l10n/ca.json40
-rw-r--r--apps/files_encryption/l10n/cs_CZ.js53
-rw-r--r--apps/files_encryption/l10n/cs_CZ.json51
-rw-r--r--apps/files_encryption/l10n/cy_GB.js6
-rw-r--r--apps/files_encryption/l10n/cy_GB.json4
-rw-r--r--apps/files_encryption/l10n/da.js53
-rw-r--r--apps/files_encryption/l10n/da.json51
-rw-r--r--apps/files_encryption/l10n/de.js53
-rw-r--r--apps/files_encryption/l10n/de.json51
-rw-r--r--apps/files_encryption/l10n/de_CH.js33
-rw-r--r--apps/files_encryption/l10n/de_CH.json31
-rw-r--r--apps/files_encryption/l10n/de_DE.js53
-rw-r--r--apps/files_encryption/l10n/de_DE.json51
-rw-r--r--apps/files_encryption/l10n/el.js53
-rw-r--r--apps/files_encryption/l10n/el.json51
-rw-r--r--apps/files_encryption/l10n/en_GB.js53
-rw-r--r--apps/files_encryption/l10n/en_GB.json51
-rw-r--r--apps/files_encryption/l10n/eo.js17
-rw-r--r--apps/files_encryption/l10n/eo.json15
-rw-r--r--apps/files_encryption/l10n/es.js53
-rw-r--r--apps/files_encryption/l10n/es.json51
-rw-r--r--apps/files_encryption/l10n/es_AR.js38
-rw-r--r--apps/files_encryption/l10n/es_AR.json36
-rw-r--r--apps/files_encryption/l10n/es_CL.js6
-rw-r--r--apps/files_encryption/l10n/es_CL.json4
-rw-r--r--apps/files_encryption/l10n/es_MX.js37
-rw-r--r--apps/files_encryption/l10n/es_MX.json35
-rw-r--r--apps/files_encryption/l10n/et_EE.js51
-rw-r--r--apps/files_encryption/l10n/et_EE.json49
-rw-r--r--apps/files_encryption/l10n/eu.js53
-rw-r--r--apps/files_encryption/l10n/eu.json51
-rw-r--r--apps/files_encryption/l10n/fa.js30
-rw-r--r--apps/files_encryption/l10n/fa.json28
-rw-r--r--apps/files_encryption/l10n/fi_FI.js51
-rw-r--r--apps/files_encryption/l10n/fi_FI.json49
-rw-r--r--apps/files_encryption/l10n/fr.js53
-rw-r--r--apps/files_encryption/l10n/fr.json51
-rw-r--r--apps/files_encryption/l10n/gl.js53
-rw-r--r--apps/files_encryption/l10n/gl.json51
-rw-r--r--apps/files_encryption/l10n/he.js6
-rw-r--r--apps/files_encryption/l10n/he.json4
-rw-r--r--apps/files_encryption/l10n/hr.js42
-rw-r--r--apps/files_encryption/l10n/hr.json40
-rw-r--r--apps/files_encryption/l10n/hu_HU.js38
-rw-r--r--apps/files_encryption/l10n/hu_HU.json36
-rw-r--r--apps/files_encryption/l10n/ia.js6
-rw-r--r--apps/files_encryption/l10n/ia.json4
-rw-r--r--apps/files_encryption/l10n/id.js53
-rw-r--r--apps/files_encryption/l10n/id.json51
-rw-r--r--apps/files_encryption/l10n/is.js6
-rw-r--r--apps/files_encryption/l10n/is.json4
-rw-r--r--apps/files_encryption/l10n/it.js53
-rw-r--r--apps/files_encryption/l10n/it.json51
-rw-r--r--apps/files_encryption/l10n/ja.js53
-rw-r--r--apps/files_encryption/l10n/ja.json51
-rw-r--r--apps/files_encryption/l10n/ka_GE.js6
-rw-r--r--apps/files_encryption/l10n/ka_GE.json4
-rw-r--r--apps/files_encryption/l10n/km.js11
-rw-r--r--apps/files_encryption/l10n/km.json9
-rw-r--r--apps/files_encryption/l10n/kn.js8
-rw-r--r--apps/files_encryption/l10n/kn.json6
-rw-r--r--apps/files_encryption/l10n/ko.js53
-rw-r--r--apps/files_encryption/l10n/ko.json51
-rw-r--r--apps/files_encryption/l10n/ku_IQ.js6
-rw-r--r--apps/files_encryption/l10n/ku_IQ.json4
-rw-r--r--apps/files_encryption/l10n/lb.js6
-rw-r--r--apps/files_encryption/l10n/lb.json4
-rw-r--r--apps/files_encryption/l10n/lo.js6
-rw-r--r--apps/files_encryption/l10n/lo.json4
-rw-r--r--apps/files_encryption/l10n/lt_LT.js37
-rw-r--r--apps/files_encryption/l10n/lt_LT.json35
-rw-r--r--apps/files_encryption/l10n/lv.js8
-rw-r--r--apps/files_encryption/l10n/lv.json6
-rw-r--r--apps/files_encryption/l10n/mk.js18
-rw-r--r--apps/files_encryption/l10n/mk.json16
-rw-r--r--apps/files_encryption/l10n/nb_NO.js53
-rw-r--r--apps/files_encryption/l10n/nb_NO.json51
-rw-r--r--apps/files_encryption/l10n/nl.js53
-rw-r--r--apps/files_encryption/l10n/nl.json51
-rw-r--r--apps/files_encryption/l10n/nn_NO.js6
-rw-r--r--apps/files_encryption/l10n/nn_NO.json4
-rw-r--r--apps/files_encryption/l10n/pa.js6
-rw-r--r--apps/files_encryption/l10n/pa.json4
-rw-r--r--apps/files_encryption/l10n/pl.js53
-rw-r--r--apps/files_encryption/l10n/pl.json51
-rw-r--r--apps/files_encryption/l10n/pt_BR.js53
-rw-r--r--apps/files_encryption/l10n/pt_BR.json51
-rw-r--r--apps/files_encryption/l10n/pt_PT.js53
-rw-r--r--apps/files_encryption/l10n/pt_PT.json51
-rw-r--r--apps/files_encryption/l10n/ro.js18
-rw-r--r--apps/files_encryption/l10n/ro.json16
-rw-r--r--apps/files_encryption/l10n/ru.js53
-rw-r--r--apps/files_encryption/l10n/ru.json51
-rw-r--r--apps/files_encryption/l10n/si_LK.js6
-rw-r--r--apps/files_encryption/l10n/si_LK.json4
-rw-r--r--apps/files_encryption/l10n/sk_SK.js53
-rw-r--r--apps/files_encryption/l10n/sk_SK.json51
-rw-r--r--apps/files_encryption/l10n/sl.js53
-rw-r--r--apps/files_encryption/l10n/sl.json51
-rw-r--r--apps/files_encryption/l10n/sq.js7
-rw-r--r--apps/files_encryption/l10n/sq.json5
-rw-r--r--apps/files_encryption/l10n/sr.js53
-rw-r--r--apps/files_encryption/l10n/sr.json51
-rw-r--r--apps/files_encryption/l10n/sr@latin.js8
-rw-r--r--apps/files_encryption/l10n/sr@latin.json6
-rw-r--r--apps/files_encryption/l10n/sv.js52
-rw-r--r--apps/files_encryption/l10n/sv.json50
-rw-r--r--apps/files_encryption/l10n/ta_LK.js6
-rw-r--r--apps/files_encryption/l10n/ta_LK.json4
-rw-r--r--apps/files_encryption/l10n/th_TH.js6
-rw-r--r--apps/files_encryption/l10n/th_TH.json4
-rw-r--r--apps/files_encryption/l10n/tr.js53
-rw-r--r--apps/files_encryption/l10n/tr.json51
-rw-r--r--apps/files_encryption/l10n/ug.js6
-rw-r--r--apps/files_encryption/l10n/ug.json4
-rw-r--r--apps/files_encryption/l10n/uk.js53
-rw-r--r--apps/files_encryption/l10n/uk.json51
-rw-r--r--apps/files_encryption/l10n/ur_PK.js6
-rw-r--r--apps/files_encryption/l10n/ur_PK.json4
-rw-r--r--apps/files_encryption/l10n/vi.js24
-rw-r--r--apps/files_encryption/l10n/vi.json22
-rw-r--r--apps/files_encryption/l10n/zh_CN.js48
-rw-r--r--apps/files_encryption/l10n/zh_CN.json46
-rw-r--r--apps/files_encryption/l10n/zh_HK.js9
-rw-r--r--apps/files_encryption/l10n/zh_HK.json7
-rw-r--r--apps/files_encryption/l10n/zh_TW.js39
-rw-r--r--apps/files_encryption/l10n/zh_TW.json37
-rw-r--r--apps/files_encryption/lib/capabilities.php39
-rw-r--r--apps/files_encryption/lib/crypt.php581
-rw-r--r--apps/files_encryption/lib/helper.php532
-rw-r--r--apps/files_encryption/lib/hooks.php625
-rw-r--r--apps/files_encryption/lib/keymanager.php500
-rw-r--r--apps/files_encryption/lib/migration.php302
-rw-r--r--apps/files_encryption/lib/proxy.php401
-rw-r--r--apps/files_encryption/lib/session.php203
-rw-r--r--apps/files_encryption/lib/stream.php700
-rw-r--r--apps/files_encryption/lib/util.php1700
-rw-r--r--apps/files_encryption/settings-personal.php60
-rw-r--r--apps/files_encryption/templates/invalid_private_key.php12
-rw-r--r--apps/files_encryption/tests/binarybin9734 -> 0 bytes
-rwxr-xr-xapps/files_encryption/tests/crypt.php678
-rw-r--r--apps/files_encryption/tests/encryption.keybin24 -> 0 bytes
-rw-r--r--apps/files_encryption/tests/encryption_table.xml39
-rw-r--r--apps/files_encryption/tests/helper.php339
-rw-r--r--apps/files_encryption/tests/hooks.php447
-rw-r--r--apps/files_encryption/tests/keymanager.php411
-rw-r--r--apps/files_encryption/tests/legacy-encrypted-text.txt1
-rw-r--r--apps/files_encryption/tests/migration.php266
-rw-r--r--apps/files_encryption/tests/proxy.php154
-rwxr-xr-xapps/files_encryption/tests/share.php1392
-rw-r--r--apps/files_encryption/tests/stream.php232
-rw-r--r--apps/files_encryption/tests/testcase.php111
-rwxr-xr-xapps/files_encryption/tests/trashbin.php346
-rwxr-xr-xapps/files_encryption/tests/util.php693
-rw-r--r--apps/files_encryption/tests/zerosbin10238 -> 0 bytes
-rw-r--r--apps/files_external/js/settings.js38
-rw-r--r--apps/files_external/l10n/az.js2
-rw-r--r--apps/files_external/l10n/az.json2
-rw-r--r--apps/files_external/l10n/da.js5
-rw-r--r--apps/files_external/l10n/da.json5
-rw-r--r--apps/files_external/l10n/es.js4
-rw-r--r--apps/files_external/l10n/es.json4
-rw-r--r--apps/files_external/l10n/fr.js6
-rw-r--r--apps/files_external/l10n/fr.json6
-rw-r--r--apps/files_external/l10n/nb_NO.js5
-rw-r--r--apps/files_external/l10n/nb_NO.json5
-rw-r--r--apps/files_external/l10n/pt_BR.js5
-rw-r--r--apps/files_external/l10n/pt_BR.json5
-rw-r--r--apps/files_external/l10n/sl.js5
-rw-r--r--apps/files_external/l10n/sl.json5
-rw-r--r--apps/files_external/l10n/sr.js20
-rw-r--r--apps/files_external/l10n/sr.json20
-rw-r--r--apps/files_external/l10n/tr.js2
-rw-r--r--apps/files_external/l10n/tr.json2
-rw-r--r--apps/files_external/lib/google.php4
-rw-r--r--apps/files_external/lib/sftp_key.php9
-rw-r--r--apps/files_external/lib/smb_oc.php15
-rw-r--r--apps/files_external/personal.php1
-rw-r--r--apps/files_external/service/globalstoragesservice.php11
-rw-r--r--apps/files_external/service/storagesservice.php6
-rw-r--r--apps/files_external/settings.php1
-rw-r--r--apps/files_external/templates/settings.php2
-rw-r--r--apps/files_external/tests/js/settingsSpec.js14
-rw-r--r--apps/files_sharing/appinfo/routes.php6
-rw-r--r--apps/files_sharing/lib/activity.php19
-rw-r--r--apps/files_sharing/lib/cache.php9
-rw-r--r--apps/files_sharing/lib/capabilities.php87
-rw-r--r--apps/files_sharing/lib/share/file.php7
-rw-r--r--apps/files_sharing/lib/sharedstorage.php17
-rw-r--r--apps/files_sharing/tests/capabilities.php187
-rw-r--r--apps/files_sharing/tests/propagation.php22
-rw-r--r--apps/files_sharing/tests/testcase.php29
-rw-r--r--apps/files_sharing/tests/updater.php2
-rw-r--r--apps/files_trashbin/lib/storage.php4
-rw-r--r--apps/files_trashbin/lib/trashbin.php133
-rw-r--r--apps/files_trashbin/tests/storage.php8
-rw-r--r--apps/files_trashbin/tests/trashbin.php14
-rw-r--r--apps/files_versions/download.php2
-rw-r--r--apps/files_versions/lib/storage.php14
-rw-r--r--apps/files_versions/tests/versions.php6
-rw-r--r--apps/user_ldap/l10n/da.js32
-rw-r--r--apps/user_ldap/l10n/da.json32
-rw-r--r--apps/user_ldap/l10n/fr.js18
-rw-r--r--apps/user_ldap/l10n/fr.json18
-rw-r--r--apps/user_ldap/l10n/nb_NO.js3
-rw-r--r--apps/user_ldap/l10n/nb_NO.json3
-rw-r--r--apps/user_ldap/l10n/sr.js103
-rw-r--r--apps/user_ldap/l10n/sr.json103
-rw-r--r--apps/user_ldap/templates/part.settingcontrols.php2
-rw-r--r--apps/user_ldap/templates/part.wizardcontrols.php2
-rw-r--r--apps/user_webdavauth/appinfo/app.php2
-rw-r--r--build/license.php2
-rw-r--r--config/config.sample.php16
-rw-r--r--core/ajax/share.php2
-rw-r--r--core/application.php4
-rw-r--r--core/command/user/add.php3
-rw-r--r--core/js/setupchecks.js5
-rw-r--r--core/js/tests/specs/setupchecksSpec.js24
-rw-r--r--core/l10n/cs_CZ.js1
-rw-r--r--core/l10n/cs_CZ.json1
-rw-r--r--core/l10n/da.js3
-rw-r--r--core/l10n/da.json3
-rw-r--r--core/l10n/de.js1
-rw-r--r--core/l10n/de.json1
-rw-r--r--core/l10n/de_DE.js1
-rw-r--r--core/l10n/de_DE.json1
-rw-r--r--core/l10n/el.js1
-rw-r--r--core/l10n/el.json1
-rw-r--r--core/l10n/es.js7
-rw-r--r--core/l10n/es.json7
-rw-r--r--core/l10n/fi_FI.js1
-rw-r--r--core/l10n/fi_FI.json1
-rw-r--r--core/l10n/fr.js2
-rw-r--r--core/l10n/fr.json2
-rw-r--r--core/l10n/gl.js1
-rw-r--r--core/l10n/gl.json1
-rw-r--r--core/l10n/it.js1
-rw-r--r--core/l10n/it.json1
-rw-r--r--core/l10n/nb_NO.js17
-rw-r--r--core/l10n/nb_NO.json17
-rw-r--r--core/l10n/nl.js1
-rw-r--r--core/l10n/nl.json1
-rw-r--r--core/l10n/pt_BR.js2
-rw-r--r--core/l10n/pt_BR.json2
-rw-r--r--core/l10n/pt_PT.js1
-rw-r--r--core/l10n/pt_PT.json1
-rw-r--r--core/l10n/sl.js1
-rw-r--r--core/l10n/sl.json1
-rw-r--r--core/l10n/sr.js1
-rw-r--r--core/l10n/sr.json1
-rw-r--r--core/l10n/tr.js1
-rw-r--r--core/l10n/tr.json1
-rw-r--r--core/l10n/zh_CN.js26
-rw-r--r--core/l10n/zh_CN.json26
-rw-r--r--core/register_command.php4
-rw-r--r--core/templates/layout.user.php8
-rw-r--r--cron.php16
-rw-r--r--lib/base.php23
-rw-r--r--lib/l10n/da.js6
-rw-r--r--lib/l10n/da.json6
-rw-r--r--lib/l10n/de.js4
-rw-r--r--lib/l10n/de.json4
-rw-r--r--lib/l10n/de_DE.js4
-rw-r--r--lib/l10n/de_DE.json4
-rw-r--r--lib/l10n/el.js2
-rw-r--r--lib/l10n/el.json2
-rw-r--r--lib/l10n/es.js2
-rw-r--r--lib/l10n/es.json2
-rw-r--r--lib/l10n/fr.js18
-rw-r--r--lib/l10n/fr.json18
-rw-r--r--lib/l10n/nb_NO.js14
-rw-r--r--lib/l10n/nb_NO.json14
-rw-r--r--lib/l10n/pt_BR.js3
-rw-r--r--lib/l10n/pt_BR.json3
-rw-r--r--lib/l10n/sl.js5
-rw-r--r--lib/l10n/sl.json5
-rw-r--r--lib/l10n/sr.js87
-rw-r--r--lib/l10n/sr.json87
-rw-r--r--lib/l10n/tr.js2
-rw-r--r--lib/l10n/tr.json2
-rw-r--r--lib/private/app.php2
-rw-r--r--lib/private/app/appmanager.php22
-rw-r--r--lib/private/cache/file.php24
-rw-r--r--lib/private/cache/fileglobalgc.php4
-rw-r--r--lib/private/connector/sabre/file.php140
-rw-r--r--lib/private/datetimezone.php16
-rw-r--r--lib/private/encryption/exceptions/decryptionfailedexception.php30
-rw-r--r--lib/private/encryption/exceptions/emptyencryptiondataexception.php30
-rw-r--r--lib/private/encryption/exceptions/encryptionfailedexception.php30
-rw-r--r--lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php38
-rw-r--r--lib/private/encryption/exceptions/encryptionheadertolargeexception.php34
-rw-r--r--lib/private/encryption/exceptions/modulealreadyexistsexception.php39
-rw-r--r--lib/private/encryption/exceptions/moduledoesnotexistsexception.php31
-rw-r--r--lib/private/encryption/exceptions/unknowncipherexception.php30
-rw-r--r--lib/private/encryption/file.php78
-rw-r--r--lib/private/encryption/keys/factory.php26
-rw-r--r--lib/private/encryption/keys/storage.php70
-rw-r--r--lib/private/encryption/manager.php80
-rw-r--r--lib/private/encryption/update.php73
-rw-r--r--lib/private/encryption/util.php176
-rw-r--r--lib/private/filechunking.php4
-rw-r--r--lib/private/fileproxy.php138
-rw-r--r--lib/private/files.php4
-rw-r--r--lib/private/files/cache/cache.php31
-rw-r--r--lib/private/files/cache/homecache.php14
-rw-r--r--lib/private/files/cache/storage.php2
-rw-r--r--lib/private/files/fileinfo.php7
-rw-r--r--lib/private/files/filesystem.php2
-rw-r--r--lib/private/files/storage/common.php43
-rw-r--r--lib/private/files/storage/local.php13
-rw-r--r--lib/private/files/storage/localtempfiletrait.php85
-rw-r--r--lib/private/files/storage/wrapper/encryption.php208
-rw-r--r--lib/private/files/storage/wrapper/quota.php5
-rw-r--r--lib/private/files/stream/encryption.php154
-rw-r--r--lib/private/files/view.php22
-rw-r--r--lib/private/group/manager.php2
-rw-r--r--lib/private/helper.php23
-rw-r--r--lib/private/hook.php52
-rw-r--r--lib/private/l10n.php5
-rw-r--r--lib/private/mimetypes.list.php4
-rw-r--r--lib/private/preview.php363
-rw-r--r--lib/private/preview/bitmap.php79
-rw-r--r--lib/private/preview/bmp.php31
-rw-r--r--lib/private/preview/gif.php31
-rw-r--r--lib/private/preview/image.php10
-rw-r--r--lib/private/preview/jpeg.php31
-rw-r--r--lib/private/preview/png.php31
-rw-r--r--lib/private/preview/xbitmap.php31
-rw-r--r--lib/private/previewmanager.php30
-rw-r--r--lib/private/response.php23
-rw-r--r--lib/private/server.php36
-rw-r--r--lib/private/setup.php3
-rw-r--r--lib/private/share/share.php2
-rw-r--r--lib/private/util.php156
-rw-r--r--lib/public/encryption/exceptions/genericencryptionexception.php35
-rw-r--r--lib/public/encryption/iencryptionmodule.php26
-rw-r--r--lib/public/encryption/ifile.php (renamed from apps/files_encryption/appinfo/update.php)18
-rw-r--r--lib/public/encryption/imanager.php30
-rw-r--r--lib/public/encryption/keys/istorage.php43
-rw-r--r--lib/public/idatetimezone.php3
-rw-r--r--lib/public/iservercontainer.php26
-rw-r--r--lib/public/response.php8
-rw-r--r--lib/public/util.php20
-rw-r--r--lib/repair/repairmimetypes.php26
-rw-r--r--ocs/v1.php2
-rw-r--r--settings/admin.php12
-rw-r--r--settings/ajax/checksetup.php40
-rw-r--r--settings/ajax/decryptall.php62
-rw-r--r--settings/ajax/deletekeys.php35
-rw-r--r--settings/ajax/disableapp.php4
-rw-r--r--settings/ajax/enableapp.php3
-rw-r--r--settings/ajax/restorekeys.php35
-rw-r--r--settings/application.php19
-rw-r--r--settings/changepassword/controller.php37
-rw-r--r--settings/controller/checksetupcontroller.php106
-rw-r--r--settings/css/settings.css17
-rw-r--r--settings/js/apps.js2
-rw-r--r--settings/js/personal.js77
-rw-r--r--settings/l10n/ar.js6
-rw-r--r--settings/l10n/ar.json6
-rw-r--r--settings/l10n/ast.js12
-rw-r--r--settings/l10n/ast.json12
-rw-r--r--settings/l10n/az.js21
-rw-r--r--settings/l10n/az.json21
-rw-r--r--settings/l10n/bg_BG.js18
-rw-r--r--settings/l10n/bg_BG.json18
-rw-r--r--settings/l10n/bn_BD.js1
-rw-r--r--settings/l10n/bn_BD.json1
-rw-r--r--settings/l10n/bs.js11
-rw-r--r--settings/l10n/bs.json11
-rw-r--r--settings/l10n/ca.js18
-rw-r--r--settings/l10n/ca.json18
-rw-r--r--settings/l10n/cs_CZ.js18
-rw-r--r--settings/l10n/cs_CZ.json18
-rw-r--r--settings/l10n/da.js36
-rw-r--r--settings/l10n/da.json36
-rw-r--r--settings/l10n/de.js18
-rw-r--r--settings/l10n/de.json18
-rw-r--r--settings/l10n/de_DE.js18
-rw-r--r--settings/l10n/de_DE.json18
-rw-r--r--settings/l10n/el.js18
-rw-r--r--settings/l10n/el.json18
-rw-r--r--settings/l10n/en_GB.js16
-rw-r--r--settings/l10n/en_GB.json16
-rw-r--r--settings/l10n/eo.js4
-rw-r--r--settings/l10n/eo.json4
-rw-r--r--settings/l10n/es.js28
-rw-r--r--settings/l10n/es.json28
-rw-r--r--settings/l10n/es_AR.js8
-rw-r--r--settings/l10n/es_AR.json8
-rw-r--r--settings/l10n/es_MX.js7
-rw-r--r--settings/l10n/es_MX.json7
-rw-r--r--settings/l10n/et_EE.js12
-rw-r--r--settings/l10n/et_EE.json12
-rw-r--r--settings/l10n/eu.js12
-rw-r--r--settings/l10n/eu.json12
-rw-r--r--settings/l10n/fa.js10
-rw-r--r--settings/l10n/fa.json10
-rw-r--r--settings/l10n/fi_FI.js18
-rw-r--r--settings/l10n/fi_FI.json18
-rw-r--r--settings/l10n/fr.js37
-rw-r--r--settings/l10n/fr.json37
-rw-r--r--settings/l10n/gl.js20
-rw-r--r--settings/l10n/gl.json20
-rw-r--r--settings/l10n/he.js5
-rw-r--r--settings/l10n/he.json5
-rw-r--r--settings/l10n/hr.js12
-rw-r--r--settings/l10n/hr.json12
-rw-r--r--settings/l10n/hu_HU.js12
-rw-r--r--settings/l10n/hu_HU.json12
-rw-r--r--settings/l10n/id.js12
-rw-r--r--settings/l10n/id.json12
-rw-r--r--settings/l10n/is.js1
-rw-r--r--settings/l10n/is.json1
-rw-r--r--settings/l10n/it.js18
-rw-r--r--settings/l10n/it.json18
-rw-r--r--settings/l10n/ja.js12
-rw-r--r--settings/l10n/ja.json12
-rw-r--r--settings/l10n/ka_GE.js5
-rw-r--r--settings/l10n/ka_GE.json5
-rw-r--r--settings/l10n/km.js3
-rw-r--r--settings/l10n/km.json3
-rw-r--r--settings/l10n/ko.js12
-rw-r--r--settings/l10n/ko.json12
-rw-r--r--settings/l10n/lt_LT.js8
-rw-r--r--settings/l10n/lt_LT.json8
-rw-r--r--settings/l10n/lv.js5
-rw-r--r--settings/l10n/lv.json5
-rw-r--r--settings/l10n/mk.js5
-rw-r--r--settings/l10n/mk.json5
-rw-r--r--settings/l10n/mn.js2
-rw-r--r--settings/l10n/mn.json2
-rw-r--r--settings/l10n/nb_NO.js44
-rw-r--r--settings/l10n/nb_NO.json44
-rw-r--r--settings/l10n/nl.js18
-rw-r--r--settings/l10n/nl.json18
-rw-r--r--settings/l10n/nn_NO.js4
-rw-r--r--settings/l10n/nn_NO.json4
-rw-r--r--settings/l10n/oc.js2
-rw-r--r--settings/l10n/oc.json2
-rw-r--r--settings/l10n/pl.js12
-rw-r--r--settings/l10n/pl.json12
-rw-r--r--settings/l10n/pt_BR.js36
-rw-r--r--settings/l10n/pt_BR.json36
-rw-r--r--settings/l10n/pt_PT.js18
-rw-r--r--settings/l10n/pt_PT.json18
-rw-r--r--settings/l10n/ro.js5
-rw-r--r--settings/l10n/ro.json5
-rw-r--r--settings/l10n/ru.js18
-rw-r--r--settings/l10n/ru.json18
-rw-r--r--settings/l10n/si_LK.js1
-rw-r--r--settings/l10n/si_LK.json1
-rw-r--r--settings/l10n/sk_SK.js12
-rw-r--r--settings/l10n/sk_SK.json12
-rw-r--r--settings/l10n/sl.js15
-rw-r--r--settings/l10n/sl.json15
-rw-r--r--settings/l10n/sq.js4
-rw-r--r--settings/l10n/sq.json4
-rw-r--r--settings/l10n/sr.js45
-rw-r--r--settings/l10n/sr.json45
-rw-r--r--settings/l10n/sr@latin.js1
-rw-r--r--settings/l10n/sr@latin.json1
-rw-r--r--settings/l10n/sv.js12
-rw-r--r--settings/l10n/sv.json12
-rw-r--r--settings/l10n/ta_LK.js1
-rw-r--r--settings/l10n/ta_LK.json1
-rw-r--r--settings/l10n/th_TH.js5
-rw-r--r--settings/l10n/th_TH.json5
-rw-r--r--settings/l10n/tr.js34
-rw-r--r--settings/l10n/tr.json34
-rw-r--r--settings/l10n/uk.js16
-rw-r--r--settings/l10n/uk.json16
-rw-r--r--settings/l10n/vi.js5
-rw-r--r--settings/l10n/vi.json5
-rw-r--r--settings/l10n/zh_CN.js13
-rw-r--r--settings/l10n/zh_CN.json13
-rw-r--r--settings/l10n/zh_HK.js1
-rw-r--r--settings/l10n/zh_HK.json1
-rw-r--r--settings/l10n/zh_TW.js10
-rw-r--r--settings/l10n/zh_TW.json10
-rw-r--r--settings/personal.php11
-rw-r--r--settings/routes.php9
-rw-r--r--settings/templates/admin.php67
-rw-r--r--settings/templates/personal.php52
-rw-r--r--settings/users.php4
-rw-r--r--tests/bootstrap.php1
-rw-r--r--tests/enable_all.php2
-rw-r--r--tests/lib/app.php4
-rw-r--r--tests/lib/app/manager.php180
-rw-r--r--tests/lib/avatar.php13
-rw-r--r--tests/lib/cache/file.php7
-rw-r--r--tests/lib/cache/usercache.php7
-rw-r--r--tests/lib/encryption/keys/storage.php153
-rw-r--r--tests/lib/encryption/managertest.php58
-rw-r--r--tests/lib/encryption/utiltest.php18
-rw-r--r--tests/lib/files/cache/cache.php9
-rw-r--r--tests/lib/files/cache/updater.php8
-rw-r--r--tests/lib/files/cache/updaterlegacy.php21
-rw-r--r--tests/lib/files/cache/watcher.php10
-rw-r--r--tests/lib/files/etagtest.php17
-rw-r--r--tests/lib/files/filesystem.php12
-rw-r--r--tests/lib/files/node/integration.php12
-rw-r--r--tests/lib/files/storage/storage.php36
-rw-r--r--tests/lib/files/storage/wrapper/encryption.php125
-rw-r--r--tests/lib/files/storage/wrapper/jail.php4
-rw-r--r--tests/lib/files/storage/wrapper/quota.php8
-rw-r--r--tests/lib/files/stream/encryption.php104
-rw-r--r--tests/lib/files/utils/scanner.php8
-rw-r--r--tests/lib/files/view.php12
-rw-r--r--tests/lib/group/manager.php6
-rw-r--r--tests/lib/preview.php92
-rw-r--r--tests/lib/repair/repairmimetypes.php53
-rw-r--r--tests/lib/streamwrappers.php16
-rw-r--r--tests/lib/testcase.php15
-rw-r--r--tests/lib/util.php27
-rw-r--r--tests/settings/controller/CheckSetupControllerTest.php242
606 files changed, 9649 insertions, 19018 deletions
diff --git a/.htaccess b/.htaccess
index 8c1cefb89c2..115a02495c8 100644
--- a/.htaccess
+++ b/.htaccess
@@ -38,8 +38,8 @@ RewriteEngine on
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule ^\.well-known/host-meta /public.php?service=host-meta [QSA,L]
RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L]
-RewriteRule ^\.well-known/carddav /remote.php/carddav/ [R]
-RewriteRule ^\.well-known/caldav /remote.php/caldav/ [R]
+RewriteRule ^\.well-known/carddav /remote.php/carddav/ [R=301,L]
+RewriteRule ^\.well-known/caldav /remote.php/caldav/ [R=301,L]
RewriteRule ^apps/calendar/caldav\.php remote.php/caldav/ [QSA,L]
RewriteRule ^apps/contacts/carddav\.php remote.php/carddav/ [QSA,L]
RewriteRule ^remote/(.*) remote.php [QSA,L]
diff --git a/apps/files_encryption/exception/multikeyencryptexception.php b/apps/encryption/appinfo/app.php
index 3b485a33982..6bbf2113366 100644
--- a/apps/files_encryption/exception/multikeyencryptexception.php
+++ b/apps/encryption/appinfo/app.php
@@ -1,8 +1,8 @@
<?php
/**
* @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -21,14 +21,9 @@
*
*/
-namespace OCA\Files_Encryption\Exception;
+namespace OCA\Encryption\AppInfo;
-/**
- * Throw this exception if multi key encrytion fails
- *
- * Possible error codes:
- * 110 - openssl_seal failed
- */
-class MultiKeyEncryptException extends EncryptionException {
- const OPENSSL_SEAL_FAILED = 110;
-}
+$app = new Application();
+$app->registerEncryptionModule();
+$app->registerHooks();
+$app->registerSettings();
diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php
new file mode 100644
index 00000000000..6f4e22bdd68
--- /dev/null
+++ b/apps/encryption/appinfo/application.php
@@ -0,0 +1,192 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\AppInfo;
+
+
+use OC\Files\Filesystem;
+use OC\Files\View;
+use OCA\Encryption\Crypto\Crypt;
+use OCA\Encryption\HookManager;
+use OCA\Encryption\Hooks\UserHooks;
+use OCA\Encryption\KeyManager;
+use OCA\Encryption\Recovery;
+use OCA\Encryption\Users\Setup;
+use OCA\Encryption\Util;
+use OCP\App;
+use OCP\AppFramework\IAppContainer;
+use OCP\Encryption\IManager;
+use OCP\IConfig;
+
+
+class Application extends \OCP\AppFramework\App {
+ /**
+ * @var IManager
+ */
+ private $encryptionManager;
+ /**
+ * @var IConfig
+ */
+ private $config;
+
+ /**
+ * @param $appName
+ * @param array $urlParams
+ */
+ public function __construct($urlParams = array()) {
+ parent::__construct('encryption', $urlParams);
+ $this->encryptionManager = \OC::$server->getEncryptionManager();
+ $this->config = \OC::$server->getConfig();
+ $this->registerServices();
+ }
+
+ /**
+ *
+ */
+ public function registerHooks() {
+ if (!$this->config->getSystemValue('maintenance', false)) {
+
+ $container = $this->getContainer();
+ $server = $container->getServer();
+ // Register our hooks and fire them.
+ $hookManager = new HookManager();
+
+ $hookManager->registerHook([
+ new UserHooks($container->query('KeyManager'),
+ $server->getLogger(),
+ $container->query('UserSetup'),
+ $server->getUserSession(),
+ $container->query('Util'),
+ new \OCA\Encryption\Session($server->getSession()),
+ $container->query('Crypt'),
+ $container->query('Recovery'))
+ ]);
+
+ $hookManager->fireHooks();
+
+ } else {
+ // Logout user if we are in maintenance to force re-login
+ $this->getContainer()->getServer()->getUserSession()->logout();
+ }
+ }
+
+ /**
+ *
+ */
+ public function registerEncryptionModule() {
+ $container = $this->getContainer();
+ $container->registerService('EncryptionModule', function (IAppContainer $c) {
+ return new \OCA\Encryption\Crypto\Encryption(
+ $c->query('Crypt'),
+ $c->query('KeyManager'),
+ $c->query('Util'));
+ });
+ $module = $container->query('EncryptionModule');
+ $this->encryptionManager->registerEncryptionModule($module);
+ }
+
+ /**
+ *
+ */
+ public function registerServices() {
+ $container = $this->getContainer();
+
+ $container->registerService('Crypt',
+ function (IAppContainer $c) {
+ $server = $c->getServer();
+ return new Crypt($server->getLogger(),
+ $server->getUserSession(),
+ $server->getConfig());
+ });
+
+ $container->registerService('KeyManager',
+ function (IAppContainer $c) {
+ $server = $c->getServer();
+
+ return new KeyManager($server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID),
+ $c->query('Crypt'),
+ $server->getConfig(),
+ $server->getUserSession(),
+ new \OCA\Encryption\Session($server->getSession()),
+ $server->getLogger(),
+ $c->query('Util')
+ );
+ });
+
+
+ $container->registerService('Recovery',
+ function (IAppContainer $c) {
+ $server = $c->getServer();
+
+ return new Recovery(
+ $server->getUserSession(),
+ $c->query('Crypt'),
+ $server->getSecureRandom(),
+ $c->query('KeyManager'),
+ $server->getConfig(),
+ $server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID),
+ $server->getEncryptionFilesHelper(),
+ new \OC\Files\View());
+ });
+
+ $container->registerService('RecoveryController', function (IAppContainer $c) {
+ $server = $c->getServer();
+ return new \OCA\Encryption\Controller\RecoveryController(
+ $c->getAppName(),
+ $server->getRequest(),
+ $server->getConfig(),
+ $server->getL10N($c->getAppName()),
+ $c->query('Recovery'));
+ });
+
+ $container->registerService('UserSetup',
+ function (IAppContainer $c) {
+ $server = $c->getServer();
+ return new Setup($server->getLogger(),
+ $server->getUserSession(),
+ $c->query('Crypt'),
+ $c->query('KeyManager'));
+ });
+
+ $container->registerService('Util',
+ function (IAppContainer $c) {
+ $server = $c->getServer();
+
+ return new Util(
+ new View(),
+ $c->query('Crypt'),
+ $server->getLogger(),
+ $server->getUserSession(),
+ $server->getConfig());
+ });
+
+ }
+
+ /**
+ *
+ */
+ public function registerSettings() {
+ // Register settings scripts
+ App::registerAdmin('encryption', 'settings/settings-admin');
+ App::registerPersonal('encryption', 'settings/settings-personal');
+ }
+}
diff --git a/apps/encryption/appinfo/info.xml b/apps/encryption/appinfo/info.xml
new file mode 100644
index 00000000000..e4a7d790e9c
--- /dev/null
+++ b/apps/encryption/appinfo/info.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<info>
+ <id>encryption</id>
+ <description>
+ This application encrypts all files accessed by ownCloud at rest,
+ wherever they are stored. As an example, with this application
+ enabled, external cloud based Amazon S3 storage will be encrypted,
+ protecting this data on storage outside of the control of the Admin.
+ When this application is enabled for the first time, all files are
+ encrypted as users log in and are prompted for their password. The
+ recommended recovery key option enables recovery of files in case
+ the key is lost.
+ Note that this app encrypts all files that are touched by ownCloud,
+ so external storage providers and applications such as SharePoint
+ will see new files encrypted when they are accessed. Encryption is
+ based on AES 128 or 256 bit keys. More information is available in
+ the Encryption documentation
+ </description>
+<name>Encryption</name>
+ <license>AGPL</license>
+ <author>Bjoern Schiessle, Clark Tomlinson</author>
+ <requiremin>8</requiremin>
+ <shipped>true</shipped>
+ <documentation>
+ <user>user-encryption</user>
+ <admin>admin-encryption</admin>
+ </documentation>
+ <rememberlogin>false</rememberlogin>
+ <types>
+ <filesystem/>
+ </types>
+ <dependencies>
+ <lib>openssl</lib>
+ </dependencies>
+
+</info>
diff --git a/apps/encryption/appinfo/routes.php b/apps/encryption/appinfo/routes.php
new file mode 100644
index 00000000000..0dab4a01b97
--- /dev/null
+++ b/apps/encryption/appinfo/routes.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption\AppInfo;
+
+(new Application())->registerRoutes($this, array('routes' => array(
+
+ [
+ 'name' => 'Recovery#adminRecovery',
+ 'url' => '/ajax/adminRecovery',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Recovery#changeRecoveryPassword',
+ 'url' => '/ajax/changeRecoveryPassword',
+ 'verb' => 'POST'
+ ],
+ [
+ 'name' => 'Recovery#userSetRecovery',
+ 'url' => '/ajax/userSetRecovery',
+ 'verb' => 'POST'
+ ]
+
+
+)));
diff --git a/apps/encryption/controller/recoverycontroller.php b/apps/encryption/controller/recoverycontroller.php
new file mode 100644
index 00000000000..3d0e39d7b93
--- /dev/null
+++ b/apps/encryption/controller/recoverycontroller.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption\Controller;
+
+
+use OCA\Encryption\Recovery;
+use OCP\AppFramework\Controller;
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\IRequest;
+use OCP\JSON;
+use OCP\AppFramework\Http\DataResponse;
+
+class RecoveryController extends Controller {
+ /**
+ * @var IConfig
+ */
+ private $config;
+ /**
+ * @var IL10N
+ */
+ private $l;
+ /**
+ * @var Recovery
+ */
+ private $recovery;
+
+ /**
+ * @param string $AppName
+ * @param IRequest $request
+ * @param IConfig $config
+ * @param IL10N $l10n
+ * @param Recovery $recovery
+ */
+ public function __construct($AppName, IRequest $request, IConfig $config, IL10N $l10n, Recovery $recovery) {
+ parent::__construct($AppName, $request);
+ $this->config = $config;
+ $this->l = $l10n;
+ $this->recovery = $recovery;
+ }
+
+ public function adminRecovery($recoveryPassword, $confirmPassword, $adminEnableRecovery) {
+ // Check if both passwords are the same
+ if (empty($recoveryPassword)) {
+ $errorMessage = (string) $this->l->t('Missing recovery key password');
+ return new DataResponse(['data' => ['message' => $errorMessage]], 500);
+ }
+
+ if (empty($confirmPassword)) {
+ $errorMessage = (string) $this->l->t('Please repeat the recovery key password');
+ return new DataResponse(['data' => ['message' => $errorMessage]], 500);
+ }
+
+ if ($recoveryPassword !== $confirmPassword) {
+ $errorMessage = (string) $this->l->t('Repeated recovery key password does not match the provided recovery key password');
+ return new DataResponse(['data' => ['message' => $errorMessage]], 500);
+ }
+
+ if (isset($adminEnableRecovery) && $adminEnableRecovery === '1') {
+ if ($this->recovery->enableAdminRecovery($recoveryPassword)) {
+ return new DataResponse(['status' =>'success', 'data' => array('message' => (string) $this->l->t('Recovery key successfully enabled'))]);
+ }
+ return new DataResponse(['data' => array('message' => (string) $this->l->t('Could not enable recovery key. Please check your recovery key password!'))]);
+ } elseif (isset($adminEnableRecovery) && $adminEnableRecovery === '0') {
+ if ($this->recovery->disableAdminRecovery($recoveryPassword)) {
+ return new DataResponse(['data' => array('message' => (string) $this->l->t('Recovery key successfully disabled'))]);
+ }
+ return new DataResponse(['data' => array('message' => (string) $this->l->t('Could not disable recovery key. Please check your recovery key password!'))]);
+ }
+ }
+
+ public function changeRecoveryPassword($newPassword, $oldPassword, $confirmPassword) {
+ //check if both passwords are the same
+ if (empty($oldPassword)) {
+ $errorMessage = (string) $this->l->t('Please provide the old recovery password');
+ return new DataResponse(array('data' => array('message' => $errorMessage)));
+ }
+
+ if (empty($newPassword)) {
+ $errorMessage = (string) $this->l->t('Please provide a new recovery password');
+ return new DataResponse (array('data' => array('message' => $errorMessage)));
+ }
+
+ if (empty($confirmPassword)) {
+ $errorMessage = (string) $this->l->t('Please repeat the new recovery password');
+ return new DataResponse(array('data' => array('message' => $errorMessage)));
+ }
+
+ if ($newPassword !== $confirmPassword) {
+ $errorMessage = (string) $this->l->t('Repeated recovery key password does not match the provided recovery key password');
+ return new DataResponse(array('data' => array('message' => $errorMessage)));
+ }
+
+ $result = $this->recovery->changeRecoveryKeyPassword($newPassword, $oldPassword);
+
+ if ($result) {
+ return new DataResponse(
+ array(
+ 'status' => 'success' ,
+ 'data' => array(
+ 'message' => (string) $this->l->t('Password successfully changed.'))
+ )
+ );
+ } else {
+ return new DataResponse(
+ array(
+ 'data' => array
+ ('message' => (string) $this->l->t('Could not change the password. Maybe the old password was not correct.'))
+ )
+ );
+ }
+ }
+
+ /**
+ * @NoAdminRequired
+ */
+ public function userSetRecovery($userEnableRecovery) {
+ if ($userEnableRecovery === '0' || $userEnableRecovery === '1') {
+
+ $result = $this->recovery->setRecoveryForUser($userEnableRecovery);
+
+ if ($result) {
+ return new DataResponse(
+ array(
+ 'status' => 'success',
+ 'data' => array(
+ 'message' => (string) $this->l->t('Recovery Key enabled'))
+ )
+ );
+ } else {
+ return new DataResponse(
+ array(
+ 'data' => array
+ ('message' => (string) $this->l->t('Could not enable the recovery key, please try again or contact your administrator'))
+ )
+ );
+ }
+ }
+ }
+
+}
diff --git a/apps/files_encryption/css/settings-personal.css b/apps/encryption/css/settings-personal.css
index 8eb5bedcb06..8eb5bedcb06 100644
--- a/apps/files_encryption/css/settings-personal.css
+++ b/apps/encryption/css/settings-personal.css
diff --git a/apps/files_encryption/exception/multikeydecryptexception.php b/apps/encryption/hooks/contracts/ihook.php
index a75bd663dc6..d4f20700d78 100644
--- a/apps/files_encryption/exception/multikeydecryptexception.php
+++ b/apps/encryption/hooks/contracts/ihook.php
@@ -1,8 +1,6 @@
<?php
/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Clark Tomlinson <fallen013@gmail.com>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -21,14 +19,14 @@
*
*/
-namespace OCA\Files_Encryption\Exception;
+namespace OCA\Encryption\Hooks\Contracts;
-/**
- * Throw this encryption if multi key decryption failed
- *
- * Possible error codes:
- * 110 - openssl_open failed
- */
-class MultiKeyDecryptException extends EncryptionException {
- const OPENSSL_OPEN_FAILED = 110;
+
+interface IHook {
+ /**
+ * Connects Hooks
+ *
+ * @return null
+ */
+ public function addHooks();
}
diff --git a/apps/encryption/hooks/userhooks.php b/apps/encryption/hooks/userhooks.php
new file mode 100644
index 00000000000..c39fa34108b
--- /dev/null
+++ b/apps/encryption/hooks/userhooks.php
@@ -0,0 +1,288 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Hooks;
+
+
+use OCP\Util as OCUtil;
+use OCA\Encryption\Hooks\Contracts\IHook;
+use OCA\Encryption\KeyManager;
+use OCA\Encryption\Crypto\Crypt;
+use OCA\Encryption\Users\Setup;
+use OCP\App;
+use OCP\ILogger;
+use OCP\IUserSession;
+use OCA\Encryption\Util;
+use OCA\Encryption\Session;
+use OCA\Encryption\Recovery;
+
+class UserHooks implements IHook {
+ /**
+ * @var KeyManager
+ */
+ private $keyManager;
+ /**
+ * @var ILogger
+ */
+ private $logger;
+ /**
+ * @var Setup
+ */
+ private $userSetup;
+ /**
+ * @var IUserSession
+ */
+ private $user;
+ /**
+ * @var Util
+ */
+ private $util;
+ /**
+ * @var Session
+ */
+ private $session;
+ /**
+ * @var Recovery
+ */
+ private $recovery;
+ /**
+ * @var Crypt
+ */
+ private $crypt;
+
+ /**
+ * UserHooks constructor.
+ *
+ * @param KeyManager $keyManager
+ * @param ILogger $logger
+ * @param Setup $userSetup
+ * @param IUserSession $user
+ * @param Util $util
+ * @param Session $session
+ * @param Crypt $crypt
+ * @param Recovery $recovery
+ */
+ public function __construct(KeyManager $keyManager,
+ ILogger $logger,
+ Setup $userSetup,
+ IUserSession $user,
+ Util $util,
+ Session $session,
+ Crypt $crypt,
+ Recovery $recovery) {
+
+ $this->keyManager = $keyManager;
+ $this->logger = $logger;
+ $this->userSetup = $userSetup;
+ $this->user = $user;
+ $this->util = $util;
+ $this->session = $session;
+ $this->recovery = $recovery;
+ $this->crypt = $crypt;
+ }
+
+ /**
+ * Connects Hooks
+ *
+ * @return null
+ */
+ public function addHooks() {
+ OCUtil::connectHook('OC_User', 'post_login', $this, 'login');
+ OCUtil::connectHook('OC_User', 'logout', $this, 'logout');
+ OCUtil::connectHook('OC_User',
+ 'post_setPassword',
+ $this,
+ 'setPassphrase');
+ OCUtil::connectHook('OC_User',
+ 'pre_setPassword',
+ $this,
+ 'preSetPassphrase');
+ OCUtil::connectHook('OC_User',
+ 'post_createUser',
+ $this,
+ 'postCreateUser');
+ OCUtil::connectHook('OC_User',
+ 'post_deleteUser',
+ $this,
+ 'postDeleteUser');
+ }
+
+
+ /**
+ * Startup encryption backend upon user login
+ *
+ * @note This method should never be called for users using client side encryption
+ * @param array $params
+ * @return bool
+ */
+ public function login($params) {
+
+ if (!App::isEnabled('encryption')) {
+ return true;
+ }
+
+ // ensure filesystem is loaded
+ // Todo: update?
+ if (!\OC\Files\Filesystem::$loaded) {
+ \OC_Util::setupFS($params['uid']);
+ }
+
+ // setup user, if user not ready force relogin
+ if (!$this->userSetup->setupUser($params['uid'], $params['password'])) {
+ return false;
+ }
+
+ $this->keyManager->init($params['uid'], $params['password']);
+ }
+
+ /**
+ * remove keys from session during logout
+ */
+ public function logout() {
+ $this->session->clear();
+ }
+
+ /**
+ * setup encryption backend upon user created
+ *
+ * @note This method should never be called for users using client side encryption
+ * @param array $params
+ */
+ public function postCreateUser($params) {
+
+ if (App::isEnabled('encryption')) {
+ $this->userSetup->setupUser($params['uid'], $params['password']);
+ }
+ }
+
+ /**
+ * cleanup encryption backend upon user deleted
+ *
+ * @param array $params : uid, password
+ * @note This method should never be called for users using client side encryption
+ */
+ public function postDeleteUser($params) {
+
+ if (App::isEnabled('encryption')) {
+ $this->keyManager->deletePublicKey($params['uid']);
+ }
+ }
+
+ /**
+ * If the password can't be changed within ownCloud, than update the key password in advance.
+ *
+ * @param array $params : uid, password
+ * @return bool
+ */
+ public function preSetPassphrase($params) {
+ if (App::isEnabled('encryption')) {
+
+ if (!$this->user->getUser()->canChangePassword()) {
+ $this->setPassphrase($params);
+ }
+ }
+ }
+
+ /**
+ * Change a user's encryption passphrase
+ *
+ * @param array $params keys: uid, password
+ * @return bool
+ */
+ public function setPassphrase($params) {
+
+ // Get existing decrypted private key
+ $privateKey = $this->session->getPrivateKey();
+
+ if ($params['uid'] === $this->user->getUser()->getUID() && $privateKey) {
+
+ // Encrypt private key with new user pwd as passphrase
+ $encryptedPrivateKey = $this->crypt->symmetricEncryptFileContent($privateKey,
+ $params['password']);
+
+ // Save private key
+ if ($encryptedPrivateKey) {
+ $this->keyManager->setPrivateKey($this->user->getUser()->getUID(),
+ $encryptedPrivateKey);
+ } else {
+ $this->logger->error('Encryption could not update users encryption password');
+ }
+
+ // NOTE: Session does not need to be updated as the
+ // private key has not changed, only the passphrase
+ // used to decrypt it has changed
+ } else { // admin changed the password for a different user, create new keys and reencrypt file keys
+ $user = $params['uid'];
+ $recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null;
+
+ // we generate new keys if...
+ // ...we have a recovery password and the user enabled the recovery key
+ // ...encryption was activated for the first time (no keys exists)
+ // ...the user doesn't have any files
+ if (
+ ($this->recovery->isRecoveryEnabledForUser($user) && $recoveryPassword)
+ || !$this->keyManager->userHasKeys($user)
+ || !$this->util->userHasFiles($user)
+ ) {
+
+ // backup old keys
+ //$this->backupAllKeys('recovery');
+
+ $newUserPassword = $params['password'];
+
+ $keyPair = $this->crypt->createKeyPair();
+
+ // Save public key
+ $this->keyManager->setPublicKey($user, $keyPair['publicKey']);
+
+ // Encrypt private key with new password
+ $encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'],
+ $newUserPassword);
+
+ if ($encryptedKey) {
+ $this->keyManager->setPrivateKey($user, $encryptedKey);
+
+ if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
+ $this->recovery->recoverUsersFiles($recoveryPassword, $user);
+ }
+ } else {
+ $this->logger->error('Encryption Could not update users encryption password');
+ }
+ }
+ }
+ }
+
+
+
+ /**
+ * after password reset we create a new key pair for the user
+ *
+ * @param array $params
+ */
+ public function postPasswordReset($params) {
+ $password = $params['password'];
+
+ $this->keyManager->replaceUserKeys($params['uid']);
+ $this->userSetup->setupServerSide($params['uid'], $password);
+ }
+}
diff --git a/apps/files_encryption/img/app.svg b/apps/encryption/img/app.svg
index 1157c71c66e..1157c71c66e 100644
--- a/apps/files_encryption/img/app.svg
+++ b/apps/encryption/img/app.svg
diff --git a/apps/files_encryption/js/detect-migration.js b/apps/encryption/js/detect-migration.js
index f5627edf4e4..f5627edf4e4 100644
--- a/apps/files_encryption/js/detect-migration.js
+++ b/apps/encryption/js/detect-migration.js
diff --git a/apps/files_encryption/js/encryption.js b/apps/encryption/js/encryption.js
index d2d1c3a1fc5..d2d1c3a1fc5 100644
--- a/apps/files_encryption/js/encryption.js
+++ b/apps/encryption/js/encryption.js
diff --git a/apps/files_encryption/js/settings-admin.js b/apps/encryption/js/settings-admin.js
index 2242c1f7124..36765adf3e4 100644
--- a/apps/files_encryption/js/settings-admin.js
+++ b/apps/encryption/js/settings-admin.js
@@ -17,7 +17,7 @@ $(document).ready(function(){
var confirmPassword = $( '#repeatEncryptionRecoveryPassword' ).val();
OC.msg.startSaving('#encryptionSetRecoveryKey .msg');
$.post(
- OC.filePath( 'files_encryption', 'ajax', 'adminrecovery.php' )
+ OC.generateUrl('/apps/encryption/ajax/adminRecovery')
, { adminEnableRecovery: recoveryStatus, recoveryPassword: recoveryPassword, confirmPassword: confirmPassword }
, function( result ) {
OC.msg.finishedSaving('#encryptionSetRecoveryKey .msg', result);
@@ -44,7 +44,7 @@ $(document).ready(function(){
var confirmNewPassword = $('#repeatedNewEncryptionRecoveryPassword').val();
OC.msg.startSaving('#encryptionChangeRecoveryKey .msg');
$.post(
- OC.filePath( 'files_encryption', 'ajax', 'changeRecoveryPassword.php' )
+ OC.generateUrl('/apps/encryption/ajax/changeRecoveryPassword')
, { oldPassword: oldRecoveryPassword, newPassword: newRecoveryPassword, confirmPassword: confirmNewPassword }
, function( data ) {
OC.msg.finishedSaving('#encryptionChangeRecoveryKey .msg', data);
diff --git a/apps/files_encryption/js/settings-personal.js b/apps/encryption/js/settings-personal.js
index b798ba7e4e1..dcfbba4ecde 100644
--- a/apps/files_encryption/js/settings-personal.js
+++ b/apps/encryption/js/settings-personal.js
@@ -9,7 +9,7 @@ function updatePrivateKeyPasswd() {
var newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val();
OC.msg.startSaving('#encryption .msg');
$.post(
- OC.filePath( 'files_encryption', 'ajax', 'updatePrivateKeyPassword.php' )
+ OC.generateUrl('/apps/encryption/ajax/updatePrivateKeyPassword')
, { oldPassword: oldPrivateKeyPassword, newPassword: newPrivateKeyPassword }
, function( data ) {
if (data.status === "error") {
@@ -29,7 +29,7 @@ $(document).ready(function(){
var recoveryStatus = $( this ).val();
OC.msg.startAction('#userEnableRecovery .msg', 'Updating recovery keys. This can take some time...');
$.post(
- OC.filePath( 'files_encryption', 'ajax', 'userrecovery.php' )
+ OC.generateUrl('/apps/encryption/ajax/userSetRecovery')
, { userEnableRecovery: recoveryStatus }
, function( data ) {
OC.msg.finishedAction('#userEnableRecovery .msg', data);
@@ -40,33 +40,6 @@ $(document).ready(function(){
}
);
- $("#encryptAll").click(
- function(){
-
- // Hide feedback messages in case they're already visible
- $('#encryptAllSuccess').hide();
- $('#encryptAllError').hide();
-
- var userPassword = $( '#userPassword' ).val();
- var encryptAll = $( '#encryptAll' ).val();
-
- $.post(
- OC.filePath( 'files_encryption', 'ajax', 'encryptall.php' )
- , { encryptAll: encryptAll, userPassword: userPassword }
- , function( data ) {
- if ( data.status == "success" ) {
- $('#encryptAllSuccess').show();
- } else {
- $('#encryptAllError').show();
- }
- }
- );
- // Ensure page is not reloaded on form submit
- return false;
- }
-
- );
-
// update private key password
$('input:password[name="changePrivateKeyPassword"]').keyup(function(event) {
diff --git a/apps/files_encryption/l10n/.gitkeep b/apps/encryption/l10n/.gitkeep
index e69de29bb2d..e69de29bb2d 100644
--- a/apps/files_encryption/l10n/.gitkeep
+++ b/apps/encryption/l10n/.gitkeep
diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php
new file mode 100644
index 00000000000..6e1008d29a0
--- /dev/null
+++ b/apps/encryption/lib/crypto/crypt.php
@@ -0,0 +1,459 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Crypto;
+
+
+use OC\Encryption\Exceptions\DecryptionFailedException;
+use OC\Encryption\Exceptions\EncryptionFailedException;
+use OCA\Encryption\Exceptions\MultiKeyDecryptException;
+use OCA\Encryption\Exceptions\MultiKeyEncryptException;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+use OCP\IConfig;
+use OCP\ILogger;
+use OCP\IUser;
+use OCP\IUserSession;
+
+class Crypt {
+
+ const DEFAULT_CIPHER = 'AES-256-CFB';
+
+ const HEADER_START = 'HBEGIN';
+ const HEADER_END = 'HEND';
+ /**
+ * @var ILogger
+ */
+ private $logger;
+ /**
+ * @var IUser
+ */
+ private $user;
+ /**
+ * @var IConfig
+ */
+ private $config;
+
+ /**
+ * @param ILogger $logger
+ * @param IUserSession $userSession
+ * @param IConfig $config
+ */
+ public function __construct(ILogger $logger, IUserSession $userSession, IConfig $config) {
+ $this->logger = $logger;
+ $this->user = $userSession && $userSession->isLoggedIn() ? $userSession->getUser() : false;
+ $this->config = $config;
+ }
+
+ /**
+ * @return array|bool
+ */
+ public function createKeyPair() {
+
+ $log = $this->logger;
+ $res = $this->getOpenSSLPKey();
+
+ if (!$res) {
+ $log->error("Encryption Library could'nt generate users key-pair for {$this->user->getUID()}",
+ ['app' => 'encryption']);
+
+ if (openssl_error_string()) {
+ $log->error('Encryption library openssl_pkey_new() fails: ' . openssl_error_string(),
+ ['app' => 'encryption']);
+ }
+ } elseif (openssl_pkey_export($res,
+ $privateKey,
+ null,
+ $this->getOpenSSLConfig())) {
+ $keyDetails = openssl_pkey_get_details($res);
+ $publicKey = $keyDetails['key'];
+
+ return [
+ 'publicKey' => $publicKey,
+ 'privateKey' => $privateKey
+ ];
+ }
+ $log->error('Encryption library couldn\'t export users private key, please check your servers openSSL configuration.' . $this->user->getUID(),
+ ['app' => 'encryption']);
+ if (openssl_error_string()) {
+ $log->error('Encryption Library:' . openssl_error_string(),
+ ['app' => 'encryption']);
+ }
+
+ return false;
+ }
+
+ /**
+ * @return resource
+ */
+ public function getOpenSSLPKey() {
+ $config = $this->getOpenSSLConfig();
+ return openssl_pkey_new($config);
+ }
+
+ /**
+ * @return array
+ */
+ private function getOpenSSLConfig() {
+ $config = ['private_key_bits' => 4096];
+ $config = array_merge(\OC::$server->getConfig()->getSystemValue('openssl',
+ []),
+ $config);
+ return $config;
+ }
+
+ /**
+ * @param string $plainContent
+ * @param string $passPhrase
+ * @return bool|string
+ * @throws GenericEncryptionException
+ */
+ public function symmetricEncryptFileContent($plainContent, $passPhrase) {
+
+ if (!$plainContent) {
+ $this->logger->error('Encryption Library, symmetrical encryption failed no content given',
+ ['app' => 'encryption']);
+ return false;
+ }
+
+ $iv = $this->generateIv();
+
+ $encryptedContent = $this->encrypt($plainContent,
+ $iv,
+ $passPhrase,
+ $this->getCipher());
+ // combine content to encrypt the IV identifier and actual IV
+ $catFile = $this->concatIV($encryptedContent, $iv);
+ $padded = $this->addPadding($catFile);
+
+ return $padded;
+ }
+
+ /**
+ * @param string $plainContent
+ * @param string $iv
+ * @param string $passPhrase
+ * @param string $cipher
+ * @return string
+ * @throws EncryptionFailedException
+ */
+ private function encrypt($plainContent, $iv, $passPhrase = '', $cipher = self::DEFAULT_CIPHER) {
+ $encryptedContent = openssl_encrypt($plainContent,
+ $cipher,
+ $passPhrase,
+ false,
+ $iv);
+
+ if (!$encryptedContent) {
+ $error = 'Encryption (symmetric) of content failed';
+ $this->logger->error($error . openssl_error_string(),
+ ['app' => 'encryption']);
+ throw new EncryptionFailedException($error);
+ }
+
+ return $encryptedContent;
+ }
+
+ /**
+ * @return mixed|string
+ */
+ public function getCipher() {
+ $cipher = $this->config->getSystemValue('cipher', self::DEFAULT_CIPHER);
+ if ($cipher !== 'AES-256-CFB' && $cipher !== 'AES-128-CFB') {
+ $this->logger->warning('Wrong cipher defined in config.php only AES-128-CFB and AES-256-CFB are supported. Fall back' . self::DEFAULT_CIPHER,
+ ['app' => 'encryption']);
+ $cipher = self::DEFAULT_CIPHER;
+ }
+
+ return $cipher;
+ }
+
+ /**
+ * @param string $encryptedContent
+ * @param string $iv
+ * @return string
+ */
+ private function concatIV($encryptedContent, $iv) {
+ return $encryptedContent . '00iv00' . $iv;
+ }
+
+ /**
+ * @param $data
+ * @return string
+ */
+ private function addPadding($data) {
+ return $data . 'xx';
+ }
+
+ /**
+ * @param string $recoveryKey
+ * @param string $password
+ * @return bool|string
+ */
+ public function decryptPrivateKey($recoveryKey, $password) {
+
+ $header = $this->parseHeader($recoveryKey);
+ $cipher = $this->getCipher();
+
+ // If we found a header we need to remove it from the key we want to decrypt
+ if (!empty($header)) {
+ $recoveryKey = substr($recoveryKey,
+ strpos($recoveryKey,
+ self::HEADER_END) + strlen(self::HEADER_START));
+ }
+
+ $plainKey = $this->symmetricDecryptFileContent($recoveryKey,
+ $password,
+ $cipher);
+
+ // Check if this is a valid private key
+ $res = openssl_get_privatekey($plainKey);
+ if (is_resource($res)) {
+ $sslInfo = openssl_pkey_get_details($res);
+ if (!isset($sslInfo['key'])) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+
+ return $plainKey;
+ }
+
+ /**
+ * @param $keyFileContents
+ * @param string $passPhrase
+ * @param string $cipher
+ * @return string
+ * @throws DecryptionFailedException
+ */
+ public function symmetricDecryptFileContent($keyFileContents, $passPhrase = '', $cipher = self::DEFAULT_CIPHER) {
+ // Remove Padding
+ $noPadding = $this->removePadding($keyFileContents);
+
+ $catFile = $this->splitIv($noPadding);
+
+ return $this->decrypt($catFile['encrypted'],
+ $catFile['iv'],
+ $passPhrase,
+ $cipher);
+ }
+
+ /**
+ * @param $padded
+ * @return bool|string
+ */
+ private function removePadding($padded) {
+ if (substr($padded, -2) === 'xx') {
+ return substr($padded, 0, -2);
+ }
+ return false;
+ }
+
+ /**
+ * @param $catFile
+ * @return array
+ */
+ private function splitIv($catFile) {
+ // Fetch encryption metadata from end of file
+ $meta = substr($catFile, -22);
+
+ // Fetch IV from end of file
+ $iv = substr($meta, -16);
+
+ // Remove IV and IV Identifier text to expose encrypted content
+
+ $encrypted = substr($catFile, 0, -22);
+
+ return [
+ 'encrypted' => $encrypted,
+ 'iv' => $iv
+ ];
+ }
+
+ /**
+ * @param $encryptedContent
+ * @param $iv
+ * @param string $passPhrase
+ * @param string $cipher
+ * @return string
+ * @throws DecryptionFailedException
+ */
+ private function decrypt($encryptedContent, $iv, $passPhrase = '', $cipher = self::DEFAULT_CIPHER) {
+ $plainContent = openssl_decrypt($encryptedContent,
+ $cipher,
+ $passPhrase,
+ false,
+ $iv);
+
+ if ($plainContent) {
+ return $plainContent;
+ } else {
+ throw new DecryptionFailedException('Encryption library: Decryption (symmetric) of content failed: ' . openssl_error_string());
+ }
+ }
+
+ /**
+ * @param $data
+ * @return array
+ */
+ private function parseHeader($data) {
+ $result = [];
+
+ if (substr($data, 0, strlen(self::HEADER_START)) === self::HEADER_START) {
+ $endAt = strpos($data, self::HEADER_END);
+ $header = substr($data, 0, $endAt + strlen(self::HEADER_END));
+
+ // +1 not to start with an ':' which would result in empty element at the beginning
+ $exploded = explode(':',
+ substr($header, strlen(self::HEADER_START) + 1));
+
+ $element = array_shift($exploded);
+
+ while ($element != self::HEADER_END) {
+ $result[$element] = array_shift($exploded);
+ $element = array_shift($exploded);
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * @return string
+ * @throws GenericEncryptionException
+ */
+ private function generateIv() {
+ $random = openssl_random_pseudo_bytes(12, $strong);
+ if ($random) {
+ if (!$strong) {
+ // If OpenSSL indicates randomness is insecure log error
+ $this->logger->error('Encryption Library: Insecure symmetric key was generated using openssl_random_psudo_bytes()',
+ ['app' => 'encryption']);
+ }
+
+ /*
+ * We encode the iv purely for string manipulation
+ * purposes -it gets decoded before use
+ */
+ return base64_encode($random);
+ }
+ // If we ever get here we've failed anyway no need for an else
+ throw new GenericEncryptionException('Generating IV Failed');
+ }
+
+ /**
+ * Generate a pseudo random 256-bit ASCII key, used as file key
+ * @return string
+ */
+ public static function generateFileKey() {
+ // Generate key
+ $key = base64_encode(openssl_random_pseudo_bytes(32, $strong));
+ if (!$key || !$strong) {
+ // If OpenSSL indicates randomness is insecure, log error
+ throw new \Exception('Encryption library, Insecure symmetric key was generated using openssl_random_pseudo_bytes()');
+ }
+
+ return $key;
+ }
+
+ /**
+ * Check if a file's contents contains an IV and is symmetrically encrypted
+ *
+ * @param $content
+ * @return bool
+ */
+ public function isCatFileContent($content) {
+ if (!$content) {
+ return false;
+ }
+
+ $noPadding = $this->removePadding($content);
+
+ // Fetch encryption metadata from end of file
+ $meta = substr($noPadding, -22);
+
+ // Fetch identifier from start of metadata
+ $identifier = substr($meta, 0, 6);
+
+ if ($identifier === '00iv00') {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param $encKeyFile
+ * @param $shareKey
+ * @param $privateKey
+ * @return mixed
+ * @throws MultiKeyDecryptException
+ */
+ public function multiKeyDecrypt($encKeyFile, $shareKey, $privateKey) {
+ if (!$encKeyFile) {
+ throw new MultiKeyDecryptException('Cannot multikey decrypt empty plain content');
+ }
+
+ if (openssl_open($encKeyFile, $plainContent, $shareKey, $privateKey)) {
+ return $plainContent;
+ } else {
+ throw new MultiKeyDecryptException('multikeydecrypt with share key failed:' . openssl_error_string());
+ }
+ }
+
+ /**
+ * @param $plainContent
+ * @param array $keyFiles
+ * @return array
+ * @throws MultiKeyEncryptException
+ */
+ public function multiKeyEncrypt($plainContent, array $keyFiles) {
+ // openssl_seal returns false without errors if plaincontent is empty
+ // so trigger our own error
+ if (empty($plainContent)) {
+ throw new MultiKeyEncryptException('Cannot multikeyencrypt empty plain content');
+ }
+
+ // Set empty vars to be set by openssl by reference
+ $sealed = '';
+ $shareKeys = [];
+ $mappedShareKeys = [];
+
+ if (openssl_seal($plainContent, $sealed, $shareKeys, $keyFiles)) {
+ $i = 0;
+
+ // Ensure each shareKey is labelled with its corresponding key id
+ foreach ($keyFiles as $userId => $publicKey) {
+ $mappedShareKeys[$userId] = $shareKeys[$i];
+ $i++;
+ }
+
+ return [
+ 'keys' => $mappedShareKeys,
+ 'data' => $sealed
+ ];
+ } else {
+ throw new MultiKeyEncryptException('multikeyencryption failed ' . openssl_error_string());
+ }
+ }
+}
+
diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php
new file mode 100644
index 00000000000..04b7b83b0c2
--- /dev/null
+++ b/apps/encryption/lib/crypto/encryption.php
@@ -0,0 +1,341 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Crypto;
+
+
+use OCA\Encryption\Util;
+use OCP\Encryption\IEncryptionModule;
+use OCA\Encryption\KeyManager;
+
+class Encryption implements IEncryptionModule {
+
+ const ID = 'OC_DEFAULT_MODULE';
+
+ /**
+ * @var Crypt
+ */
+ private $crypt;
+
+ /** @var string */
+ private $cipher;
+
+ /** @var string */
+ private $path;
+
+ /** @var string */
+ private $user;
+
+ /** @var string */
+ private $fileKey;
+
+ /** @var string */
+ private $writeCache;
+
+ /** @var KeyManager */
+ private $keyManager;
+
+ /** @var array */
+ private $accessList;
+
+ /** @var boolean */
+ private $isWriteOperation;
+
+ /** @var Util */
+ private $util;
+
+ /**
+ *
+ * @param \OCA\Encryption\Crypto\Crypt $crypt
+ * @param KeyManager $keyManager
+ * @param Util $util
+ */
+ public function __construct(Crypt $crypt, KeyManager $keyManager, Util $util) {
+ $this->crypt = $crypt;
+ $this->keyManager = $keyManager;
+ $this->util = $util;
+ }
+
+ /**
+ * @return string defining the technical unique id
+ */
+ public function getId() {
+ return self::ID;
+ }
+
+ /**
+ * In comparison to getKey() this function returns a human readable (maybe translated) name
+ *
+ * @return string
+ */
+ public function getDisplayName() {
+ return 'ownCloud Default Encryption';
+ }
+
+ /**
+ * start receiving chunks from a file. This is the place where you can
+ * perform some initial step before starting encrypting/decrypting the
+ * chunks
+ *
+ * @param string $path to the file
+ * @param string $user who read/write the file
+ * @param array $header contains the header data read from the file
+ * @param array $accessList who has access to the file contains the key 'users' and 'public'
+ *
+ * @return array $header contain data as key-value pairs which should be
+ * written to the header, in case of a write operation
+ * or if no additional data is needed return a empty array
+ */
+ public function begin($path, $user, $header, $accessList) {
+
+ if (isset($header['cipher'])) {
+ $this->cipher = $header['cipher'];
+ } else {
+ $this->cipher = $this->crypt->getCipher();
+ }
+
+ $this->path = $this->getPathToRealFile($path);
+ $this->accessList = $accessList;
+ $this->user = $user;
+ $this->writeCache = '';
+ $this->isWriteOperation = false;
+
+ $this->fileKey = $this->keyManager->getFileKey($this->path, $this->user);
+
+ return array('cipher' => $this->cipher);
+ }
+
+ /**
+ * last chunk received. This is the place where you can perform some final
+ * operation and return some remaining data if something is left in your
+ * buffer.
+ *
+ * @param string $path to the file
+ * @return string remained data which should be written to the file in case
+ * of a write operation
+ */
+ public function end($path) {
+ $result = '';
+ if ($this->isWriteOperation) {
+ if (!empty($this->writeCache)) {
+ $result = $this->crypt->symmetricEncryptFileContent($this->writeCache, $this->fileKey);
+ $this->writeCache = '';
+ }
+ $publicKeys = array();
+ foreach ($this->accessList['users'] as $uid) {
+ $publicKeys[$uid] = $this->keyManager->getPublicKey($uid);
+ }
+
+ $publicKeys = $this->keyManager->addSystemKeys($this->accessList, $publicKeys);
+
+ $encryptedKeyfiles = $this->crypt->multiKeyEncrypt($this->fileKey, $publicKeys);
+ $this->keyManager->setAllFileKeys($this->path, $encryptedKeyfiles);
+ }
+ return $result;
+ }
+
+ /**
+ * encrypt data
+ *
+ * @param string $data you want to encrypt
+ * @return mixed encrypted data
+ */
+ public function encrypt($data) {
+ $this->isWriteOperation = true;
+ if (empty($this->fileKey)) {
+ $this->fileKey = $this->crypt->generateFileKey();
+ }
+
+ // If extra data is left over from the last round, make sure it
+ // is integrated into the next 6126 / 8192 block
+ if ($this->writeCache) {
+
+ // Concat writeCache to start of $data
+ $data = $this->writeCache . $data;
+
+ // Clear the write cache, ready for reuse - it has been
+ // flushed and its old contents processed
+ $this->writeCache = '';
+
+ }
+
+ $encrypted = '';
+ // While there still remains some data to be processed & written
+ while (strlen($data) > 0) {
+
+ // Remaining length for this iteration, not of the
+ // entire file (may be greater than 8192 bytes)
+ $remainingLength = strlen($data);
+
+ // If data remaining to be written is less than the
+ // size of 1 6126 byte block
+ if ($remainingLength < 6126) {
+
+ // Set writeCache to contents of $data
+ // The writeCache will be carried over to the
+ // next write round, and added to the start of
+ // $data to ensure that written blocks are
+ // always the correct length. If there is still
+ // data in writeCache after the writing round
+ // has finished, then the data will be written
+ // to disk by $this->flush().
+ $this->writeCache = $data;
+
+ // Clear $data ready for next round
+ $data = '';
+
+ } else {
+
+ // Read the chunk from the start of $data
+ $chunk = substr($data, 0, 6126);
+
+ $encrypted .= $this->crypt->symmetricEncryptFileContent($chunk, $this->fileKey);
+
+ // Remove the chunk we just processed from
+ // $data, leaving only unprocessed data in $data
+ // var, for handling on the next round
+ $data = substr($data, 6126);
+
+ }
+
+ }
+
+ return $encrypted;
+ }
+
+ /**
+ * decrypt data
+ *
+ * @param string $data you want to decrypt
+ * @return mixed decrypted data
+ */
+ public function decrypt($data) {
+ $result = '';
+ if (!empty($data)) {
+ $result = $this->crypt->symmetricDecryptFileContent($data, $this->fileKey);
+ }
+ return $result;
+ }
+
+ /**
+ * update encrypted file, e.g. give additional users access to the file
+ *
+ * @param string $path path to the file which should be updated
+ * @param string $uid of the user who performs the operation
+ * @param array $accessList who has access to the file contains the key 'users' and 'public'
+ * @return boolean
+ */
+ public function update($path, $uid, $accessList) {
+ $fileKey = $this->keyManager->getFileKey($path, $uid);
+ $publicKeys = array();
+ foreach ($accessList['users'] as $user) {
+ $publicKeys[$user] = $this->keyManager->getPublicKey($user);
+ }
+
+ $publicKeys = $this->keyManager->addSystemKeys($accessList, $publicKeys);
+
+ $encryptedFileKey = $this->crypt->multiKeyEncrypt($fileKey, $publicKeys);
+
+ $this->keyManager->deleteAllFileKeys($path);
+
+ $this->keyManager->setAllFileKeys($path, $encryptedFileKey);
+
+ return true;
+ }
+
+ /**
+ * add system keys such as the public share key and the recovery key
+ *
+ * @param array $accessList
+ * @param array $publicKeys
+ * @return array
+ */
+ public function addSystemKeys(array $accessList, array $publicKeys) {
+ if (!empty($accessList['public'])) {
+ $publicKeys[$this->keyManager->getPublicShareKeyId()] = $this->keyManager->getPublicShareKey();
+ }
+
+ if ($this->keyManager->recoveryKeyExists() &&
+ $this->util->isRecoveryEnabledForUser()) {
+
+ $publicKeys[$this->keyManager->getRecoveryKeyId()] = $this->keyManager->getRecoveryKey();
+ }
+
+ return $publicKeys;
+ }
+
+
+ /**
+ * should the file be encrypted or not
+ *
+ * @param string $path
+ * @return boolean
+ */
+ public function shouldEncrypt($path) {
+ $parts = explode('/', $path);
+ if (count($parts) < 3) {
+ return false;
+ }
+
+ if ($parts[2] == 'files') {
+ return true;
+ }
+ if ($parts[2] == 'files_versions') {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * calculate unencrypted size
+ *
+ * @param string $path to file
+ * @return integer unencrypted size
+ */
+ public function calculateUnencryptedSize($path) {
+ // TODO: Implement calculateUnencryptedSize() method.
+ }
+
+ /**
+ * get size of the unencrypted payload per block.
+ * ownCloud read/write files with a block size of 8192 byte
+ *
+ * @return integer
+ */
+ public function getUnencryptedBlockSize() {
+ return 6126;
+ }
+
+ protected function getPathToRealFile($path) {
+ $realPath = $path;
+ $parts = explode('/', $path);
+ if ($parts[2] === 'files_versions') {
+ $realPath = '/' . $parts[1] . '/files/' . implode('/', array_slice($parts, 3));
+ $length = strrpos($realPath, '.');
+ $realPath = substr($realPath, 0, $length);
+ }
+
+ return $realPath;
+ }
+}
diff --git a/apps/files_encryption/appinfo/register_command.php b/apps/encryption/lib/exceptions/multikeydecryptexception.php
index 4864e801162..48b916ff1b8 100644
--- a/apps/files_encryption/appinfo/register_command.php
+++ b/apps/encryption/lib/exceptions/multikeydecryptexception.php
@@ -1,6 +1,5 @@
<?php
/**
- * @author Morris Jobke <hey@morrisjobke.de>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
@@ -19,8 +18,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+namespace OCA\Encryption\Exceptions;
-use OCA\Files_Encryption\Command\MigrateKeys;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
-$userManager = OC::$server->getUserManager();
-$application->add(new MigrateKeys($userManager));
+class MultiKeyDecryptException extends GenericEncryptionException {
+
+}
diff --git a/apps/encryption/lib/exceptions/multikeyencryptexception.php b/apps/encryption/lib/exceptions/multikeyencryptexception.php
new file mode 100644
index 00000000000..197e06adbf3
--- /dev/null
+++ b/apps/encryption/lib/exceptions/multikeyencryptexception.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class MultiKeyEncryptException extends GenericEncryptionException {
+
+}
diff --git a/apps/encryption/lib/exceptions/privatekeymissingexception.php b/apps/encryption/lib/exceptions/privatekeymissingexception.php
new file mode 100644
index 00000000000..29db5a16641
--- /dev/null
+++ b/apps/encryption/lib/exceptions/privatekeymissingexception.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class PrivateKeyMissingException extends GenericEncryptionException {
+
+ /**
+ * @param string $userId
+ */
+ public function __construct($userId) {
+ if(empty($userId)) {
+ $userId = "<no-user-id-given>";
+ }
+ parent::__construct("Private Key missing for user: $userId");
+ }
+
+}
diff --git a/apps/encryption/lib/exceptions/publickeymissingexception.php b/apps/encryption/lib/exceptions/publickeymissingexception.php
new file mode 100644
index 00000000000..078add0369a
--- /dev/null
+++ b/apps/encryption/lib/exceptions/publickeymissingexception.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class PublicKeyMissingException extends GenericEncryptionException {
+
+ /**
+ * @param string $userId
+ */
+ public function __construct($userId) {
+ if(empty($userId)) {
+ $userId = "<no-user-id-given>";
+ }
+ parent::__construct("Public Key missing for user: $userId");
+ }
+
+}
diff --git a/apps/encryption/lib/hookmanager.php b/apps/encryption/lib/hookmanager.php
new file mode 100644
index 00000000000..0094bc54e7f
--- /dev/null
+++ b/apps/encryption/lib/hookmanager.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption;
+
+
+use OCA\Encryption\Hooks\Contracts\IHook;
+
+class HookManager {
+
+ private $hookInstances = [];
+
+ /**
+ * @param array|IHook $instances
+ * - This accepts either a single instance of IHook or an array of instances of IHook
+ * @return bool
+ */
+ public function registerHook($instances) {
+ if (is_array($instances)) {
+ foreach ($instances as $instance) {
+ if (!$instance instanceof IHook) {
+ return false;
+ }
+ $this->hookInstances[] = $instance;
+ }
+
+ } elseif ($instances instanceof IHook) {
+ $this->hookInstances[] = $instances;
+ }
+ return true;
+ }
+
+ /**
+ *
+ */
+ public function fireHooks() {
+ foreach ($this->hookInstances as $instance) {
+ /**
+ * Fire off the add hooks method of each instance stored in cache
+ *
+ * @var $instance IHook
+ */
+ $instance->addHooks();
+ }
+
+ }
+
+}
diff --git a/apps/encryption/lib/keymanager.php b/apps/encryption/lib/keymanager.php
new file mode 100644
index 00000000000..81bc082042d
--- /dev/null
+++ b/apps/encryption/lib/keymanager.php
@@ -0,0 +1,531 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption;
+
+use OC\Encryption\Exceptions\DecryptionFailedException;
+use OCA\Encryption\Exceptions\PrivateKeyMissingException;
+use OCA\Encryption\Exceptions\PublicKeyMissingException;
+use OCA\Encryption\Crypto\Crypt;
+use OCP\Encryption\Keys\IStorage;
+use OCP\IConfig;
+use OCP\ILogger;
+use OCP\IUserSession;
+
+class KeyManager {
+
+ /**
+ * @var Session
+ */
+ protected $session;
+ /**
+ * @var IStorage
+ */
+ private $keyStorage;
+ /**
+ * @var Crypt
+ */
+ private $crypt;
+ /**
+ * @var string
+ */
+ private $recoveryKeyId;
+ /**
+ * @var string
+ */
+ private $publicShareKeyId;
+ /**
+ * @var string UserID
+ */
+ private $keyId;
+ /**
+ * @var string
+ */
+ private $publicKeyId = 'publicKey';
+ /**
+ * @var string
+ */
+ private $privateKeyId = 'privateKey';
+
+ /**
+ * @var string
+ */
+ private $shareKeyId = 'shareKey';
+
+ /**
+ * @var string
+ */
+ private $fileKeyId = 'fileKey';
+ /**
+ * @var IConfig
+ */
+ private $config;
+ /**
+ * @var ILogger
+ */
+ private $log;
+ /**
+ * @var Util
+ */
+ private $util;
+
+ /**
+ * @param IStorage $keyStorage
+ * @param Crypt $crypt
+ * @param IConfig $config
+ * @param IUserSession $userSession
+ * @param Session $session
+ * @param ILogger $log
+ * @param Util $util
+ */
+ public function __construct(
+ IStorage $keyStorage,
+ Crypt $crypt,
+ IConfig $config,
+ IUserSession $userSession,
+ Session $session,
+ ILogger $log,
+ Util $util
+ ) {
+
+ $this->util = $util;
+ $this->session = $session;
+ $this->keyStorage = $keyStorage;
+ $this->crypt = $crypt;
+ $this->config = $config;
+ $this->log = $log;
+
+ $this->recoveryKeyId = $this->config->getAppValue('encryption',
+ 'recoveryKeyId');
+ if (empty($this->recoveryKeyId)) {
+ $this->recoveryKeyId = 'recoveryKey_' . substr(md5(time()), 0, 8);
+ $this->config->setAppValue('encryption',
+ 'recoveryKeyId',
+ $this->recoveryKeyId);
+ }
+
+ $this->publicShareKeyId = $this->config->getAppValue('encryption',
+ 'publicShareKeyId');
+ if (empty($this->publicShareKeyId)) {
+ $this->publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8);
+ $this->config->setAppValue('encryption', 'publicShareKeyId', $this->publicShareKeyId);
+ }
+
+ $shareKey = $this->getPublicShareKey();
+ if (empty($shareKey)) {
+ $keyPair = $this->crypt->createKeyPair();
+
+ // Save public key
+ $this->keyStorage->setSystemUserKey(
+ $this->publicShareKeyId . '.publicKey', $keyPair['publicKey']);
+
+ // Encrypt private key empty passphrase
+ $encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'], '');
+ $this->keyStorage->setSystemUserKey($this->publicShareKeyId . '.privateKey', $encryptedKey);
+ }
+
+ $this->keyId = $userSession && $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : false;
+ $this->log = $log;
+ }
+
+ /**
+ * @return bool
+ */
+ public function recoveryKeyExists() {
+ $key = $this->getRecoveryKey();
+ return (!empty($key));
+ }
+
+ /**
+ * get recovery key
+ *
+ * @return string
+ */
+ public function getRecoveryKey() {
+ return $this->keyStorage->getSystemUserKey($this->recoveryKeyId . '.publicKey');
+ }
+
+ /**
+ * get recovery key ID
+ *
+ * @return string
+ */
+ public function getRecoveryKeyId() {
+ return $this->recoveryKeyId;
+ }
+
+ /**
+ * @param $password
+ * @return bool
+ */
+ public function checkRecoveryPassword($password) {
+ $recoveryKey = $this->keyStorage->getSystemUserKey($this->recoveryKeyId . '.privateKey');
+ $decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey,
+ $password);
+
+ if ($decryptedRecoveryKey) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param string $uid
+ * @param string $password
+ * @param string $keyPair
+ * @return bool
+ */
+ public function storeKeyPair($uid, $password, $keyPair) {
+ // Save Public Key
+ $this->setPublicKey($uid, $keyPair['publicKey']);
+
+ $encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'],
+ $password);
+
+ if ($encryptedKey) {
+ $this->setPrivateKey($uid, $encryptedKey);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param string $password
+ * @param array $keyPair
+ * @return bool
+ */
+ public function setRecoveryKey($password, $keyPair) {
+ // Save Public Key
+ $this->keyStorage->setSystemUserKey($this->getRecoveryKeyId(). '.publicKey', $keyPair['publicKey']);
+
+ $encryptedKey = $this->crypt->symmetricEncryptFileContent($keyPair['privateKey'],
+ $password);
+
+ if ($encryptedKey) {
+ $this->setSystemPrivateKey($this->getRecoveryKeyId(), $encryptedKey);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param $userId
+ * @param $key
+ * @return bool
+ */
+ public function setPublicKey($userId, $key) {
+ return $this->keyStorage->setUserKey($userId, $this->publicKeyId, $key);
+ }
+
+ /**
+ * @param $userId
+ * @param $key
+ * @return bool
+ */
+ public function setPrivateKey($userId, $key) {
+ return $this->keyStorage->setUserKey($userId,
+ $this->privateKeyId,
+ $key);
+ }
+
+ /**
+ * write file key to key storage
+ *
+ * @param string $path
+ * @param string $key
+ * @return boolean
+ */
+ public function setFileKey($path, $key) {
+ return $this->keyStorage->setFileKey($path, $this->fileKeyId, $key);
+ }
+
+ /**
+ * set all file keys (the file key and the corresponding share keys)
+ *
+ * @param string $path
+ * @param array $keys
+ */
+ public function setAllFileKeys($path, $keys) {
+ $this->setFileKey($path, $keys['data']);
+ foreach ($keys['keys'] as $uid => $keyFile) {
+ $this->setShareKey($path, $uid, $keyFile);
+ }
+ }
+
+ /**
+ * write share key to the key storage
+ *
+ * @param string $path
+ * @param string $uid
+ * @param string $key
+ * @return boolean
+ */
+ public function setShareKey($path, $uid, $key) {
+ $keyId = $uid . '.' . $this->shareKeyId;
+ return $this->keyStorage->setFileKey($path, $keyId, $key);
+ }
+
+ /**
+ * Decrypt private key and store it
+ *
+ * @param string $uid userid
+ * @param string $passPhrase users password
+ * @return boolean
+ */
+ public function init($uid, $passPhrase) {
+ try {
+ $privateKey = $this->getPrivateKey($uid);
+ $privateKey = $this->crypt->decryptPrivateKey($privateKey,
+ $passPhrase);
+ } catch (PrivateKeyMissingException $e) {
+ return false;
+ } catch (DecryptionFailedException $e) {
+ return false;
+ }
+
+ $this->session->setPrivateKey($privateKey);
+ $this->session->setStatus(Session::INIT_SUCCESSFUL);
+
+ return true;
+ }
+
+ /**
+ * @param $userId
+ * @return mixed
+ * @throws PrivateKeyMissingException
+ */
+ public function getPrivateKey($userId) {
+ $privateKey = $this->keyStorage->getUserKey($userId,
+ $this->privateKeyId);
+
+ if (strlen($privateKey) !== 0) {
+ return $privateKey;
+ }
+ throw new PrivateKeyMissingException($userId);
+ }
+
+ /**
+ * @param $path
+ * @param $uid
+ * @return string
+ */
+ public function getFileKey($path, $uid) {
+ $encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId);
+
+ if (is_null($uid)) {
+ $uid = $this->getPublicShareKeyId();
+ $shareKey = $this->getShareKey($path, $uid);
+ $privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.privateKey');
+ $privateKey = $this->crypt->symmetricDecryptFileContent($privateKey);
+ } else {
+ $shareKey = $this->getShareKey($path, $uid);
+ $privateKey = $this->session->getPrivateKey();
+ }
+
+ if ($encryptedFileKey && $shareKey && $privateKey) {
+ return $this->crypt->multiKeyDecrypt($encryptedFileKey,
+ $shareKey,
+ $privateKey);
+ }
+
+ return '';
+ }
+
+ /**
+ * get the encrypted file key
+ *
+ * @param $path
+ * @return string
+ */
+ public function getEncryptedFileKey($path) {
+ $encryptedFileKey = $this->keyStorage->getFileKey($path,
+ $this->fileKeyId);
+
+ return $encryptedFileKey;
+ }
+
+ /**
+ * delete share key
+ *
+ * @param string $path
+ * @param string $keyId
+ * @return boolean
+ */
+ public function deleteShareKey($path, $keyId) {
+ return $this->keyStorage->deleteFileKey($path, $keyId . '.' . $this->shareKeyId);
+ }
+
+
+ /**
+ * @param $path
+ * @param $uid
+ * @return mixed
+ */
+ public function getShareKey($path, $uid) {
+ $keyId = $uid . '.' . $this->shareKeyId;
+ return $this->keyStorage->getFileKey($path, $keyId);
+ }
+
+ /**
+ * @param $userId
+ * @return bool
+ */
+ public function userHasKeys($userId) {
+ try {
+ $this->getPrivateKey($userId);
+ $this->getPublicKey($userId);
+ } catch (PrivateKeyMissingException $e) {
+ return false;
+ } catch (PublicKeyMissingException $e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @param $userId
+ * @return mixed
+ * @throws PublicKeyMissingException
+ */
+ public function getPublicKey($userId) {
+ $publicKey = $this->keyStorage->getUserKey($userId, $this->publicKeyId);
+
+ if (strlen($publicKey) !== 0) {
+ return $publicKey;
+ }
+ throw new PublicKeyMissingException($userId);
+ }
+
+ public function getPublicShareKeyId() {
+ return $this->publicShareKeyId;
+ }
+
+ /**
+ * get public key for public link shares
+ *
+ * @return string
+ */
+ public function getPublicShareKey() {
+ return $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.publicKey');
+ }
+
+ /**
+ * @param $purpose
+ * @param bool $timestamp
+ * @param bool $includeUserKeys
+ */
+ public function backupAllKeys($purpose, $timestamp = true, $includeUserKeys = true) {
+// $backupDir = $this->keyStorage->;
+ }
+
+ /**
+ * @param string $uid
+ */
+ public function replaceUserKeys($uid) {
+ $this->backupAllKeys('password_reset');
+ $this->deletePublicKey($uid);
+ $this->deletePrivateKey($uid);
+ }
+
+ /**
+ * @param $uid
+ * @return bool
+ */
+ public function deletePublicKey($uid) {
+ return $this->keyStorage->deleteUserKey($uid, $this->publicKeyId);
+ }
+
+ /**
+ * @param $uid
+ * @return bool
+ */
+ private function deletePrivateKey($uid) {
+ return $this->keyStorage->deleteUserKey($uid, $this->privateKeyId);
+ }
+
+ public function deleteAllFileKeys($path) {
+ return $this->keyStorage->deleteAllFileKeys($path);
+ }
+
+ /**
+ * @param array $userIds
+ * @return array
+ * @throws PublicKeyMissingException
+ */
+ public function getPublicKeys(array $userIds) {
+ $keys = [];
+
+ foreach ($userIds as $userId) {
+ try {
+ $keys[$userId] = $this->getPublicKey($userId);
+ } catch (PublicKeyMissingException $e) {
+ continue;
+ }
+ }
+
+ return $keys;
+
+ }
+
+ /**
+ * @param string $keyId
+ * @return string returns openssl key
+ */
+ public function getSystemPrivateKey($keyId) {
+ return $this->keyStorage->getSystemUserKey($keyId . '.' . $this->privateKeyId);
+ }
+
+ /**
+ * @param string $keyId
+ * @param string $key
+ * @return string returns openssl key
+ */
+ public function setSystemPrivateKey($keyId, $key) {
+ return $this->keyStorage->setSystemUserKey($keyId . '.' . $this->privateKeyId, $key);
+ }
+
+ /**
+ * add system keys such as the public share key and the recovery key
+ *
+ * @param array $accessList
+ * @param array $publicKeys
+ * @return array
+ * @throws PublicKeyMissingException
+ */
+ public function addSystemKeys(array $accessList, array $publicKeys) {
+ if (!empty($accessList['public'])) {
+ $publicShareKey = $this->getPublicShareKey();
+ if (empty($publicShareKey)) {
+ throw new PublicKeyMissingException($this->getPublicShareKeyId());
+ }
+ $publicKeys[$this->getPublicShareKeyId()] = $publicShareKey;
+ }
+
+ if ($this->recoveryKeyExists() &&
+ $this->util->isRecoveryEnabledForUser()) {
+
+ $publicKeys[$this->getRecoveryKeyId()] = $this->getRecoveryKey();
+ }
+
+ return $publicKeys;
+ }
+}
diff --git a/apps/encryption/lib/recovery.php b/apps/encryption/lib/recovery.php
new file mode 100644
index 00000000000..5c2ca67a2b4
--- /dev/null
+++ b/apps/encryption/lib/recovery.php
@@ -0,0 +1,317 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption;
+
+
+use OCA\Encryption\Crypto\Crypt;
+use OCP\Encryption\Keys\IStorage;
+use OCP\IConfig;
+use OCP\IUser;
+use OCP\IUserSession;
+use OCP\PreConditionNotMetException;
+use OCP\Security\ISecureRandom;
+use OC\Files\View;
+use OCP\Encryption\IFile;
+
+class Recovery {
+
+
+ /**
+ * @var null|IUser
+ */
+ protected $user;
+ /**
+ * @var Crypt
+ */
+ protected $crypt;
+ /**
+ * @var ISecureRandom
+ */
+ private $random;
+ /**
+ * @var KeyManager
+ */
+ private $keyManager;
+ /**
+ * @var IConfig
+ */
+ private $config;
+ /**
+ * @var IStorage
+ */
+ private $keyStorage;
+ /**
+ * @var View
+ */
+ private $view;
+ /**
+ * @var IFile
+ */
+ private $file;
+ /**
+ * @var string
+ */
+ private $recoveryKeyId;
+
+ /**
+ * @param IUserSession $user
+ * @param Crypt $crypt
+ * @param ISecureRandom $random
+ * @param KeyManager $keyManager
+ * @param IConfig $config
+ * @param IStorage $keyStorage
+ * @param IFile $file
+ * @param View $view
+ */
+ public function __construct(IUserSession $user,
+ Crypt $crypt,
+ ISecureRandom $random,
+ KeyManager $keyManager,
+ IConfig $config,
+ IStorage $keyStorage,
+ IFile $file,
+ View $view) {
+ $this->user = ($user && $user->isLoggedIn()) ? $user->getUser() : false;
+ $this->crypt = $crypt;
+ $this->random = $random;
+ $this->keyManager = $keyManager;
+ $this->config = $config;
+ $this->keyStorage = $keyStorage;
+ $this->view = $view;
+ $this->file = $file;
+ }
+
+ /**
+ * @param $recoveryKeyId
+ * @param $password
+ * @return bool
+ */
+ public function enableAdminRecovery($password) {
+ $appConfig = $this->config;
+ $keyManager = $this->keyManager;
+
+ if (!$keyManager->recoveryKeyExists()) {
+ $keyPair = $this->crypt->createKeyPair();
+
+ $this->keyManager->setRecoveryKey($password, $keyPair);
+ }
+
+ if ($keyManager->checkRecoveryPassword($password)) {
+ $appConfig->setAppValue('encryption', 'recoveryAdminEnabled', 1);
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * change recovery key id
+ *
+ * @param string $newPassword
+ * @param string $oldPassword
+ */
+ public function changeRecoveryKeyPassword($newPassword, $oldPassword) {
+ $recoveryKey = $this->keyManager->getSystemPrivateKey($this->keyManager->getRecoveryKeyId());
+ $decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey, $oldPassword);
+ $encryptedRecoveryKey = $this->crypt->symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword);
+ if ($encryptedRecoveryKey) {
+ $this->keyManager->setSystemPrivateKey($this->keyManager->getRecoveryKeyId(), $encryptedRecoveryKey);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param $recoveryPassword
+ * @return bool
+ */
+ public function disableAdminRecovery($recoveryPassword) {
+ $keyManager = $this->keyManager;
+
+ if ($keyManager->checkRecoveryPassword($recoveryPassword)) {
+ // Set recoveryAdmin as disabled
+ $this->config->setAppValue('encryption', 'recoveryAdminEnabled', 0);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * check if recovery is enabled for user
+ *
+ * @param string $user if no user is given we check the current logged-in user
+ *
+ * @return bool
+ */
+ public function isRecoveryEnabledForUser($user = '') {
+ $uid = empty($user) ? $this->user->getUID() : $user;
+ $recoveryMode = $this->config->getUserValue($uid,
+ 'encryption',
+ 'recoveryEnabled',
+ 0);
+
+ return ($recoveryMode === '1');
+ }
+
+ /**
+ * check if recovery is key is enabled by the administrator
+ *
+ * @return bool
+ */
+ public function isRecoveryKeyEnabled() {
+ $enabled = $this->config->getAppValue('encryption', 'recoveryAdminEnabled', 0);
+
+ return ($enabled === '1');
+ }
+
+ /**
+ * @param string $value
+ * @return bool
+ */
+ public function setRecoveryForUser($value) {
+
+ try {
+ $this->config->setUserValue($this->user->getUID(),
+ 'encryption',
+ 'recoveryEnabled',
+ $value);
+
+ if ($value === '1') {
+ $this->addRecoveryKeys('/' . $this->user->getUID() . '/files/');
+ } else {
+ $this->removeRecoveryKeys('/' . $this->user->getUID() . '/files/');
+ }
+
+ return true;
+ } catch (PreConditionNotMetException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * add recovery key to all encrypted files
+ */
+ private function addRecoveryKeys($path) {
+ $dirContent = $this->view->getDirectoryContent($path);
+ foreach ($dirContent as $item) {
+ $filePath = $item->getPath();
+ if ($item['type'] === 'dir') {
+ $this->addRecoveryKeys($filePath . '/');
+ } else {
+ $fileKey = $this->keyManager->getFileKey($filePath, $this->user->getUID());
+ if (!empty($fileKey)) {
+ $accessList = $this->file->getAccessList($filePath);
+ $publicKeys = array();
+ foreach ($accessList['users'] as $uid) {
+ $publicKeys[$uid] = $this->keyManager->getPublicKey($uid);
+ }
+
+ $publicKeys = $this->keyManager->addSystemKeys($accessList, $publicKeys);
+
+ $encryptedKeyfiles = $this->crypt->multiKeyEncrypt($fileKey, $publicKeys);
+ $this->keyManager->setAllFileKeys($filePath, $encryptedKeyfiles);
+ }
+ }
+ }
+ }
+
+ /**
+ * remove recovery key to all encrypted files
+ */
+ private function removeRecoveryKeys($path) {
+ $dirContent = $this->view->getDirectoryContent($path);
+ foreach ($dirContent as $item) {
+ $filePath = $item->getPath();
+ if ($item['type'] === 'dir') {
+ $this->removeRecoveryKeys($filePath . '/');
+ } else {
+ $this->keyManager->deleteShareKey($filePath, $this->keyManager->getRecoveryKeyId());
+ }
+ }
+ }
+
+ /**
+ * recover users files with the recovery key
+ *
+ * @param string $recoveryPassword
+ * @param string $user
+ */
+ public function recoverUsersFiles($recoveryPassword, $user) {
+ $encryptedKey = $this->keyManager->getSystemPrivateKey($this->keyManager->getRecoveryKeyId());
+
+ $privateKey = $this->crypt->decryptPrivateKey($encryptedKey,
+ $recoveryPassword);
+
+ $this->recoverAllFiles('/' . $user . '/files/', $privateKey);
+ }
+
+ /**
+ * @param $path
+ * @param $privateKey
+ */
+ private function recoverAllFiles($path, $privateKey) {
+ $dirContent = $this->view->getDirectoryContent($path);
+
+ foreach ($dirContent as $item) {
+ // Get relative path from encryption/keyfiles
+ $filePath = $item->getPath();
+ if ($this->view->is_dir($filePath)) {
+ $this->recoverAllFiles($filePath . '/', $privateKey);
+ } else {
+ $this->recoverFile($filePath, $privateKey);
+ }
+ }
+
+ }
+
+ /**
+ * @param string $path
+ * @param string $privateKey
+ */
+ private function recoverFile($path, $privateKey) {
+ $encryptedFileKey = $this->keyManager->getEncryptedFileKey($path);
+ $shareKey = $this->keyManager->getShareKey($path, $this->keyManager->getRecoveryKeyId());
+
+ if ($encryptedFileKey && $shareKey && $privateKey) {
+ $fileKey = $this->crypt->multiKeyDecrypt($encryptedFileKey,
+ $shareKey,
+ $privateKey);
+ }
+
+ if (!empty($fileKey)) {
+ $accessList = $this->file->getAccessList($path);
+ $publicKeys = array();
+ foreach ($accessList['users'] as $uid) {
+ $publicKeys[$uid] = $this->keyManager->getPublicKey($uid);
+ }
+
+ $publicKeys = $this->keyManager->addSystemKeys($accessList, $publicKeys);
+
+ $encryptedKeyfiles = $this->crypt->multiKeyEncrypt($fileKey, $publicKeys);
+ $this->keyManager->setAllFileKeys($path, $encryptedKeyfiles);
+ }
+
+ }
+
+
+}
diff --git a/apps/encryption/lib/session.php b/apps/encryption/lib/session.php
new file mode 100644
index 00000000000..2b79e71df49
--- /dev/null
+++ b/apps/encryption/lib/session.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption;
+
+use \OCP\ISession;
+
+class Session {
+
+ /** @var ISession */
+ protected $session;
+
+ const NOT_INITIALIZED = '0';
+ const INIT_EXECUTED = '1';
+ const INIT_SUCCESSFUL = '2';
+
+ public function __construct(ISession $session) {
+ $this->session = $session;
+ }
+
+ /**
+ * Sets status of encryption app
+ *
+ * @param string $status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
+ */
+ public function setStatus($status) {
+ $this->session->set('encryptionInitialized', $status);
+ }
+
+ /**
+ * Gets status if we already tried to initialize the encryption app
+ *
+ * @return string init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
+ */
+ public function getStatus() {
+ $status = $this->session->get('encryptionInitialized');
+ if (is_null($status)) {
+ $status = self::NOT_INITIALIZED;
+ }
+
+ return $status;
+ }
+
+ /**
+ * Gets user or public share private key from session
+ *
+ * @return string $privateKey The user's plaintext private key
+ * @throws Exceptions\PrivateKeyMissingException
+ */
+ public function getPrivateKey() {
+ $key = $this->session->get('privateKey');
+ if (is_null($key)) {
+ throw new Exceptions\PrivateKeyMissingException('please try to log-out and log-in again', 0);
+ }
+ return $key;
+ }
+
+ /**
+ * check if private key is set
+ *
+ * @return boolean
+ */
+ public function isPrivateKeySet() {
+ $key = $this->session->get('privateKey');
+ if (is_null($key)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Sets user private key to session
+ *
+ * @param string $key users private key
+ *
+ * @note this should only be set on login
+ */
+ public function setPrivateKey($key) {
+ $this->session->set('privateKey', $key);
+ }
+
+
+ /**
+ * remove keys from session
+ */
+ public function clear() {
+ $this->session->remove('publicSharePrivateKey');
+ $this->session->remove('privateKey');
+ $this->session->remove('encryptionInitialized');
+
+ }
+
+}
diff --git a/apps/encryption/lib/users/setup.php b/apps/encryption/lib/users/setup.php
new file mode 100644
index 00000000000..1c4214f173c
--- /dev/null
+++ b/apps/encryption/lib/users/setup.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption\Users;
+
+
+use OCA\Encryption\Crypto\Crypt;
+use OCA\Encryption\KeyManager;
+use OCP\ILogger;
+use OCP\IUserSession;
+
+class Setup {
+ /**
+ * @var Crypt
+ */
+ private $crypt;
+ /**
+ * @var KeyManager
+ */
+ private $keyManager;
+ /**
+ * @var ILogger
+ */
+ private $logger;
+ /**
+ * @var bool|string
+ */
+ private $user;
+
+
+ /**
+ * @param ILogger $logger
+ * @param IUserSession $userSession
+ * @param Crypt $crypt
+ * @param KeyManager $keyManager
+ */
+ public function __construct(ILogger $logger, IUserSession $userSession, Crypt $crypt, KeyManager $keyManager) {
+ $this->logger = $logger;
+ $this->user = $userSession && $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : false;
+ $this->crypt = $crypt;
+ $this->keyManager = $keyManager;
+ }
+
+ /**
+ * @param $uid userid
+ * @param $password user password
+ * @return bool
+ */
+ public function setupUser($uid, $password) {
+ return $this->setupServerSide($uid, $password);
+ }
+
+ /**
+ * @param $uid userid
+ * @param $password user password
+ * @return bool
+ */
+ public function setupServerSide($uid, $password) {
+ // Check if user already has keys
+ if (!$this->keyManager->userHasKeys($uid)) {
+ return $this->keyManager->storeKeyPair($uid, $password,
+ $this->crypt->createKeyPair());
+ }
+ return true;
+ }
+}
diff --git a/apps/encryption/lib/util.php b/apps/encryption/lib/util.php
new file mode 100644
index 00000000000..04e04028caf
--- /dev/null
+++ b/apps/encryption/lib/util.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption;
+
+
+use OC\Files\View;
+use OCA\Encryption\Crypto\Crypt;
+use OCP\IConfig;
+use OCP\ILogger;
+use OCP\IUser;
+use OCP\IUserSession;
+use OCP\PreConditionNotMetException;
+
+class Util {
+ /**
+ * @var View
+ */
+ private $files;
+ /**
+ * @var Crypt
+ */
+ private $crypt;
+ /**
+ * @var ILogger
+ */
+ private $logger;
+ /**
+ * @var bool|IUser
+ */
+ private $user;
+ /**
+ * @var IConfig
+ */
+ private $config;
+
+ /**
+ * Util constructor.
+ *
+ * @param View $files
+ * @param Crypt $crypt
+ * @param ILogger $logger
+ * @param IUserSession $userSession
+ * @param IConfig $config
+ */
+ public function __construct(View $files,
+ Crypt $crypt,
+ ILogger $logger,
+ IUserSession $userSession,
+ IConfig $config
+ ) {
+ $this->files = $files;
+ $this->crypt = $crypt;
+ $this->logger = $logger;
+ $this->user = $userSession && $userSession->isLoggedIn() ? $userSession->getUser() : false;
+ $this->config = $config;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isRecoveryEnabledForUser() {
+ $recoveryMode = $this->config->getUserValue($this->user->getUID(),
+ 'encryption',
+ 'recoveryEnabled',
+ 0);
+
+ return ($recoveryMode === '1');
+ }
+
+ /**
+ * @param $enabled
+ * @return bool
+ */
+ public function setRecoveryForUser($enabled) {
+ $value = $enabled ? '1' : '0';
+
+ try {
+ $this->config->setUserValue($this->user->getUID(),
+ 'encryption',
+ 'recoveryEnabled',
+ $value);
+ return true;
+ } catch (PreConditionNotMetException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * @param string $uid
+ * @return bool
+ */
+ public function userHasFiles($uid) {
+ return $this->files->file_exists($uid . '/files');
+ }
+
+
+}
diff --git a/apps/files_encryption/settings-admin.php b/apps/encryption/settings/settings-admin.php
index 44dcc2309a4..c7ac8c09c6b 100644
--- a/apps/files_encryption/settings-admin.php
+++ b/apps/encryption/settings/settings-admin.php
@@ -1,11 +1,8 @@
<?php
/**
* @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Sam Tuke <mail@samtuke.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -26,17 +23,14 @@
\OC_Util::checkAdminUser();
-$tmpl = new OCP\Template('files_encryption', 'settings-admin');
+$tmpl = new OCP\Template('encryption', 'settings-admin');
// Check if an adminRecovery account is enabled for recovering files after lost pwd
-$recoveryAdminEnabled = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled', '0');
-$session = new \OCA\Files_Encryption\Session(new \OC\Files\View('/'));
-$initStatus = $session->getInitialized();
+$recoveryAdminEnabled = \OC::$server->getConfig()->getAppValue('encryption', 'recoveryAdminEnabled', '0');
+$session = new \OCA\Encryption\Session(\OC::$server->getSession());
-$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
-$tmpl->assign('initStatus', $initStatus);
-\OCP\Util::addscript('files_encryption', 'settings-admin');
-\OCP\Util::addscript('core', 'multiselect');
+$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
+$tmpl->assign('initStatus', $session->getStatus());
return $tmpl->fetchPage();
diff --git a/apps/encryption/settings/settings-personal.php b/apps/encryption/settings/settings-personal.php
new file mode 100644
index 00000000000..abbe62af615
--- /dev/null
+++ b/apps/encryption/settings/settings-personal.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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/>
+ *
+ */
+
+$session = new \OCA\Encryption\Session(\OC::$server->getSession());
+$userSession = \OC::$server->getUserSession();
+
+$template = new OCP\Template('encryption', 'settings-personal');
+$crypt = new \OCA\Encryption\Crypto\Crypt(
+ \OC::$server->getLogger(),
+ $userSession,
+ \OC::$server->getConfig());
+
+$util = new \OCA\Encryption\Util(
+ new \OC\Files\View(),
+ $crypt,
+ \OC::$server->getLogger(),
+ $userSession,
+ \OC::$server->getConfig());
+
+$keyManager = new \OCA\Encryption\KeyManager(
+ \OC::$server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID),
+ $crypt,
+ \OC::$server->getConfig(),
+ $userSession,
+ $session,
+ \OC::$server->getLogger(), $util);
+
+$user = $userSession->getUser()->getUID();
+
+$view = new \OC\Files\View('/');
+
+
+
+$privateKeySet = $session->isPrivateKeySet();
+// did we tried to initialize the keys for this session?
+$initialized = $session->getStatus();
+
+$recoveryAdminEnabled = \OC::$server->getConfig()->getAppValue('encryption', 'recoveryAdminEnabled');
+$recoveryEnabledForUser = $util->isRecoveryEnabledForUser();
+
+$result = false;
+
+if ($recoveryAdminEnabled || !$privateKeySet) {
+ $template->assign('recoveryEnabled', $recoveryAdminEnabled);
+ $template->assign('recoveryEnabledForUser', $recoveryEnabledForUser);
+ $template->assign('privateKeySet', $privateKeySet);
+ $template->assign('initialized', $initialized);
+
+ $result = $template->fetchPage();
+}
+
+return $result;
+
diff --git a/apps/files_encryption/templates/settings-admin.php b/apps/encryption/templates/settings-admin.php
index b686912bf4d..b64e75512e7 100644
--- a/apps/files_encryption/templates/settings-admin.php
+++ b/apps/encryption/templates/settings-admin.php
@@ -1,11 +1,13 @@
<?php
- /** @var array $_ */
- /** @var OC_L10N $l */
+/** @var array $_ */
+/** @var OC_L10N $l */
+script('encryption', 'settings-admin');
+script('core', 'multiselect');
?>
<form id="encryption" class="section">
- <h2><?php p($l->t('Server-side Encryption')); ?></h2>
+ <h2><?php p($l->t('ownCloud basic encryption module')); ?></h2>
- <?php if($_["initStatus"] === \OCA\Files_Encryption\Session::NOT_INITIALIZED): ?>
+ <?php if(!$_["initStatus"]): ?>
<?php p($l->t("Encryption App is enabled but your keys are not initialized, please log-out and log-in again")); ?>
<?php else: ?>
<p id="encryptionSetRecoveryKey">
diff --git a/apps/files_encryption/templates/settings-personal.php b/apps/encryption/templates/settings-personal.php
index 3c8034c968f..6b8821ca8a8 100644
--- a/apps/files_encryption/templates/settings-personal.php
+++ b/apps/encryption/templates/settings-personal.php
@@ -1,70 +1,72 @@
-<?php
- /** @var array $_ */
- /** @var OC_L10N $l */
-?>
-<form id="encryption" class="section">
- <h2><?php p($l->t('Server-side Encryption')); ?></h2>
-
- <?php if ( $_["initialized"] === \OCA\Files_Encryption\Session::NOT_INITIALIZED ): ?>
-
- <?php p($l->t("Encryption App is enabled but your keys are not initialized, please log-out and log-in again")); ?>
-
- <?php elseif ( $_["initialized"] === \OCA\Files_Encryption\Session::INIT_EXECUTED ): ?>
- <p>
- <a name="changePKPasswd" />
- <label for="changePrivateKeyPasswd">
- <em><?php p( $l->t( "Your private key password no longer matches your log-in password." ) ); ?></em>
- </label>
- <br />
- <?php p( $l->t( "Set your old private key password to your current log-in password:" ) ); ?>
- <?php if ( $_["recoveryEnabledForUser"] ):
- p( $l->t( " If you don't remember your old password you can ask your administrator to recover your files." ) );
- endif; ?>
- <br />
- <input
- type="password"
- name="changePrivateKeyPassword"
- id="oldPrivateKeyPassword" />
- <label for="oldPrivateKeyPassword"><?php p($l->t( "Old log-in password" )); ?></label>
- <br />
- <input
- type="password"
- name="changePrivateKeyPassword"
- id="newPrivateKeyPassword" />
- <label for="newRecoveryPassword"><?php p($l->t( "Current log-in password" )); ?></label>
- <br />
- <button
- type="button"
- name="submitChangePrivateKeyPassword"
- disabled><?php p($l->t( "Update Private Key Password" )); ?>
- </button>
- <span class="msg"></span>
- </p>
-
- <?php elseif ( $_["recoveryEnabled"] && $_["privateKeySet"] && $_["initialized"] === \OCA\Files_Encryption\Session::INIT_SUCCESSFUL ): ?>
- <br />
- <p id="userEnableRecovery">
- <label for="userEnableRecovery"><?php p( $l->t( "Enable password recovery:" ) ); ?></label>
- <span class="msg"></span>
- <br />
- <em><?php p( $l->t( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" ) ); ?></em>
- <br />
- <input
- type='radio'
- id='userEnableRecovery'
- name='userEnableRecovery'
- value='1'
- <?php echo ( $_["recoveryEnabledForUser"] ? 'checked="checked"' : '' ); ?> />
- <label for="userEnableRecovery"><?php p( $l->t( "Enabled" ) ); ?></label>
- <br />
-
- <input
- type='radio'
- id='userDisableRecovery'
- name='userEnableRecovery'
- value='0'
- <?php echo ( $_["recoveryEnabledForUser"] === false ? 'checked="checked"' : '' ); ?> />
- <label for="userDisableRecovery"><?php p( $l->t( "Disabled" ) ); ?></label>
- </p>
- <?php endif; ?>
-</form>
+<?php
+ /** @var array $_ */
+ /** @var OC_L10N $l */
+script('encryption', 'settings-personal');
+script('core', 'multiselect');
+?>
+<form id="encryption" class="section">
+ <h2><?php p($l->t('ownCloud basic encryption module')); ?></h2>
+
+ <?php if ($_["initialized"] === \OCA\Encryption\Session::NOT_INITIALIZED ): ?>
+
+ <?php p($l->t("Encryption App is enabled but your keys are not initialized, please log-out and log-in again")); ?>
+
+ <?php elseif ( $_["initialized"] === \OCA\Encryption\Session::INIT_EXECUTED ): ?>
+ <p>
+ <a name="changePKPasswd" />
+ <label for="changePrivateKeyPasswd">
+ <em><?php p( $l->t( "Your private key password no longer matches your log-in password." ) ); ?></em>
+ </label>
+ <br />
+ <?php p( $l->t( "Set your old private key password to your current log-in password:" ) ); ?>
+ <?php if ( $_["recoveryEnabledForUser"] ):
+ p( $l->t( " If you don't remember your old password you can ask your administrator to recover your files." ) );
+ endif; ?>
+ <br />
+ <input
+ type="password"
+ name="changePrivateKeyPassword"
+ id="oldPrivateKeyPassword" />
+ <label for="oldPrivateKeyPassword"><?php p($l->t( "Old log-in password" )); ?></label>
+ <br />
+ <input
+ type="password"
+ name="changePrivateKeyPassword"
+ id="newPrivateKeyPassword" />
+ <label for="newRecoveryPassword"><?php p($l->t( "Current log-in password" )); ?></label>
+ <br />
+ <button
+ type="button"
+ name="submitChangePrivateKeyPassword"
+ disabled><?php p($l->t( "Update Private Key Password" )); ?>
+ </button>
+ <span class="msg"></span>
+ </p>
+
+ <?php elseif ( $_["recoveryEnabled"] && $_["privateKeySet"] && $_["initialized"] === \OCA\Encryption\Session::INIT_SUCCESSFUL ): ?>
+ <br />
+ <p id="userEnableRecovery">
+ <label for="userEnableRecovery"><?php p( $l->t( "Enable password recovery:" ) ); ?></label>
+ <span class="msg"></span>
+ <br />
+ <em><?php p( $l->t( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" ) ); ?></em>
+ <br />
+ <input
+ type='radio'
+ id='userEnableRecovery'
+ name='userEnableRecovery'
+ value='1'
+ <?php echo ( $_["recoveryEnabledForUser"] ? 'checked="checked"' : '' ); ?> />
+ <label for="userEnableRecovery"><?php p( $l->t( "Enabled" ) ); ?></label>
+ <br />
+
+ <input
+ type='radio'
+ id='userDisableRecovery'
+ name='userEnableRecovery'
+ value='0'
+ <?php echo ( $_["recoveryEnabledForUser"] === false ? 'checked="checked"' : '' ); ?> />
+ <label for="userDisableRecovery"><?php p( $l->t( "Disabled" ) ); ?></label>
+ </p>
+ <?php endif; ?>
+</form>
diff --git a/apps/encryption/tests/hooks/UserHooksTest.php b/apps/encryption/tests/hooks/UserHooksTest.php
new file mode 100644
index 00000000000..1d76e3ba1a2
--- /dev/null
+++ b/apps/encryption/tests/hooks/UserHooksTest.php
@@ -0,0 +1,217 @@
+<?php
+/**
+ * @author Clark Tomlinson <clark@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ */
+
+
+
+namespace OCA\Encryption\Tests\Hooks;
+
+
+use OCA\Encryption\Hooks\UserHooks;
+use Test\TestCase;
+
+class UserHooksTest extends TestCase {
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $utilMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $recoveryMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $sessionMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $keyManagerMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $userSetupMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $userSessionMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $cryptMock;
+ /**
+ * @var UserHooks
+ */
+ private $instance;
+
+ private $params = ['uid' => 'testUser', 'password' => 'password'];
+
+ public function testLogin() {
+ $this->userSetupMock->expects($this->exactly(2))
+ ->method('setupUser')
+ ->willReturnOnConsecutiveCalls(true, false);
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('init')
+ ->with('testUser', 'password');
+
+ $this->assertNull($this->instance->login($this->params));
+ $this->assertFalse($this->instance->login($this->params));
+ }
+
+ public function testLogout() {
+ $this->sessionMock->expects($this->once())
+ ->method('clear');
+
+ $this->assertNull($this->instance->logout());
+ }
+
+ public function testPostCreateUser() {
+ $this->userSetupMock->expects($this->once())
+ ->method('setupUser');
+
+ $this->assertNull($this->instance->postCreateUser($this->params));
+ }
+
+ public function testPostDeleteUser() {
+ $this->keyManagerMock->expects($this->once())
+ ->method('deletePublicKey')
+ ->with('testUser');
+
+ $this->assertNull($this->instance->postDeleteUser($this->params));
+ }
+
+ public function testPreSetPassphrase() {
+ $this->userSessionMock->expects($this->once())
+ ->method('canChangePassword');
+
+ $this->assertNull($this->instance->preSetPassphrase($this->params));
+ }
+
+ public function testSetPassphrase() {
+ $this->sessionMock->expects($this->exactly(4))
+ ->method('getPrivateKey')
+ ->willReturnOnConsecutiveCalls(true, false);
+
+ $this->cryptMock->expects($this->exactly(4))
+ ->method('symmetricEncryptFileContent')
+ ->willReturn(true);
+
+ $this->keyManagerMock->expects($this->exactly(4))
+ ->method('setPrivateKey');
+
+ $this->assertNull($this->instance->setPassphrase($this->params));
+ $this->params['recoveryPassword'] = 'password';
+
+ $this->recoveryMock->expects($this->exactly(3))
+ ->method('isRecoveryEnabledForUser')
+ ->with('testUser')
+ ->willReturnOnConsecutiveCalls(true, false);
+
+
+ // Test first if statement
+ $this->assertNull($this->instance->setPassphrase($this->params));
+
+ // Test Second if conditional
+ $this->keyManagerMock->expects($this->exactly(2))
+ ->method('userHasKeys')
+ ->with('testUser')
+ ->willReturn(true);
+
+ $this->assertNull($this->instance->setPassphrase($this->params));
+
+ // Test third and final if condition
+ $this->utilMock->expects($this->once())
+ ->method('userHasFiles')
+ ->with('testUser')
+ ->willReturn(false);
+
+ $this->cryptMock->expects($this->once())
+ ->method('createKeyPair');
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('setPrivateKey');
+
+ $this->recoveryMock->expects($this->once())
+ ->method('recoverUsersFiles')
+ ->with('password', 'testUser');
+
+ $this->assertNull($this->instance->setPassphrase($this->params));
+ }
+
+ public function testPostPasswordReset() {
+ $this->keyManagerMock->expects($this->once())
+ ->method('replaceUserKeys')
+ ->with('testUser');
+
+ $this->userSetupMock->expects($this->once())
+ ->method('setupServerSide')
+ ->with('testUser', 'password');
+
+ $this->assertNull($this->instance->postPasswordReset($this->params));
+ }
+
+ protected function setUp() {
+ parent::setUp();
+ $loggerMock = $this->getMock('OCP\ILogger');
+ $this->keyManagerMock = $this->getMockBuilder('OCA\Encryption\KeyManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->userSetupMock = $this->getMockBuilder('OCA\Encryption\Users\Setup')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->userSessionMock = $this->getMockBuilder('OCP\IUserSession')
+ ->disableOriginalConstructor()
+ ->setMethods([
+ 'isLoggedIn',
+ 'getUID',
+ 'login',
+ 'logout',
+ 'setUser',
+ 'getUser',
+ 'canChangePassword'
+ ])
+ ->getMock();
+
+ $this->userSessionMock->expects($this->any())->method('getUID')->will($this->returnValue('testUser'));
+
+ $this->userSessionMock->expects($this->any())
+ ->method($this->anything())
+ ->will($this->returnSelf());
+
+ $utilMock = $this->getMockBuilder('OCA\Encryption\Util')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $sessionMock = $this->getMockBuilder('OCA\Encryption\Session')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $recoveryMock = $this->getMockBuilder('OCA\Encryption\Recovery')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->sessionMock = $sessionMock;
+ $this->recoveryMock = $recoveryMock;
+ $this->utilMock = $utilMock;
+ $this->instance = new UserHooks($this->keyManagerMock,
+ $loggerMock,
+ $this->userSetupMock,
+ $this->userSessionMock,
+ $this->utilMock,
+ $this->sessionMock,
+ $this->cryptMock,
+ $this->recoveryMock
+ );
+
+ }
+
+}
diff --git a/apps/encryption/tests/lib/HookManagerTest.php b/apps/encryption/tests/lib/HookManagerTest.php
new file mode 100644
index 00000000000..3da0bafb691
--- /dev/null
+++ b/apps/encryption/tests/lib/HookManagerTest.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption\Tests;
+
+
+use OCA\Encryption\HookManager;
+use Test\TestCase;
+
+class HookManagerTest extends TestCase {
+
+ /**
+ * @var HookManager
+ */
+ private static $instance;
+
+ /**
+ *
+ */
+ public function testRegisterHookWithArray() {
+ self::$instance->registerHook([
+ $this->getMockBuilder('OCA\Encryption\Hooks\Contracts\IHook')->disableOriginalConstructor()->getMock(),
+ $this->getMockBuilder('OCA\Encryption\Hooks\Contracts\IHook')->disableOriginalConstructor()->getMock(),
+ $this->getMock('NotIHook')
+ ]);
+
+ $hookInstances = \Test_Helper::invokePrivate(self::$instance, 'hookInstances');
+ // Make sure our type checking works
+ $this->assertCount(2, $hookInstances);
+ }
+
+
+ /**
+ *
+ */
+ public static function setUpBeforeClass() {
+ parent::setUpBeforeClass();
+ // have to make instance static to preserve data between tests
+ self::$instance = new HookManager();
+
+ }
+
+ /**
+ *
+ */
+ public function testRegisterHooksWithInstance() {
+ $mock = $this->getMockBuilder('OCA\Encryption\Hooks\Contracts\IHook')->disableOriginalConstructor()->getMock();
+ self::$instance->registerHook($mock);
+
+ $hookInstances = \Test_Helper::invokePrivate(self::$instance, 'hookInstances');
+ $this->assertCount(3, $hookInstances);
+
+ }
+
+}
diff --git a/apps/encryption/tests/lib/KeyManagerTest.php b/apps/encryption/tests/lib/KeyManagerTest.php
new file mode 100644
index 00000000000..1e51341a7e4
--- /dev/null
+++ b/apps/encryption/tests/lib/KeyManagerTest.php
@@ -0,0 +1,300 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Tests;
+
+
+use OCA\Encryption\KeyManager;
+use Test\TestCase;
+
+class KeyManagerTest extends TestCase {
+ /**
+ * @var KeyManager
+ */
+ private $instance;
+ /**
+ * @var string
+ */
+ private $userId;
+
+ /** @var string */
+ private $systemKeyId;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $keyStorageMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $cryptMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $userMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $sessionMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $logMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $utilMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $configMock;
+
+ public function setUp() {
+ parent::setUp();
+ $this->userId = 'user1';
+ $this->systemKeyId = 'systemKeyId';
+ $this->keyStorageMock = $this->getMock('OCP\Encryption\Keys\IStorage');
+ $this->cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->configMock = $this->getMock('OCP\IConfig');
+ $this->configMock->expects($this->any())
+ ->method('getAppValue')
+ ->willReturn($this->systemKeyId);
+ $this->userMock = $this->getMock('OCP\IUserSession');
+ $this->sessionMock = $this->getMockBuilder('OCA\Encryption\Session')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->logMock = $this->getMock('OCP\ILogger');
+ $this->utilMock = $this->getMockBuilder('OCA\Encryption\Util')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->instance = new KeyManager(
+ $this->keyStorageMock,
+ $this->cryptMock,
+ $this->configMock,
+ $this->userMock,
+ $this->sessionMock,
+ $this->logMock,
+ $this->utilMock);
+ }
+
+ public function testDeleteShareKey() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('deleteFileKey')
+ ->with($this->equalTo('/path'), $this->equalTo('keyId.shareKey'))
+ ->willReturn(true);
+
+ $this->assertTrue(
+ $this->instance->deleteShareKey('/path', 'keyId')
+ );
+ }
+
+ public function testGetPrivateKey() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('getUserKey')
+ ->with($this->equalTo($this->userId), $this->equalTo('privateKey'))
+ ->willReturn('privateKey');
+
+
+ $this->assertSame('privateKey',
+ $this->instance->getPrivateKey($this->userId)
+ );
+ }
+
+ public function testGetPublicKey() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('getUserKey')
+ ->with($this->equalTo($this->userId), $this->equalTo('publicKey'))
+ ->willReturn('publicKey');
+
+
+ $this->assertSame('publicKey',
+ $this->instance->getPublicKey($this->userId)
+ );
+ }
+
+ public function testRecoveryKeyExists() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('getSystemUserKey')
+ ->with($this->equalTo($this->systemKeyId . '.publicKey'))
+ ->willReturn('recoveryKey');
+
+
+ $this->assertTrue($this->instance->recoveryKeyExists());
+ }
+
+ public function testCheckRecoveryKeyPassword() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('getSystemUserKey')
+ ->with($this->equalTo($this->systemKeyId . '.privateKey'))
+ ->willReturn('recoveryKey');
+ $this->cryptMock->expects($this->any())
+ ->method('decryptPrivateKey')
+ ->with($this->equalTo('recoveryKey'), $this->equalTo('pass'))
+ ->willReturn('decryptedRecoveryKey');
+
+ $this->assertTrue($this->instance->checkRecoveryPassword('pass'));
+ }
+
+ public function testSetPublicKey() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('setUserKey')
+ ->with(
+ $this->equalTo($this->userId),
+ $this->equalTo('publicKey'),
+ $this->equalTo('key'))
+ ->willReturn(true);
+
+
+ $this->assertTrue(
+ $this->instance->setPublicKey($this->userId, 'key')
+ );
+ }
+
+ public function testSetPrivateKey() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('setUserKey')
+ ->with(
+ $this->equalTo($this->userId),
+ $this->equalTo('privateKey'),
+ $this->equalTo('key'))
+ ->willReturn(true);
+
+
+ $this->assertTrue(
+ $this->instance->setPrivateKey($this->userId, 'key')
+ );
+ }
+
+ public function testUserHasKeys() {
+ $this->keyStorageMock->expects($this->exactly(2))
+ ->method('getUserKey')
+ ->with($this->equalTo($this->userId), $this->anything())
+ ->willReturn('key');
+
+
+ $this->assertTrue(
+ $this->instance->userHasKeys($this->userId)
+ );
+ }
+
+ public function testInit() {
+ $this->keyStorageMock->expects($this->any())
+ ->method('getUserKey')
+ ->with($this->equalTo($this->userId), $this->equalTo('privateKey'))
+ ->willReturn('privateKey');
+ $this->cryptMock->expects($this->any())
+ ->method('decryptPrivateKey')
+ ->with($this->equalTo('privateKey'), $this->equalTo('pass'))
+ ->willReturn('decryptedPrivateKey');
+
+
+ $this->assertTrue(
+ $this->instance->init($this->userId, 'pass')
+ );
+
+ }
+
+ public function testSetRecoveryKey() {
+ $this->keyStorageMock->expects($this->exactly(2))
+ ->method('setSystemUserKey')
+ ->willReturn(true);
+ $this->cryptMock->expects($this->any())
+ ->method('symmetricEncryptFileContent')
+ ->with($this->equalTo('privateKey'), $this->equalTo('pass'))
+ ->willReturn('decryptedPrivateKey');
+
+
+ $this->assertTrue(
+ $this->instance->setRecoveryKey('pass',
+ array('publicKey' => 'publicKey', 'privateKey' => 'privateKey'))
+ );
+ }
+
+ public function testSetSystemPrivateKey() {
+ $this->keyStorageMock->expects($this->exactly(1))
+ ->method('setSystemUserKey')
+ ->with($this->equalTo('keyId.privateKey'), $this->equalTo('key'))
+ ->willReturn(true);
+
+
+ $this->assertTrue(
+ $this->instance->setSystemPrivateKey('keyId', 'key')
+ );
+ }
+
+ public function testGetSystemPrivateKey() {
+ $this->keyStorageMock->expects($this->exactly(1))
+ ->method('getSystemUserKey')
+ ->with($this->equalTo('keyId.privateKey'))
+ ->willReturn('systemPrivateKey');
+
+
+ $this->assertSame('systemPrivateKey',
+ $this->instance->getSystemPrivateKey('keyId')
+ );
+ }
+
+ public function testGetEncryptedFileKey() {
+ $this->keyStorageMock->expects($this->once())
+ ->method('getFileKey')
+ ->with('/', 'fileKey')
+ ->willReturn(true);
+
+ $this->assertTrue($this->instance->getEncryptedFileKey('/'));
+ }
+
+ public function testGetFileKey() {
+ $this->keyStorageMock->expects($this->exactly(4))
+ ->method('getFileKey')
+ ->willReturn(true);
+
+ $this->keyStorageMock->expects($this->once())
+ ->method('getSystemUserKey')
+ ->willReturn(true);
+
+ $this->cryptMock->expects($this->once())
+ ->method('symmetricDecryptFileContent')
+ ->willReturn(true);
+
+ $this->cryptMock->expects($this->once())
+ ->method('multiKeyDecrypt')
+ ->willReturn(true);
+
+ $this->assertTrue($this->instance->getFileKey('/', null));
+ $this->assertEmpty($this->instance->getFileKey('/', $this->userId));
+ }
+
+ public function testDeletePrivateKey() {
+ $this->keyStorageMock->expects($this->once())
+ ->method('deleteUserKey')
+ ->with('user1', 'privateKey')
+ ->willReturn(true);
+
+ $this->assertTrue(\Test_Helper::invokePrivate($this->instance,
+ 'deletePrivateKey',
+ [$this->userId]));
+ }
+
+ public function testDeleteAllFileKeys() {
+ $this->keyStorageMock->expects($this->once())
+ ->method('deleteAllFileKeys')
+ ->willReturn(true);
+
+ $this->assertTrue($this->instance->deleteAllFileKeys('/'));
+ }
+}
diff --git a/apps/encryption/tests/lib/RecoveryTest.php b/apps/encryption/tests/lib/RecoveryTest.php
new file mode 100644
index 00000000000..b3fd403949c
--- /dev/null
+++ b/apps/encryption/tests/lib/RecoveryTest.php
@@ -0,0 +1,265 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption\Tests;
+
+
+use OCA\Encryption\Recovery;
+use Test\TestCase;
+
+class RecoveryTest extends TestCase {
+ private static $tempStorage = [];
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $fileMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $viewMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $userSessionMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $keyManagerMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $configMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $cryptMock;
+ /**
+ * @var Recovery
+ */
+ private $instance;
+
+ public function testEnableAdminRecovery() {
+ $this->keyManagerMock->expects($this->exactly(2))
+ ->method('recoveryKeyExists')
+ ->willReturnOnConsecutiveCalls(false, true);
+
+ $this->cryptMock->expects($this->once())
+ ->method('createKeyPair')
+ ->willReturn(true);
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('setRecoveryKey')
+ ->willReturn(false);
+
+ $this->keyManagerMock->expects($this->exactly(2))
+ ->method('checkRecoveryPassword')
+ ->willReturnOnConsecutiveCalls(true, false);
+
+ $this->assertTrue($this->instance->enableAdminRecovery('password'));
+ $this->assertArrayHasKey('recoveryAdminEnabled', self::$tempStorage);
+ $this->assertEquals(1, self::$tempStorage['recoveryAdminEnabled']);
+
+ $this->assertFalse($this->instance->enableAdminRecovery('password'));
+ }
+
+ public function testChangeRecoveryKeyPassword() {
+ $this->assertFalse($this->instance->changeRecoveryKeyPassword('password',
+ 'passwordOld'));
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('getSystemPrivateKey');
+
+ $this->cryptMock->expects($this->once())
+ ->method('decryptPrivateKey');
+
+ $this->cryptMock->expects($this->once())
+ ->method('symmetricEncryptFileContent')
+ ->willReturn(true);
+
+ $this->assertTrue($this->instance->changeRecoveryKeyPassword('password',
+ 'passwordOld'));
+ }
+
+ public function testDisableAdminRecovery() {
+
+ $this->keyManagerMock->expects($this->exactly(2))
+ ->method('checkRecoveryPassword')
+ ->willReturnOnConsecutiveCalls(true, false);
+
+ $this->assertArrayHasKey('recoveryAdminEnabled', self::$tempStorage);
+ $this->assertTrue($this->instance->disableAdminRecovery('password'));
+ $this->assertEquals(0, self::$tempStorage['recoveryAdminEnabled']);
+
+ $this->assertFalse($this->instance->disableAdminRecovery('password'));
+ }
+
+ public function testIsRecoveryEnabledForUser() {
+
+ $this->configMock->expects($this->exactly(2))
+ ->method('getUserValue')
+ ->willReturnOnConsecutiveCalls('1', '0');
+
+ $this->assertTrue($this->instance->isRecoveryEnabledForUser());
+ $this->assertFalse($this->instance->isRecoveryEnabledForUser('admin'));
+ }
+
+ public function testIsRecoveryKeyEnabled() {
+ $this->assertFalse($this->instance->isRecoveryKeyEnabled());
+ self::$tempStorage['recoveryAdminEnabled'] = '1';
+ $this->assertTrue($this->instance->isRecoveryKeyEnabled());
+ }
+
+ public function testSetRecoveryFolderForUser() {
+ $this->viewMock->expects($this->exactly(2))
+ ->method('getDirectoryContent')
+ ->willReturn([]);
+ $this->assertTrue($this->instance->setRecoveryForUser(0));
+ $this->assertTrue($this->instance->setRecoveryForUser('1'));
+ }
+
+ public function testRecoverUserFiles() {
+ $this->viewMock->expects($this->once())
+ ->method('getDirectoryContent')
+ ->willReturn([]);
+
+ $this->cryptMock->expects($this->once())
+ ->method('decryptPrivateKey');
+ $this->assertNull($this->instance->recoverUsersFiles('password',
+ 'admin'));
+ }
+
+ public function testRecoverFile() {
+ $this->keyManagerMock->expects($this->once())
+ ->method('getEncryptedFileKey')
+ ->willReturn(true);
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('getShareKey')
+ ->willReturn(true);
+
+ $this->cryptMock->expects($this->once())
+ ->method('multiKeyDecrypt')
+ ->willReturn(true);
+
+ $this->fileMock->expects($this->once())
+ ->method('getAccessList')
+ ->willReturn(['users' => ['admin']]);
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('getPublicKey')
+ ->willReturn('publicKey');
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('addSystemKeys')
+ ->willReturn(['admin' => 'publicKey']);
+
+
+ $this->cryptMock->expects($this->once())
+ ->method('multiKeyEncrypt');
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('setAllFileKeys');
+
+ $this->assertNull(\Test_Helper::invokePrivate($this->instance,
+ 'recoverFile',
+ ['/', 'testkey']));
+ }
+
+ protected function setUp() {
+ parent::setUp();
+
+
+ $this->userSessionMock = $this->getMockBuilder('OCP\IUserSession')
+ ->disableOriginalConstructor()
+ ->setMethods([
+ 'isLoggedIn',
+ 'getUID',
+ 'login',
+ 'logout',
+ 'setUser',
+ 'getUser'
+ ])
+ ->getMock();
+
+ $this->userSessionMock->expects($this->any())->method('getUID')->will($this->returnValue('admin'));
+
+ $this->userSessionMock->expects($this->any())
+ ->method($this->anything())
+ ->will($this->returnSelf());
+
+ $this->cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt')->disableOriginalConstructor()->getMock();
+ $randomMock = $this->getMock('OCP\Security\ISecureRandom');
+ $this->keyManagerMock = $this->getMockBuilder('OCA\Encryption\KeyManager')->disableOriginalConstructor()->getMock();
+ $this->configMock = $this->getMock('OCP\IConfig');
+ $keyStorageMock = $this->getMock('OCP\Encryption\Keys\IStorage');
+ $this->fileMock = $this->getMock('OCP\Encryption\IFile');
+ $this->viewMock = $this->getMock('OC\Files\View');
+
+ $this->configMock->expects($this->any())
+ ->method('setAppValue')
+ ->will($this->returnCallback([$this, 'setValueTester']));
+
+ $this->configMock->expects($this->any())
+ ->method('getAppValue')
+ ->will($this->returnCallback([$this, 'getValueTester']));
+
+ $this->instance = new Recovery($this->userSessionMock,
+ $this->cryptMock,
+ $randomMock,
+ $this->keyManagerMock,
+ $this->configMock,
+ $keyStorageMock,
+ $this->fileMock,
+ $this->viewMock);
+ }
+
+
+ /**
+ * @param $app
+ * @param $key
+ * @param $value
+ */
+ public function setValueTester($app, $key, $value) {
+ self::$tempStorage[$key] = $value;
+ }
+
+ /**
+ * @param $key
+ */
+ public function removeValueTester($key) {
+ unset(self::$tempStorage[$key]);
+ }
+
+ /**
+ * @param $app
+ * @param $key
+ * @return mixed
+ */
+ public function getValueTester($app, $key) {
+ if (!empty(self::$tempStorage[$key])) {
+ return self::$tempStorage[$key];
+ }
+ return null;
+ }
+
+
+}
diff --git a/apps/encryption/tests/lib/SessionTest.php b/apps/encryption/tests/lib/SessionTest.php
new file mode 100644
index 00000000000..e036c439939
--- /dev/null
+++ b/apps/encryption/tests/lib/SessionTest.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Tests;
+
+
+use OCA\Encryption\Session;
+use Test\TestCase;
+
+class SessionTest extends TestCase {
+ private static $tempStorage = [];
+ /**
+ * @var Session
+ */
+ private $instance;
+ private $sessionMock;
+
+ /**
+ * @expectedException \OCA\Encryption\Exceptions\PrivateKeyMissingException
+ * @expectedExceptionMessage Private Key missing for user: please try to log-out and log-in again
+ */
+ public function testThatGetPrivateKeyThrowsExceptionWhenNotSet() {
+ $this->instance->getPrivateKey();
+ }
+
+ /**
+ * @depends testThatGetPrivateKeyThrowsExceptionWhenNotSet
+ */
+ public function testSetAndGetPrivateKey() {
+ $this->instance->setPrivateKey('dummyPrivateKey');
+ $this->assertEquals('dummyPrivateKey', $this->instance->getPrivateKey());
+
+ }
+
+ /**
+ * @depends testSetAndGetPrivateKey
+ */
+ public function testIsPrivateKeySet() {
+ $this->assertTrue($this->instance->isPrivateKeySet());
+
+ unset(self::$tempStorage['privateKey']);
+ $this->assertFalse($this->instance->isPrivateKeySet());
+
+ // Set private key back so we can test clear method
+ self::$tempStorage['privateKey'] = 'dummyPrivateKey';
+ }
+
+ /**
+ *
+ */
+ public function testSetAndGetStatusWillSetAndReturn() {
+ // Check if get status will return 0 if it has not been set before
+ $this->assertEquals(0, $this->instance->getStatus());
+
+ $this->instance->setStatus(Session::NOT_INITIALIZED);
+ $this->assertEquals(0, $this->instance->getStatus());
+
+ $this->instance->setStatus(Session::INIT_EXECUTED);
+ $this->assertEquals(1, $this->instance->getStatus());
+
+ $this->instance->setStatus(Session::INIT_SUCCESSFUL);
+ $this->assertEquals(2, $this->instance->getStatus());
+ }
+
+ /**
+ * @param $key
+ * @param $value
+ */
+ public function setValueTester($key, $value) {
+ self::$tempStorage[$key] = $value;
+ }
+
+ /**
+ * @param $key
+ */
+ public function removeValueTester($key) {
+ unset(self::$tempStorage[$key]);
+ }
+
+ /**
+ * @param $key
+ * @return mixed
+ */
+ public function getValueTester($key) {
+ if (!empty(self::$tempStorage[$key])) {
+ return self::$tempStorage[$key];
+ }
+ return null;
+ }
+
+ /**
+ *
+ */
+ public function testClearWillRemoveValues() {
+ $this->instance->clear();
+ $this->assertEmpty(self::$tempStorage);
+ }
+
+ /**
+ *
+ */
+ protected function setUp() {
+ parent::setUp();
+ $this->sessionMock = $this->getMock('OCP\ISession');
+
+ $this->sessionMock->expects($this->any())
+ ->method('set')
+ ->will($this->returnCallback([$this, "setValueTester"]));
+
+ $this->sessionMock->expects($this->any())
+ ->method('get')
+ ->will($this->returnCallback([$this, "getValueTester"]));
+
+ $this->sessionMock->expects($this->any())
+ ->method('remove')
+ ->will($this->returnCallback([$this, "removeValueTester"]));
+
+
+ $this->instance = new Session($this->sessionMock);
+ }
+}
diff --git a/apps/encryption/tests/lib/UtilTest.php b/apps/encryption/tests/lib/UtilTest.php
new file mode 100644
index 00000000000..5f086a8e475
--- /dev/null
+++ b/apps/encryption/tests/lib/UtilTest.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption\Tests;
+
+
+use OCA\Encryption\Util;
+use Test\TestCase;
+
+class UtilTest extends TestCase {
+ private static $tempStorage = [];
+ private $configMock;
+ private $filesMock;
+ /**
+ * @var Util
+ */
+ private $instance;
+
+ public function testSetRecoveryForUser() {
+ $this->instance->setRecoveryForUser('1');
+ $this->assertArrayHasKey('recoveryEnabled', self::$tempStorage);
+ }
+
+ /**
+ *
+ */
+ public function testIsRecoveryEnabledForUser() {
+ $this->assertTrue($this->instance->isRecoveryEnabledForUser());
+
+ // Assert recovery will return default value if not set
+ unset(self::$tempStorage['recoveryEnabled']);
+ $this->assertEquals(0, $this->instance->isRecoveryEnabledForUser());
+ }
+
+ public function testUserHasFiles() {
+ $this->filesMock->expects($this->once())
+ ->method('file_exists')
+ ->will($this->returnValue(true));
+
+ $this->assertTrue($this->instance->userHasFiles('admin'));
+ }
+
+ protected function setUp() {
+ parent::setUp();
+ $this->filesMock = $this->getMock('OC\Files\View');
+
+ $cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $loggerMock = $this->getMock('OCP\ILogger');
+ $userSessionMock = $this->getMockBuilder('OCP\IUserSession')
+ ->disableOriginalConstructor()
+ ->setMethods([
+ 'isLoggedIn',
+ 'getUID',
+ 'login',
+ 'logout',
+ 'setUser',
+ 'getUser'
+ ])
+ ->getMock();
+
+ $userSessionMock->method('isLoggedIn')->will($this->returnValue(true));
+
+ $userSessionMock->method('getUID')->will($this->returnValue('admin'));
+
+ $userSessionMock->expects($this->any())
+ ->method($this->anything())
+ ->will($this->returnSelf());
+
+
+ $this->configMock = $configMock = $this->getMock('OCP\IConfig');
+
+ $this->configMock->expects($this->any())
+ ->method('getUserValue')
+ ->will($this->returnCallback([$this, 'getValueTester']));
+
+ $this->configMock->expects($this->any())
+ ->method('setUserValue')
+ ->will($this->returnCallback([$this, 'setValueTester']));
+
+ $this->instance = new Util($this->filesMock, $cryptMock, $loggerMock, $userSessionMock, $configMock);
+ }
+
+ /**
+ * @param $userId
+ * @param $app
+ * @param $key
+ * @param $value
+ */
+ public function setValueTester($userId, $app, $key, $value) {
+ self::$tempStorage[$key] = $value;
+ }
+
+ /**
+ * @param $userId
+ * @param $app
+ * @param $key
+ * @param $default
+ * @return mixed
+ */
+ public function getValueTester($userId, $app, $key, $default) {
+ if (!empty(self::$tempStorage[$key])) {
+ return self::$tempStorage[$key];
+ }
+ return $default ?: null;
+ }
+
+}
diff --git a/apps/encryption/tests/lib/crypto/encryptionTest.php b/apps/encryption/tests/lib/crypto/encryptionTest.php
new file mode 100644
index 00000000000..9e14a70ebb0
--- /dev/null
+++ b/apps/encryption/tests/lib/crypto/encryptionTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@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\Encryption\Tests\Crypto;
+
+use Test\TestCase;
+use OCA\Encryption\Crypto\Encryption;
+
+class EncryptionTest extends TestCase {
+
+ /** @var Encryption */
+ private $instance;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $keyManagerMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $cryptMock;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $utilMock;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->utilMock = $this->getMockBuilder('OCA\Encryption\Util')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->keyManagerMock = $this->getMockBuilder('OCA\Encryption\KeyManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->instance = new Encryption($this->cryptMock, $this->keyManagerMock, $this->utilMock);
+ }
+
+ /**
+ * @dataProvider dataProviderForTestGetPathToRealFile
+ */
+ public function testGetPathToRealFile($path, $expected) {
+ $this->assertSame($expected,
+ \Test_Helper::invokePrivate($this->instance, 'getPathToRealFile', array($path))
+ );
+ }
+
+ public function dataProviderForTestGetPathToRealFile() {
+ return array(
+ array('/user/files/foo/bar.txt', '/user/files/foo/bar.txt'),
+ array('/user/files/foo.txt', '/user/files/foo.txt'),
+ array('/user/files_versions/foo.txt.v543534', '/user/files/foo.txt'),
+ array('/user/files_versions/foo/bar.txt.v5454', '/user/files/foo/bar.txt'),
+ );
+ }
+
+
+} \ No newline at end of file
diff --git a/apps/encryption/tests/lib/users/SetupTest.php b/apps/encryption/tests/lib/users/SetupTest.php
new file mode 100644
index 00000000000..354de26253e
--- /dev/null
+++ b/apps/encryption/tests/lib/users/SetupTest.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.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\Encryption\Tests\Users;
+
+
+use OCA\Encryption\Users\Setup;
+use Test\TestCase;
+
+class SetupTest extends TestCase {
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $keyManagerMock;
+ /**
+ * @var \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $cryptMock;
+ /**
+ * @var Setup
+ */
+ private $instance;
+
+ public function testSetupServerSide() {
+ $this->keyManagerMock->expects($this->exactly(2))
+ ->method('userHasKeys')
+ ->with('admin')
+ ->willReturnOnConsecutiveCalls(true, false);
+
+ $this->assertTrue($this->instance->setupServerSide('admin',
+ 'password'));
+
+ $this->keyManagerMock->expects($this->once())
+ ->method('storeKeyPair')
+ ->with('admin', 'password')
+ ->willReturn(false);
+
+ $this->assertFalse($this->instance->setupServerSide('admin',
+ 'password'));
+ }
+
+ protected function setUp() {
+ parent::setUp();
+ $logMock = $this->getMock('OCP\ILogger');
+ $userSessionMock = $this->getMockBuilder('OCP\IUserSession')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->cryptMock = $this->getMockBuilder('OCA\Encryption\Crypto\Crypt')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->keyManagerMock = $this->getMockBuilder('OCA\Encryption\KeyManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->instance = new Setup($logMock,
+ $userSessionMock,
+ $this->cryptMock,
+ $this->keyManagerMock);
+ }
+
+}
diff --git a/apps/encryption_dummy/img/app.svg b/apps/encryption_dummy/img/app.svg
new file mode 100644
index 00000000000..1157c71c66e
--- /dev/null
+++ b/apps/encryption_dummy/img/app.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xml:space="preserve"
+ height="16px"
+ width="16px"
+ version="1.1"
+ y="0px"
+ x="0px"
+ viewBox="0 0 71 100"
+ id="svg2"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="app.svg"><metadata
+ id="metadata10"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs8" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1014"
+ id="namedview6"
+ showgrid="false"
+ inkscape:zoom="14.75"
+ inkscape:cx="-21.423729"
+ inkscape:cy="8"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" /><path
+ d="m8 1c-2.2091 0-4 1.7909-4 4v2h-1v7h10v-7h-1v-2c0-2.2091-1.791-4-4-4zm0 2c1.1046 0 2 0.89543 2 2v2h-4v-2c0-1.1046 0.8954-2 2-2z"
+ transform="matrix(6.25,0,0,6.25,-14.5,0)"
+ id="path4"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ style="fill:none"
+ d="m 3.0644068,10.508475 0,-3.4576275 0.4655371,0 0.465537,0 0.049537,-1.2033899 C 4.1094633,4.2818838 4.1578923,4.0112428 4.4962182,3.3259708 4.7075644,2.8978935 4.9002217,2.6327599 5.2605792,2.2740624 6.7855365,0.75613022 8.9920507,0.69157582 10.623172,2.1171729 c 0.384104,0.3357058 0.882069,1.0763131 1.054177,1.5678422 0.147302,0.4206856 0.262873,1.6086448 0.266436,2.7387137 l 0.002,0.6271187 0.508474,0 0.508475,0 0,3.4576275 0,3.457627 -4.9491527,0 -4.9491525,0 0,-3.457627 z M 10.065882,6.3559322 c -0.02012,-0.3822034 -0.04774,-0.7076271 -0.0614,-0.7231639 -0.013653,-0.015537 -0.024824,0.281921 -0.024824,0.661017 l 0,0.6892655 -1.9630041,0 -1.963004,0 -0.023717,-0.4576271 -0.023717,-0.4576271 -0.013279,0.4915254 -0.013279,0.4915255 2.0613978,0 2.0613972,0 -0.03657,-0.6949153 0,0 z M 6.5396275,3.7118644 C 6.648082,3.5720339 6.7197092,3.4576271 6.6987988,3.4576271 c -0.062956,0 -0.5835446,0.6841947 -0.5835446,0.7669359 0,0.042237 0.051116,0.00136 0.1135916,-0.090834 0.062475,-0.092195 0.2023271,-0.2820343 0.3107817,-0.4218648 z M 9.7498983,4.0169492 C 9.6961899,3.9144068 9.5352369,3.723769 9.392225,3.5933098 L 9.1322034,3.356111 9.3784249,3.6272081 c 0.1354218,0.1491033 0.2814105,0.3397411 0.3244192,0.4236394 0.043009,0.083898 0.093162,0.1525423 0.1114515,0.1525423 0.01829,0 -0.010689,-0.083898 -0.064397,-0.1864406 l 0,0 z M 7.3032896,3.1315382 C 7.2704731,3.0987216 6.877102,3.3089557 6.8306315,3.3841466 6.8091904,3.4188389 6.911918,3.3813452 7.0589148,3.300827 7.2059117,3.2203088 7.3158803,3.1441289 7.3032896,3.1315382 l 0,0 z"
+ id="path3007"
+ inkscape:connector-curvature="0"
+ transform="matrix(6.25,0,0,6.25,-14.5,0)" /></svg> \ No newline at end of file
diff --git a/apps/encryption_dummy/lib/dummymodule.php b/apps/encryption_dummy/lib/dummymodule.php
index 8ca9cd4f9af..8cec9dfaf4c 100644
--- a/apps/encryption_dummy/lib/dummymodule.php
+++ b/apps/encryption_dummy/lib/dummymodule.php
@@ -23,7 +23,9 @@
namespace OCA\Encryption_Dummy;
-class DummyModule implements \OCP\Encryption\IEncryptionModule {
+use OCP\Encryption\IEncryptionModule;
+
+class DummyModule implements IEncryptionModule {
/** @var boolean */
protected $isWriteOperation;
@@ -32,7 +34,7 @@ class DummyModule implements \OCP\Encryption\IEncryptionModule {
* @return string defining the technical unique id
*/
public function getId() {
- return "34876934";
+ return "OC_DUMMY_MODULE";
}
/**
@@ -104,17 +106,6 @@ class DummyModule implements \OCP\Encryption\IEncryptionModule {
}
/**
- * update encrypted file, e.g. give additional users access to the file
- *
- * @param string $path path to the file which should be updated
- * @param array $accessList who has access to the file contains the key 'users' and 'public'
- * @return boolean
- */
- public function update($path, $accessList) {
- return true;
- }
-
- /**
* should the file be encrypted or not
*
* @param string $path
@@ -142,4 +133,15 @@ class DummyModule implements \OCP\Encryption\IEncryptionModule {
return 6126;
}
-} \ No newline at end of file
+ /**
+ * update encrypted file, e.g. give additional users access to the file
+ *
+ * @param string $path path to the file which should be updated
+ * @param string $uid of the user who performs the operation
+ * @param array $accessList who has access to the file contains the key 'users' and 'public'
+ * @return boolean
+ */
+ public function update($path, $uid, $accessList) {
+ return true;
+ }
+}
diff --git a/apps/files/download.php b/apps/files/download.php
index 1af576051bd..c85051e0f4e 100644
--- a/apps/files/download.php
+++ b/apps/files/download.php
@@ -43,7 +43,7 @@ $ftype=\OC_Helper::getSecureMimeType(\OC\Files\Filesystem::getMimeType( $filenam
header('Content-Type:'.$ftype);
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
OCP\Response::disableCaching();
-header('Content-Length: '.\OC\Files\Filesystem::filesize($filename));
+OCP\Response::setContentLengthHeader(\OC\Files\Filesystem::filesize($filename));
OC_Util::obEnd();
\OC\Files\Filesystem::readfile( $filename );
diff --git a/apps/files/index.php b/apps/files/index.php
index cfc5b931e13..ea0fd0ce2fe 100644
--- a/apps/files/index.php
+++ b/apps/files/index.php
@@ -84,12 +84,6 @@ $config = \OC::$server->getConfig();
// mostly for the home storage's free space
$dirInfo = \OC\Files\Filesystem::getFileInfo('/', false);
$storageInfo=OC_Helper::getStorageInfo('/', $dirInfo);
-// if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code)
-$encryptionInitStatus = 2;
-if (OC_App::isEnabled('files_encryption')) {
- $session = new \OCA\Files_Encryption\Session(new \OC\Files\View('/'));
- $encryptionInitStatus = $session->getInitialized();
-}
$nav = new OCP\Template('files', 'appnavigation', '');
@@ -146,11 +140,9 @@ OCP\Util::addscript('files', 'keyboardshortcuts');
$tmpl = new OCP\Template('files', 'index', 'user');
$tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']);
$tmpl->assign('isPublic', false);
-$tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles());
$tmpl->assign("mailNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_mail_notification', 'no'));
$tmpl->assign("mailPublicNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_public_notification', 'no'));
$tmpl->assign("allowShareWithLink", $config->getAppValue('core', 'shareapi_allow_links', 'yes'));
-$tmpl->assign("encryptionInitStatus", $encryptionInitStatus);
$tmpl->assign('appNavigation', $nav);
$tmpl->assign('appContents', $contentItems);
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index e63c3cad52e..68e9315954f 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -120,28 +120,6 @@
}
},
- displayEncryptionWarning: function() {
-
- if (!OC.Notification.isHidden()) {
- return;
- }
-
- var encryptedFiles = $('#encryptedFiles').val();
- var initStatus = $('#encryptionInitStatus').val();
- if (initStatus === '0') { // enc not initialized, but should be
- OC.Notification.show(t('files', 'Encryption App is enabled but your keys are not initialized, please log-out and log-in again'));
- return;
- }
- if (initStatus === '1') { // encryption tried to init but failed
- OC.Notification.show(t('files', 'Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.'));
- return;
- }
- if (encryptedFiles === '1') {
- OC.Notification.show(t('files', 'Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.'));
- return;
- }
- },
-
/**
* Returns the download URL of the given file(s)
* @param filename string or array of file names to download
@@ -220,7 +198,6 @@
*/
initialize: function() {
Files.getMimeIcon.cache = {};
- Files.displayEncryptionWarning();
Files.bindKeyboardShortcuts(document, $);
// TODO: move file list related code (upload) to OCA.Files.FileList
diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js
index 953be33753c..60f4a8d0f87 100644
--- a/apps/files/l10n/az.js
+++ b/apps/files/l10n/az.js
@@ -102,6 +102,7 @@ OC.L10N.register(
"Folder" : "Qovluq",
"Upload" : "Serverə yüklə",
"Cancel upload" : "Yüklənməni dayandır",
+ "No files in here" : "Burda fayl yoxdur",
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json
index 5946ba45ca3..d6bac687732 100644
--- a/apps/files/l10n/az.json
+++ b/apps/files/l10n/az.json
@@ -100,6 +100,7 @@
"Folder" : "Qovluq",
"Upload" : "Serverə yüklə",
"Cancel upload" : "Yüklənməni dayandır",
+ "No files in here" : "Burda fayl yoxdur",
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index 84289c65679..b9dfbe23ab2 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -102,6 +102,7 @@ OC.L10N.register(
"Folder" : "Mappe",
"Upload" : "Upload",
"Cancel upload" : "Fortryd upload",
+ "No files in here" : "Her er ingen filer",
"Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index 5c6b681177b..3ba0f9abbd8 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -100,6 +100,7 @@
"Folder" : "Mappe",
"Upload" : "Upload",
"Cancel upload" : "Fortryd upload",
+ "No files in here" : "Her er ingen filer",
"Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!",
"No entries found in this folder" : "Der blev ikke fundet poster i denne mappe",
"Select all" : "Vælg alle",
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 18c6b327db8..242f2ad4d76 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -102,6 +102,7 @@ OC.L10N.register(
"Folder" : "Dossier",
"Upload" : "Chargement",
"Cancel upload" : "Annuler l'envoi",
+ "No files in here" : "Pas de fichier ici",
"Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 414cfc0a80a..76136495968 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -100,6 +100,7 @@
"Folder" : "Dossier",
"Upload" : "Chargement",
"Cancel upload" : "Annuler l'envoi",
+ "No files in here" : "Pas de fichier ici",
"Upload some content or sync with your devices!" : "Déposez du contenu ou synchronisez vos appareils !",
"No entries found in this folder" : "Aucune entrée trouvée dans ce dossier",
"Select all" : "Tout sélectionner",
diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js
index f9f966c1854..bc9893c708a 100644
--- a/apps/files/l10n/nb_NO.js
+++ b/apps/files/l10n/nb_NO.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Maksimum opplastingsstørrelse",
"max. possible: " : "max. mulige:",
"Save" : "Lagre",
+ "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres her pga. utilstrekkelige rettigheter.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>",
@@ -101,6 +102,7 @@ OC.L10N.register(
"Folder" : "Mappe",
"Upload" : "Last opp",
"Cancel upload" : "Avbryt opplasting",
+ "No files in here" : "Ingen filer her",
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json
index a4007782c2b..2c12b3ad0c5 100644
--- a/apps/files/l10n/nb_NO.json
+++ b/apps/files/l10n/nb_NO.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Maksimum opplastingsstørrelse",
"max. possible: " : "max. mulige:",
"Save" : "Lagre",
+ "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres her pga. utilstrekkelige rettigheter.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>",
@@ -99,6 +100,7 @@
"Folder" : "Mappe",
"Upload" : "Last opp",
"Cancel upload" : "Avbryt opplasting",
+ "No files in here" : "Ingen filer her",
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
"No entries found in this folder" : "Ingen oppføringer funnet i denne mappen",
"Select all" : "Velg alle",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index 8a62a6c9e18..7d23e67422b 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -101,6 +101,7 @@ OC.L10N.register(
"Folder" : "Pasta",
"Upload" : "Enviar",
"Cancel upload" : "Cancelar envio",
+ "No files in here" : "Nenhum arquivo aqui",
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index cf65eeccc23..17c69e0607d 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -99,6 +99,7 @@
"Folder" : "Pasta",
"Upload" : "Enviar",
"Cancel upload" : "Cancelar envio",
+ "No files in here" : "Nenhum arquivo aqui",
"Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!",
"No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta",
"Select all" : "Selecionar tudo",
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index 12dd8b94610..9abf025473b 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -91,6 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Največja velikost za pošiljanja",
"max. possible: " : "največ mogoče:",
"Save" : "Shrani",
+ "Can not be edited from here due to insufficient permissions." : "Predmeta ni mogoče urejati zaradi neustreznih dovoljenj.",
"Settings" : "Nastavitve",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.",
@@ -101,6 +102,7 @@ OC.L10N.register(
"Folder" : "Mapa",
"Upload" : "Pošlji",
"Cancel upload" : "Prekliči pošiljanje",
+ "No files in here" : "V mapi ni datotek",
"Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!",
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index 91f1b986cf7..ce8a63f6376 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -89,6 +89,7 @@
"Maximum upload size" : "Največja velikost za pošiljanja",
"max. possible: " : "največ mogoče:",
"Save" : "Shrani",
+ "Can not be edited from here due to insufficient permissions." : "Predmeta ni mogoče urejati zaradi neustreznih dovoljenj.",
"Settings" : "Nastavitve",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.",
@@ -99,6 +100,7 @@
"Folder" : "Mapa",
"Upload" : "Pošlji",
"Cancel upload" : "Prekliči pošiljanje",
+ "No files in here" : "V mapi ni datotek",
"Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!",
"No entries found in this folder" : "V tej mapi ni najdenih predmetov.",
"Select all" : "izberi vse",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 9c1485ecd79..75a1ad3b1c6 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -91,7 +91,7 @@ OC.L10N.register(
"Maximum upload size" : "Највећа величина отпремања",
"max. possible: " : "највише могуће:",
"Save" : "Сачувај",
- "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка права.",
+ "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.",
"Settings" : "Поставке",
"WebDAV" : "ВебДАВ",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Користите ову адресу да <a href=\"%s\" target=\"_blank\"> приступите фајловима преко ВебДАВ-а</a>",
@@ -102,6 +102,7 @@ OC.L10N.register(
"Folder" : "фасцикла",
"Upload" : "Отпреми",
"Cancel upload" : "Откажи отпремање",
+ "No files in here" : "Овде нема фајлова",
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index 5fa46bcea17..1384a2598dc 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -89,7 +89,7 @@
"Maximum upload size" : "Највећа величина отпремања",
"max. possible: " : "највише могуће:",
"Save" : "Сачувај",
- "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка права.",
+ "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.",
"Settings" : "Поставке",
"WebDAV" : "ВебДАВ",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Користите ову адресу да <a href=\"%s\" target=\"_blank\"> приступите фајловима преко ВебДАВ-а</a>",
@@ -100,6 +100,7 @@
"Folder" : "фасцикла",
"Upload" : "Отпреми",
"Cancel upload" : "Откажи отпремање",
+ "No files in here" : "Овде нема фајлова",
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
"No entries found in this folder" : "Нема ничега у овој фасцикли",
"Select all" : "Означи све",
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index a087772eb3d..add6d671a84 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -102,6 +102,7 @@ OC.L10N.register(
"Folder" : "Klasör",
"Upload" : "Yükle",
"Cancel upload" : "Yüklemeyi iptal et",
+ "No files in here" : "Burada hiç dosya yok",
"Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Select all" : "Tümünü seç",
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index 15aa96e7f55..9f16990140f 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -100,6 +100,7 @@
"Folder" : "Klasör",
"Upload" : "Yükle",
"Cancel upload" : "Yüklemeyi iptal et",
+ "No files in here" : "Burada hiç dosya yok",
"Upload some content or sync with your devices!" : "Bir şeyler yükleyin veya aygıtlarınızla eşitleyin!",
"No entries found in this folder" : "Bu klasörde hiçbir girdi bulunamadı",
"Select all" : "Tümünü seç",
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
index 8fd2b76f9c0..e6237c7f485 100644
--- a/apps/files/templates/appnavigation.php
+++ b/apps/files/templates/appnavigation.php
@@ -14,7 +14,7 @@
<h2>
<label for="webdavurl"><?php p($l->t('WebDAV'));?></label>
</h2>
- <input id="webdavurl" type="text" readonly="readonly" value="<?php p(OC_Helper::linkToRemote('webdav')); ?>" />
+ <input id="webdavurl" type="text" readonly="readonly" value="<?php p(\OCP\Util::linkToRemote('webdav')); ?>" />
<em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em>
</div>
</div>
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index 222a996aae3..77f80bc346d 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -12,8 +12,6 @@
<input type="hidden" name="filesApp" id="filesApp" value="1" />
<input type="hidden" name="usedSpacePercent" id="usedSpacePercent" value="<?php p($_['usedSpacePercent']); ?>" />
<?php if (!$_['isPublic']) :?>
-<input type="hidden" name="encryptedFiles" id="encryptedFiles" value="<?php $_['encryptedFiles'] ? p('1') : p('0'); ?>" />
-<input type="hidden" name="encryptedInitStatus" id="encryptionInitStatus" value="<?php p($_['encryptionInitStatus']) ?>" />
<input type="hidden" name="mailNotificationEnabled" id="mailNotificationEnabled" value="<?php p($_['mailNotificationEnabled']) ?>" />
<input type="hidden" name="mailPublicNotificationEnabled" id="mailPublicNotificationEnabled" value="<?php p($_['mailPublicNotificationEnabled']) ?>" />
<input type="hidden" name="allowShareWithLink" id="allowShareWithLink" value="<?php p($_['allowShareWithLink']) ?>" />
diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php
index 789177bb353..34e7f5085dd 100644
--- a/apps/files/tests/ajax_rename.php
+++ b/apps/files/tests/ajax_rename.php
@@ -38,21 +38,15 @@ class Test_OC_Files_App_Rename extends \Test\TestCase {
*/
private $files;
- private $originalStorage;
-
protected function setUp() {
parent::setUp();
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
-
// mock OC_L10n
if (!self::$user) {
self::$user = uniqid();
}
\OC_User::createUser(self::$user, 'password');
- \OC_User::setUserId(self::$user);
-
- \OC\Files\Filesystem::init(self::$user, '/' . self::$user . '/files');
+ $this->loginAsUser(self::$user);
$l10nMock = $this->getMock('\OC_L10N', array('t'), array(), '', false);
$l10nMock->expects($this->any())
@@ -72,9 +66,8 @@ class Test_OC_Files_App_Rename extends \Test\TestCase {
protected function tearDown() {
$result = \OC_User::deleteUser(self::$user);
$this->assertTrue($result);
- \OC\Files\Filesystem::tearDown();
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
+ $this->logout();
parent::tearDown();
}
diff --git a/apps/files/tests/controller/apicontrollertest.php b/apps/files/tests/controller/apicontrollertest.php
index 5d32a693ad3..bbab711310c 100644
--- a/apps/files/tests/controller/apicontrollertest.php
+++ b/apps/files/tests/controller/apicontrollertest.php
@@ -110,7 +110,7 @@ class ApiControllerTest extends TestCase {
[
'id' => null,
'parentId' => null,
- 'date' => 'January 1, 1970 at 12:00:55 AM GMT+0',
+ 'date' => \OCP\Util::formatDate(55),
'mtime' => 55000,
'icon' => \OCA\Files\Helper::determineIcon($fileInfo),
'name' => 'root.txt',
@@ -175,7 +175,7 @@ class ApiControllerTest extends TestCase {
[
'id' => null,
'parentId' => null,
- 'date' => 'January 1, 1970 at 12:00:55 AM GMT+0',
+ 'date' => \OCP\Util::formatDate(55),
'mtime' => 55000,
'icon' => \OCA\Files\Helper::determineIcon($fileInfo1),
'name' => 'root.txt',
@@ -194,7 +194,7 @@ class ApiControllerTest extends TestCase {
[
'id' => null,
'parentId' => null,
- 'date' => 'January 1, 1970 at 12:16:39 AM GMT+0',
+ 'date' => \OCP\Util::formatDate(999),
'mtime' => 999000,
'icon' => \OCA\Files\Helper::determineIcon($fileInfo2),
'name' => 'root.txt',
diff --git a/apps/files_encryption/ajax/adminrecovery.php b/apps/files_encryption/ajax/adminrecovery.php
deleted file mode 100644
index 1c13df8b885..00000000000
--- a/apps/files_encryption/ajax/adminrecovery.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Sam Tuke <mail@samtuke.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\Files_Encryption\Helper;
-
-\OCP\JSON::checkAdminUser();
-\OCP\JSON::checkAppEnabled('files_encryption');
-\OCP\JSON::callCheck();
-
-$l = \OC::$server->getL10N('files_encryption');
-
-$return = false;
-$errorMessage = $l->t("Unknown error");
-
-//check if both passwords are the same
-if (empty($_POST['recoveryPassword'])) {
- $errorMessage = $l->t('Missing recovery key password');
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
- exit();
-}
-
-if (empty($_POST['confirmPassword'])) {
- $errorMessage = $l->t('Please repeat the recovery key password');
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
- exit();
-}
-
-if ($_POST['recoveryPassword'] !== $_POST['confirmPassword']) {
- $errorMessage = $l->t('Repeated recovery key password does not match the provided recovery key password');
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
- exit();
-}
-
-// Enable recoveryAdmin
-$recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId');
-
-if (isset($_POST['adminEnableRecovery']) && $_POST['adminEnableRecovery'] === '1') {
-
- $return = Helper::adminEnableRecovery($recoveryKeyId, (string)$_POST['recoveryPassword']);
-
- // Return success or failure
- if ($return) {
- $successMessage = $l->t('Recovery key successfully enabled');
- } else {
- $errorMessage = $l->t('Could not disable recovery key. Please check your recovery key password!');
- }
-
-// Disable recoveryAdmin
-} elseif (
- isset($_POST['adminEnableRecovery'])
- && '0' === $_POST['adminEnableRecovery']
-) {
- $return = Helper::adminDisableRecovery((string)$_POST['recoveryPassword']);
-
- if ($return) {
- $successMessage = $l->t('Recovery key successfully disabled');
- } else {
- $errorMessage = $l->t('Could not disable recovery key. Please check your recovery key password!');
- }
-}
-
-// Return success or failure
-if ($return) {
- \OCP\JSON::success(array('data' => array('message' => $successMessage)));
-} else {
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
-}
diff --git a/apps/files_encryption/ajax/changeRecoveryPassword.php b/apps/files_encryption/ajax/changeRecoveryPassword.php
deleted file mode 100644
index 146c0c5c5dc..00000000000
--- a/apps/files_encryption/ajax/changeRecoveryPassword.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@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/>
- *
- */
-
-\OCP\JSON::checkAdminUser();
-\OCP\JSON::checkAppEnabled('files_encryption');
-\OCP\JSON::callCheck();
-
-$l = \OC::$server->getL10N('core');
-
-$return = false;
-
-$oldPassword = (string)$_POST['oldPassword'];
-$newPassword = (string)$_POST['newPassword'];
-$confirmPassword = (string)$_POST['confirmPassword'];
-
-//check if both passwords are the same
-if (empty($_POST['oldPassword'])) {
- $errorMessage = $l->t('Please provide the old recovery password');
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
- exit();
-}
-
-if (empty($_POST['newPassword'])) {
- $errorMessage = $l->t('Please provide a new recovery password');
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
- exit();
-}
-
-if (empty($_POST['confirmPassword'])) {
- $errorMessage = $l->t('Please repeat the new recovery password');
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
- exit();
-}
-
-if ($_POST['newPassword'] !== $_POST['confirmPassword']) {
- $errorMessage = $l->t('Repeated recovery key password does not match the provided recovery key password');
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
- exit();
-}
-
-$view = new \OC\Files\View('/');
-$util = new \OCA\Files_Encryption\Util(new \OC\Files\View('/'), \OCP\User::getUser());
-
-$proxyStatus = \OC_FileProxy::$enabled;
-\OC_FileProxy::$enabled = false;
-
-$keyId = $util->getRecoveryKeyId();
-
-$encryptedRecoveryKey = \OCA\Files_Encryption\Keymanager::getPrivateSystemKey($keyId);
-$decryptedRecoveryKey = $encryptedRecoveryKey ? \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedRecoveryKey, $oldPassword) : false;
-
-if ($decryptedRecoveryKey) {
- $cipher = \OCA\Files_Encryption\Helper::getCipher();
- $encryptedKey = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword, $cipher);
- if ($encryptedKey) {
- \OCA\Files_Encryption\Keymanager::setPrivateSystemKey($encryptedKey, $keyId);
- $return = true;
- }
-}
-
-\OC_FileProxy::$enabled = $proxyStatus;
-
-// success or failure
-if ($return) {
- \OCP\JSON::success(array('data' => array('message' => $l->t('Password successfully changed.'))));
-} else {
- \OCP\JSON::error(array('data' => array('message' => $l->t('Could not change the password. Maybe the old password was not correct.'))));
-}
diff --git a/apps/files_encryption/ajax/getMigrationStatus.php b/apps/files_encryption/ajax/getMigrationStatus.php
deleted file mode 100644
index e140a296f32..00000000000
--- a/apps/files_encryption/ajax/getMigrationStatus.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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\Files_Encryption\Util;
-
-\OCP\JSON::checkAppEnabled('files_encryption');
-
-$loginname = isset($_POST['user']) ? (string)$_POST['user'] : '';
-$password = isset($_POST['password']) ? (string)$_POST['password'] : '';
-
-$migrationStatus = Util::MIGRATION_COMPLETED;
-
-if ($loginname !== '' && $password !== '') {
- $username = \OCP\User::checkPassword($loginname, $password);
- if ($username) {
- $util = new Util(new \OC\Files\View('/'), $username);
- $migrationStatus = $util->getMigrationStatus();
- }
-}
-
-\OCP\JSON::success(array('data' => array('migrationStatus' => $migrationStatus)));
diff --git a/apps/files_encryption/ajax/updatePrivateKeyPassword.php b/apps/files_encryption/ajax/updatePrivateKeyPassword.php
deleted file mode 100644
index e5f2d654348..00000000000
--- a/apps/files_encryption/ajax/updatePrivateKeyPassword.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@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/>
- *
- */
-
-\OCP\JSON::checkLoggedIn();
-\OCP\JSON::checkAppEnabled('files_encryption');
-\OCP\JSON::callCheck();
-
-$l = \OC::$server->getL10N('core');
-
-$return = false;
-$errorMessage = $l->t('Could not update the private key password.');
-
-$oldPassword = (string)$_POST['oldPassword'];
-$newPassword = (string)$_POST['newPassword'];
-
-$view = new \OC\Files\View('/');
-$session = new \OCA\Files_Encryption\Session($view);
-$user = \OCP\User::getUser();
-$loginName = \OC::$server->getUserSession()->getLoginName();
-
-// check new password
-$passwordCorrect = \OCP\User::checkPassword($loginName, $newPassword);
-
-if ($passwordCorrect !== false) {
-
-$proxyStatus = \OC_FileProxy::$enabled;
-\OC_FileProxy::$enabled = false;
-
-$encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, $user);
-$decryptedKey = $encryptedKey ? \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, $oldPassword) : false;
-
-if ($decryptedKey) {
- $cipher = \OCA\Files_Encryption\Helper::getCipher();
- $encryptedKey = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($decryptedKey, $newPassword, $cipher);
- if ($encryptedKey) {
- \OCA\Files_Encryption\Keymanager::setPrivateKey($encryptedKey, $user);
- $session->setPrivateKey($decryptedKey);
- $return = true;
- }
-} else {
- $result = false;
- $errorMessage = $l->t('The old password was not correct, please try again.');
-}
-
-\OC_FileProxy::$enabled = $proxyStatus;
-
-} else {
- $result = false;
- $errorMessage = $l->t('The current log-in password was not correct, please try again.');
-}
-
-// success or failure
-if ($return) {
- $session->setInitialized(\OCA\Files_Encryption\Session::INIT_SUCCESSFUL);
- \OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.'))));
-} else {
- \OCP\JSON::error(array('data' => array('message' => $errorMessage)));
-}
diff --git a/apps/files_encryption/ajax/userrecovery.php b/apps/files_encryption/ajax/userrecovery.php
deleted file mode 100644
index a1145172f71..00000000000
--- a/apps/files_encryption/ajax/userrecovery.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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/>
- *
- */
-
-\OCP\JSON::checkLoggedIn();
-\OCP\JSON::checkAppEnabled('files_encryption');
-\OCP\JSON::callCheck();
-
-$l = \OC::$server->getL10N('files_encryption');
-
-if (
- isset($_POST['userEnableRecovery'])
- && (0 == $_POST['userEnableRecovery'] || '1' === $_POST['userEnableRecovery'])
-) {
-
- $userId = \OCP\USER::getUser();
- $view = new \OC\Files\View('/');
- $util = new \OCA\Files_Encryption\Util($view, $userId);
-
- // Save recovery preference to DB
- $return = $util->setRecoveryForUser((string)$_POST['userEnableRecovery']);
-
- if ($_POST['userEnableRecovery'] === '1') {
- $util->addRecoveryKeys();
- } else {
- $util->removeRecoveryKeys();
- }
-
-} else {
-
- $return = false;
-
-}
-
-// Return success or failure
-if ($return) {
- \OCP\JSON::success(array('data' => array('message' => $l->t('File recovery settings updated'))));
-} else {
- \OCP\JSON::error(array('data' => array('message' => $l->t('Could not update file recovery'))));
-}
diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php
deleted file mode 100644
index 5da8a3a7cb9..00000000000
--- a/apps/files_encryption/appinfo/app.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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/>
- *
- */
-\OCP\Util::addscript('files_encryption', 'encryption');
-\OCP\Util::addscript('files_encryption', 'detect-migration');
-
-if (!OC_Config::getValue('maintenance', false)) {
- OC_FileProxy::register(new OCA\Files_Encryption\Proxy());
-
- // User related hooks
- OCA\Files_Encryption\Helper::registerUserHooks();
-
- // Sharing related hooks
- OCA\Files_Encryption\Helper::registerShareHooks();
-
- // Filesystem related hooks
- OCA\Files_Encryption\Helper::registerFilesystemHooks();
-
- // App manager related hooks
- OCA\Files_Encryption\Helper::registerAppHooks();
-
- if(!in_array('crypt', stream_get_wrappers())) {
- stream_wrapper_register('crypt', 'OCA\Files_Encryption\Stream');
- }
-} else {
- // logout user if we are in maintenance to force re-login
- OCP\User::logout();
-}
-
-\OC::$server->getCommandBus()->requireSync('\OC\Command\FileAccess');
-
-// Register settings scripts
-OCP\App::registerAdmin('files_encryption', 'settings-admin');
-OCP\App::registerPersonal('files_encryption', 'settings-personal');
diff --git a/apps/files_encryption/appinfo/info.xml b/apps/files_encryption/appinfo/info.xml
deleted file mode 100644
index 7f7e09d6271..00000000000
--- a/apps/files_encryption/appinfo/info.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<info>
- <id>files_encryption</id>
- <name>Server-side Encryption</name>
- <description>
- This application encrypts all files accessed by ownCloud at rest, wherever they are stored. As an example, with this application enabled, external cloud based Amazon S3 storage will be encrypted, protecting this data on storage outside of the control of the Admin. When this application is enabled for the first time, all files are encrypted as users log in and are prompted for their password. The recommended recovery key option enables recovery of files in case the key is lost.
- Note that this app encrypts all files that are touched by ownCloud, so external storage providers and applications such as SharePoint will see new files encrypted when they are accessed. Encryption is based on AES 128 or 256 bit keys. More information is available in the Encryption documentation
- </description>
- <licence>AGPL</licence>
- <author>Sam Tuke, Bjoern Schiessle, Florin Peter</author>
- <requiremin>4</requiremin>
- <shipped>true</shipped>
- <documentation>
- <user>user-encryption</user>
- <admin>admin-encryption</admin>
- </documentation>
- <rememberlogin>false</rememberlogin>
- <types>
- <filesystem/>
- </types>
- <ocsid>166047</ocsid>
- <dependencies>
- <lib>openssl</lib>
- </dependencies>
-</info>
diff --git a/apps/files_encryption/appinfo/routes.php b/apps/files_encryption/appinfo/routes.php
deleted file mode 100644
index 8884ac3b6aa..00000000000
--- a/apps/files_encryption/appinfo/routes.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Tom Needham <tom@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/>
- *
- */
-
-/** @var $this \OCP\Route\IRouter */
-
-$this->create('files_encryption_ajax_adminrecovery', 'ajax/adminrecovery.php')
- ->actionInclude('files_encryption/ajax/adminrecovery.php');
-$this->create('files_encryption_ajax_changeRecoveryPassword', 'ajax/changeRecoveryPassword.php')
- ->actionInclude('files_encryption/ajax/changeRecoveryPassword.php');
-$this->create('files_encryption_ajax_getMigrationStatus', 'ajax/getMigrationStatus.php')
- ->actionInclude('files_encryption/ajax/getMigrationStatus.php');
-$this->create('files_encryption_ajax_updatePrivateKeyPassword', 'ajax/updatePrivateKeyPassword.php')
- ->actionInclude('files_encryption/ajax/updatePrivateKeyPassword.php');
-$this->create('files_encryption_ajax_userrecovery', 'ajax/userrecovery.php')
- ->actionInclude('files_encryption/ajax/userrecovery.php');
-
-// Register with the capabilities API
-OC_API::register('get', '/cloud/capabilities', array('OCA\Files_Encryption\Capabilities', 'getCapabilities'), 'files_encryption', OC_API::USER_AUTH);
diff --git a/apps/files_encryption/appinfo/spec.txt b/apps/files_encryption/appinfo/spec.txt
deleted file mode 100644
index ddd3983a9eb..00000000000
--- a/apps/files_encryption/appinfo/spec.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-Encrypted files
----------------
-
-- Each encrypted file has at least two components: the encrypted data file
- ('catfile'), and it's corresponding key file ('keyfile'). Shared files have an
- additional key file ('share key'). The catfile contains the encrypted data
- concatenated with delimiter text, followed by the initialisation vector ('IV'),
- and padding. e.g.:
-
- [encrypted data string][delimiter][IV][padding]
- [anhAAjAmcGXqj1X9g==][00iv00][MSHU5N5gECP7aAg7][xx] (square braces added)
-
-- Directory structure:
- - Encrypted user data (catfiles) are stored in the usual /data/user/files dir
- - Keyfiles are stored in /data/user/files_encryption/keyfiles
- - Sharekey are stored in /data/user/files_encryption/share-files
-
-- File extensions:
- - Catfiles have to keep the file extension of the original file, pre-encryption
- - Keyfiles use .keyfile
- - Sharekeys have .shareKey
-
-Shared files
-------------
-
-Shared files have a centrally stored catfile and keyfile, and one sharekey for
-each user that shares it.
-
-When sharing is used, a different encryption method is used to encrypt the
-keyfile (openssl_seal). Although shared files have a keyfile, its contents
-use a different format therefore.
-
-Each time a shared file is edited or deleted, all sharekeys for users sharing
-that file must have their sharekeys changed also. The keyfile and catfile
-however need only changing in the owners files, as there is only one copy of
-these.
-
-Publicly shared files (public links)
-------------------------------------
-
-Files shared via public links use a separate system user account called 'ownCloud'. All public files are shared to that user's public key, and the private key is used to access the files when the public link is used in browser.
-
-This means that files shared via public links are accessible only to users who know the shared URL, or to admins who know the 'ownCloud' user password.
-
-Lost password recovery
-----------------------
-
-In order to enable users to read their encrypted files in the event of a password loss/reset scenario, administrators can choose to enable a 'recoveryAdmin' account. This is a user that all user files will automatically be shared to of the option is enabled. This allows the recoveryAdmin user to generate new keyfiles for the user. By default the UID of the recoveryAdmin is 'recoveryAdmin'.
-
-OC_FilesystemView
------------------
-
-files_encryption deals extensively with paths and the filesystem. In order to minimise bugs, it makes calls to filesystem methods in a consistent way: OC_FilesystemView{} objects always use '/' as their root, and specify paths each time particular methods are called. e.g. do this:
-
-$view->file_exists( 'path/to/file' );
-
-Not:
-
-$view->chroot( 'path/to' );
-$view->file_exists( 'file' );
-
-Using this convention means that $view objects are more predictable and less likely to break. Problems with paths are the #1 cause of bugs in this app, and consistent $view handling is an important way to prevent them.
-
-Notes
------
-
-- The user passphrase is required in order to set up or upgrade the app. New
- keypair generation, and the re-encryption of legacy encrypted files requires
- it. Therefore an appinfo/update.php script cannot be used, and upgrade logic
- is handled in the login hook listener. Therefore each time the user logs in
- their files are scanned to detect unencrypted and legacy encrypted files, and
- they are (re)encrypted as necessary. This may present a performance issue; we
- need to monitor this.
-- When files are saved to ownCloud via WebDAV, a .part file extension is used so
- that the file isn't cached before the upload has been completed. .part files
- are not compatible with files_encrytion's key management system however, so
- we have to always sanitise such paths manually before using them. \ No newline at end of file
diff --git a/apps/files_encryption/appinfo/version b/apps/files_encryption/appinfo/version
deleted file mode 100644
index 39e898a4f95..00000000000
--- a/apps/files_encryption/appinfo/version
+++ /dev/null
@@ -1 +0,0 @@
-0.7.1
diff --git a/apps/files_encryption/command/migratekeys.php b/apps/files_encryption/command/migratekeys.php
deleted file mode 100644
index 4f3e558167b..00000000000
--- a/apps/files_encryption/command/migratekeys.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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\Files_Encryption\Command;
-
-use OCA\Files_Encryption\Migration;
-use OCP\IUserBackend;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class MigrateKeys extends Command {
-
- /** @var \OC\User\Manager */
- private $userManager;
-
- public function __construct(\OC\User\Manager $userManager) {
- $this->userManager = $userManager;
- parent::__construct();
- }
-
- protected function configure() {
- $this
- ->setName('encryption:migrate-keys')
- ->setDescription('migrate encryption keys')
- ->addArgument(
- 'user_id',
- InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
- 'will migrate keys of the given user(s)'
- );
- }
-
- protected function execute(InputInterface $input, OutputInterface $output) {
-
- // perform system reorganization
- $migration = new Migration();
- $output->writeln("Reorganize system folder structure");
- $migration->reorganizeSystemFolderStructure();
-
- $users = $input->getArgument('user_id');
- if (!empty($users)) {
- foreach ($users as $user) {
- if ($this->userManager->userExists($user)) {
- $output->writeln("Migrating keys <info>$user</info>");
- $migration->reorganizeFolderStructureForUser($user);
- } else {
- $output->writeln("<error>Unknown user $user</error>");
- }
- }
- } else {
- foreach($this->userManager->getBackends() as $backend) {
- $name = get_class($backend);
-
- if ($backend instanceof IUserBackend) {
- $name = $backend->getBackendName();
- }
-
- $output->writeln("Migrating keys for users on backend <info>$name</info>");
-
- $limit = 500;
- $offset = 0;
- do {
- $users = $backend->getUsers('', $limit, $offset);
- foreach ($users as $user) {
- $output->writeln(" <info>$user</info>");
- $migration->reorganizeFolderStructureForUser($user);
- }
- $offset += $limit;
- } while(count($users) >= $limit);
- }
- }
-
- }
-}
diff --git a/apps/files_encryption/exception/encryptionexception.php b/apps/files_encryption/exception/encryptionexception.php
deleted file mode 100644
index 637103f5651..00000000000
--- a/apps/files_encryption/exception/encryptionexception.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @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\Files_Encryption\Exception;
-
-/**
- * Base class for all encryption exception
- *
- * Possible Error Codes:
- * 10 - generic error
- * 20 - unexpected end of encryption header
- * 30 - unexpected blog size
- * 40 - encryption header to large
- * 50 - unknown cipher
- * 60 - encryption failed
- * 70 - decryption failed
- * 80 - empty data
- * 90 - private key missing
- */
-class EncryptionException extends \Exception {
- const GENERIC = 10;
- const UNEXPECTED_END_OF_ENCRYPTION_HEADER = 20;
- const UNEXPECTED_BLOCK_SIZE = 30;
- const ENCRYPTION_HEADER_TO_LARGE = 40;
- const UNKNOWN_CIPHER = 50;
- const ENCRYPTION_FAILED = 60;
- const DECRYPTION_FAILED = 70;
- const EMPTY_DATA = 80;
- const PRIVATE_KEY_MISSING = 90;
-}
diff --git a/apps/files_encryption/files/error.php b/apps/files_encryption/files/error.php
deleted file mode 100644
index 6976c9ff6cd..00000000000
--- a/apps/files_encryption/files/error.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Volkan Gezer <volkangezer@gmail.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/>
- *
- */
-if (!isset($_)) { //also provide standalone error page
- require_once __DIR__ . '/../../../lib/base.php';
- require_once __DIR__ . '/../lib/crypt.php';
-
- OC_JSON::checkAppEnabled('files_encryption');
- OC_App::loadApp('files_encryption');
-
- $l = \OC::$server->getL10N('files_encryption');
-
- if (isset($_GET['errorCode'])) {
- $errorCode = $_GET['errorCode'];
- switch ($errorCode) {
- case \OCA\Files_Encryption\Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR:
- $errorMsg = $l->t('Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app.');
- break;
- case \OCA\Files_Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR:
- $theme = new OC_Defaults();
- $errorMsg = $l->t('Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.', array($theme->getName()));
- break;
- case \OCA\Files_Encryption\Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND:
- $errorMsg = $l->t('Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.');
- break;
- default:
- $errorMsg = $l->t("Unknown error. Please check your system settings or contact your administrator");
- break;
- }
- } else {
- $errorCode = \OCA\Files_Encryption\Crypt::ENCRYPTION_UNKNOWN_ERROR;
- $errorMsg = $l->t("Unknown error. Please check your system settings or contact your administrator");
- }
-
- if (isset($_GET['p']) && $_GET['p'] === '1') {
- header('HTTP/1.0 403 ' . $errorMsg);
- }
-
-// check if ajax request
- if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
- \OCP\JSON::error(array('data' => array('message' => $errorMsg)));
- } else {
- header('HTTP/1.0 403 ' . $errorMsg);
- $tmpl = new OC_Template('files_encryption', 'invalid_private_key', 'guest');
- $tmpl->assign('message', $errorMsg);
- $tmpl->assign('errorCode', $errorCode);
- $tmpl->printPage();
- }
-
- exit;
-}
-
diff --git a/apps/files_encryption/l10n/ar.js b/apps/files_encryption/l10n/ar.js
deleted file mode 100644
index 88b1750cc0d..00000000000
--- a/apps/files_encryption/l10n/ar.js
+++ /dev/null
@@ -1,40 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "خطأ غير معروف. ",
- "Recovery key successfully enabled" : "تم بنجاح تفعيل مفتاح الاستعادة",
- "Could not disable recovery key. Please check your recovery key password!" : "لا يمكن تعطيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
- "Recovery key successfully disabled" : "تم تعطيل مفتاح الاستعادة بنجاح",
- "Password successfully changed." : "تم تغيير كلمة المرور بنجاح.",
- "Could not change the password. Maybe the old password was not correct." : "تعذر تغيير كلمة المرور. من الممكن ان كلمة المرور القديمة غير صحيحة.",
- "Private key password successfully updated." : "تم تحديث كلمة المرور للمفتاح الخاص بنجاح.",
- "File recovery settings updated" : "اعدادات ملف الاستعادة تم تحديثه",
- "Could not update file recovery" : "تعذر تحديث ملف الاستعادة",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "برنامج التشفير لم يتم تهيئتة ! من الممكن ان برنامج التشفير تم اعادة تفعيلة خلال الجلسة. يرجى تسجيل الخروج ومن ثم تسجيل الدخول مجددا لتهيئة برنامج التشفير.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "مفتاحك الخاص غير صالح! ربما تم تغيير كلمة المرور خارج %s (مثل:مجلد شركتك). يمكنك تحديث كلمة المرور في الاعدادات الشخصية لإستعادة الوصول الى ملفاتك المشفرة.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "لا يمكن فك التشفير من هذا الملف, من الممكن ان يكون هذا الملف مُشارك. يرجى سؤال صاحب الملف لإعادة مشاركتة معك.",
- "Unknown error. Please check your system settings or contact your administrator" : "خطأ غير معروف, الرجاء التحقق من إعدادات نظامك أو راسل المدير",
- "Initial encryption started... This can take some time. Please wait." : "بدأ التشفير... من الممكن ان ياخذ بعض الوقت. يرجى الانتظار.",
- "Initial encryption running... Please try again later." : "جاري تفعيل التشفير المبدئي ، الرجاء المحاولة لاحقا",
- "Missing requirements." : "متطلبات ناقصة.",
- "Following users are not set up for encryption:" : "المستخدمين التاليين لم يتم تعيين لهم التشفيير:",
- "Go directly to your %spersonal settings%s." : " .%spersonal settings%s إنتقل مباشرة إلى ",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "تم تمكين تشفير البرامج لكن لم يتم تهيئة المفاتيح لذا يرجى تسجيل الخروج ثم تسجيل الدخول مرة آخرى.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "تفعيل استعادة المفتاح (سوف يمكنك من استعادة ملفات المستخدمين في حال فقدان كلمة المرور):",
- "Recovery key password" : "استعادة كلمة مرور المفتاح",
- "Repeat Recovery key password" : "كرر كلمة المرور لـ استعادة المفتاح",
- "Enabled" : "مفعلة",
- "Disabled" : "معطلة",
- "Change recovery key password:" : "تعديل كلمة المرور استعادة المفتاح:",
- "Old Recovery key password" : "كلمة المرور القديمة لـ استعامة المفتاح",
- "New Recovery key password" : "تعيين كلمة مرور جديدة لـ استعادة المفتاح",
- "Repeat New Recovery key password" : "كرر كلمة المرور لـ استعادة المفتاح من جديد",
- "Change Password" : "عدل كلمة السر",
- " If you don't remember your old password you can ask your administrator to recover your files." : "اذا كنت لاتتذكر كلمة السر تستطيع ان تطلب من المدير ان يستعيد ملفاتك.",
- "Old log-in password" : "كلمة المرور القديمة الخاصة بالدخول",
- "Current log-in password" : "كلمة المرور الحالية الخاصة بالدخول",
- "Update Private Key Password" : "تحديث كلمة المرور لـ المفتاح الخاص",
- "Enable password recovery:" : "تفعيل استعادة كلمة المرور:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "تفعيل هذا الخيار يمكنك من اعادة الوصول الى ملفاتك المشفرة عند فقدان كلمة المرور"
-},
-"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/files_encryption/l10n/ar.json b/apps/files_encryption/l10n/ar.json
deleted file mode 100644
index ef8d71a0b1f..00000000000
--- a/apps/files_encryption/l10n/ar.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{ "translations": {
- "Unknown error" : "خطأ غير معروف. ",
- "Recovery key successfully enabled" : "تم بنجاح تفعيل مفتاح الاستعادة",
- "Could not disable recovery key. Please check your recovery key password!" : "لا يمكن تعطيل مفتاح الاستعادة, يرجى التحقق من كلمة مرور مفتاح الاستعادة!",
- "Recovery key successfully disabled" : "تم تعطيل مفتاح الاستعادة بنجاح",
- "Password successfully changed." : "تم تغيير كلمة المرور بنجاح.",
- "Could not change the password. Maybe the old password was not correct." : "تعذر تغيير كلمة المرور. من الممكن ان كلمة المرور القديمة غير صحيحة.",
- "Private key password successfully updated." : "تم تحديث كلمة المرور للمفتاح الخاص بنجاح.",
- "File recovery settings updated" : "اعدادات ملف الاستعادة تم تحديثه",
- "Could not update file recovery" : "تعذر تحديث ملف الاستعادة",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "برنامج التشفير لم يتم تهيئتة ! من الممكن ان برنامج التشفير تم اعادة تفعيلة خلال الجلسة. يرجى تسجيل الخروج ومن ثم تسجيل الدخول مجددا لتهيئة برنامج التشفير.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "مفتاحك الخاص غير صالح! ربما تم تغيير كلمة المرور خارج %s (مثل:مجلد شركتك). يمكنك تحديث كلمة المرور في الاعدادات الشخصية لإستعادة الوصول الى ملفاتك المشفرة.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "لا يمكن فك التشفير من هذا الملف, من الممكن ان يكون هذا الملف مُشارك. يرجى سؤال صاحب الملف لإعادة مشاركتة معك.",
- "Unknown error. Please check your system settings or contact your administrator" : "خطأ غير معروف, الرجاء التحقق من إعدادات نظامك أو راسل المدير",
- "Initial encryption started... This can take some time. Please wait." : "بدأ التشفير... من الممكن ان ياخذ بعض الوقت. يرجى الانتظار.",
- "Initial encryption running... Please try again later." : "جاري تفعيل التشفير المبدئي ، الرجاء المحاولة لاحقا",
- "Missing requirements." : "متطلبات ناقصة.",
- "Following users are not set up for encryption:" : "المستخدمين التاليين لم يتم تعيين لهم التشفيير:",
- "Go directly to your %spersonal settings%s." : " .%spersonal settings%s إنتقل مباشرة إلى ",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "تم تمكين تشفير البرامج لكن لم يتم تهيئة المفاتيح لذا يرجى تسجيل الخروج ثم تسجيل الدخول مرة آخرى.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "تفعيل استعادة المفتاح (سوف يمكنك من استعادة ملفات المستخدمين في حال فقدان كلمة المرور):",
- "Recovery key password" : "استعادة كلمة مرور المفتاح",
- "Repeat Recovery key password" : "كرر كلمة المرور لـ استعادة المفتاح",
- "Enabled" : "مفعلة",
- "Disabled" : "معطلة",
- "Change recovery key password:" : "تعديل كلمة المرور استعادة المفتاح:",
- "Old Recovery key password" : "كلمة المرور القديمة لـ استعامة المفتاح",
- "New Recovery key password" : "تعيين كلمة مرور جديدة لـ استعادة المفتاح",
- "Repeat New Recovery key password" : "كرر كلمة المرور لـ استعادة المفتاح من جديد",
- "Change Password" : "عدل كلمة السر",
- " If you don't remember your old password you can ask your administrator to recover your files." : "اذا كنت لاتتذكر كلمة السر تستطيع ان تطلب من المدير ان يستعيد ملفاتك.",
- "Old log-in password" : "كلمة المرور القديمة الخاصة بالدخول",
- "Current log-in password" : "كلمة المرور الحالية الخاصة بالدخول",
- "Update Private Key Password" : "تحديث كلمة المرور لـ المفتاح الخاص",
- "Enable password recovery:" : "تفعيل استعادة كلمة المرور:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "تفعيل هذا الخيار يمكنك من اعادة الوصول الى ملفاتك المشفرة عند فقدان كلمة المرور"
-},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ast.js b/apps/files_encryption/l10n/ast.js
deleted file mode 100644
index 724f4fb0c1c..00000000000
--- a/apps/files_encryption/l10n/ast.js
+++ /dev/null
@@ -1,41 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Fallu desconocíu",
- "Recovery key successfully enabled" : "Habilitóse la recuperación de ficheros",
- "Could not disable recovery key. Please check your recovery key password!" : "Nun pudo deshabilitase la clave de recuperación. Por favor comprueba la contraseña!",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Password successfully changed." : "Camudóse la contraseña",
- "Could not change the password. Maybe the old password was not correct." : "Nun pudo camudase la contraseña. Comprueba que la contraseña actual seya correuta.",
- "Private key password successfully updated." : "Contraseña de clave privada anovada correchamente.",
- "File recovery settings updated" : "Opciones de recuperación de ficheros anovada",
- "Could not update file recovery" : "Nun pudo anovase la recuperación de ficheros",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡L'aplicación de cifráu nun s'anició! Seique se restableciera mentanto la sesión. Por favor intenta zarrar la sesión y volver a aniciala p'aniciar l'aplicación de cifráu.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡La clave privada nun ye válida! Seique la contraseña se camudase dende fuera de %s (Ex:El to direutoriu corporativu). Pues anovar la contraseña de la clave privada nes tos opciones personales pa recuperar l'accesu a los ficheros.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nun pudo descifrase esti ficheru, dablemente seya un ficheru compartíu. Solicita al propietariu del mesmu que vuelva a compartilu contigo.",
- "Unknown error. Please check your system settings or contact your administrator" : "Fallu desconocíu. Por favor, comprueba los axustes del sistema o contauta col alministrador",
- "Initial encryption started... This can take some time. Please wait." : "Cifráu aniciáu..... Esto pue llevar un tiempu. Por favor espera.",
- "Initial encryption running... Please try again later." : "Cifráu inicial en cursu... Inténtalo dempués.",
- "Missing requirements." : "Requisitos incompletos.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios nun se configuraron pal cifráu:",
- "Go directly to your %spersonal settings%s." : "Dir direutamente a los tos %saxustes personales%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicación Encryption ta habilitada pero les tos claves nun s'aniciaron, por favor zarra sesión y aníciala de nueves",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los ficheros del usuariu en casu de perda de la contraseña);",
- "Recovery key password" : "Contraseña de clave de recuperación",
- "Repeat Recovery key password" : "Repeti la contraseña de clave de recuperación",
- "Enabled" : "Habilitar",
- "Disabled" : "Deshabilitáu",
- "Change recovery key password:" : "Camudar la contraseña de la clave de recuperación",
- "Old Recovery key password" : "Clave de recuperación vieya",
- "New Recovery key password" : "Clave de recuperación nueva",
- "Repeat New Recovery key password" : "Repetir la clave de recuperación nueva",
- "Change Password" : "Camudar contraseña",
- "Set your old private key password to your current log-in password:" : "Afita la contraseña de clave privada vieya pa la to contraseña d'aniciu de sesión actual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si nun recuerdes la contraseña vieya, pues pidir a alministrador que te recupere los ficheros.",
- "Old log-in password" : "Contraseña d'accesu vieya",
- "Current log-in password" : "Contraseña d'accesu actual",
- "Update Private Key Password" : "Anovar Contraseña de Clave Privada",
- "Enable password recovery:" : "Habilitar la recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción va permitite volver a tener accesu a los ficheros cifraos en casu de perda de contraseña"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/ast.json b/apps/files_encryption/l10n/ast.json
deleted file mode 100644
index 407c27dfe7e..00000000000
--- a/apps/files_encryption/l10n/ast.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{ "translations": {
- "Unknown error" : "Fallu desconocíu",
- "Recovery key successfully enabled" : "Habilitóse la recuperación de ficheros",
- "Could not disable recovery key. Please check your recovery key password!" : "Nun pudo deshabilitase la clave de recuperación. Por favor comprueba la contraseña!",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Password successfully changed." : "Camudóse la contraseña",
- "Could not change the password. Maybe the old password was not correct." : "Nun pudo camudase la contraseña. Comprueba que la contraseña actual seya correuta.",
- "Private key password successfully updated." : "Contraseña de clave privada anovada correchamente.",
- "File recovery settings updated" : "Opciones de recuperación de ficheros anovada",
- "Could not update file recovery" : "Nun pudo anovase la recuperación de ficheros",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡L'aplicación de cifráu nun s'anició! Seique se restableciera mentanto la sesión. Por favor intenta zarrar la sesión y volver a aniciala p'aniciar l'aplicación de cifráu.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡La clave privada nun ye válida! Seique la contraseña se camudase dende fuera de %s (Ex:El to direutoriu corporativu). Pues anovar la contraseña de la clave privada nes tos opciones personales pa recuperar l'accesu a los ficheros.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nun pudo descifrase esti ficheru, dablemente seya un ficheru compartíu. Solicita al propietariu del mesmu que vuelva a compartilu contigo.",
- "Unknown error. Please check your system settings or contact your administrator" : "Fallu desconocíu. Por favor, comprueba los axustes del sistema o contauta col alministrador",
- "Initial encryption started... This can take some time. Please wait." : "Cifráu aniciáu..... Esto pue llevar un tiempu. Por favor espera.",
- "Initial encryption running... Please try again later." : "Cifráu inicial en cursu... Inténtalo dempués.",
- "Missing requirements." : "Requisitos incompletos.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios nun se configuraron pal cifráu:",
- "Go directly to your %spersonal settings%s." : "Dir direutamente a los tos %saxustes personales%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicación Encryption ta habilitada pero les tos claves nun s'aniciaron, por favor zarra sesión y aníciala de nueves",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los ficheros del usuariu en casu de perda de la contraseña);",
- "Recovery key password" : "Contraseña de clave de recuperación",
- "Repeat Recovery key password" : "Repeti la contraseña de clave de recuperación",
- "Enabled" : "Habilitar",
- "Disabled" : "Deshabilitáu",
- "Change recovery key password:" : "Camudar la contraseña de la clave de recuperación",
- "Old Recovery key password" : "Clave de recuperación vieya",
- "New Recovery key password" : "Clave de recuperación nueva",
- "Repeat New Recovery key password" : "Repetir la clave de recuperación nueva",
- "Change Password" : "Camudar contraseña",
- "Set your old private key password to your current log-in password:" : "Afita la contraseña de clave privada vieya pa la to contraseña d'aniciu de sesión actual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si nun recuerdes la contraseña vieya, pues pidir a alministrador que te recupere los ficheros.",
- "Old log-in password" : "Contraseña d'accesu vieya",
- "Current log-in password" : "Contraseña d'accesu actual",
- "Update Private Key Password" : "Anovar Contraseña de Clave Privada",
- "Enable password recovery:" : "Habilitar la recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción va permitite volver a tener accesu a los ficheros cifraos en casu de perda de contraseña"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/az.js b/apps/files_encryption/l10n/az.js
deleted file mode 100644
index d6d243d165b..00000000000
--- a/apps/files_encryption/l10n/az.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Bəlli olmayan səhv baş verdi",
- "Missing recovery key password" : "Bərpa açarının şifrəsi çatışmır",
- "Please repeat the recovery key password" : "Xahiş olunur bərpa açarı şifrəsini təkrarlayasınız",
- "Repeated recovery key password does not match the provided recovery key password" : "Təkrar daxil edilən bərpa açarı şifrəsi, öncə daxil edilən bərpa açarı ilə üst-üstə düşmür ",
- "Recovery key successfully enabled" : "Bərpa açarı uğurla aktivləşdi",
- "Could not disable recovery key. Please check your recovery key password!" : "Geriqaytarılma açarını sondürmək olmur. Xahiş edirik geriqaytarılma key açarınızı yoxlayın.",
- "Recovery key successfully disabled" : "Bərpa açarı uğurla söndürüldü",
- "Please provide the old recovery password" : "Xahiş olunur köhnə bərpa açarını daxil edəsiniz",
- "Please provide a new recovery password" : "Xahiş olunur yeni bərpa açarı şifrəsini daxil esəsiniz",
- "Please repeat the new recovery password" : "Xahiş olunur yeni bərpa açarını təkrarlayasınız",
- "Password successfully changed." : "Şifrə uğurla dəyişdirildi.",
- "Could not change the password. Maybe the old password was not correct." : "Şifrəni dəyişmək olmur, ola bilər ki, köhnə şifrə düzgün olmayıb.",
- "Could not update the private key password." : "Gizli açarın şifrəsini yeniləmək mümkün olmadı.",
- "The old password was not correct, please try again." : "Köhnə şifrə düzgün deyildi, xahiş olunur yenidən cəhd edəsiniz.",
- "The current log-in password was not correct, please try again." : "Hal-hazırki istifadəçi şifrəsi düzgün deyildi, xahiş olunur yenidən cəhd edəsiniz.",
- "Private key password successfully updated." : "Gizli aşar şifrəsi uğurla yeniləndi.",
- "File recovery settings updated" : "Fayl bərpa quraşdırmaları yeniləndi",
- "Could not update file recovery" : "Fayl bərpasını yeniləmək olmur",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Şifrələmə proqramı inisializasiya edilməyib! Ola bilər ki, şifrələnmə proqramı sizin sessiya müddətində yenidən işə salınıb. Xahiş olunur çıxıb yenidən girişə cəhd edəsiniz ki, şifrələnmə proqramı sizin istifadəçı adı üçün təkrar inisializasiya edilsin. ",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Sizin gizli açarınız doğru deyil! Təxmin edilir ki, sizin şifrə %s-dən kənarda dəyişdirilib(misal üçün sizin koorporativ qovluq). Siz öz şifrələnmiş fayllarınıza yetkinizi bərpa etmək üçün, öz şifrənizi şəxsi quraşdırmalarınızda yeniləyə bilərsiniz.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu faylı deşifrə etmək olmur və ola bilər ki, bu paylaşımda olan fayldır. Xahiş olunur faylın sahibinə həmin faylı sizinlə yenidən paylaşım etməsini bildirəsiniz. ",
- "Unknown error. Please check your system settings or contact your administrator" : "Tanınmayan səhv. Xahiş olunur sistem quraşdırmalarınızı yoxlayın yada öz inzibatçınızla əlaqə yaradın",
- "Initial encryption started... This can take some time. Please wait." : "İlkin şifələnmə başlandı... Bu müəyyən vaxt ala bilər. Xahiş olunur gözləyəsiniz.",
- "Initial encryption running... Please try again later." : "İlkin şifrələnmə işləyir... Xahiş olunur birazdan yenidən müraciət edəsiniz.",
- "Missing requirements." : "Taləbatlar çatışmır.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Xahiş olunur ki, PHP-in OpenSSL genişlənməsi yüklənib və düzgün konfiqurasiya edilib. İndiki hal üçün şifrələnmə proqramı dayandırılmışdır.",
- "Following users are not set up for encryption:" : "Göstərilən istifadəçilər şifrələnmə üçün quraşdırılmayıb:",
- "Go directly to your %spersonal settings%s." : "Birbaşa öz %sşəxsi quraşdırmalarınıza%s gedin.",
- "Server-side Encryption" : "Server-tərəf şifrələnmə",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Proqram şifrələnməsi işə salınıb ancaq, sizin açarlar inisializasiya edilməyib. Xahiş edilir çıxıb yenidən daxil olasınız",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Bərpa açarını aktivləşdir(şifrə itirilməsi hadısələrində, istifadəçi fayllarının bərpasına izin verir)",
- "Recovery key password" : "Açar şifrənin bərpa edilməsi",
- "Repeat Recovery key password" : "Bərpa açarın şifrəsini təkrar edin",
- "Enabled" : "İşə salınıb",
- "Disabled" : "Dayandırılıb",
- "Change recovery key password:" : "Bərpa açarın şifrəsini dəyişdir:",
- "Old Recovery key password" : "Köhnə bərpa açarı şifrəsi",
- "New Recovery key password" : "Yeni bərpa açarı şifrəsi",
- "Repeat New Recovery key password" : "Yeni bərpa açarı şifrəsini təkrar edin",
- "Change Password" : "Şifrəni dəyişdir",
- "Your private key password no longer matches your log-in password." : "Sizin gizli açar şifrəsi, artıq giriş adınızla uyğun gəlmir.",
- "Set your old private key password to your current log-in password:" : "Köhnə açar şifrənizi, sizin hal-hazırki giriş şifrənizə təyin edin: ",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Əgər siz köhnə şifrənizi xatırlamırsınızsa, öz inzibatçınızdan fayllarınızın bərpasını istəyə bilərsiniz.",
- "Old log-in password" : "Köhnə giriş şifrəsi",
- "Current log-in password" : "Hal-hazırki giriş şifrəsi",
- "Update Private Key Password" : "Gizli açar şifrəsini yenilə",
- "Enable password recovery:" : "Şifrə bərpasını işə sal:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Bu opsiyanın aktiv edilməsi sizə, şifrənin itdiyi hallarda bütün şifrələnmiş fayllarınıza yetkinin yenidən əldə edilməsinə şərait yaradacaq"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/az.json b/apps/files_encryption/l10n/az.json
deleted file mode 100644
index 730e79a5084..00000000000
--- a/apps/files_encryption/l10n/az.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Bəlli olmayan səhv baş verdi",
- "Missing recovery key password" : "Bərpa açarının şifrəsi çatışmır",
- "Please repeat the recovery key password" : "Xahiş olunur bərpa açarı şifrəsini təkrarlayasınız",
- "Repeated recovery key password does not match the provided recovery key password" : "Təkrar daxil edilən bərpa açarı şifrəsi, öncə daxil edilən bərpa açarı ilə üst-üstə düşmür ",
- "Recovery key successfully enabled" : "Bərpa açarı uğurla aktivləşdi",
- "Could not disable recovery key. Please check your recovery key password!" : "Geriqaytarılma açarını sondürmək olmur. Xahiş edirik geriqaytarılma key açarınızı yoxlayın.",
- "Recovery key successfully disabled" : "Bərpa açarı uğurla söndürüldü",
- "Please provide the old recovery password" : "Xahiş olunur köhnə bərpa açarını daxil edəsiniz",
- "Please provide a new recovery password" : "Xahiş olunur yeni bərpa açarı şifrəsini daxil esəsiniz",
- "Please repeat the new recovery password" : "Xahiş olunur yeni bərpa açarını təkrarlayasınız",
- "Password successfully changed." : "Şifrə uğurla dəyişdirildi.",
- "Could not change the password. Maybe the old password was not correct." : "Şifrəni dəyişmək olmur, ola bilər ki, köhnə şifrə düzgün olmayıb.",
- "Could not update the private key password." : "Gizli açarın şifrəsini yeniləmək mümkün olmadı.",
- "The old password was not correct, please try again." : "Köhnə şifrə düzgün deyildi, xahiş olunur yenidən cəhd edəsiniz.",
- "The current log-in password was not correct, please try again." : "Hal-hazırki istifadəçi şifrəsi düzgün deyildi, xahiş olunur yenidən cəhd edəsiniz.",
- "Private key password successfully updated." : "Gizli aşar şifrəsi uğurla yeniləndi.",
- "File recovery settings updated" : "Fayl bərpa quraşdırmaları yeniləndi",
- "Could not update file recovery" : "Fayl bərpasını yeniləmək olmur",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Şifrələmə proqramı inisializasiya edilməyib! Ola bilər ki, şifrələnmə proqramı sizin sessiya müddətində yenidən işə salınıb. Xahiş olunur çıxıb yenidən girişə cəhd edəsiniz ki, şifrələnmə proqramı sizin istifadəçı adı üçün təkrar inisializasiya edilsin. ",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Sizin gizli açarınız doğru deyil! Təxmin edilir ki, sizin şifrə %s-dən kənarda dəyişdirilib(misal üçün sizin koorporativ qovluq). Siz öz şifrələnmiş fayllarınıza yetkinizi bərpa etmək üçün, öz şifrənizi şəxsi quraşdırmalarınızda yeniləyə bilərsiniz.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu faylı deşifrə etmək olmur və ola bilər ki, bu paylaşımda olan fayldır. Xahiş olunur faylın sahibinə həmin faylı sizinlə yenidən paylaşım etməsini bildirəsiniz. ",
- "Unknown error. Please check your system settings or contact your administrator" : "Tanınmayan səhv. Xahiş olunur sistem quraşdırmalarınızı yoxlayın yada öz inzibatçınızla əlaqə yaradın",
- "Initial encryption started... This can take some time. Please wait." : "İlkin şifələnmə başlandı... Bu müəyyən vaxt ala bilər. Xahiş olunur gözləyəsiniz.",
- "Initial encryption running... Please try again later." : "İlkin şifrələnmə işləyir... Xahiş olunur birazdan yenidən müraciət edəsiniz.",
- "Missing requirements." : "Taləbatlar çatışmır.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Xahiş olunur ki, PHP-in OpenSSL genişlənməsi yüklənib və düzgün konfiqurasiya edilib. İndiki hal üçün şifrələnmə proqramı dayandırılmışdır.",
- "Following users are not set up for encryption:" : "Göstərilən istifadəçilər şifrələnmə üçün quraşdırılmayıb:",
- "Go directly to your %spersonal settings%s." : "Birbaşa öz %sşəxsi quraşdırmalarınıza%s gedin.",
- "Server-side Encryption" : "Server-tərəf şifrələnmə",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Proqram şifrələnməsi işə salınıb ancaq, sizin açarlar inisializasiya edilməyib. Xahiş edilir çıxıb yenidən daxil olasınız",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Bərpa açarını aktivləşdir(şifrə itirilməsi hadısələrində, istifadəçi fayllarının bərpasına izin verir)",
- "Recovery key password" : "Açar şifrənin bərpa edilməsi",
- "Repeat Recovery key password" : "Bərpa açarın şifrəsini təkrar edin",
- "Enabled" : "İşə salınıb",
- "Disabled" : "Dayandırılıb",
- "Change recovery key password:" : "Bərpa açarın şifrəsini dəyişdir:",
- "Old Recovery key password" : "Köhnə bərpa açarı şifrəsi",
- "New Recovery key password" : "Yeni bərpa açarı şifrəsi",
- "Repeat New Recovery key password" : "Yeni bərpa açarı şifrəsini təkrar edin",
- "Change Password" : "Şifrəni dəyişdir",
- "Your private key password no longer matches your log-in password." : "Sizin gizli açar şifrəsi, artıq giriş adınızla uyğun gəlmir.",
- "Set your old private key password to your current log-in password:" : "Köhnə açar şifrənizi, sizin hal-hazırki giriş şifrənizə təyin edin: ",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Əgər siz köhnə şifrənizi xatırlamırsınızsa, öz inzibatçınızdan fayllarınızın bərpasını istəyə bilərsiniz.",
- "Old log-in password" : "Köhnə giriş şifrəsi",
- "Current log-in password" : "Hal-hazırki giriş şifrəsi",
- "Update Private Key Password" : "Gizli açar şifrəsini yenilə",
- "Enable password recovery:" : "Şifrə bərpasını işə sal:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Bu opsiyanın aktiv edilməsi sizə, şifrənin itdiyi hallarda bütün şifrələnmiş fayllarınıza yetkinin yenidən əldə edilməsinə şərait yaradacaq"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/bg_BG.js b/apps/files_encryption/l10n/bg_BG.js
deleted file mode 100644
index 6f5876c0654..00000000000
--- a/apps/files_encryption/l10n/bg_BG.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Непозната грешка.",
- "Missing recovery key password" : "Липсва парола за възстановяване",
- "Please repeat the recovery key password" : "Повтори новата парола за възстановяване",
- "Repeated recovery key password does not match the provided recovery key password" : "Повторената парола за възстановяване не съвпада със зададената парола за възстановяване",
- "Recovery key successfully enabled" : "Успешно включване на опцията ключ за възстановяване.",
- "Could not disable recovery key. Please check your recovery key password!" : "Неуспешно изключване на ключа за възстановяване. Моля, провери паролата за ключа за възстановяване!",
- "Recovery key successfully disabled" : "Успешно изключване на ключа за възстановяване.",
- "Please provide the old recovery password" : "Моля, въведи старата парола за възстановяване",
- "Please provide a new recovery password" : "Моля, задай нова парола за възстановяване",
- "Please repeat the new recovery password" : "Моля, въведи повторна новата парола за възстановяване",
- "Password successfully changed." : "Паролата е успешно променена.",
- "Could not change the password. Maybe the old password was not correct." : "Грешка при промяна на паролата. Може би старата ти парола е сгрешена.",
- "Could not update the private key password." : "Неуспешна промяна на паролата на личния ключ",
- "The old password was not correct, please try again." : "Старата парола е грешна, опитай отново.",
- "The current log-in password was not correct, please try again." : "Грешна парола за вписване, опитай отново.",
- "Private key password successfully updated." : "Успешно променена тайната парола за ключа.",
- "File recovery settings updated" : "Настройките за възстановяване на файлове са променени.",
- "Could not update file recovery" : "Неуспешна промяна на настройките за възстановяване на файлове.",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Неуспешна инициализация на криптиращото приложение! Може би криптиращото приложение бе включено по време на твоята сесия. Отпиши се и се впиши обратно за да инциализираш криптиращото приложение.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Твоят таен ключ е невалиден! Вероятно твоята парола беше променена извън %s(пр. твоята корпоративна директория). Можеш да промениш своят таен ключ в Лични настройки, за да възстановиш достъпа до криптираните файлове.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Неуспешно разшифроване на този файл, вероятно това е споделен файл. Моля, поискай собственика на файла да го сподели повторно с теб.",
- "Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Моля, провери системните настройки или се свържи с администратора.",
- "Initial encryption started... This can take some time. Please wait." : "Първоначалното криптиране започна... Това може да отнеме време. Моля изчакай.",
- "Initial encryption running... Please try again later." : "Тече първоначално криптиране... Моля опитай по-късно.",
- "Missing requirements." : "Липсва задължителна информация.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Моля уверете се че OpenSSL заедно с PHP разширене са включени и конфигурирани правилно. За сега, криптиращото приложение е изключено.",
- "Following users are not set up for encryption:" : "Следните потребители не са настроени за криптиране:",
- "Go directly to your %spersonal settings%s." : "Отиде направо към твоите %sлични настройки%s.",
- "Server-side Encryption" : "Криптиране от страна на сървъра",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Програмата за криптиране е включена, но твоите ключове не са зададени, моля отпиши си и се впиши отново.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Включи опцията възстановяване на ключ (разрешава да възстанови файловете на потребителите в случай на загубена парола):",
- "Recovery key password" : "Парола за възстановяане на ключа",
- "Repeat Recovery key password" : "Повтори паролата за възстановяване на ключа",
- "Enabled" : "Включено",
- "Disabled" : "Изключено",
- "Change recovery key password:" : "Промени паролата за въстановяване на ключа:",
- "Old Recovery key password" : "Старата парола за въстановяване на ключа",
- "New Recovery key password" : "Новата парола за възстановяване на ключа",
- "Repeat New Recovery key password" : "Повтори новата паролза за възстановяване на ключа",
- "Change Password" : "Промени Паролата",
- "Your private key password no longer matches your log-in password." : "Личният ти ключ не съвпада с паролата за вписване.",
- "Set your old private key password to your current log-in password:" : "Промени паролата за тайния ти включ на паролата за вписване:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ако не помниш старата парола помоли администратора да възстанови файловете ти.",
- "Old log-in password" : "Стара парола за вписване",
- "Current log-in password" : "Текуща парола за вписване",
- "Update Private Key Password" : "Промени Тайната Парола за Ключа",
- "Enable password recovery:" : "Включи опцията възстановяване на паролата:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Избирането на тази опция ще ти позволи да възстановиш достъпа си до файловете в случай на изгубена парола."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/bg_BG.json b/apps/files_encryption/l10n/bg_BG.json
deleted file mode 100644
index 055c434d229..00000000000
--- a/apps/files_encryption/l10n/bg_BG.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Непозната грешка.",
- "Missing recovery key password" : "Липсва парола за възстановяване",
- "Please repeat the recovery key password" : "Повтори новата парола за възстановяване",
- "Repeated recovery key password does not match the provided recovery key password" : "Повторената парола за възстановяване не съвпада със зададената парола за възстановяване",
- "Recovery key successfully enabled" : "Успешно включване на опцията ключ за възстановяване.",
- "Could not disable recovery key. Please check your recovery key password!" : "Неуспешно изключване на ключа за възстановяване. Моля, провери паролата за ключа за възстановяване!",
- "Recovery key successfully disabled" : "Успешно изключване на ключа за възстановяване.",
- "Please provide the old recovery password" : "Моля, въведи старата парола за възстановяване",
- "Please provide a new recovery password" : "Моля, задай нова парола за възстановяване",
- "Please repeat the new recovery password" : "Моля, въведи повторна новата парола за възстановяване",
- "Password successfully changed." : "Паролата е успешно променена.",
- "Could not change the password. Maybe the old password was not correct." : "Грешка при промяна на паролата. Може би старата ти парола е сгрешена.",
- "Could not update the private key password." : "Неуспешна промяна на паролата на личния ключ",
- "The old password was not correct, please try again." : "Старата парола е грешна, опитай отново.",
- "The current log-in password was not correct, please try again." : "Грешна парола за вписване, опитай отново.",
- "Private key password successfully updated." : "Успешно променена тайната парола за ключа.",
- "File recovery settings updated" : "Настройките за възстановяване на файлове са променени.",
- "Could not update file recovery" : "Неуспешна промяна на настройките за възстановяване на файлове.",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Неуспешна инициализация на криптиращото приложение! Може би криптиращото приложение бе включено по време на твоята сесия. Отпиши се и се впиши обратно за да инциализираш криптиращото приложение.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Твоят таен ключ е невалиден! Вероятно твоята парола беше променена извън %s(пр. твоята корпоративна директория). Можеш да промениш своят таен ключ в Лични настройки, за да възстановиш достъпа до криптираните файлове.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Неуспешно разшифроване на този файл, вероятно това е споделен файл. Моля, поискай собственика на файла да го сподели повторно с теб.",
- "Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Моля, провери системните настройки или се свържи с администратора.",
- "Initial encryption started... This can take some time. Please wait." : "Първоначалното криптиране започна... Това може да отнеме време. Моля изчакай.",
- "Initial encryption running... Please try again later." : "Тече първоначално криптиране... Моля опитай по-късно.",
- "Missing requirements." : "Липсва задължителна информация.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Моля уверете се че OpenSSL заедно с PHP разширене са включени и конфигурирани правилно. За сега, криптиращото приложение е изключено.",
- "Following users are not set up for encryption:" : "Следните потребители не са настроени за криптиране:",
- "Go directly to your %spersonal settings%s." : "Отиде направо към твоите %sлични настройки%s.",
- "Server-side Encryption" : "Криптиране от страна на сървъра",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Програмата за криптиране е включена, но твоите ключове не са зададени, моля отпиши си и се впиши отново.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Включи опцията възстановяване на ключ (разрешава да възстанови файловете на потребителите в случай на загубена парола):",
- "Recovery key password" : "Парола за възстановяане на ключа",
- "Repeat Recovery key password" : "Повтори паролата за възстановяване на ключа",
- "Enabled" : "Включено",
- "Disabled" : "Изключено",
- "Change recovery key password:" : "Промени паролата за въстановяване на ключа:",
- "Old Recovery key password" : "Старата парола за въстановяване на ключа",
- "New Recovery key password" : "Новата парола за възстановяване на ключа",
- "Repeat New Recovery key password" : "Повтори новата паролза за възстановяване на ключа",
- "Change Password" : "Промени Паролата",
- "Your private key password no longer matches your log-in password." : "Личният ти ключ не съвпада с паролата за вписване.",
- "Set your old private key password to your current log-in password:" : "Промени паролата за тайния ти включ на паролата за вписване:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ако не помниш старата парола помоли администратора да възстанови файловете ти.",
- "Old log-in password" : "Стара парола за вписване",
- "Current log-in password" : "Текуща парола за вписване",
- "Update Private Key Password" : "Промени Тайната Парола за Ключа",
- "Enable password recovery:" : "Включи опцията възстановяване на паролата:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Избирането на тази опция ще ти позволи да възстановиш достъпа си до файловете в случай на изгубена парола."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/bn_BD.js b/apps/files_encryption/l10n/bn_BD.js
deleted file mode 100644
index 2a1446e5723..00000000000
--- a/apps/files_encryption/l10n/bn_BD.js
+++ /dev/null
@@ -1,22 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "অজানা জটিলতা",
- "Recovery key successfully enabled" : "পূনরুদ্ধার চাবি সার্থকভাবে কার্যকর করা হয়েছে",
- "Recovery key successfully disabled" : "পূনরুদ্ধার চাবি সার্থকভাবে অকার্যকর করা হয়েছে",
- "Password successfully changed." : "আপনার কূটশব্দটি সার্থকভাবে পরিবর্তন করা হয়েছে ",
- "Initial encryption started... This can take some time. Please wait." : "প্রাথমিক এনক্রিপসন শুরু হয়েছে.... এটি কিছুটা সময় নিতে পারে। অপেক্ষা করুন।",
- "Initial encryption running... Please try again later." : "প্রাথমিক এনক্রিপসন চলছে.... দয়া করে পরে আবার চেষ্টা করুন।",
- "Missing requirements." : "প্রয়োজনানুযায়ী ঘাটতি আছে।",
- "Following users are not set up for encryption:" : "নিম্নবর্ণিত ব্যবহারকারীগণ এনক্রিপসনের জন্য অধিকারপ্রাপ্ত নন:",
- "Go directly to your %spersonal settings%s." : "সরাসরি আপনার %spersonal settings%s এ যান।",
- "Repeat Recovery key password" : "পূণরূদ্ধার কি এর কুটশব্দ পূণরায় দিন",
- "Enabled" : "কার্যকর",
- "Disabled" : "অকার্যকর",
- "Change recovery key password:" : "পূণরূদ্ধার কি এর কুটশব্দ পরিবর্তন করুন:",
- "Old Recovery key password" : "পূণরূদ্ধার কি এর পুরাতন কুটশব্দ",
- "New Recovery key password" : "পূণরূদ্ধার কি এর নতুন কুটশব্দ",
- "Repeat New Recovery key password" : "পূণরূদ্ধার কি এর নতুন কুটশব্দ পূণরায় দিন",
- "Change Password" : "কূটশব্দ পরিবর্তন করুন"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/bn_BD.json b/apps/files_encryption/l10n/bn_BD.json
deleted file mode 100644
index 9c2eca6591a..00000000000
--- a/apps/files_encryption/l10n/bn_BD.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{ "translations": {
- "Unknown error" : "অজানা জটিলতা",
- "Recovery key successfully enabled" : "পূনরুদ্ধার চাবি সার্থকভাবে কার্যকর করা হয়েছে",
- "Recovery key successfully disabled" : "পূনরুদ্ধার চাবি সার্থকভাবে অকার্যকর করা হয়েছে",
- "Password successfully changed." : "আপনার কূটশব্দটি সার্থকভাবে পরিবর্তন করা হয়েছে ",
- "Initial encryption started... This can take some time. Please wait." : "প্রাথমিক এনক্রিপসন শুরু হয়েছে.... এটি কিছুটা সময় নিতে পারে। অপেক্ষা করুন।",
- "Initial encryption running... Please try again later." : "প্রাথমিক এনক্রিপসন চলছে.... দয়া করে পরে আবার চেষ্টা করুন।",
- "Missing requirements." : "প্রয়োজনানুযায়ী ঘাটতি আছে।",
- "Following users are not set up for encryption:" : "নিম্নবর্ণিত ব্যবহারকারীগণ এনক্রিপসনের জন্য অধিকারপ্রাপ্ত নন:",
- "Go directly to your %spersonal settings%s." : "সরাসরি আপনার %spersonal settings%s এ যান।",
- "Repeat Recovery key password" : "পূণরূদ্ধার কি এর কুটশব্দ পূণরায় দিন",
- "Enabled" : "কার্যকর",
- "Disabled" : "অকার্যকর",
- "Change recovery key password:" : "পূণরূদ্ধার কি এর কুটশব্দ পরিবর্তন করুন:",
- "Old Recovery key password" : "পূণরূদ্ধার কি এর পুরাতন কুটশব্দ",
- "New Recovery key password" : "পূণরূদ্ধার কি এর নতুন কুটশব্দ",
- "Repeat New Recovery key password" : "পূণরূদ্ধার কি এর নতুন কুটশব্দ পূণরায় দিন",
- "Change Password" : "কূটশব্দ পরিবর্তন করুন"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/bs.js b/apps/files_encryption/l10n/bs.js
deleted file mode 100644
index 7bf649dcb68..00000000000
--- a/apps/files_encryption/l10n/bs.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Nepoznata greška",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je uključena, ali vaši ključevi nisu inicializirani, molim odjavite se i ponovno prijavite",
- "Enabled" : "Aktivirano",
- "Disabled" : "Onemogućeno"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/bs.json b/apps/files_encryption/l10n/bs.json
deleted file mode 100644
index df05ce3e24f..00000000000
--- a/apps/files_encryption/l10n/bs.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "Unknown error" : "Nepoznata greška",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je uključena, ali vaši ključevi nisu inicializirani, molim odjavite se i ponovno prijavite",
- "Enabled" : "Aktivirano",
- "Disabled" : "Onemogućeno"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ca.js b/apps/files_encryption/l10n/ca.js
deleted file mode 100644
index 189fc653160..00000000000
--- a/apps/files_encryption/l10n/ca.js
+++ /dev/null
@@ -1,42 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Error desconegut",
- "Recovery key successfully enabled" : "La clau de recuperació s'ha activat",
- "Could not disable recovery key. Please check your recovery key password!" : "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!",
- "Recovery key successfully disabled" : "La clau de recuperació s'ha descativat",
- "Password successfully changed." : "La contrasenya s'ha canviat.",
- "Could not change the password. Maybe the old password was not correct." : "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.",
- "Private key password successfully updated." : "La contrasenya de la clau privada s'ha actualitzat.",
- "File recovery settings updated" : "S'han actualitzat els arranjaments de recuperació de fitxers",
- "Could not update file recovery" : "No s'ha pogut actualitzar la recuperació de fitxers",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'aplicació d'encriptació no està inicialitzada! Potser l'aplicació d'encriptació ha estat reiniciada durant la sessió. Intenteu sortir i acreditar-vos de nou per reinicialitzar l'aplicació d'encriptació.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "La clau privada no és vàlida! Probablement la contrasenya va ser canviada des de fora de %s (per exemple, en el directori de l'empresa). Vostè pot actualitzar la contrasenya de clau privada en la seva configuració personal per poder recuperar l'accés en els arxius xifrats.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es pot desencriptar aquest fitxer, probablement és un fitxer compartit. Demaneu al propietari del fitxer que el comparteixi de nou amb vós.",
- "Unknown error. Please check your system settings or contact your administrator" : "Error desconegut. Comproveu l'arranjament del sistema o aviseu a l'administrador",
- "Initial encryption started... This can take some time. Please wait." : "La encriptació inicial ha començat... Pot trigar una estona, espereu.",
- "Initial encryption running... Please try again later." : "encriptació inicial en procés... Proveu-ho més tard.",
- "Missing requirements." : "Manca de requisits.",
- "Following users are not set up for encryption:" : "Els usuaris següents no estan configurats per a l'encriptació:",
- "Go directly to your %spersonal settings%s." : "Vés directament a l'%sarranjament personal%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicació d'encriptació està activada però les claus no estan inicialitzades, sortiu i acrediteu-vos de nou.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activa la clau de recuperació (permet recuperar fitxers d'usuaris en cas de pèrdua de contrasenya):",
- "Recovery key password" : "Clau de recuperació de la contrasenya",
- "Repeat Recovery key password" : "Repetiu la clau de recuperació de contrasenya",
- "Enabled" : "Activat",
- "Disabled" : "Desactivat",
- "Change recovery key password:" : "Canvia la clau de recuperació de contrasenya:",
- "Old Recovery key password" : "Antiga clau de recuperació de contrasenya",
- "New Recovery key password" : "Nova clau de recuperació de contrasenya",
- "Repeat New Recovery key password" : "Repetiu la nova clau de recuperació de contrasenya",
- "Change Password" : "Canvia la contrasenya",
- "Your private key password no longer matches your log-in password." : "La clau privada ja no es correspon amb la contrasenya d'accés:",
- "Set your old private key password to your current log-in password:" : "Establiu la vostra antiga clau privada a l'actual contrasenya d'accés:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recordeu la contrasenya anterior podeu demanar a l'administrador que recuperi els vostres fitxers.",
- "Old log-in password" : "Contrasenya anterior d'accés",
- "Current log-in password" : "Contrasenya d'accés actual",
- "Update Private Key Password" : "Actualitza la contrasenya de clau privada",
- "Enable password recovery:" : "Habilita la recuperació de contrasenya:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Activar aquesta opció us permetrà obtenir de nou accés als vostres fitxers encriptats en cas de perdre la contrasenya"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/ca.json b/apps/files_encryption/l10n/ca.json
deleted file mode 100644
index e3de02e1701..00000000000
--- a/apps/files_encryption/l10n/ca.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{ "translations": {
- "Unknown error" : "Error desconegut",
- "Recovery key successfully enabled" : "La clau de recuperació s'ha activat",
- "Could not disable recovery key. Please check your recovery key password!" : "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!",
- "Recovery key successfully disabled" : "La clau de recuperació s'ha descativat",
- "Password successfully changed." : "La contrasenya s'ha canviat.",
- "Could not change the password. Maybe the old password was not correct." : "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.",
- "Private key password successfully updated." : "La contrasenya de la clau privada s'ha actualitzat.",
- "File recovery settings updated" : "S'han actualitzat els arranjaments de recuperació de fitxers",
- "Could not update file recovery" : "No s'ha pogut actualitzar la recuperació de fitxers",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'aplicació d'encriptació no està inicialitzada! Potser l'aplicació d'encriptació ha estat reiniciada durant la sessió. Intenteu sortir i acreditar-vos de nou per reinicialitzar l'aplicació d'encriptació.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "La clau privada no és vàlida! Probablement la contrasenya va ser canviada des de fora de %s (per exemple, en el directori de l'empresa). Vostè pot actualitzar la contrasenya de clau privada en la seva configuració personal per poder recuperar l'accés en els arxius xifrats.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es pot desencriptar aquest fitxer, probablement és un fitxer compartit. Demaneu al propietari del fitxer que el comparteixi de nou amb vós.",
- "Unknown error. Please check your system settings or contact your administrator" : "Error desconegut. Comproveu l'arranjament del sistema o aviseu a l'administrador",
- "Initial encryption started... This can take some time. Please wait." : "La encriptació inicial ha començat... Pot trigar una estona, espereu.",
- "Initial encryption running... Please try again later." : "encriptació inicial en procés... Proveu-ho més tard.",
- "Missing requirements." : "Manca de requisits.",
- "Following users are not set up for encryption:" : "Els usuaris següents no estan configurats per a l'encriptació:",
- "Go directly to your %spersonal settings%s." : "Vés directament a l'%sarranjament personal%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicació d'encriptació està activada però les claus no estan inicialitzades, sortiu i acrediteu-vos de nou.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activa la clau de recuperació (permet recuperar fitxers d'usuaris en cas de pèrdua de contrasenya):",
- "Recovery key password" : "Clau de recuperació de la contrasenya",
- "Repeat Recovery key password" : "Repetiu la clau de recuperació de contrasenya",
- "Enabled" : "Activat",
- "Disabled" : "Desactivat",
- "Change recovery key password:" : "Canvia la clau de recuperació de contrasenya:",
- "Old Recovery key password" : "Antiga clau de recuperació de contrasenya",
- "New Recovery key password" : "Nova clau de recuperació de contrasenya",
- "Repeat New Recovery key password" : "Repetiu la nova clau de recuperació de contrasenya",
- "Change Password" : "Canvia la contrasenya",
- "Your private key password no longer matches your log-in password." : "La clau privada ja no es correspon amb la contrasenya d'accés:",
- "Set your old private key password to your current log-in password:" : "Establiu la vostra antiga clau privada a l'actual contrasenya d'accés:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recordeu la contrasenya anterior podeu demanar a l'administrador que recuperi els vostres fitxers.",
- "Old log-in password" : "Contrasenya anterior d'accés",
- "Current log-in password" : "Contrasenya d'accés actual",
- "Update Private Key Password" : "Actualitza la contrasenya de clau privada",
- "Enable password recovery:" : "Habilita la recuperació de contrasenya:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Activar aquesta opció us permetrà obtenir de nou accés als vostres fitxers encriptats en cas de perdre la contrasenya"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/cs_CZ.js b/apps/files_encryption/l10n/cs_CZ.js
deleted file mode 100644
index 42e14ca683f..00000000000
--- a/apps/files_encryption/l10n/cs_CZ.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Neznámá chyba",
- "Missing recovery key password" : "Chybí heslo klíče pro obnovu",
- "Please repeat the recovery key password" : "Zopakujte prosím heslo klíče pro obnovu",
- "Repeated recovery key password does not match the provided recovery key password" : "Opakované heslo pro obnovu nesouhlasí se zadaným heslem",
- "Recovery key successfully enabled" : "Záchranný klíč byl úspěšně povolen",
- "Could not disable recovery key. Please check your recovery key password!" : "Nelze zakázat záchranný klíč. Zkontrolujte prosím heslo svého záchranného klíče!",
- "Recovery key successfully disabled" : "Záchranný klíč byl úspěšně zakázán",
- "Please provide the old recovery password" : "Zadejte prosím staré heslo pro obnovu",
- "Please provide a new recovery password" : "Zadejte prosím nové heslo pro obnovu",
- "Please repeat the new recovery password" : "Zopakujte prosím nové heslo pro obnovu",
- "Password successfully changed." : "Heslo bylo úspěšně změněno.",
- "Could not change the password. Maybe the old password was not correct." : "Změna hesla se nezdařila. Pravděpodobně nebylo stávající heslo zadáno správně.",
- "Could not update the private key password." : "Nelze aktualizovat heslo soukromého klíče.",
- "The old password was not correct, please try again." : "Staré heslo nebylo zadáno správně, zkuste to prosím znovu.",
- "The current log-in password was not correct, please try again." : "Současné přihlašovací heslo nebylo zadáno správně, zkuste to prosím znovu.",
- "Private key password successfully updated." : "Heslo soukromého klíče úspěšně aktualizováno.",
- "File recovery settings updated" : "Možnosti záchrany souborů aktualizovány",
- "Could not update file recovery" : "Nelze nastavit záchranu souborů",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikace pro šifrování není inicializována! Je možné, že aplikace byla znovu aktivována během vašeho přihlášení. Zkuste se prosím odhlásit a znovu přihlásit pro provedení inicializace šifrovací aplikace.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš soukromý klíč není platný! Pravděpodobně bylo vaše heslo změněno vně systému %s (např. ve vašem firemním adresáři). Heslo vašeho soukromého klíče můžete změnit ve svém osobním nastavení pro obnovení přístupu k vašim zašifrovaným souborům.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento soubor se nepodařilo dešifrovat, pravděpodobně je sdílený. Požádejte prosím majitele souboru, aby jej s vámi znovu sdílel.",
- "Unknown error. Please check your system settings or contact your administrator" : "Neznámá chyba. Zkontrolujte nastavení systému nebo kontaktujte vašeho správce.",
- "Initial encryption started... This can take some time. Please wait." : "Počáteční šifrování zahájeno... Toto může chvíli trvat. Počkejte prosím.",
- "Initial encryption running... Please try again later." : "Probíhá počáteční šifrování... Zkuste to prosím znovu později.",
- "Missing requirements." : "Nesplněné závislosti.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Ujistěte se prosím, že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Aplikace pro šifrování byla prozatím vypnuta.",
- "Following users are not set up for encryption:" : "Následující uživatelé nemají nastavené šifrování:",
- "Go directly to your %spersonal settings%s." : "Přejít přímo do svého %sosobního nastavení%s.",
- "Server-side Encryption" : "Šifrování na serveru",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Povolit klíč pro obnovu (umožňuje obnovu uživatelských souborů v případě ztráty hesla)",
- "Recovery key password" : "Heslo klíče pro obnovu",
- "Repeat Recovery key password" : "Zopakujte heslo klíče pro obnovu",
- "Enabled" : "Povoleno",
- "Disabled" : "Zakázáno",
- "Change recovery key password:" : "Změna hesla klíče pro obnovu:",
- "Old Recovery key password" : "Původní heslo klíče pro obnovu",
- "New Recovery key password" : "Nové heslo klíče pro obnovu",
- "Repeat New Recovery key password" : "Zopakujte nové heslo klíče pro obnovu",
- "Change Password" : "Změnit heslo",
- "Your private key password no longer matches your log-in password." : "Heslo vašeho soukromého klíče se již neshoduje s vaším přihlašovacím heslem.",
- "Set your old private key password to your current log-in password:" : "Změňte své staré heslo soukromého klíče na stejné, jako je vaše současné přihlašovací heslo:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Pokud si nepamatujete své původní heslo, můžete požádat správce o obnovu vašich souborů.",
- "Old log-in password" : "Původní přihlašovací heslo",
- "Current log-in password" : "Aktuální přihlašovací heslo",
- "Update Private Key Password" : "Změnit heslo soukromého klíče",
- "Enable password recovery:" : "Povolit obnovu hesla:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Zapnutí této volby vám umožní znovu získat přístup k vašim zašifrovaným souborům pokud ztratíte heslo"
-},
-"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_encryption/l10n/cs_CZ.json b/apps/files_encryption/l10n/cs_CZ.json
deleted file mode 100644
index 6e724f8ea2e..00000000000
--- a/apps/files_encryption/l10n/cs_CZ.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Neznámá chyba",
- "Missing recovery key password" : "Chybí heslo klíče pro obnovu",
- "Please repeat the recovery key password" : "Zopakujte prosím heslo klíče pro obnovu",
- "Repeated recovery key password does not match the provided recovery key password" : "Opakované heslo pro obnovu nesouhlasí se zadaným heslem",
- "Recovery key successfully enabled" : "Záchranný klíč byl úspěšně povolen",
- "Could not disable recovery key. Please check your recovery key password!" : "Nelze zakázat záchranný klíč. Zkontrolujte prosím heslo svého záchranného klíče!",
- "Recovery key successfully disabled" : "Záchranný klíč byl úspěšně zakázán",
- "Please provide the old recovery password" : "Zadejte prosím staré heslo pro obnovu",
- "Please provide a new recovery password" : "Zadejte prosím nové heslo pro obnovu",
- "Please repeat the new recovery password" : "Zopakujte prosím nové heslo pro obnovu",
- "Password successfully changed." : "Heslo bylo úspěšně změněno.",
- "Could not change the password. Maybe the old password was not correct." : "Změna hesla se nezdařila. Pravděpodobně nebylo stávající heslo zadáno správně.",
- "Could not update the private key password." : "Nelze aktualizovat heslo soukromého klíče.",
- "The old password was not correct, please try again." : "Staré heslo nebylo zadáno správně, zkuste to prosím znovu.",
- "The current log-in password was not correct, please try again." : "Současné přihlašovací heslo nebylo zadáno správně, zkuste to prosím znovu.",
- "Private key password successfully updated." : "Heslo soukromého klíče úspěšně aktualizováno.",
- "File recovery settings updated" : "Možnosti záchrany souborů aktualizovány",
- "Could not update file recovery" : "Nelze nastavit záchranu souborů",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikace pro šifrování není inicializována! Je možné, že aplikace byla znovu aktivována během vašeho přihlášení. Zkuste se prosím odhlásit a znovu přihlásit pro provedení inicializace šifrovací aplikace.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš soukromý klíč není platný! Pravděpodobně bylo vaše heslo změněno vně systému %s (např. ve vašem firemním adresáři). Heslo vašeho soukromého klíče můžete změnit ve svém osobním nastavení pro obnovení přístupu k vašim zašifrovaným souborům.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento soubor se nepodařilo dešifrovat, pravděpodobně je sdílený. Požádejte prosím majitele souboru, aby jej s vámi znovu sdílel.",
- "Unknown error. Please check your system settings or contact your administrator" : "Neznámá chyba. Zkontrolujte nastavení systému nebo kontaktujte vašeho správce.",
- "Initial encryption started... This can take some time. Please wait." : "Počáteční šifrování zahájeno... Toto může chvíli trvat. Počkejte prosím.",
- "Initial encryption running... Please try again later." : "Probíhá počáteční šifrování... Zkuste to prosím znovu později.",
- "Missing requirements." : "Nesplněné závislosti.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Ujistěte se prosím, že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Aplikace pro šifrování byla prozatím vypnuta.",
- "Following users are not set up for encryption:" : "Následující uživatelé nemají nastavené šifrování:",
- "Go directly to your %spersonal settings%s." : "Přejít přímo do svého %sosobního nastavení%s.",
- "Server-side Encryption" : "Šifrování na serveru",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Povolit klíč pro obnovu (umožňuje obnovu uživatelských souborů v případě ztráty hesla)",
- "Recovery key password" : "Heslo klíče pro obnovu",
- "Repeat Recovery key password" : "Zopakujte heslo klíče pro obnovu",
- "Enabled" : "Povoleno",
- "Disabled" : "Zakázáno",
- "Change recovery key password:" : "Změna hesla klíče pro obnovu:",
- "Old Recovery key password" : "Původní heslo klíče pro obnovu",
- "New Recovery key password" : "Nové heslo klíče pro obnovu",
- "Repeat New Recovery key password" : "Zopakujte nové heslo klíče pro obnovu",
- "Change Password" : "Změnit heslo",
- "Your private key password no longer matches your log-in password." : "Heslo vašeho soukromého klíče se již neshoduje s vaším přihlašovacím heslem.",
- "Set your old private key password to your current log-in password:" : "Změňte své staré heslo soukromého klíče na stejné, jako je vaše současné přihlašovací heslo:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Pokud si nepamatujete své původní heslo, můžete požádat správce o obnovu vašich souborů.",
- "Old log-in password" : "Původní přihlašovací heslo",
- "Current log-in password" : "Aktuální přihlašovací heslo",
- "Update Private Key Password" : "Změnit heslo soukromého klíče",
- "Enable password recovery:" : "Povolit obnovu hesla:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Zapnutí této volby vám umožní znovu získat přístup k vašim zašifrovaným souborům pokud ztratíte heslo"
-},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/cy_GB.js b/apps/files_encryption/l10n/cy_GB.js
deleted file mode 100644
index 03b6d253b38..00000000000
--- a/apps/files_encryption/l10n/cy_GB.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Encryption" : "Amgryptiad"
-},
-"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
diff --git a/apps/files_encryption/l10n/cy_GB.json b/apps/files_encryption/l10n/cy_GB.json
deleted file mode 100644
index ed3f6b2fb92..00000000000
--- a/apps/files_encryption/l10n/cy_GB.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Encryption" : "Amgryptiad"
-},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/da.js b/apps/files_encryption/l10n/da.js
deleted file mode 100644
index 667b8e72c7a..00000000000
--- a/apps/files_encryption/l10n/da.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Ukendt fejl",
- "Missing recovery key password" : "Der mangler kodeord for gendannelsesnøgle",
- "Please repeat the recovery key password" : "Gentag venligst kodeordet for gendannelsesnøglen",
- "Repeated recovery key password does not match the provided recovery key password" : "Det gentagne kodeord for gendannelsesnøglen stemmer ikke med det angivne kodeord for gendannelsesnøglen",
- "Recovery key successfully enabled" : "Gendannelsesnøgle aktiveret med succes",
- "Could not disable recovery key. Please check your recovery key password!" : "Kunne ikke deaktivere gendannelsesnøgle. Kontroller din gendannelsesnøgle kodeord!",
- "Recovery key successfully disabled" : "Gendannelsesnøgle deaktiveret succesfuldt",
- "Please provide the old recovery password" : "Angiv venligst det gamle kodeord for gendannelsesnøglen",
- "Please provide a new recovery password" : "Angiv venligst et nyt kodeord til gendannelse",
- "Please repeat the new recovery password" : "Gentag venligst det nye kodeord til gendannelse",
- "Password successfully changed." : "Kodeordet blev ændret succesfuldt",
- "Could not change the password. Maybe the old password was not correct." : "Kunne ikke ændre kodeordet. Måske var det gamle kodeord ikke korrekt.",
- "Could not update the private key password." : "Kunne ikke opdatere kodeordet til den private nøgle.",
- "The old password was not correct, please try again." : "Det gamle kodeord var ikke korrekt, prøv venligst igen.",
- "The current log-in password was not correct, please try again." : "Det nuværende kodeord til log-in var ikke korrekt, prøv venligst igen.",
- "Private key password successfully updated." : "Privat nøgle kodeord succesfuldt opdateret.",
- "File recovery settings updated" : "Filgendannelsesindstillinger opdateret",
- "Could not update file recovery" : "Kunne ikke opdatere filgendannelse",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet er ikke igangsat. Det kan skyldes at krypteringsprogrammet er blevet genaktiveret under din session. Prøv at logge ud og ind igen for at aktivere krypteringsprogrammet. ",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din private nøgle er ikke gyldig. Sandsynligvis er dit kodeord blevet ændret uden for %s (f.eks dit firmas adressebog). Du kan opdatere din private nøglekode i dine personlige indstillinger for at genskabe adgang til dine krypterede filer.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke kryptere denne fil, sandsynligvis fordi filen er delt. Bed venligst filens ejer om at dele den med dig på ny.",
- "Unknown error. Please check your system settings or contact your administrator" : "Ukendt fejl. Venligst tjek dine systemindstillinger eller kontakt din systemadministrator",
- "Initial encryption started... This can take some time. Please wait." : "Førstegangskrypteringen er påbegyndt... Dette kan tage nogen tid. Vent venligst.",
- "Initial encryption running... Please try again later." : "Kryptering foretages... Prøv venligst igen senere.",
- "Missing requirements." : "Manglende betingelser.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Sørg for at OpenSSL, sammen med PHP-udvidelsen, er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.",
- "Following users are not set up for encryption:" : "Følgende brugere er ikke sat op til kryptering:",
- "Go directly to your %spersonal settings%s." : "Gå direkte til dine %spersonlige indstillinger%s.",
- "Server-side Encryption" : "Kryptering på serverdelen",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret, men din nøgler er ikke igangsat. Log venligst ud og ind igen.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktiver gendannelsesnøgle (Tillad gendannelse af brugerfiler i tilfælde af tab af kodeord):",
- "Recovery key password" : "Gendannelsesnøgle kodeord",
- "Repeat Recovery key password" : "Gentag gendannelse af nøglekoden",
- "Enabled" : "Aktiveret",
- "Disabled" : "Deaktiveret",
- "Change recovery key password:" : "Skift gendannelsesnøgle kodeord:",
- "Old Recovery key password" : "Gammel Gendannelsesnøgle kodeord",
- "New Recovery key password" : "Ny Gendannelsesnøgle kodeord",
- "Repeat New Recovery key password" : "Gentag det nye gendannaleses nøglekodeord",
- "Change Password" : "Skift Kodeord",
- "Your private key password no longer matches your log-in password." : "Dit private nøglekodeord stemmer ikke længere overens med dit login-kodeord.",
- "Set your old private key password to your current log-in password:" : "Sæt dit gamle, private nøglekodeord til at være dit nuværende login-kodeord. ",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Hvis du ikke kan huske dit gamle kodeord kan du bede din administrator om at gendanne dine filer.",
- "Old log-in password" : "Gammelt login kodeord",
- "Current log-in password" : "Nuvrende login kodeord",
- "Update Private Key Password" : "Opdater Privat Nøgle Kodeord",
- "Enable password recovery:" : "Aktiver kodeord gendannelse:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aktivering af denne valgmulighed tillader dig at generhverve adgang til dine krypterede filer i tilfælde af tab af kodeord"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/da.json b/apps/files_encryption/l10n/da.json
deleted file mode 100644
index 0561094f291..00000000000
--- a/apps/files_encryption/l10n/da.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Ukendt fejl",
- "Missing recovery key password" : "Der mangler kodeord for gendannelsesnøgle",
- "Please repeat the recovery key password" : "Gentag venligst kodeordet for gendannelsesnøglen",
- "Repeated recovery key password does not match the provided recovery key password" : "Det gentagne kodeord for gendannelsesnøglen stemmer ikke med det angivne kodeord for gendannelsesnøglen",
- "Recovery key successfully enabled" : "Gendannelsesnøgle aktiveret med succes",
- "Could not disable recovery key. Please check your recovery key password!" : "Kunne ikke deaktivere gendannelsesnøgle. Kontroller din gendannelsesnøgle kodeord!",
- "Recovery key successfully disabled" : "Gendannelsesnøgle deaktiveret succesfuldt",
- "Please provide the old recovery password" : "Angiv venligst det gamle kodeord for gendannelsesnøglen",
- "Please provide a new recovery password" : "Angiv venligst et nyt kodeord til gendannelse",
- "Please repeat the new recovery password" : "Gentag venligst det nye kodeord til gendannelse",
- "Password successfully changed." : "Kodeordet blev ændret succesfuldt",
- "Could not change the password. Maybe the old password was not correct." : "Kunne ikke ændre kodeordet. Måske var det gamle kodeord ikke korrekt.",
- "Could not update the private key password." : "Kunne ikke opdatere kodeordet til den private nøgle.",
- "The old password was not correct, please try again." : "Det gamle kodeord var ikke korrekt, prøv venligst igen.",
- "The current log-in password was not correct, please try again." : "Det nuværende kodeord til log-in var ikke korrekt, prøv venligst igen.",
- "Private key password successfully updated." : "Privat nøgle kodeord succesfuldt opdateret.",
- "File recovery settings updated" : "Filgendannelsesindstillinger opdateret",
- "Could not update file recovery" : "Kunne ikke opdatere filgendannelse",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet er ikke igangsat. Det kan skyldes at krypteringsprogrammet er blevet genaktiveret under din session. Prøv at logge ud og ind igen for at aktivere krypteringsprogrammet. ",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din private nøgle er ikke gyldig. Sandsynligvis er dit kodeord blevet ændret uden for %s (f.eks dit firmas adressebog). Du kan opdatere din private nøglekode i dine personlige indstillinger for at genskabe adgang til dine krypterede filer.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke kryptere denne fil, sandsynligvis fordi filen er delt. Bed venligst filens ejer om at dele den med dig på ny.",
- "Unknown error. Please check your system settings or contact your administrator" : "Ukendt fejl. Venligst tjek dine systemindstillinger eller kontakt din systemadministrator",
- "Initial encryption started... This can take some time. Please wait." : "Førstegangskrypteringen er påbegyndt... Dette kan tage nogen tid. Vent venligst.",
- "Initial encryption running... Please try again later." : "Kryptering foretages... Prøv venligst igen senere.",
- "Missing requirements." : "Manglende betingelser.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Sørg for at OpenSSL, sammen med PHP-udvidelsen, er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.",
- "Following users are not set up for encryption:" : "Følgende brugere er ikke sat op til kryptering:",
- "Go directly to your %spersonal settings%s." : "Gå direkte til dine %spersonlige indstillinger%s.",
- "Server-side Encryption" : "Kryptering på serverdelen",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret, men din nøgler er ikke igangsat. Log venligst ud og ind igen.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktiver gendannelsesnøgle (Tillad gendannelse af brugerfiler i tilfælde af tab af kodeord):",
- "Recovery key password" : "Gendannelsesnøgle kodeord",
- "Repeat Recovery key password" : "Gentag gendannelse af nøglekoden",
- "Enabled" : "Aktiveret",
- "Disabled" : "Deaktiveret",
- "Change recovery key password:" : "Skift gendannelsesnøgle kodeord:",
- "Old Recovery key password" : "Gammel Gendannelsesnøgle kodeord",
- "New Recovery key password" : "Ny Gendannelsesnøgle kodeord",
- "Repeat New Recovery key password" : "Gentag det nye gendannaleses nøglekodeord",
- "Change Password" : "Skift Kodeord",
- "Your private key password no longer matches your log-in password." : "Dit private nøglekodeord stemmer ikke længere overens med dit login-kodeord.",
- "Set your old private key password to your current log-in password:" : "Sæt dit gamle, private nøglekodeord til at være dit nuværende login-kodeord. ",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Hvis du ikke kan huske dit gamle kodeord kan du bede din administrator om at gendanne dine filer.",
- "Old log-in password" : "Gammelt login kodeord",
- "Current log-in password" : "Nuvrende login kodeord",
- "Update Private Key Password" : "Opdater Privat Nøgle Kodeord",
- "Enable password recovery:" : "Aktiver kodeord gendannelse:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aktivering af denne valgmulighed tillader dig at generhverve adgang til dine krypterede filer i tilfælde af tab af kodeord"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/de.js b/apps/files_encryption/l10n/de.js
deleted file mode 100644
index 544d7630833..00000000000
--- a/apps/files_encryption/l10n/de.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Unbekannter Fehler",
- "Missing recovery key password" : "Schlüsselpasswort zur Wiederherstellung fehlt",
- "Please repeat the recovery key password" : "Schlüsselpasswort zur Wiederherstellung bitte wiederholen",
- "Repeated recovery key password does not match the provided recovery key password" : "Das wiederholte Schlüsselpasswort zur Wiederherstellung stimmt nicht mit dem geforderten Schlüsselpasswort zur Wiederherstellung überein",
- "Recovery key successfully enabled" : "Wiederherstellungsschlüssel wurde erfolgreich aktiviert",
- "Could not disable recovery key. Please check your recovery key password!" : "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Überprüfe Dein Wiederherstellungspasswort!",
- "Recovery key successfully disabled" : "Wiederherstellungsschlüssel deaktiviert.",
- "Please provide the old recovery password" : "Bitte das alte Passwort zur Wiederherstellung eingeben",
- "Please provide a new recovery password" : "Bitte das alte Passwort zur Wiederherstellung eingeben",
- "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen",
- "Password successfully changed." : "Dein Passwort wurde geändert.",
- "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort falsch.",
- "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.",
- "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuche es noch einmal.",
- "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuche es noch einmal.",
- "Private key password successfully updated." : "Passwort des privaten Schlüssels erfolgreich aktualisiert",
- "File recovery settings updated" : "Einstellungen zur Wiederherstellung von Dateien wurden aktualisiert",
- "Could not update file recovery" : "Dateiwiederherstellung konnte nicht aktualisiert werden",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuche Dich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Dein privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von %s Dein Passwort geändert (z.B. in Deinem gemeinsamen Verzeichnis). Du kannst das Passwort Deines privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Deine Dateien zu gelangen.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte frage den Dateibesitzer, ob er die Datei nochmals mit Dir teilt.",
- "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfe Deine Systemeinstellungen oder kontaktiere Deinen Administrator",
- "Initial encryption started... This can take some time. Please wait." : "Initialverschlüsselung gestartet… Dies kann einige Zeit dauern. Bitte warten.",
- "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuche es später wieder.",
- "Missing requirements." : "Fehlende Vorraussetzungen",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stelle sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.",
- "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
- "Go directly to your %spersonal settings%s." : "Direkt zu Deinen %spersonal settings%s wechseln.",
- "Server-side Encryption" : "Serverseitige Verschlüsselung",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Die Verschlüsselung-App ist aktiviert, aber Deine Schlüssel sind nicht initialisiert. Bitte melde Dich nochmals ab und wieder an.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Wiederherstellungsschlüssel aktivieren (ermöglicht das Wiederherstellen von Dateien, falls das Passwort vergessen wurde):",
- "Recovery key password" : "Wiederherstellungsschlüssel-Passwort",
- "Repeat Recovery key password" : "Schlüssel-Passwort zur Wiederherstellung wiederholen",
- "Enabled" : "Aktiviert",
- "Disabled" : "Deaktiviert",
- "Change recovery key password:" : "Wiederherstellungsschlüssel-Passwort ändern:",
- "Old Recovery key password" : "Altes Wiederherstellungsschlüssel-Passwort",
- "New Recovery key password" : "Neues Wiederherstellungsschlüssel-Passwort",
- "Repeat New Recovery key password" : "Neues Schlüssel-Passwort zur Wiederherstellung wiederholen",
- "Change Password" : "Passwort ändern",
- "Your private key password no longer matches your log-in password." : "Dein Passwort für Deinen privaten Schlüssel stimmt nicht mehr mit Deinem Loginpasswort überein.",
- "Set your old private key password to your current log-in password:" : "Dein altes Passwort für Deinen privaten Schlüssel auf Dein aktuelles Anmeldepasswort einstellen:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Wenn Du Dein altes Passwort vergessen hast, könntest Du Deinen Administrator bitten, Deine Daten wiederherzustellen.",
- "Old log-in password" : "Altes Login Passwort",
- "Current log-in password" : "Aktuelles Passwort",
- "Update Private Key Password" : "Passwort für den privaten Schlüssel aktualisieren",
- "Enable password recovery:" : "Passwortwiederherstellung aktivieren:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Wenn Du diese Option aktivierst, kannst Du Deine verschlüsselten Dateien wiederherstellen, falls Du Dein Passwort vergisst"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/de.json b/apps/files_encryption/l10n/de.json
deleted file mode 100644
index 7ba97e39ac5..00000000000
--- a/apps/files_encryption/l10n/de.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Unbekannter Fehler",
- "Missing recovery key password" : "Schlüsselpasswort zur Wiederherstellung fehlt",
- "Please repeat the recovery key password" : "Schlüsselpasswort zur Wiederherstellung bitte wiederholen",
- "Repeated recovery key password does not match the provided recovery key password" : "Das wiederholte Schlüsselpasswort zur Wiederherstellung stimmt nicht mit dem geforderten Schlüsselpasswort zur Wiederherstellung überein",
- "Recovery key successfully enabled" : "Wiederherstellungsschlüssel wurde erfolgreich aktiviert",
- "Could not disable recovery key. Please check your recovery key password!" : "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Überprüfe Dein Wiederherstellungspasswort!",
- "Recovery key successfully disabled" : "Wiederherstellungsschlüssel deaktiviert.",
- "Please provide the old recovery password" : "Bitte das alte Passwort zur Wiederherstellung eingeben",
- "Please provide a new recovery password" : "Bitte das alte Passwort zur Wiederherstellung eingeben",
- "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen",
- "Password successfully changed." : "Dein Passwort wurde geändert.",
- "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort falsch.",
- "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.",
- "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuche es noch einmal.",
- "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuche es noch einmal.",
- "Private key password successfully updated." : "Passwort des privaten Schlüssels erfolgreich aktualisiert",
- "File recovery settings updated" : "Einstellungen zur Wiederherstellung von Dateien wurden aktualisiert",
- "Could not update file recovery" : "Dateiwiederherstellung konnte nicht aktualisiert werden",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuche Dich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Dein privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von %s Dein Passwort geändert (z.B. in Deinem gemeinsamen Verzeichnis). Du kannst das Passwort Deines privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Deine Dateien zu gelangen.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte frage den Dateibesitzer, ob er die Datei nochmals mit Dir teilt.",
- "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfe Deine Systemeinstellungen oder kontaktiere Deinen Administrator",
- "Initial encryption started... This can take some time. Please wait." : "Initialverschlüsselung gestartet… Dies kann einige Zeit dauern. Bitte warten.",
- "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuche es später wieder.",
- "Missing requirements." : "Fehlende Vorraussetzungen",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stelle sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.",
- "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
- "Go directly to your %spersonal settings%s." : "Direkt zu Deinen %spersonal settings%s wechseln.",
- "Server-side Encryption" : "Serverseitige Verschlüsselung",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Die Verschlüsselung-App ist aktiviert, aber Deine Schlüssel sind nicht initialisiert. Bitte melde Dich nochmals ab und wieder an.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Wiederherstellungsschlüssel aktivieren (ermöglicht das Wiederherstellen von Dateien, falls das Passwort vergessen wurde):",
- "Recovery key password" : "Wiederherstellungsschlüssel-Passwort",
- "Repeat Recovery key password" : "Schlüssel-Passwort zur Wiederherstellung wiederholen",
- "Enabled" : "Aktiviert",
- "Disabled" : "Deaktiviert",
- "Change recovery key password:" : "Wiederherstellungsschlüssel-Passwort ändern:",
- "Old Recovery key password" : "Altes Wiederherstellungsschlüssel-Passwort",
- "New Recovery key password" : "Neues Wiederherstellungsschlüssel-Passwort",
- "Repeat New Recovery key password" : "Neues Schlüssel-Passwort zur Wiederherstellung wiederholen",
- "Change Password" : "Passwort ändern",
- "Your private key password no longer matches your log-in password." : "Dein Passwort für Deinen privaten Schlüssel stimmt nicht mehr mit Deinem Loginpasswort überein.",
- "Set your old private key password to your current log-in password:" : "Dein altes Passwort für Deinen privaten Schlüssel auf Dein aktuelles Anmeldepasswort einstellen:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Wenn Du Dein altes Passwort vergessen hast, könntest Du Deinen Administrator bitten, Deine Daten wiederherzustellen.",
- "Old log-in password" : "Altes Login Passwort",
- "Current log-in password" : "Aktuelles Passwort",
- "Update Private Key Password" : "Passwort für den privaten Schlüssel aktualisieren",
- "Enable password recovery:" : "Passwortwiederherstellung aktivieren:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Wenn Du diese Option aktivierst, kannst Du Deine verschlüsselten Dateien wiederherstellen, falls Du Dein Passwort vergisst"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/de_CH.js b/apps/files_encryption/l10n/de_CH.js
deleted file mode 100644
index 1f5a01e6798..00000000000
--- a/apps/files_encryption/l10n/de_CH.js
+++ /dev/null
@@ -1,33 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Unbekannter Fehler",
- "Recovery key successfully enabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich aktiviert.",
- "Could not disable recovery key. Please check your recovery key password!" : "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Bitte überprüfen Sie das Passwort für den Wiederherstellungsschlüssel!",
- "Recovery key successfully disabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich deaktiviert.",
- "Password successfully changed." : "Das Passwort wurde erfolgreich geändert.",
- "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.",
- "Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.",
- "Could not update the private key password. Maybe the old password was not correct." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Vielleicht war das alte Passwort nicht richtig.",
- "File recovery settings updated" : "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.",
- "Could not update file recovery" : "Die Dateiwiederherstellung konnte nicht aktualisiert werden.",
- "Missing requirements." : "Fehlende Voraussetzungen",
- "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.",
- "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
- "Encryption" : "Verschlüsselung",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivieren Sie den Wiederherstellungsschlüssel (erlaubt die Wiederherstellung des Zugangs zu den Benutzerdateien, wenn das Passwort verloren geht).",
- "Recovery key password" : "Wiederherstellungschlüsselpasswort",
- "Enabled" : "Aktiviert",
- "Disabled" : "Deaktiviert",
- "Change recovery key password:" : "Wiederherstellungsschlüsselpasswort ändern",
- "Old Recovery key password" : "Altes Wiederherstellungsschlüsselpasswort",
- "New Recovery key password" : "Neues Wiederherstellungsschlüsselpasswort ",
- "Change Password" : "Passwort ändern",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Falls Sie sich nicht an Ihr altes Passwort erinnern können, fragen Sie bitte Ihren Administrator, um Ihre Dateien wiederherzustellen.",
- "Old log-in password" : "Altes Login-Passwort",
- "Current log-in password" : "Momentanes Login-Passwort",
- "Update Private Key Password" : "Das Passwort des privaten Schlüssels aktualisieren",
- "Enable password recovery:" : "Die Passwort-Wiederherstellung aktivieren:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/de_CH.json b/apps/files_encryption/l10n/de_CH.json
deleted file mode 100644
index 244d0946bfe..00000000000
--- a/apps/files_encryption/l10n/de_CH.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{ "translations": {
- "Unknown error" : "Unbekannter Fehler",
- "Recovery key successfully enabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich aktiviert.",
- "Could not disable recovery key. Please check your recovery key password!" : "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Bitte überprüfen Sie das Passwort für den Wiederherstellungsschlüssel!",
- "Recovery key successfully disabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich deaktiviert.",
- "Password successfully changed." : "Das Passwort wurde erfolgreich geändert.",
- "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.",
- "Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.",
- "Could not update the private key password. Maybe the old password was not correct." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Vielleicht war das alte Passwort nicht richtig.",
- "File recovery settings updated" : "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.",
- "Could not update file recovery" : "Die Dateiwiederherstellung konnte nicht aktualisiert werden.",
- "Missing requirements." : "Fehlende Voraussetzungen",
- "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.",
- "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:",
- "Encryption" : "Verschlüsselung",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivieren Sie den Wiederherstellungsschlüssel (erlaubt die Wiederherstellung des Zugangs zu den Benutzerdateien, wenn das Passwort verloren geht).",
- "Recovery key password" : "Wiederherstellungschlüsselpasswort",
- "Enabled" : "Aktiviert",
- "Disabled" : "Deaktiviert",
- "Change recovery key password:" : "Wiederherstellungsschlüsselpasswort ändern",
- "Old Recovery key password" : "Altes Wiederherstellungsschlüsselpasswort",
- "New Recovery key password" : "Neues Wiederherstellungsschlüsselpasswort ",
- "Change Password" : "Passwort ändern",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Falls Sie sich nicht an Ihr altes Passwort erinnern können, fragen Sie bitte Ihren Administrator, um Ihre Dateien wiederherzustellen.",
- "Old log-in password" : "Altes Login-Passwort",
- "Current log-in password" : "Momentanes Login-Passwort",
- "Update Private Key Password" : "Das Passwort des privaten Schlüssels aktualisieren",
- "Enable password recovery:" : "Die Passwort-Wiederherstellung aktivieren:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/de_DE.js b/apps/files_encryption/l10n/de_DE.js
deleted file mode 100644
index 9ad50104ea8..00000000000
--- a/apps/files_encryption/l10n/de_DE.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Unbekannter Fehler",
- "Missing recovery key password" : "Schlüsselpasswort zur Wiederherstellung fehlt",
- "Please repeat the recovery key password" : "Schlüsselpasswort zur Wiederherstellung bitte wiederholen",
- "Repeated recovery key password does not match the provided recovery key password" : "Das wiederholte Schlüsselpasswort zur Wiederherstellung stimmt nicht mit dem geforderten Schlüsselpasswort zur Wiederherstellung überein",
- "Recovery key successfully enabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich aktiviert.",
- "Could not disable recovery key. Please check your recovery key password!" : "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Bitte überprüfen Sie das Passwort für den Wiederherstellungsschlüssel!",
- "Recovery key successfully disabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich deaktiviert.",
- "Please provide the old recovery password" : "Bitte das alte Passwort zur Wiederherstellung eingeben",
- "Please provide a new recovery password" : "Bitte das neue Passwort zur Wiederherstellung eingeben",
- "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen",
- "Password successfully changed." : "Das Passwort wurde erfolgreich geändert.",
- "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.",
- "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.",
- "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuchen Sie es noch einmal.",
- "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuchen Sie es noch einmal.",
- "Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.",
- "File recovery settings updated" : "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.",
- "Could not update file recovery" : "Die Dateiwiederherstellung konnte nicht aktualisiert werden.",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuchen Sie sich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ihr privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von %s Ihr Passwort geändert (z.B. in Ihrem gemeinsamen Verzeichnis). Sie können das Passwort Ihres privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Ihre Dateien zu gelangen.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte fragen Sie den Dateibesitzer, dass er die Datei nochmals mit Ihnen teilt.",
- "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfen Sie die Systemeinstellungen oder kontaktieren Sie Ihren Administrator",
- "Initial encryption started... This can take some time. Please wait." : "Anfangsverschlüsselung gestartet … Dieses kann einige Zeit dauern. Bitte warten.",
- "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuchen Sie es später wieder.",
- "Missing requirements." : "Fehlende Voraussetzungen",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.",
- "Following users are not set up for encryption:" : "Für folgende Benutzer ist keine Verschlüsselung eingerichtet:",
- "Go directly to your %spersonal settings%s." : "Wechseln Sie direkt zu Ihren %spersonal settings%s.",
- "Server-side Encryption" : "Serverseitige Verschlüsselung",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselung-App ist aktiviert, aber Ihre Schlüssel sind nicht initialisiert. Bitte nochmals ab- und wieder anmelden.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivieren Sie den Wiederherstellungsschlüssel (erlaubt die Wiederherstellung des Zugangs zu den Benutzerdateien, wenn das Passwort verloren geht):",
- "Recovery key password" : "Wiederherstellungschlüsselpasswort",
- "Repeat Recovery key password" : "Schlüsselpasswort zur Wiederherstellung wiederholen",
- "Enabled" : "Aktiviert",
- "Disabled" : "Deaktiviert",
- "Change recovery key password:" : "Wiederherstellungsschlüsselpasswort ändern",
- "Old Recovery key password" : "Altes Wiederherstellungsschlüsselpasswort",
- "New Recovery key password" : "Neues Wiederherstellungsschlüsselpasswort ",
- "Repeat New Recovery key password" : "Neues Schlüsselpasswort zur Wiederherstellung wiederholen",
- "Change Password" : "Passwort ändern",
- "Your private key password no longer matches your log-in password." : "Das Privatschlüsselpasswort stimmt nicht länger mit dem Anmeldepasswort überein.",
- "Set your old private key password to your current log-in password:" : "Ihr altes Privatschlüsselpasswort auf Ihr aktuelles Anmeldepasswort stellen:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Falls Sie sich nicht an Ihr altes Passwort erinnern können, fragen Sie bitte Ihren Administrator, um Ihre Dateien wiederherzustellen.",
- "Old log-in password" : "Altes Anmeldepasswort",
- "Current log-in password" : "Aktuelles Anmeldepasswort",
- "Update Private Key Password" : "Das Passwort des privaten Schlüssels aktualisieren",
- "Enable password recovery:" : "Die Passwort-Wiederherstellung aktivieren:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/de_DE.json b/apps/files_encryption/l10n/de_DE.json
deleted file mode 100644
index 135818e290c..00000000000
--- a/apps/files_encryption/l10n/de_DE.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Unbekannter Fehler",
- "Missing recovery key password" : "Schlüsselpasswort zur Wiederherstellung fehlt",
- "Please repeat the recovery key password" : "Schlüsselpasswort zur Wiederherstellung bitte wiederholen",
- "Repeated recovery key password does not match the provided recovery key password" : "Das wiederholte Schlüsselpasswort zur Wiederherstellung stimmt nicht mit dem geforderten Schlüsselpasswort zur Wiederherstellung überein",
- "Recovery key successfully enabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich aktiviert.",
- "Could not disable recovery key. Please check your recovery key password!" : "Der Wiederherstellungsschlüssel konnte nicht deaktiviert werden. Bitte überprüfen Sie das Passwort für den Wiederherstellungsschlüssel!",
- "Recovery key successfully disabled" : "Der Wiederherstellungsschlüssel wurde erfolgreich deaktiviert.",
- "Please provide the old recovery password" : "Bitte das alte Passwort zur Wiederherstellung eingeben",
- "Please provide a new recovery password" : "Bitte das neue Passwort zur Wiederherstellung eingeben",
- "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen",
- "Password successfully changed." : "Das Passwort wurde erfolgreich geändert.",
- "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.",
- "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.",
- "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuchen Sie es noch einmal.",
- "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuchen Sie es noch einmal.",
- "Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.",
- "File recovery settings updated" : "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.",
- "Could not update file recovery" : "Die Dateiwiederherstellung konnte nicht aktualisiert werden.",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuchen Sie sich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ihr privater Schlüssel ist ungültig. Möglicher Weise wurde außerhalb von %s Ihr Passwort geändert (z.B. in Ihrem gemeinsamen Verzeichnis). Sie können das Passwort Ihres privaten Schlüssels in den persönlichen Einstellungen aktualisieren, um wieder an Ihre Dateien zu gelangen.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte fragen Sie den Dateibesitzer, dass er die Datei nochmals mit Ihnen teilt.",
- "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfen Sie die Systemeinstellungen oder kontaktieren Sie Ihren Administrator",
- "Initial encryption started... This can take some time. Please wait." : "Anfangsverschlüsselung gestartet … Dieses kann einige Zeit dauern. Bitte warten.",
- "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuchen Sie es später wieder.",
- "Missing requirements." : "Fehlende Voraussetzungen",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.",
- "Following users are not set up for encryption:" : "Für folgende Benutzer ist keine Verschlüsselung eingerichtet:",
- "Go directly to your %spersonal settings%s." : "Wechseln Sie direkt zu Ihren %spersonal settings%s.",
- "Server-side Encryption" : "Serverseitige Verschlüsselung",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselung-App ist aktiviert, aber Ihre Schlüssel sind nicht initialisiert. Bitte nochmals ab- und wieder anmelden.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivieren Sie den Wiederherstellungsschlüssel (erlaubt die Wiederherstellung des Zugangs zu den Benutzerdateien, wenn das Passwort verloren geht):",
- "Recovery key password" : "Wiederherstellungschlüsselpasswort",
- "Repeat Recovery key password" : "Schlüsselpasswort zur Wiederherstellung wiederholen",
- "Enabled" : "Aktiviert",
- "Disabled" : "Deaktiviert",
- "Change recovery key password:" : "Wiederherstellungsschlüsselpasswort ändern",
- "Old Recovery key password" : "Altes Wiederherstellungsschlüsselpasswort",
- "New Recovery key password" : "Neues Wiederherstellungsschlüsselpasswort ",
- "Repeat New Recovery key password" : "Neues Schlüsselpasswort zur Wiederherstellung wiederholen",
- "Change Password" : "Passwort ändern",
- "Your private key password no longer matches your log-in password." : "Das Privatschlüsselpasswort stimmt nicht länger mit dem Anmeldepasswort überein.",
- "Set your old private key password to your current log-in password:" : "Ihr altes Privatschlüsselpasswort auf Ihr aktuelles Anmeldepasswort stellen:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Falls Sie sich nicht an Ihr altes Passwort erinnern können, fragen Sie bitte Ihren Administrator, um Ihre Dateien wiederherzustellen.",
- "Old log-in password" : "Altes Anmeldepasswort",
- "Current log-in password" : "Aktuelles Anmeldepasswort",
- "Update Private Key Password" : "Das Passwort des privaten Schlüssels aktualisieren",
- "Enable password recovery:" : "Die Passwort-Wiederherstellung aktivieren:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/el.js b/apps/files_encryption/l10n/el.js
deleted file mode 100644
index ad7621545bd..00000000000
--- a/apps/files_encryption/l10n/el.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Άγνωστο σφάλμα",
- "Missing recovery key password" : "Λείπει το κλειδί επαναφοράς κωδικού",
- "Please repeat the recovery key password" : "Παρακαλώ επαναλάβετε το κλειδί επαναφοράς κωδικού",
- "Repeated recovery key password does not match the provided recovery key password" : "Η επανάληψη του κλειδιού επαναφοράς κωδικού δεν ταιριάζει με το δοσμένο κλειδί επαναφοράς κωδικού",
- "Recovery key successfully enabled" : "Επιτυχής ενεργοποίηση κλειδιού ανάκτησης",
- "Could not disable recovery key. Please check your recovery key password!" : "Αποτυχία απενεργοποίησης κλειδιού ανάκτησης. Παρακαλώ ελέγξτε τον κωδικό του κλειδιού ανάκτησής σας!",
- "Recovery key successfully disabled" : "Επιτυχής απενεργοποίηση κλειδιού ανάκτησης",
- "Please provide the old recovery password" : "Παρακαλώ παρέχετε τον παλιό κωδικό επαναφοράς",
- "Please provide a new recovery password" : "Παρακαλώ παρέχετε ένα νέο κωδικό επαναφοράς",
- "Please repeat the new recovery password" : "Παρακαλώ επαναλάβετε το νέο κωδικό επαναφοράς",
- "Password successfully changed." : "Ο κωδικός αλλάχτηκε επιτυχώς.",
- "Could not change the password. Maybe the old password was not correct." : "Αποτυχία αλλαγής κωδικού ίσως ο παλιός κωδικός να μην ήταν σωστός.",
- "Could not update the private key password." : "Αποτυχία ενημέρωσης του προσωπικού κλειδιού πρόσβασης",
- "The old password was not correct, please try again." : "Το παλαιό συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.",
- "The current log-in password was not correct, please try again." : "Το τρέχον συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.",
- "Private key password successfully updated." : "Το Προσωπικό κλειδί πρόσβασης ενημερώθηκε επιτυχώς",
- "File recovery settings updated" : "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν",
- "Could not update file recovery" : "Αποτυχία ενημέρωσης ανάκτησης αρχείων",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Η εφαρμογή κρυπτογράφησης δεν έχει εκκινήσει! Ίσως η εφαρμογή κρυπτογράφησης επανενεργοποιήθηκε κατά τη διάρκεια της τρέχουσας σύνδεσής σας. Παρακαλώ προσπαθήστε να αποσυνδεθείτε και να ξανασυνδεθείτε για να εκκινήσετε την εφαρμογή κρυπτογράφησης.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Το προσωπικό σας κλειδί δεν είναι έγκυρο! Πιθανόν ο κωδικός σας να άλλαξε έξω από το %s (π.χ. τη λίστα διευθύνσεων της εταιρείας σας). Μπορείτε να ενημερώσετε το προσωπικό σας κλειδί επαναφοράς κωδικού στις προσωπικές σας ρυθμίσεις για να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Δεν ήταν δυνατό να αποκρυπτογραφηθεί αυτό το αρχείο, πιθανόν πρόκειται για κοινόχρηστο αρχείο. Παρακαλώ ζητήστε από τον ιδιοκτήτη του αρχείου να το ξαναμοιραστεί μαζί σας.",
- "Unknown error. Please check your system settings or contact your administrator" : "Άγνωστο σφάλμα. Παρακαλώ ελέγξτε τις ρυθμίσεις του συστήματό σας ή επικοινωνήστε με τον διαχειριστή συστημάτων σας",
- "Initial encryption started... This can take some time. Please wait." : "Η αρχική κρυπτογράφηση άρχισε... Αυτό μπορεί να πάρει κάποια ώρα. Παρακαλώ περιμένετε.",
- "Initial encryption running... Please try again later." : "Εκτέλεση αρχικής κρυπτογράφησης... Παρακαλώ προσπαθήστε αργότερα.",
- "Missing requirements." : "Προαπαιτούμενα που απουσιάζουν.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Παρακαλώ επιβεβαιώστε ότι η OpenSSL μαζί με την επέκταση PHP έχουν ενεργοποιηθεί και ρυθμιστεί σωστά. Προς το παρόν, η εφαρμογή κρυπτογράφησης είναι απενεργοποιημένη.",
- "Following users are not set up for encryption:" : "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:",
- "Go directly to your %spersonal settings%s." : "Πηγαίνετε κατ'ευθείαν στις %sπροσωπικές ρυθμίσεις%s σας.",
- "Server-side Encryption" : "Κρυπτογράφηση από τον Διακομιστή",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Η εφαρμογή κρυπτογράφησης είναι ενεργοποιημένη αλλά τα κλειδιά σας δεν έχουν καταγραφεί, παρακαλώ αποσυνδεθείτε και επανασυνδεθείτε.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Ενεργοποίηση κλειδιού ανάκτησης (επιτρέψτε την ανάκτηση αρχείων χρηστών σε περίπτωση απώλειας κωδικού):",
- "Recovery key password" : "Επαναφορά κωδικού κλειδιού",
- "Repeat Recovery key password" : "Επαναλάβετε το κλειδί επαναφοράς κωδικού",
- "Enabled" : "Ενεργοποιημένο",
- "Disabled" : "Απενεργοποιημένο",
- "Change recovery key password:" : "Αλλαγή κλειδιού επαναφοράς κωδικού:",
- "Old Recovery key password" : "Παλιό κλειδί επαναφοράς κωδικού",
- "New Recovery key password" : "Νέο κλειδί επαναφοράς κωδικού",
- "Repeat New Recovery key password" : "Επαναλάβετε νέο κλειδί επαναφοράς κωδικού",
- "Change Password" : "Αλλαγή Κωδικού Πρόσβασης",
- "Your private key password no longer matches your log-in password." : "Ο κωδικός του ιδιωτικού κλειδιού σας δεν ταιριάζει πλέον με τον κωδικό σύνδεσής σας.",
- "Set your old private key password to your current log-in password:" : "Ορίστε τον παλιό σας κωδικό ιδιωτικού κλειδιού στον τρέχοντα κωδικό σύνδεσης.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Εάν δεν θυμάστε τον παλιό σας κωδικό μπορείτε να ζητήσετε από τον διαχειριστή σας να επανακτήσει τα αρχεία σας.",
- "Old log-in password" : "Παλαιό συνθηματικό εισόδου",
- "Current log-in password" : "Τρέχον συνθηματικό πρόσβασης",
- "Update Private Key Password" : "Ενημέρωση Προσωπικού Κλειδού Πρόσβασης",
- "Enable password recovery:" : "Ενεργοποιήστε την ανάκτηση κωδικού πρόσβασης",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Η ενεργοποίηση αυτής της επιλογής θα σας επιτρέψει να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία σε περίπτωση απώλειας του κωδικού σας"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/el.json b/apps/files_encryption/l10n/el.json
deleted file mode 100644
index cbe19731893..00000000000
--- a/apps/files_encryption/l10n/el.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Άγνωστο σφάλμα",
- "Missing recovery key password" : "Λείπει το κλειδί επαναφοράς κωδικού",
- "Please repeat the recovery key password" : "Παρακαλώ επαναλάβετε το κλειδί επαναφοράς κωδικού",
- "Repeated recovery key password does not match the provided recovery key password" : "Η επανάληψη του κλειδιού επαναφοράς κωδικού δεν ταιριάζει με το δοσμένο κλειδί επαναφοράς κωδικού",
- "Recovery key successfully enabled" : "Επιτυχής ενεργοποίηση κλειδιού ανάκτησης",
- "Could not disable recovery key. Please check your recovery key password!" : "Αποτυχία απενεργοποίησης κλειδιού ανάκτησης. Παρακαλώ ελέγξτε τον κωδικό του κλειδιού ανάκτησής σας!",
- "Recovery key successfully disabled" : "Επιτυχής απενεργοποίηση κλειδιού ανάκτησης",
- "Please provide the old recovery password" : "Παρακαλώ παρέχετε τον παλιό κωδικό επαναφοράς",
- "Please provide a new recovery password" : "Παρακαλώ παρέχετε ένα νέο κωδικό επαναφοράς",
- "Please repeat the new recovery password" : "Παρακαλώ επαναλάβετε το νέο κωδικό επαναφοράς",
- "Password successfully changed." : "Ο κωδικός αλλάχτηκε επιτυχώς.",
- "Could not change the password. Maybe the old password was not correct." : "Αποτυχία αλλαγής κωδικού ίσως ο παλιός κωδικός να μην ήταν σωστός.",
- "Could not update the private key password." : "Αποτυχία ενημέρωσης του προσωπικού κλειδιού πρόσβασης",
- "The old password was not correct, please try again." : "Το παλαιό συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.",
- "The current log-in password was not correct, please try again." : "Το τρέχον συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.",
- "Private key password successfully updated." : "Το Προσωπικό κλειδί πρόσβασης ενημερώθηκε επιτυχώς",
- "File recovery settings updated" : "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν",
- "Could not update file recovery" : "Αποτυχία ενημέρωσης ανάκτησης αρχείων",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Η εφαρμογή κρυπτογράφησης δεν έχει εκκινήσει! Ίσως η εφαρμογή κρυπτογράφησης επανενεργοποιήθηκε κατά τη διάρκεια της τρέχουσας σύνδεσής σας. Παρακαλώ προσπαθήστε να αποσυνδεθείτε και να ξανασυνδεθείτε για να εκκινήσετε την εφαρμογή κρυπτογράφησης.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Το προσωπικό σας κλειδί δεν είναι έγκυρο! Πιθανόν ο κωδικός σας να άλλαξε έξω από το %s (π.χ. τη λίστα διευθύνσεων της εταιρείας σας). Μπορείτε να ενημερώσετε το προσωπικό σας κλειδί επαναφοράς κωδικού στις προσωπικές σας ρυθμίσεις για να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Δεν ήταν δυνατό να αποκρυπτογραφηθεί αυτό το αρχείο, πιθανόν πρόκειται για κοινόχρηστο αρχείο. Παρακαλώ ζητήστε από τον ιδιοκτήτη του αρχείου να το ξαναμοιραστεί μαζί σας.",
- "Unknown error. Please check your system settings or contact your administrator" : "Άγνωστο σφάλμα. Παρακαλώ ελέγξτε τις ρυθμίσεις του συστήματό σας ή επικοινωνήστε με τον διαχειριστή συστημάτων σας",
- "Initial encryption started... This can take some time. Please wait." : "Η αρχική κρυπτογράφηση άρχισε... Αυτό μπορεί να πάρει κάποια ώρα. Παρακαλώ περιμένετε.",
- "Initial encryption running... Please try again later." : "Εκτέλεση αρχικής κρυπτογράφησης... Παρακαλώ προσπαθήστε αργότερα.",
- "Missing requirements." : "Προαπαιτούμενα που απουσιάζουν.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Παρακαλώ επιβεβαιώστε ότι η OpenSSL μαζί με την επέκταση PHP έχουν ενεργοποιηθεί και ρυθμιστεί σωστά. Προς το παρόν, η εφαρμογή κρυπτογράφησης είναι απενεργοποιημένη.",
- "Following users are not set up for encryption:" : "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:",
- "Go directly to your %spersonal settings%s." : "Πηγαίνετε κατ'ευθείαν στις %sπροσωπικές ρυθμίσεις%s σας.",
- "Server-side Encryption" : "Κρυπτογράφηση από τον Διακομιστή",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Η εφαρμογή κρυπτογράφησης είναι ενεργοποιημένη αλλά τα κλειδιά σας δεν έχουν καταγραφεί, παρακαλώ αποσυνδεθείτε και επανασυνδεθείτε.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Ενεργοποίηση κλειδιού ανάκτησης (επιτρέψτε την ανάκτηση αρχείων χρηστών σε περίπτωση απώλειας κωδικού):",
- "Recovery key password" : "Επαναφορά κωδικού κλειδιού",
- "Repeat Recovery key password" : "Επαναλάβετε το κλειδί επαναφοράς κωδικού",
- "Enabled" : "Ενεργοποιημένο",
- "Disabled" : "Απενεργοποιημένο",
- "Change recovery key password:" : "Αλλαγή κλειδιού επαναφοράς κωδικού:",
- "Old Recovery key password" : "Παλιό κλειδί επαναφοράς κωδικού",
- "New Recovery key password" : "Νέο κλειδί επαναφοράς κωδικού",
- "Repeat New Recovery key password" : "Επαναλάβετε νέο κλειδί επαναφοράς κωδικού",
- "Change Password" : "Αλλαγή Κωδικού Πρόσβασης",
- "Your private key password no longer matches your log-in password." : "Ο κωδικός του ιδιωτικού κλειδιού σας δεν ταιριάζει πλέον με τον κωδικό σύνδεσής σας.",
- "Set your old private key password to your current log-in password:" : "Ορίστε τον παλιό σας κωδικό ιδιωτικού κλειδιού στον τρέχοντα κωδικό σύνδεσης.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Εάν δεν θυμάστε τον παλιό σας κωδικό μπορείτε να ζητήσετε από τον διαχειριστή σας να επανακτήσει τα αρχεία σας.",
- "Old log-in password" : "Παλαιό συνθηματικό εισόδου",
- "Current log-in password" : "Τρέχον συνθηματικό πρόσβασης",
- "Update Private Key Password" : "Ενημέρωση Προσωπικού Κλειδού Πρόσβασης",
- "Enable password recovery:" : "Ενεργοποιήστε την ανάκτηση κωδικού πρόσβασης",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Η ενεργοποίηση αυτής της επιλογής θα σας επιτρέψει να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία σε περίπτωση απώλειας του κωδικού σας"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/en_GB.js b/apps/files_encryption/l10n/en_GB.js
deleted file mode 100644
index dc0dba85eb2..00000000000
--- a/apps/files_encryption/l10n/en_GB.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Unknown error",
- "Missing recovery key password" : "Missing recovery key password",
- "Please repeat the recovery key password" : "Please repeat the recovery key password",
- "Repeated recovery key password does not match the provided recovery key password" : "Repeated recovery key password does not match the provided recovery key password",
- "Recovery key successfully enabled" : "Recovery key enabled successfully",
- "Could not disable recovery key. Please check your recovery key password!" : "Could not disable recovery key. Please check your recovery key password!",
- "Recovery key successfully disabled" : "Recovery key disabled successfully",
- "Please provide the old recovery password" : "Please provide the old recovery password",
- "Please provide a new recovery password" : "Please provide a new recovery password",
- "Please repeat the new recovery password" : "Please repeat the new recovery password",
- "Password successfully changed." : "Password changed successfully.",
- "Could not change the password. Maybe the old password was not correct." : "Could not change the password. Maybe the old password was incorrect.",
- "Could not update the private key password." : "Could not update the private key password.",
- "The old password was not correct, please try again." : "The old password was not correct, please try again.",
- "The current log-in password was not correct, please try again." : "The current log-in password was not correct, please try again.",
- "Private key password successfully updated." : "Private key password updated successfully.",
- "File recovery settings updated" : "File recovery settings updated",
- "Could not update file recovery" : "Could not update file recovery",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Encryption app not initialised! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialise the encryption app.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, which is probably a shared file. Please ask the file owner to reshare the file with you.",
- "Unknown error. Please check your system settings or contact your administrator" : "Unknown error. Please check your system settings or contact your administrator",
- "Initial encryption started... This can take some time. Please wait." : "Initial encryption started... This can take some time. Please wait.",
- "Initial encryption running... Please try again later." : "Initial encryption running... Please try again later.",
- "Missing requirements." : "Missing requirements.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Please make sure that OpenSSL together with the PHP extension is enabled and properly configured. For now, the encryption app has been disabled.",
- "Following users are not set up for encryption:" : "Following users are not set up for encryption:",
- "Go directly to your %spersonal settings%s." : "Go directly to your %spersonal settings%s.",
- "Server-side Encryption" : "Server-side Encryption",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption App is enabled but your keys are not initialised, please log-out and log-in again",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Enable recovery key (allow to recover users files in case of password loss):",
- "Recovery key password" : "Recovery key password",
- "Repeat Recovery key password" : "Repeat recovery key password",
- "Enabled" : "Enabled",
- "Disabled" : "Disabled",
- "Change recovery key password:" : "Change recovery key password:",
- "Old Recovery key password" : "Old recovery key password",
- "New Recovery key password" : "New recovery key password",
- "Repeat New Recovery key password" : "Repeat new recovery key password",
- "Change Password" : "Change Password",
- "Your private key password no longer matches your log-in password." : "Your private key password no longer matches your log-in password.",
- "Set your old private key password to your current log-in password:" : "Set your old private key password to your current log-in password:",
- " If you don't remember your old password you can ask your administrator to recover your files." : " If you don't remember your old password you can ask your administrator to recover your files.",
- "Old log-in password" : "Old login password",
- "Current log-in password" : "Current login password",
- "Update Private Key Password" : "Update Private Key Password",
- "Enable password recovery:" : "Enable password recovery:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/en_GB.json b/apps/files_encryption/l10n/en_GB.json
deleted file mode 100644
index 8afafc4e908..00000000000
--- a/apps/files_encryption/l10n/en_GB.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Unknown error",
- "Missing recovery key password" : "Missing recovery key password",
- "Please repeat the recovery key password" : "Please repeat the recovery key password",
- "Repeated recovery key password does not match the provided recovery key password" : "Repeated recovery key password does not match the provided recovery key password",
- "Recovery key successfully enabled" : "Recovery key enabled successfully",
- "Could not disable recovery key. Please check your recovery key password!" : "Could not disable recovery key. Please check your recovery key password!",
- "Recovery key successfully disabled" : "Recovery key disabled successfully",
- "Please provide the old recovery password" : "Please provide the old recovery password",
- "Please provide a new recovery password" : "Please provide a new recovery password",
- "Please repeat the new recovery password" : "Please repeat the new recovery password",
- "Password successfully changed." : "Password changed successfully.",
- "Could not change the password. Maybe the old password was not correct." : "Could not change the password. Maybe the old password was incorrect.",
- "Could not update the private key password." : "Could not update the private key password.",
- "The old password was not correct, please try again." : "The old password was not correct, please try again.",
- "The current log-in password was not correct, please try again." : "The current log-in password was not correct, please try again.",
- "Private key password successfully updated." : "Private key password updated successfully.",
- "File recovery settings updated" : "File recovery settings updated",
- "Could not update file recovery" : "Could not update file recovery",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Encryption app not initialised! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialise the encryption app.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, which is probably a shared file. Please ask the file owner to reshare the file with you.",
- "Unknown error. Please check your system settings or contact your administrator" : "Unknown error. Please check your system settings or contact your administrator",
- "Initial encryption started... This can take some time. Please wait." : "Initial encryption started... This can take some time. Please wait.",
- "Initial encryption running... Please try again later." : "Initial encryption running... Please try again later.",
- "Missing requirements." : "Missing requirements.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Please make sure that OpenSSL together with the PHP extension is enabled and properly configured. For now, the encryption app has been disabled.",
- "Following users are not set up for encryption:" : "Following users are not set up for encryption:",
- "Go directly to your %spersonal settings%s." : "Go directly to your %spersonal settings%s.",
- "Server-side Encryption" : "Server-side Encryption",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption App is enabled but your keys are not initialised, please log-out and log-in again",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Enable recovery key (allow to recover users files in case of password loss):",
- "Recovery key password" : "Recovery key password",
- "Repeat Recovery key password" : "Repeat recovery key password",
- "Enabled" : "Enabled",
- "Disabled" : "Disabled",
- "Change recovery key password:" : "Change recovery key password:",
- "Old Recovery key password" : "Old recovery key password",
- "New Recovery key password" : "New recovery key password",
- "Repeat New Recovery key password" : "Repeat new recovery key password",
- "Change Password" : "Change Password",
- "Your private key password no longer matches your log-in password." : "Your private key password no longer matches your log-in password.",
- "Set your old private key password to your current log-in password:" : "Set your old private key password to your current log-in password:",
- " If you don't remember your old password you can ask your administrator to recover your files." : " If you don't remember your old password you can ask your administrator to recover your files.",
- "Old log-in password" : "Old login password",
- "Current log-in password" : "Current login password",
- "Update Private Key Password" : "Update Private Key Password",
- "Enable password recovery:" : "Enable password recovery:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/eo.js b/apps/files_encryption/l10n/eo.js
deleted file mode 100644
index b99a3f80920..00000000000
--- a/apps/files_encryption/l10n/eo.js
+++ /dev/null
@@ -1,17 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Nekonata eraro",
- "Password successfully changed." : "La pasvorto sukcese ŝanĝiĝis.",
- "Could not change the password. Maybe the old password was not correct." : "Ne eblis ŝanĝi la pasvorton. Eble la malnova pasvorto malĝustis.",
- "Private key password successfully updated." : "La pasvorto de la malpublika klavo sukcese ĝisdatiĝis.",
- "Missing requirements." : "Mankas neproj.",
- "Enabled" : "Kapabligita",
- "Disabled" : "Malkapabligita",
- "Change Password" : "Ŝarĝi pasvorton",
- "Old log-in password" : "Malnova ensaluta pasvorto",
- "Current log-in password" : "Nuna ensaluta pasvorto",
- "Update Private Key Password" : "Ĝisdatigi la pasvorton de la malpublika klavo",
- "Enable password recovery:" : "Kapabligi restaŭron de pasvorto:"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/eo.json b/apps/files_encryption/l10n/eo.json
deleted file mode 100644
index 02ba7e2faa1..00000000000
--- a/apps/files_encryption/l10n/eo.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{ "translations": {
- "Unknown error" : "Nekonata eraro",
- "Password successfully changed." : "La pasvorto sukcese ŝanĝiĝis.",
- "Could not change the password. Maybe the old password was not correct." : "Ne eblis ŝanĝi la pasvorton. Eble la malnova pasvorto malĝustis.",
- "Private key password successfully updated." : "La pasvorto de la malpublika klavo sukcese ĝisdatiĝis.",
- "Missing requirements." : "Mankas neproj.",
- "Enabled" : "Kapabligita",
- "Disabled" : "Malkapabligita",
- "Change Password" : "Ŝarĝi pasvorton",
- "Old log-in password" : "Malnova ensaluta pasvorto",
- "Current log-in password" : "Nuna ensaluta pasvorto",
- "Update Private Key Password" : "Ĝisdatigi la pasvorton de la malpublika klavo",
- "Enable password recovery:" : "Kapabligi restaŭron de pasvorto:"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/es.js b/apps/files_encryption/l10n/es.js
deleted file mode 100644
index 22c2b02a8e7..00000000000
--- a/apps/files_encryption/l10n/es.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Error desconocido",
- "Missing recovery key password" : "Falta contraseña de recuperación.",
- "Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación",
- "Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada.",
- "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor, ¡compruebe su contraseña!",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación",
- "Please provide a new recovery password" : "Por favor, ingrese una nueva contraseña de recuperación",
- "Please repeat the new recovery password" : "Por favor, repita su nueva contraseña de recuperación",
- "Password successfully changed." : "Su contraseña ha sido cambiada",
- "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
- "Could not update the private key password." : "No se pudo actualizar la contraseña de la clave privada.",
- "The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor intente de nuevo.",
- "The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcto, por favor intente de nuevo.",
- "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.",
- "File recovery settings updated" : "Opciones de recuperación de archivos actualizada",
- "Could not update file recovery" : "No se pudo actualizar la recuperación de archivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá se restableció durante su sesión. Por favor intente cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera de %s (Ej: su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.",
- "Unknown error. Please check your system settings or contact your administrator" : "Error desconocido. Revise la configuración de su sistema o contacte con su administrador",
- "Initial encryption started... This can take some time. Please wait." : "Ha comenzado el cifrado inicial... Esto puede tardar un rato. Por favor, espere.",
- "Initial encryption running... Please try again later." : "Cifrado inicial en curso... Inténtelo más tarde.",
- "Missing requirements." : "Requisitos incompletos.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que OpenSSL y la extensión de PHP estén habilitados y configurados correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:",
- "Go directly to your %spersonal settings%s." : "Ir directamente a %sOpciones%s.",
- "Server-side Encryption" : "Cifrado en el servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de cifrado está habilitada pero sus claves no se han inicializado, por favor, cierre la sesión y vuelva a iniciarla de nuevo.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los ficheros del usuario en caso de pérdida de la contraseña);",
- "Recovery key password" : "Contraseña de clave de recuperación",
- "Repeat Recovery key password" : "Repite la contraseña de clave de recuperación",
- "Enabled" : "Habilitar",
- "Disabled" : "Deshabilitado",
- "Change recovery key password:" : "Cambiar la contraseña de la clave de recuperación",
- "Old Recovery key password" : "Antigua clave de recuperación",
- "New Recovery key password" : "Nueva clave de recuperación",
- "Repeat New Recovery key password" : "Repetir la nueva clave de recuperación",
- "Change Password" : "Cambiar contraseña",
- "Your private key password no longer matches your log-in password." : "Su contraseña de clave privada ya no coincide con su contraseña de acceso.",
- "Set your old private key password to your current log-in password:" : "Establezca la contraseña de clave privada antigua para su contraseña de inicio de sesión actual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus ficheros.",
- "Old log-in password" : "Contraseña de acceso antigua",
- "Current log-in password" : "Contraseña de acceso actual",
- "Update Private Key Password" : "Actualizar contraseña de clave privada",
- "Enable password recovery:" : "Habilitar la recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus ficheros cifrados en caso de pérdida de contraseña"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/es.json b/apps/files_encryption/l10n/es.json
deleted file mode 100644
index f31c325a239..00000000000
--- a/apps/files_encryption/l10n/es.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Error desconocido",
- "Missing recovery key password" : "Falta contraseña de recuperación.",
- "Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación",
- "Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada.",
- "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor, ¡compruebe su contraseña!",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación",
- "Please provide a new recovery password" : "Por favor, ingrese una nueva contraseña de recuperación",
- "Please repeat the new recovery password" : "Por favor, repita su nueva contraseña de recuperación",
- "Password successfully changed." : "Su contraseña ha sido cambiada",
- "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
- "Could not update the private key password." : "No se pudo actualizar la contraseña de la clave privada.",
- "The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor intente de nuevo.",
- "The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcto, por favor intente de nuevo.",
- "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.",
- "File recovery settings updated" : "Opciones de recuperación de archivos actualizada",
- "Could not update file recovery" : "No se pudo actualizar la recuperación de archivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá se restableció durante su sesión. Por favor intente cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera de %s (Ej: su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.",
- "Unknown error. Please check your system settings or contact your administrator" : "Error desconocido. Revise la configuración de su sistema o contacte con su administrador",
- "Initial encryption started... This can take some time. Please wait." : "Ha comenzado el cifrado inicial... Esto puede tardar un rato. Por favor, espere.",
- "Initial encryption running... Please try again later." : "Cifrado inicial en curso... Inténtelo más tarde.",
- "Missing requirements." : "Requisitos incompletos.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que OpenSSL y la extensión de PHP estén habilitados y configurados correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:",
- "Go directly to your %spersonal settings%s." : "Ir directamente a %sOpciones%s.",
- "Server-side Encryption" : "Cifrado en el servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de cifrado está habilitada pero sus claves no se han inicializado, por favor, cierre la sesión y vuelva a iniciarla de nuevo.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los ficheros del usuario en caso de pérdida de la contraseña);",
- "Recovery key password" : "Contraseña de clave de recuperación",
- "Repeat Recovery key password" : "Repite la contraseña de clave de recuperación",
- "Enabled" : "Habilitar",
- "Disabled" : "Deshabilitado",
- "Change recovery key password:" : "Cambiar la contraseña de la clave de recuperación",
- "Old Recovery key password" : "Antigua clave de recuperación",
- "New Recovery key password" : "Nueva clave de recuperación",
- "Repeat New Recovery key password" : "Repetir la nueva clave de recuperación",
- "Change Password" : "Cambiar contraseña",
- "Your private key password no longer matches your log-in password." : "Su contraseña de clave privada ya no coincide con su contraseña de acceso.",
- "Set your old private key password to your current log-in password:" : "Establezca la contraseña de clave privada antigua para su contraseña de inicio de sesión actual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus ficheros.",
- "Old log-in password" : "Contraseña de acceso antigua",
- "Current log-in password" : "Contraseña de acceso actual",
- "Update Private Key Password" : "Actualizar contraseña de clave privada",
- "Enable password recovery:" : "Habilitar la recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus ficheros cifrados en caso de pérdida de contraseña"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/es_AR.js b/apps/files_encryption/l10n/es_AR.js
deleted file mode 100644
index 88a7456dbc6..00000000000
--- a/apps/files_encryption/l10n/es_AR.js
+++ /dev/null
@@ -1,38 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Error desconocido",
- "Recovery key successfully enabled" : "Se habilitó la recuperación de archivos",
- "Could not disable recovery key. Please check your recovery key password!" : "No fue posible deshabilitar la clave de recuperación. Por favor, comprobá tu contraseña.",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Password successfully changed." : "Tu contraseña fue cambiada",
- "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Comprobá que la contraseña actual sea correcta.",
- "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.",
- "File recovery settings updated" : "Las opciones de recuperación de archivos fueron actualizadas",
- "Could not update file recovery" : "No fue posible actualizar la recuperación de archivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de encriptación no está inicializada! Es probable que la aplicación fue re-habilitada durante tu sesión. Intenta salir y iniciar sesión para volverla a iniciar.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Tu llave privada no es válida! Aparenta que tu clave fue cambiada fuera de %s (de tus directorios). Puedes actualizar la contraseña de tu clave privadaen las configuraciones personales para recobrar el acceso a tus archivos encriptados.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede descibrar este archivo, probablemente sea un archivo compartido. Por favor pídele al dueño que recomparta el archivo contigo.",
- "Initial encryption started... This can take some time. Please wait." : "Encriptación inicial comenzada... Esto puede durar un tiempo. Por favor espere.",
- "Initial encryption running... Please try again later." : "Encriptación inicial corriendo... Por favor intente mas tarde. ",
- "Missing requirements." : "Requisitos incompletos.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios no fueron configurados para encriptar:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encriptación está habilitada pero las llaves no fueron inicializadas, por favor termine y vuelva a iniciar la sesión",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar clave de recuperación (te permite recuperar los archivos de usuario en el caso que pierdas la contraseña):",
- "Recovery key password" : "Contraseña de recuperación de clave",
- "Repeat Recovery key password" : "Repetir la contraseña de la clave de recuperación",
- "Enabled" : "Habilitado",
- "Disabled" : "Deshabilitado",
- "Change recovery key password:" : "Cambiar contraseña para recuperar la clave:",
- "Old Recovery key password" : "Contraseña antigua de recuperación de clave",
- "New Recovery key password" : "Nueva contraseña de recuperación de clave",
- "Repeat New Recovery key password" : "Repetir Nueva contraseña para la clave de recuperación",
- "Change Password" : "Cambiar contraseña",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no te acordás de tu contraseña antigua, pedile al administrador que recupere tus archivos",
- "Old log-in password" : "Contraseña anterior",
- "Current log-in password" : "Contraseña actual",
- "Update Private Key Password" : "Actualizar contraseña de la clave privada",
- "Enable password recovery:" : "Habilitar recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitando esta opción, vas a tener acceso a tus archivos encriptados, incluso si perdés la contraseña"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/es_AR.json b/apps/files_encryption/l10n/es_AR.json
deleted file mode 100644
index 03495731eca..00000000000
--- a/apps/files_encryption/l10n/es_AR.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{ "translations": {
- "Unknown error" : "Error desconocido",
- "Recovery key successfully enabled" : "Se habilitó la recuperación de archivos",
- "Could not disable recovery key. Please check your recovery key password!" : "No fue posible deshabilitar la clave de recuperación. Por favor, comprobá tu contraseña.",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Password successfully changed." : "Tu contraseña fue cambiada",
- "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Comprobá que la contraseña actual sea correcta.",
- "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.",
- "File recovery settings updated" : "Las opciones de recuperación de archivos fueron actualizadas",
- "Could not update file recovery" : "No fue posible actualizar la recuperación de archivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de encriptación no está inicializada! Es probable que la aplicación fue re-habilitada durante tu sesión. Intenta salir y iniciar sesión para volverla a iniciar.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Tu llave privada no es válida! Aparenta que tu clave fue cambiada fuera de %s (de tus directorios). Puedes actualizar la contraseña de tu clave privadaen las configuraciones personales para recobrar el acceso a tus archivos encriptados.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede descibrar este archivo, probablemente sea un archivo compartido. Por favor pídele al dueño que recomparta el archivo contigo.",
- "Initial encryption started... This can take some time. Please wait." : "Encriptación inicial comenzada... Esto puede durar un tiempo. Por favor espere.",
- "Initial encryption running... Please try again later." : "Encriptación inicial corriendo... Por favor intente mas tarde. ",
- "Missing requirements." : "Requisitos incompletos.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios no fueron configurados para encriptar:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encriptación está habilitada pero las llaves no fueron inicializadas, por favor termine y vuelva a iniciar la sesión",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar clave de recuperación (te permite recuperar los archivos de usuario en el caso que pierdas la contraseña):",
- "Recovery key password" : "Contraseña de recuperación de clave",
- "Repeat Recovery key password" : "Repetir la contraseña de la clave de recuperación",
- "Enabled" : "Habilitado",
- "Disabled" : "Deshabilitado",
- "Change recovery key password:" : "Cambiar contraseña para recuperar la clave:",
- "Old Recovery key password" : "Contraseña antigua de recuperación de clave",
- "New Recovery key password" : "Nueva contraseña de recuperación de clave",
- "Repeat New Recovery key password" : "Repetir Nueva contraseña para la clave de recuperación",
- "Change Password" : "Cambiar contraseña",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no te acordás de tu contraseña antigua, pedile al administrador que recupere tus archivos",
- "Old log-in password" : "Contraseña anterior",
- "Current log-in password" : "Contraseña actual",
- "Update Private Key Password" : "Actualizar contraseña de la clave privada",
- "Enable password recovery:" : "Habilitar recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitando esta opción, vas a tener acceso a tus archivos encriptados, incluso si perdés la contraseña"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/es_CL.js b/apps/files_encryption/l10n/es_CL.js
deleted file mode 100644
index 5863354a6f1..00000000000
--- a/apps/files_encryption/l10n/es_CL.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Error desconocido"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/es_CL.json b/apps/files_encryption/l10n/es_CL.json
deleted file mode 100644
index 8573fba4ca1..00000000000
--- a/apps/files_encryption/l10n/es_CL.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "Error desconocido"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/es_MX.js b/apps/files_encryption/l10n/es_MX.js
deleted file mode 100644
index 29721e7904e..00000000000
--- a/apps/files_encryption/l10n/es_MX.js
+++ /dev/null
@@ -1,37 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Error desconocido",
- "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor compruebe su contraseña!",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Password successfully changed." : "Su contraseña ha sido cambiada",
- "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
- "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.",
- "File recovery settings updated" : "Opciones de recuperación de archivos actualizada",
- "Could not update file recovery" : "No se pudo actualizar la recuperación de archivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.",
- "Initial encryption started... This can take some time. Please wait." : "Encriptación iniciada... Esto puede tomar un tiempo. Por favor espere.",
- "Missing requirements." : "Requisitos incompletos.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los archivos del usuario en caso de pérdida de la contraseña);",
- "Recovery key password" : "Contraseña de clave de recuperación",
- "Repeat Recovery key password" : "Repite la contraseña de clave de recuperación",
- "Enabled" : "Habilitar",
- "Disabled" : "Deshabilitado",
- "Change recovery key password:" : "Cambiar la contraseña de la clave de recuperación",
- "Old Recovery key password" : "Antigua clave de recuperación",
- "New Recovery key password" : "Nueva clave de recuperación",
- "Repeat New Recovery key password" : "Repetir la nueva clave de recuperación",
- "Change Password" : "Cambiar contraseña",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus archivos.",
- "Old log-in password" : "Contraseña de acceso antigua",
- "Current log-in password" : "Contraseña de acceso actual",
- "Update Private Key Password" : "Actualizar Contraseña de Clave Privada",
- "Enable password recovery:" : "Habilitar la recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus archivos cifrados en caso de pérdida de contraseña"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/es_MX.json b/apps/files_encryption/l10n/es_MX.json
deleted file mode 100644
index e8c5d52d457..00000000000
--- a/apps/files_encryption/l10n/es_MX.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{ "translations": {
- "Unknown error" : "Error desconocido",
- "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor compruebe su contraseña!",
- "Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
- "Password successfully changed." : "Su contraseña ha sido cambiada",
- "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
- "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.",
- "File recovery settings updated" : "Opciones de recuperación de archivos actualizada",
- "Could not update file recovery" : "No se pudo actualizar la recuperación de archivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.",
- "Initial encryption started... This can take some time. Please wait." : "Encriptación iniciada... Esto puede tomar un tiempo. Por favor espere.",
- "Missing requirements." : "Requisitos incompletos.",
- "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los archivos del usuario en caso de pérdida de la contraseña);",
- "Recovery key password" : "Contraseña de clave de recuperación",
- "Repeat Recovery key password" : "Repite la contraseña de clave de recuperación",
- "Enabled" : "Habilitar",
- "Disabled" : "Deshabilitado",
- "Change recovery key password:" : "Cambiar la contraseña de la clave de recuperación",
- "Old Recovery key password" : "Antigua clave de recuperación",
- "New Recovery key password" : "Nueva clave de recuperación",
- "Repeat New Recovery key password" : "Repetir la nueva clave de recuperación",
- "Change Password" : "Cambiar contraseña",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus archivos.",
- "Old log-in password" : "Contraseña de acceso antigua",
- "Current log-in password" : "Contraseña de acceso actual",
- "Update Private Key Password" : "Actualizar Contraseña de Clave Privada",
- "Enable password recovery:" : "Habilitar la recuperación de contraseña:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus archivos cifrados en caso de pérdida de contraseña"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/et_EE.js b/apps/files_encryption/l10n/et_EE.js
deleted file mode 100644
index 0e293cc0ee6..00000000000
--- a/apps/files_encryption/l10n/et_EE.js
+++ /dev/null
@@ -1,51 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Tundmatu viga",
- "Missing recovery key password" : "Muuda taastevõtme parool",
- "Please repeat the recovery key password" : "Palun korda uut taastevõtme parooli",
- "Repeated recovery key password does not match the provided recovery key password" : "Lahtritesse sisestatud taastevõtme paroolid ei kattu",
- "Recovery key successfully enabled" : "Taastevõtme lubamine õnnestus",
- "Could not disable recovery key. Please check your recovery key password!" : "Ei suuda keelata taastevõtit. Palun kontrolli oma taastevõtme parooli!",
- "Recovery key successfully disabled" : "Taastevõtme keelamine õnnestus",
- "Please provide the old recovery password" : "Palun sisesta vana taastevõtme parool",
- "Please provide a new recovery password" : "Palun sisesta uus taastevõtme parool",
- "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli",
- "Password successfully changed." : "Parool edukalt vahetatud.",
- "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.",
- "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.",
- "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.",
- "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.",
- "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.",
- "File recovery settings updated" : "Faili taaste seaded uuendatud",
- "Could not update file recovery" : "Ei suuda uuendada taastefaili",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krüpteerimise rakend pole käivitatud. Võib-olla krüpteerimise rakend taaskäivitati sinu sessiooni kestel. Palun proovi logida välja ning uuesti sisse käivitamaks krüpteerimise rakendit.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Sinu provaatne võti pole kehtiv! Tõenäoliselt mudueti parooli väljaspool kausta %s (nt. sinu ettevõtte kaust). Sa saad uuendada oma privaatse võtme parooli oma isiklikes seadetes, et taastada ligipääs sinu krüpteeritud failidele.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Sa ei saa seda faili dekrüpteerida, see on tõenäoliselt jagatud fail. Palun lase omanikul seda faili sinuga uuesti jagada.",
- "Unknown error. Please check your system settings or contact your administrator" : "Tundmatu viga. Palun võta ühendust oma administraatoriga.",
- "Initial encryption started... This can take some time. Please wait." : "Algne krüpteerimine käivitati... See võib võtta natuke aega. Palun oota.",
- "Initial encryption running... Please try again later." : "Toimub esmane krüpteerimine... Palun proovi hiljem uuesti.",
- "Missing requirements." : "Nõutavad on puudu.",
- "Following users are not set up for encryption:" : "Järgmised kasutajad pole seadistatud krüpteeringuks:",
- "Go directly to your %spersonal settings%s." : "Liigi otse oma %s isiklike seadete %s juurde.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krüpteerimisrakend on lubatud, kuid võtmeid pole lähtestatud. Palun logi välja ning uuesti sisse.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Luba taastevõti (võimalda kasutaja failide taastamine parooli kaotuse puhul):",
- "Recovery key password" : "Taastevõtme parool",
- "Repeat Recovery key password" : "Korda taastevõtme parooli",
- "Enabled" : "Sisse lülitatud",
- "Disabled" : "Väljalülitatud",
- "Change recovery key password:" : "Muuda taastevõtme parooli:",
- "Old Recovery key password" : "Vana taastevõtme parool",
- "New Recovery key password" : "Uus taastevõtme parool",
- "Repeat New Recovery key password" : "Korda uut taastevõtme parooli",
- "Change Password" : "Muuda parooli",
- "Your private key password no longer matches your log-in password." : "Sinu provaatvõtme parool ei kattu enam sinu sisselogimise parooliga.",
- "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme parooliks oma praegune sisselogimise parool.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Kui sa ei mäleta oma vana parooli, siis palu oma süsteemihalduril taastada ligipääs failidele.",
- "Old log-in password" : "Vana sisselogimise parool",
- "Current log-in password" : "Praegune sisselogimise parool",
- "Update Private Key Password" : "Uuenda privaatse võtme parooli",
- "Enable password recovery:" : "Luba parooli taaste:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parooli kaotuse puhul"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/et_EE.json b/apps/files_encryption/l10n/et_EE.json
deleted file mode 100644
index c63c9e40e97..00000000000
--- a/apps/files_encryption/l10n/et_EE.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{ "translations": {
- "Unknown error" : "Tundmatu viga",
- "Missing recovery key password" : "Muuda taastevõtme parool",
- "Please repeat the recovery key password" : "Palun korda uut taastevõtme parooli",
- "Repeated recovery key password does not match the provided recovery key password" : "Lahtritesse sisestatud taastevõtme paroolid ei kattu",
- "Recovery key successfully enabled" : "Taastevõtme lubamine õnnestus",
- "Could not disable recovery key. Please check your recovery key password!" : "Ei suuda keelata taastevõtit. Palun kontrolli oma taastevõtme parooli!",
- "Recovery key successfully disabled" : "Taastevõtme keelamine õnnestus",
- "Please provide the old recovery password" : "Palun sisesta vana taastevõtme parool",
- "Please provide a new recovery password" : "Palun sisesta uus taastevõtme parool",
- "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli",
- "Password successfully changed." : "Parool edukalt vahetatud.",
- "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.",
- "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.",
- "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.",
- "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.",
- "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.",
- "File recovery settings updated" : "Faili taaste seaded uuendatud",
- "Could not update file recovery" : "Ei suuda uuendada taastefaili",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krüpteerimise rakend pole käivitatud. Võib-olla krüpteerimise rakend taaskäivitati sinu sessiooni kestel. Palun proovi logida välja ning uuesti sisse käivitamaks krüpteerimise rakendit.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Sinu provaatne võti pole kehtiv! Tõenäoliselt mudueti parooli väljaspool kausta %s (nt. sinu ettevõtte kaust). Sa saad uuendada oma privaatse võtme parooli oma isiklikes seadetes, et taastada ligipääs sinu krüpteeritud failidele.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Sa ei saa seda faili dekrüpteerida, see on tõenäoliselt jagatud fail. Palun lase omanikul seda faili sinuga uuesti jagada.",
- "Unknown error. Please check your system settings or contact your administrator" : "Tundmatu viga. Palun võta ühendust oma administraatoriga.",
- "Initial encryption started... This can take some time. Please wait." : "Algne krüpteerimine käivitati... See võib võtta natuke aega. Palun oota.",
- "Initial encryption running... Please try again later." : "Toimub esmane krüpteerimine... Palun proovi hiljem uuesti.",
- "Missing requirements." : "Nõutavad on puudu.",
- "Following users are not set up for encryption:" : "Järgmised kasutajad pole seadistatud krüpteeringuks:",
- "Go directly to your %spersonal settings%s." : "Liigi otse oma %s isiklike seadete %s juurde.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krüpteerimisrakend on lubatud, kuid võtmeid pole lähtestatud. Palun logi välja ning uuesti sisse.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Luba taastevõti (võimalda kasutaja failide taastamine parooli kaotuse puhul):",
- "Recovery key password" : "Taastevõtme parool",
- "Repeat Recovery key password" : "Korda taastevõtme parooli",
- "Enabled" : "Sisse lülitatud",
- "Disabled" : "Väljalülitatud",
- "Change recovery key password:" : "Muuda taastevõtme parooli:",
- "Old Recovery key password" : "Vana taastevõtme parool",
- "New Recovery key password" : "Uus taastevõtme parool",
- "Repeat New Recovery key password" : "Korda uut taastevõtme parooli",
- "Change Password" : "Muuda parooli",
- "Your private key password no longer matches your log-in password." : "Sinu provaatvõtme parool ei kattu enam sinu sisselogimise parooliga.",
- "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme parooliks oma praegune sisselogimise parool.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Kui sa ei mäleta oma vana parooli, siis palu oma süsteemihalduril taastada ligipääs failidele.",
- "Old log-in password" : "Vana sisselogimise parool",
- "Current log-in password" : "Praegune sisselogimise parool",
- "Update Private Key Password" : "Uuenda privaatse võtme parooli",
- "Enable password recovery:" : "Luba parooli taaste:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parooli kaotuse puhul"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/eu.js b/apps/files_encryption/l10n/eu.js
deleted file mode 100644
index d1d1b55f73b..00000000000
--- a/apps/files_encryption/l10n/eu.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Errore ezezaguna",
- "Missing recovery key password" : "Berreskurapen gakoaren pasahitza falta da",
- "Please repeat the recovery key password" : "Mesedez errepikatu berreskuratze gakoaren pasahitza",
- "Repeated recovery key password does not match the provided recovery key password" : "Errepikatutako berreskuratze gakoaren pasahitza ez dator bat berreskuratze gakoaren pasahitzarekin",
- "Recovery key successfully enabled" : "Berreskuratze gakoa behar bezala gaitua",
- "Could not disable recovery key. Please check your recovery key password!" : "Ezin da berreskuratze gako desgaitu. Egiaztatu berreskuratze gako pasahitza!",
- "Recovery key successfully disabled" : "Berreskuratze gakoa behar bezala desgaitu da",
- "Please provide the old recovery password" : "Mesedez sartu berreskuratze pasahitz zaharra",
- "Please provide a new recovery password" : "Mesedez sartu berreskuratze pasahitz berria",
- "Please repeat the new recovery password" : "Mesedez errepikatu berreskuratze pasahitz berria",
- "Password successfully changed." : "Pasahitza behar bezala aldatu da.",
- "Could not change the password. Maybe the old password was not correct." : "Ezin izan da pasahitza aldatu. Agian pasahitz zaharra okerrekoa da.",
- "Could not update the private key password." : "Ezin izan da gako pribatu pasahitza eguneratu. ",
- "The old password was not correct, please try again." : "Pasahitz zaharra ez da egokia. Mesedez, saiatu berriro.",
- "The current log-in password was not correct, please try again." : "Oraingo pasahitza ez da egokia. Mesedez, saiatu berriro.",
- "Private key password successfully updated." : "Gako pasahitz pribatu behar bezala eguneratu da.",
- "File recovery settings updated" : "Fitxategi berreskuratze ezarpenak eguneratuak",
- "Could not update file recovery" : "Ezin da fitxategi berreskuratzea eguneratu",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Enkriptazio aplikazioa ez dago hasieratuta! Agian aplikazioa birgaitu egin da zure saioa bitartean. Mesdez atear eta sartu berriz enkriptazio aplikazioa hasierarazteko.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Zure gako pribatua ez da egokia! Seguruaski zure pasahitza %s-tik kanpo aldatu da (adb. zure direktorio korporatiboa). Zure gako pribatuaren pasahitza eguneratu dezakezu zure ezarpen pertsonaletan zure enkriptatutako fitxategiak berreskuratzeko.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin izan da fitxategi hau deszifratu, ziurrenik elkarbanatutako fitxategi bat da. Mesdez, eskatu fitxategiaren jabeari fitxategia zurekin berriz elkarbana dezan.",
- "Unknown error. Please check your system settings or contact your administrator" : "Errore ezezaguna. Mesedez, egiaztatu zure sistemaren ezarpenak edo jarri zure administrariarekin kontaktuan.",
- "Initial encryption started... This can take some time. Please wait." : "Hasierako enkriptazioa hasi da... Honek denbora har dezake. Mesedez itxaron.",
- "Initial encryption running... Please try again later." : "Hasierako enkriptaketa abian... mesedez, saiatu beranduago.",
- "Missing requirements." : "Eskakizun batzuk ez dira betetzen.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Mesedez ziurtatu OpenSSL eta PHP hedapena instaltuta eta ongi konfiguratuta daudela. Oraingoz enkriptazio aplikazioa desgaitua izan da.",
- "Following users are not set up for encryption:" : "Hurrengo erabiltzaileak ez daude enktriptatzeko konfiguratutak:",
- "Go directly to your %spersonal settings%s." : "Joan zuzenean zure %sezarpen pertsonaletara%s.",
- "Server-side Encryption" : "Zerbitzari aldeko enkriptazioa",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Enkriptazio aplikazioa gaituta dago baina zure gakoak ez daude konfiguratuta, mesedez saioa bukatu eta berriro hasi",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Gaitu berreskurapen gakoa (erabiltzaileen fitxategiak berreskuratzea ahalbidetzen du pasahitza galtzen badute ere):",
- "Recovery key password" : "Berreskuratze gako pasahitza",
- "Repeat Recovery key password" : "Errepikatu berreskuratze gakoaren pasahitza",
- "Enabled" : "Gaitua",
- "Disabled" : "Ez-gaitua",
- "Change recovery key password:" : "Aldatu berreskuratze gako pasahitza:",
- "Old Recovery key password" : "Berreskuratze gako pasahitz zaharra",
- "New Recovery key password" : "Berreskuratze gako pasahitz berria",
- "Repeat New Recovery key password" : "Errepikatu berreskuratze gako berriaren pasahitza",
- "Change Password" : "Aldatu Pasahitza",
- "Your private key password no longer matches your log-in password." : "Zure gako pasahitza pribatua ez da dagoeneko bat etortzen zure sartzeko pasahitzarekin.",
- "Set your old private key password to your current log-in password:" : "Ezarri zure gako pasahitz zaharra orain duzun sartzeko pasahitzan:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ez baduzu zure pasahitz zaharra gogoratzen eskatu zure administratzaileari zure fitxategiak berreskuratzeko.",
- "Old log-in password" : "Sartzeko pasahitz zaharra",
- "Current log-in password" : "Sartzeko oraingo pasahitza",
- "Update Private Key Password" : "Eguneratu gako pasahitza pribatua",
- "Enable password recovery:" : "Gaitu pasahitzaren berreskuratzea:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aukera hau gaituz zure enkriptatutako fitxategiak berreskuratu ahal izango dituzu pasahitza galtzekotan"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/eu.json b/apps/files_encryption/l10n/eu.json
deleted file mode 100644
index 3bd66a039f3..00000000000
--- a/apps/files_encryption/l10n/eu.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Errore ezezaguna",
- "Missing recovery key password" : "Berreskurapen gakoaren pasahitza falta da",
- "Please repeat the recovery key password" : "Mesedez errepikatu berreskuratze gakoaren pasahitza",
- "Repeated recovery key password does not match the provided recovery key password" : "Errepikatutako berreskuratze gakoaren pasahitza ez dator bat berreskuratze gakoaren pasahitzarekin",
- "Recovery key successfully enabled" : "Berreskuratze gakoa behar bezala gaitua",
- "Could not disable recovery key. Please check your recovery key password!" : "Ezin da berreskuratze gako desgaitu. Egiaztatu berreskuratze gako pasahitza!",
- "Recovery key successfully disabled" : "Berreskuratze gakoa behar bezala desgaitu da",
- "Please provide the old recovery password" : "Mesedez sartu berreskuratze pasahitz zaharra",
- "Please provide a new recovery password" : "Mesedez sartu berreskuratze pasahitz berria",
- "Please repeat the new recovery password" : "Mesedez errepikatu berreskuratze pasahitz berria",
- "Password successfully changed." : "Pasahitza behar bezala aldatu da.",
- "Could not change the password. Maybe the old password was not correct." : "Ezin izan da pasahitza aldatu. Agian pasahitz zaharra okerrekoa da.",
- "Could not update the private key password." : "Ezin izan da gako pribatu pasahitza eguneratu. ",
- "The old password was not correct, please try again." : "Pasahitz zaharra ez da egokia. Mesedez, saiatu berriro.",
- "The current log-in password was not correct, please try again." : "Oraingo pasahitza ez da egokia. Mesedez, saiatu berriro.",
- "Private key password successfully updated." : "Gako pasahitz pribatu behar bezala eguneratu da.",
- "File recovery settings updated" : "Fitxategi berreskuratze ezarpenak eguneratuak",
- "Could not update file recovery" : "Ezin da fitxategi berreskuratzea eguneratu",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Enkriptazio aplikazioa ez dago hasieratuta! Agian aplikazioa birgaitu egin da zure saioa bitartean. Mesdez atear eta sartu berriz enkriptazio aplikazioa hasierarazteko.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Zure gako pribatua ez da egokia! Seguruaski zure pasahitza %s-tik kanpo aldatu da (adb. zure direktorio korporatiboa). Zure gako pribatuaren pasahitza eguneratu dezakezu zure ezarpen pertsonaletan zure enkriptatutako fitxategiak berreskuratzeko.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin izan da fitxategi hau deszifratu, ziurrenik elkarbanatutako fitxategi bat da. Mesdez, eskatu fitxategiaren jabeari fitxategia zurekin berriz elkarbana dezan.",
- "Unknown error. Please check your system settings or contact your administrator" : "Errore ezezaguna. Mesedez, egiaztatu zure sistemaren ezarpenak edo jarri zure administrariarekin kontaktuan.",
- "Initial encryption started... This can take some time. Please wait." : "Hasierako enkriptazioa hasi da... Honek denbora har dezake. Mesedez itxaron.",
- "Initial encryption running... Please try again later." : "Hasierako enkriptaketa abian... mesedez, saiatu beranduago.",
- "Missing requirements." : "Eskakizun batzuk ez dira betetzen.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Mesedez ziurtatu OpenSSL eta PHP hedapena instaltuta eta ongi konfiguratuta daudela. Oraingoz enkriptazio aplikazioa desgaitua izan da.",
- "Following users are not set up for encryption:" : "Hurrengo erabiltzaileak ez daude enktriptatzeko konfiguratutak:",
- "Go directly to your %spersonal settings%s." : "Joan zuzenean zure %sezarpen pertsonaletara%s.",
- "Server-side Encryption" : "Zerbitzari aldeko enkriptazioa",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Enkriptazio aplikazioa gaituta dago baina zure gakoak ez daude konfiguratuta, mesedez saioa bukatu eta berriro hasi",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Gaitu berreskurapen gakoa (erabiltzaileen fitxategiak berreskuratzea ahalbidetzen du pasahitza galtzen badute ere):",
- "Recovery key password" : "Berreskuratze gako pasahitza",
- "Repeat Recovery key password" : "Errepikatu berreskuratze gakoaren pasahitza",
- "Enabled" : "Gaitua",
- "Disabled" : "Ez-gaitua",
- "Change recovery key password:" : "Aldatu berreskuratze gako pasahitza:",
- "Old Recovery key password" : "Berreskuratze gako pasahitz zaharra",
- "New Recovery key password" : "Berreskuratze gako pasahitz berria",
- "Repeat New Recovery key password" : "Errepikatu berreskuratze gako berriaren pasahitza",
- "Change Password" : "Aldatu Pasahitza",
- "Your private key password no longer matches your log-in password." : "Zure gako pasahitza pribatua ez da dagoeneko bat etortzen zure sartzeko pasahitzarekin.",
- "Set your old private key password to your current log-in password:" : "Ezarri zure gako pasahitz zaharra orain duzun sartzeko pasahitzan:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ez baduzu zure pasahitz zaharra gogoratzen eskatu zure administratzaileari zure fitxategiak berreskuratzeko.",
- "Old log-in password" : "Sartzeko pasahitz zaharra",
- "Current log-in password" : "Sartzeko oraingo pasahitza",
- "Update Private Key Password" : "Eguneratu gako pasahitza pribatua",
- "Enable password recovery:" : "Gaitu pasahitzaren berreskuratzea:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aukera hau gaituz zure enkriptatutako fitxategiak berreskuratu ahal izango dituzu pasahitza galtzekotan"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/fa.js b/apps/files_encryption/l10n/fa.js
deleted file mode 100644
index e05d6e4d3a4..00000000000
--- a/apps/files_encryption/l10n/fa.js
+++ /dev/null
@@ -1,30 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "خطای نامشخص",
- "Recovery key successfully enabled" : "کلید بازیابی با موفقیت فعال شده است.",
- "Could not disable recovery key. Please check your recovery key password!" : "کلید بازیابی را نمی تواند غیرفعال نماید. لطفا رمزعبور کلید بازیابی خود را بررسی کنید!",
- "Recovery key successfully disabled" : "کلید بازیابی با موفقیت غیر فعال شده است.",
- "Password successfully changed." : "رمزعبور با موفقیت تغییر یافت.",
- "Could not change the password. Maybe the old password was not correct." : "رمزعبور را نمیتواند تغییر دهد. شاید رمزعبورقدیمی صحیح نمی باشد.",
- "Private key password successfully updated." : "رمزعبور کلید خصوصی با موفقیت به روز شد.",
- "File recovery settings updated" : "تنظیمات بازیابی فایل به روز شده است.",
- "Could not update file recovery" : "به روز رسانی بازیابی فایل را نمی تواند انجام دهد.",
- "Missing requirements." : "نیازمندی های گمشده",
- "Following users are not set up for encryption:" : "کاربران زیر برای رمزنگاری تنظیم نشده اند",
- "Enable recovery key (allow to recover users files in case of password loss):" : "فعال کردن کلید بازیابی(اجازه بازیابی فایل های کاربران در صورت از دست دادن رمزعبور):",
- "Recovery key password" : "رمزعبور کلید بازیابی",
- "Enabled" : "فعال شده",
- "Disabled" : "غیرفعال شده",
- "Change recovery key password:" : "تغییر رمزعبور کلید بازیابی:",
- "Old Recovery key password" : "رمزعبور قدیمی کلید بازیابی ",
- "New Recovery key password" : "رمزعبور جدید کلید بازیابی",
- "Change Password" : "تغییر رمزعبور",
- " If you don't remember your old password you can ask your administrator to recover your files." : "اگر رمزعبور قدیمی را فراموش کرده اید میتوانید از مدیر خود برای بازیابی فایل هایتان درخواست نمایید.",
- "Old log-in password" : "رمزعبور قدیمی",
- "Current log-in password" : "رمزعبور فعلی",
- "Update Private Key Password" : "به روز رسانی رمزعبور کلید خصوصی",
- "Enable password recovery:" : "فعال سازی بازیابی رمزعبور:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "فعال کردن این گزینه به شما اجازه خواهد داد در صورت از دست دادن رمزعبور به فایل های رمزگذاری شده خود دسترسی داشته باشید."
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/fa.json b/apps/files_encryption/l10n/fa.json
deleted file mode 100644
index f048a93c1ad..00000000000
--- a/apps/files_encryption/l10n/fa.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{ "translations": {
- "Unknown error" : "خطای نامشخص",
- "Recovery key successfully enabled" : "کلید بازیابی با موفقیت فعال شده است.",
- "Could not disable recovery key. Please check your recovery key password!" : "کلید بازیابی را نمی تواند غیرفعال نماید. لطفا رمزعبور کلید بازیابی خود را بررسی کنید!",
- "Recovery key successfully disabled" : "کلید بازیابی با موفقیت غیر فعال شده است.",
- "Password successfully changed." : "رمزعبور با موفقیت تغییر یافت.",
- "Could not change the password. Maybe the old password was not correct." : "رمزعبور را نمیتواند تغییر دهد. شاید رمزعبورقدیمی صحیح نمی باشد.",
- "Private key password successfully updated." : "رمزعبور کلید خصوصی با موفقیت به روز شد.",
- "File recovery settings updated" : "تنظیمات بازیابی فایل به روز شده است.",
- "Could not update file recovery" : "به روز رسانی بازیابی فایل را نمی تواند انجام دهد.",
- "Missing requirements." : "نیازمندی های گمشده",
- "Following users are not set up for encryption:" : "کاربران زیر برای رمزنگاری تنظیم نشده اند",
- "Enable recovery key (allow to recover users files in case of password loss):" : "فعال کردن کلید بازیابی(اجازه بازیابی فایل های کاربران در صورت از دست دادن رمزعبور):",
- "Recovery key password" : "رمزعبور کلید بازیابی",
- "Enabled" : "فعال شده",
- "Disabled" : "غیرفعال شده",
- "Change recovery key password:" : "تغییر رمزعبور کلید بازیابی:",
- "Old Recovery key password" : "رمزعبور قدیمی کلید بازیابی ",
- "New Recovery key password" : "رمزعبور جدید کلید بازیابی",
- "Change Password" : "تغییر رمزعبور",
- " If you don't remember your old password you can ask your administrator to recover your files." : "اگر رمزعبور قدیمی را فراموش کرده اید میتوانید از مدیر خود برای بازیابی فایل هایتان درخواست نمایید.",
- "Old log-in password" : "رمزعبور قدیمی",
- "Current log-in password" : "رمزعبور فعلی",
- "Update Private Key Password" : "به روز رسانی رمزعبور کلید خصوصی",
- "Enable password recovery:" : "فعال سازی بازیابی رمزعبور:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "فعال کردن این گزینه به شما اجازه خواهد داد در صورت از دست دادن رمزعبور به فایل های رمزگذاری شده خود دسترسی داشته باشید."
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/fi_FI.js b/apps/files_encryption/l10n/fi_FI.js
deleted file mode 100644
index d72e2da452f..00000000000
--- a/apps/files_encryption/l10n/fi_FI.js
+++ /dev/null
@@ -1,51 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Tuntematon virhe",
- "Missing recovery key password" : "Palautusavaimen salasana puuttuu",
- "Please repeat the recovery key password" : "Toista palautusavaimen salasana",
- "Repeated recovery key password does not match the provided recovery key password" : "Toistamiseen annettu palautusavaimen salasana ei täsmää annettua palautusavaimen salasanaa",
- "Recovery key successfully enabled" : "Palautusavain kytketty päälle onnistuneesti",
- "Could not disable recovery key. Please check your recovery key password!" : "Palautusavaimen poistaminen käytöstä ei onnistunut. Tarkista palautusavaimesi salasana!",
- "Recovery key successfully disabled" : "Palautusavain poistettu onnistuneesti käytöstä",
- "Please provide the old recovery password" : "Anna vanha palautussalasana",
- "Please provide a new recovery password" : "Anna uusi palautussalasana",
- "Please repeat the new recovery password" : "Toista uusi palautussalasana",
- "Password successfully changed." : "Salasana vaihdettiin onnistuneesti.",
- "Could not change the password. Maybe the old password was not correct." : "Salasanan vaihto epäonnistui. Kenties vanha salasana oli väärin.",
- "Could not update the private key password." : "Yksityisen avaimen salasanaa ei voitu päivittää.",
- "The old password was not correct, please try again." : "Vanha salasana oli väärin, yritä uudelleen.",
- "The current log-in password was not correct, please try again." : "Nykyinen kirjautumissalasana ei ollut oikein, yritä uudelleen.",
- "Private key password successfully updated." : "Yksityisen avaimen salasana päivitetty onnistuneesti.",
- "File recovery settings updated" : "Tiedostopalautuksen asetukset päivitetty",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Salaussovellusta ei ole käynnissä! Kenties salaussovellus otettiin uudelleen käyttöön nykyisen istuntosi aikana. Kirjaudu ulos ja takaisin sisään saadaksesi salaussovelluksen käyttöön.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tämän tiedoston salauksen purkaminen ei onnistu. Kyseessä on luultavasti jaettu tiedosto. Pyydä tiedoston omistajaa jakamaan tiedosto kanssasi uudelleen.",
- "Unknown error. Please check your system settings or contact your administrator" : "Tuntematon virhe. Tarkista järjestelmän asetukset tai ole yhteydessä ylläpitäjään.",
- "Initial encryption started... This can take some time. Please wait." : "Ensimmäinen salauskerta käynnistetty... Tämä saattaa kestää hetken.",
- "Initial encryption running... Please try again later." : "Ensimmäinen salauskerta on meneillään... Yritä myöhemmin uudelleen.",
- "Missing requirements." : "Puuttuvat vaatimukset.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Varmista, että OpenSSL ja PHP-laajennus ovat käytössä ja niiden asetukset ovat oikein. Salaussovellus on poistettu toistaiseksi käytöstä.",
- "Following users are not set up for encryption:" : "Seuraavat käyttäjät eivät ole määrittäneet salausta:",
- "Go directly to your %spersonal settings%s." : "Siirry suoraan %shenkilökohtaisiin asetuksiisi%s.",
- "Server-side Encryption" : "Palvelinpuolen salaus",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Salaussovellus on käytössä, mutta salausavaimia ei ole alustettu. Ole hyvä ja kirjaudu sisään uudelleen.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Käytä palautusavainta (salli käyttäjien tiedostojen palauttaminen, jos heidän salasana unohtuu):",
- "Recovery key password" : "Palautusavaimen salasana",
- "Repeat Recovery key password" : "Toista palautusavaimen salasana",
- "Enabled" : "Käytössä",
- "Disabled" : "Ei käytössä",
- "Change recovery key password:" : "Vaihda palautusavaimen salasana:",
- "Old Recovery key password" : "Vanha palautusavaimen salasana",
- "New Recovery key password" : "Uusi palautusavaimen salasana",
- "Repeat New Recovery key password" : "Toista uusi palautusavaimen salasana",
- "Change Password" : "Vaihda salasana",
- "Your private key password no longer matches your log-in password." : "Salaisen avaimesi salasana ei enää vastaa kirjautumissalasanaasi.",
- "Set your old private key password to your current log-in password:" : "Aseta yksityisen avaimen vanha salasana vastaamaan nykyistä kirjautumissalasanaasi:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jos et muista vanhaa salasanaasi, voit pyytää ylläpitäjää palauttamaan tiedostosi.",
- "Old log-in password" : "Vanha kirjautumissalasana",
- "Current log-in password" : "Nykyinen kirjautumissalasana",
- "Update Private Key Password" : "Päivitä yksityisen avaimen salasana",
- "Enable password recovery:" : "Ota salasanan palautus käyttöön:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Tämän valinnan käyttäminen mahdollistaa pääsyn salattuihin tiedostoihisi, jos salasana unohtuu"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/fi_FI.json b/apps/files_encryption/l10n/fi_FI.json
deleted file mode 100644
index 2b0d92dfd55..00000000000
--- a/apps/files_encryption/l10n/fi_FI.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{ "translations": {
- "Unknown error" : "Tuntematon virhe",
- "Missing recovery key password" : "Palautusavaimen salasana puuttuu",
- "Please repeat the recovery key password" : "Toista palautusavaimen salasana",
- "Repeated recovery key password does not match the provided recovery key password" : "Toistamiseen annettu palautusavaimen salasana ei täsmää annettua palautusavaimen salasanaa",
- "Recovery key successfully enabled" : "Palautusavain kytketty päälle onnistuneesti",
- "Could not disable recovery key. Please check your recovery key password!" : "Palautusavaimen poistaminen käytöstä ei onnistunut. Tarkista palautusavaimesi salasana!",
- "Recovery key successfully disabled" : "Palautusavain poistettu onnistuneesti käytöstä",
- "Please provide the old recovery password" : "Anna vanha palautussalasana",
- "Please provide a new recovery password" : "Anna uusi palautussalasana",
- "Please repeat the new recovery password" : "Toista uusi palautussalasana",
- "Password successfully changed." : "Salasana vaihdettiin onnistuneesti.",
- "Could not change the password. Maybe the old password was not correct." : "Salasanan vaihto epäonnistui. Kenties vanha salasana oli väärin.",
- "Could not update the private key password." : "Yksityisen avaimen salasanaa ei voitu päivittää.",
- "The old password was not correct, please try again." : "Vanha salasana oli väärin, yritä uudelleen.",
- "The current log-in password was not correct, please try again." : "Nykyinen kirjautumissalasana ei ollut oikein, yritä uudelleen.",
- "Private key password successfully updated." : "Yksityisen avaimen salasana päivitetty onnistuneesti.",
- "File recovery settings updated" : "Tiedostopalautuksen asetukset päivitetty",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Salaussovellusta ei ole käynnissä! Kenties salaussovellus otettiin uudelleen käyttöön nykyisen istuntosi aikana. Kirjaudu ulos ja takaisin sisään saadaksesi salaussovelluksen käyttöön.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tämän tiedoston salauksen purkaminen ei onnistu. Kyseessä on luultavasti jaettu tiedosto. Pyydä tiedoston omistajaa jakamaan tiedosto kanssasi uudelleen.",
- "Unknown error. Please check your system settings or contact your administrator" : "Tuntematon virhe. Tarkista järjestelmän asetukset tai ole yhteydessä ylläpitäjään.",
- "Initial encryption started... This can take some time. Please wait." : "Ensimmäinen salauskerta käynnistetty... Tämä saattaa kestää hetken.",
- "Initial encryption running... Please try again later." : "Ensimmäinen salauskerta on meneillään... Yritä myöhemmin uudelleen.",
- "Missing requirements." : "Puuttuvat vaatimukset.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Varmista, että OpenSSL ja PHP-laajennus ovat käytössä ja niiden asetukset ovat oikein. Salaussovellus on poistettu toistaiseksi käytöstä.",
- "Following users are not set up for encryption:" : "Seuraavat käyttäjät eivät ole määrittäneet salausta:",
- "Go directly to your %spersonal settings%s." : "Siirry suoraan %shenkilökohtaisiin asetuksiisi%s.",
- "Server-side Encryption" : "Palvelinpuolen salaus",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Salaussovellus on käytössä, mutta salausavaimia ei ole alustettu. Ole hyvä ja kirjaudu sisään uudelleen.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Käytä palautusavainta (salli käyttäjien tiedostojen palauttaminen, jos heidän salasana unohtuu):",
- "Recovery key password" : "Palautusavaimen salasana",
- "Repeat Recovery key password" : "Toista palautusavaimen salasana",
- "Enabled" : "Käytössä",
- "Disabled" : "Ei käytössä",
- "Change recovery key password:" : "Vaihda palautusavaimen salasana:",
- "Old Recovery key password" : "Vanha palautusavaimen salasana",
- "New Recovery key password" : "Uusi palautusavaimen salasana",
- "Repeat New Recovery key password" : "Toista uusi palautusavaimen salasana",
- "Change Password" : "Vaihda salasana",
- "Your private key password no longer matches your log-in password." : "Salaisen avaimesi salasana ei enää vastaa kirjautumissalasanaasi.",
- "Set your old private key password to your current log-in password:" : "Aseta yksityisen avaimen vanha salasana vastaamaan nykyistä kirjautumissalasanaasi:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jos et muista vanhaa salasanaasi, voit pyytää ylläpitäjää palauttamaan tiedostosi.",
- "Old log-in password" : "Vanha kirjautumissalasana",
- "Current log-in password" : "Nykyinen kirjautumissalasana",
- "Update Private Key Password" : "Päivitä yksityisen avaimen salasana",
- "Enable password recovery:" : "Ota salasanan palautus käyttöön:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Tämän valinnan käyttäminen mahdollistaa pääsyn salattuihin tiedostoihisi, jos salasana unohtuu"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/fr.js b/apps/files_encryption/l10n/fr.js
deleted file mode 100644
index 09ddd64cb40..00000000000
--- a/apps/files_encryption/l10n/fr.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Erreur Inconnue ",
- "Missing recovery key password" : "Mot de passe de la clef de récupération manquant",
- "Please repeat the recovery key password" : "Répétez le mot de passe de la clef de récupération",
- "Repeated recovery key password does not match the provided recovery key password" : "Le mot de passe de la clef de récupération et sa répétition ne sont pas identiques.",
- "Recovery key successfully enabled" : "Clef de récupération activée avec succès",
- "Could not disable recovery key. Please check your recovery key password!" : "Impossible de désactiver la clef de récupération. Veuillez vérifier le mot de passe de votre clef de récupération !",
- "Recovery key successfully disabled" : "Clef de récupération désactivée avec succès",
- "Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération",
- "Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
- "Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
- "Password successfully changed." : "Mot de passe changé avec succès.",
- "Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
- "Could not update the private key password." : "Impossible de mettre à jour le mot de passe de la clef privée.",
- "The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.",
- "The current log-in password was not correct, please try again." : "Le mot de passe actuel n'est pas correct, veuillez réessayer.",
- "Private key password successfully updated." : "Mot de passe de la clef privée mis à jour avec succès.",
- "File recovery settings updated" : "Paramètres de récupération de fichiers mis à jour",
- "Could not update file recovery" : "Impossible de mettre à jour les fichiers de récupération",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée n'est pas valide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier : il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le partager à nouveau avec vous.",
- "Unknown error. Please check your system settings or contact your administrator" : "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter un administrateur.",
- "Initial encryption started... This can take some time. Please wait." : "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.",
- "Initial encryption running... Please try again later." : "Chiffrement initial en cours... Veuillez ré-essayer ultérieurement.",
- "Missing requirements." : "Dépendances manquantes.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Merci de vous assurer que OpenSSL et son extension PHP sont activés et configurés correctement. Pour l'instant, l'application de chiffrement a été désactivée.",
- "Following users are not set up for encryption:" : "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :",
- "Go directly to your %spersonal settings%s." : "Aller à %svos paramètres personnels%s.",
- "Server-side Encryption" : "Chiffrement côté serveur",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activer la clef de récupération (permet de récupérer les fichiers des utilisateurs en cas de perte de mot de passe).",
- "Recovery key password" : "Mot de passe de la clef de récupération",
- "Repeat Recovery key password" : "Répétez le mot de passe de la clef de récupération",
- "Enabled" : "Activé",
- "Disabled" : "Désactivé",
- "Change recovery key password:" : "Modifier le mot de passe de la clef de récupération :",
- "Old Recovery key password" : "Ancien mot de passe de la clef de récupération",
- "New Recovery key password" : "Nouveau mot de passe de la clef de récupération",
- "Repeat New Recovery key password" : "Répétez le nouveau mot de passe de la clef de récupération",
- "Change Password" : "Changer de mot de passe",
- "Your private key password no longer matches your log-in password." : "Le mot de passe de votre clef privée ne correspond plus à votre mot de passe de connexion.",
- "Set your old private key password to your current log-in password:" : "Faites de votre mot de passe de connexion le mot de passe de votre clef privée :",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si vous ne vous souvenez plus de votre ancien mot de passe, vous pouvez demander à votre administrateur de récupérer vos fichiers.",
- "Old log-in password" : "Ancien mot de passe de connexion",
- "Current log-in password" : "Actuel mot de passe de connexion",
- "Update Private Key Password" : "Mettre à jour le mot de passe de votre clef privée",
- "Enable password recovery:" : "Activer la récupération du mot de passe :",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Activer cette option vous permettra d'obtenir à nouveau l'accès à vos fichiers chiffrés en cas de perte de mot de passe"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_encryption/l10n/fr.json b/apps/files_encryption/l10n/fr.json
deleted file mode 100644
index 3b439872250..00000000000
--- a/apps/files_encryption/l10n/fr.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Erreur Inconnue ",
- "Missing recovery key password" : "Mot de passe de la clef de récupération manquant",
- "Please repeat the recovery key password" : "Répétez le mot de passe de la clef de récupération",
- "Repeated recovery key password does not match the provided recovery key password" : "Le mot de passe de la clef de récupération et sa répétition ne sont pas identiques.",
- "Recovery key successfully enabled" : "Clef de récupération activée avec succès",
- "Could not disable recovery key. Please check your recovery key password!" : "Impossible de désactiver la clef de récupération. Veuillez vérifier le mot de passe de votre clef de récupération !",
- "Recovery key successfully disabled" : "Clef de récupération désactivée avec succès",
- "Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération",
- "Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
- "Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
- "Password successfully changed." : "Mot de passe changé avec succès.",
- "Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
- "Could not update the private key password." : "Impossible de mettre à jour le mot de passe de la clef privée.",
- "The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.",
- "The current log-in password was not correct, please try again." : "Le mot de passe actuel n'est pas correct, veuillez réessayer.",
- "Private key password successfully updated." : "Mot de passe de la clef privée mis à jour avec succès.",
- "File recovery settings updated" : "Paramètres de récupération de fichiers mis à jour",
- "Could not update file recovery" : "Impossible de mettre à jour les fichiers de récupération",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée n'est pas valide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier : il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire du fichier de le partager à nouveau avec vous.",
- "Unknown error. Please check your system settings or contact your administrator" : "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter un administrateur.",
- "Initial encryption started... This can take some time. Please wait." : "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.",
- "Initial encryption running... Please try again later." : "Chiffrement initial en cours... Veuillez ré-essayer ultérieurement.",
- "Missing requirements." : "Dépendances manquantes.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Merci de vous assurer que OpenSSL et son extension PHP sont activés et configurés correctement. Pour l'instant, l'application de chiffrement a été désactivée.",
- "Following users are not set up for encryption:" : "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :",
- "Go directly to your %spersonal settings%s." : "Aller à %svos paramètres personnels%s.",
- "Server-side Encryption" : "Chiffrement côté serveur",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activer la clef de récupération (permet de récupérer les fichiers des utilisateurs en cas de perte de mot de passe).",
- "Recovery key password" : "Mot de passe de la clef de récupération",
- "Repeat Recovery key password" : "Répétez le mot de passe de la clef de récupération",
- "Enabled" : "Activé",
- "Disabled" : "Désactivé",
- "Change recovery key password:" : "Modifier le mot de passe de la clef de récupération :",
- "Old Recovery key password" : "Ancien mot de passe de la clef de récupération",
- "New Recovery key password" : "Nouveau mot de passe de la clef de récupération",
- "Repeat New Recovery key password" : "Répétez le nouveau mot de passe de la clef de récupération",
- "Change Password" : "Changer de mot de passe",
- "Your private key password no longer matches your log-in password." : "Le mot de passe de votre clef privée ne correspond plus à votre mot de passe de connexion.",
- "Set your old private key password to your current log-in password:" : "Faites de votre mot de passe de connexion le mot de passe de votre clef privée :",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Si vous ne vous souvenez plus de votre ancien mot de passe, vous pouvez demander à votre administrateur de récupérer vos fichiers.",
- "Old log-in password" : "Ancien mot de passe de connexion",
- "Current log-in password" : "Actuel mot de passe de connexion",
- "Update Private Key Password" : "Mettre à jour le mot de passe de votre clef privée",
- "Enable password recovery:" : "Activer la récupération du mot de passe :",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Activer cette option vous permettra d'obtenir à nouveau l'accès à vos fichiers chiffrés en cas de perte de mot de passe"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/gl.js b/apps/files_encryption/l10n/gl.js
deleted file mode 100644
index bd44dc65bc7..00000000000
--- a/apps/files_encryption/l10n/gl.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Produciuse un erro descoñecido",
- "Missing recovery key password" : "Falta a chave de recuperación",
- "Please repeat the recovery key password" : "Repita a chave de recuperación",
- "Repeated recovery key password does not match the provided recovery key password" : "A repetición da chave de recuperación non coincide coa chave de recuperación estabelecida",
- "Recovery key successfully enabled" : "Activada satisfactoriamente a chave de recuperación",
- "Could not disable recovery key. Please check your recovery key password!" : "Non foi posíbel desactivar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!",
- "Recovery key successfully disabled" : "Desactivada satisfactoriamente a chave de recuperación",
- "Please provide the old recovery password" : "Introduza a chave de recuperación antiga",
- "Please provide a new recovery password" : "Introduza a nova chave de recuperación",
- "Please repeat the new recovery password" : "Repita a nova chave de recuperación",
- "Password successfully changed." : "O contrasinal foi cambiado satisfactoriamente",
- "Could not change the password. Maybe the old password was not correct." : "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.",
- "Could not update the private key password." : "Non foi posíbel actualizar o contrasinal da chave privada.",
- "The old password was not correct, please try again." : "O contrasinal antigo non é correcto, ténteo de novo.",
- "The current log-in password was not correct, please try again." : "O actual contrasinal de acceso non é correcto, ténteo de novo.",
- "Private key password successfully updated." : "A chave privada foi actualizada correctamente.",
- "File recovery settings updated" : "Actualizouse o ficheiro de axustes de recuperación",
- "Could not update file recovery" : "Non foi posíbel actualizar o ficheiro de recuperación",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Non se iniciou a aplicación de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala para que tamén se inicie a aplicación de cifrado.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior do %s (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pídalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.",
- "Unknown error. Please check your system settings or contact your administrator" : "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou contacte co administrador",
- "Initial encryption started... This can take some time. Please wait." : "Comezou o cifrado inicial... Isto pode levar bastante tempo. Agarde.",
- "Initial encryption running... Please try again later." : "O cifrado inicial está en execución... Tenteo máis tarde.",
- "Missing requirements." : "Non se cumpren os requisitos.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que está instalado o OpenSSL xunto coa extensión PHP e que estean activados e configurados correctamente. Polo de agora foi desactivada a aplicación de cifrado.",
- "Following users are not set up for encryption:" : "Os seguintes usuarios non teñen configuración para o cifrado:",
- "Go directly to your %spersonal settings%s." : "Vaia directamente aos seus %saxustes persoais%s.",
- "Server-side Encryption" : "Cifrado na parte do servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as chaves non foron preparadas, saia da sesión e volva a acceder de novo",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activar a chave de recuperación (permitirá recuperar os ficheiros dos usuarios no caso de perda do contrasinal):",
- "Recovery key password" : "Contrasinal da chave de recuperación",
- "Repeat Recovery key password" : "Repita o contrasinal da chave de recuperación",
- "Enabled" : "Activado",
- "Disabled" : "Desactivado",
- "Change recovery key password:" : "Cambiar o contrasinal da chave de la recuperación:",
- "Old Recovery key password" : "Antigo contrasinal da chave de recuperación",
- "New Recovery key password" : "Novo contrasinal da chave de recuperación",
- "Repeat New Recovery key password" : "Repita o novo contrasinal da chave de recuperación",
- "Change Password" : "Cambiar o contrasinal",
- "Your private key password no longer matches your log-in password." : "O seu contrasinal da chave privada non coincide co seu contrasinal de acceso.",
- "Set your old private key password to your current log-in password:" : "Estabeleza o seu contrasinal antigo da chave de recuperación ao seu contrasinal de acceso actual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se non lembra o seu antigo contrasinal pode pedírllelo ao seu administrador para recuperar os seus ficheiros.",
- "Old log-in password" : "Contrasinal antigo de acceso",
- "Current log-in password" : "Contrasinal actual de acceso",
- "Update Private Key Password" : "Actualizar o contrasinal da chave privada",
- "Enable password recovery:" : "Activar o contrasinal de recuperación:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao activar esta opción permitiráselle volver a obter acceso aos ficheiros cifrados no caso de perda do contrasinal"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/gl.json b/apps/files_encryption/l10n/gl.json
deleted file mode 100644
index a1a8e606f1c..00000000000
--- a/apps/files_encryption/l10n/gl.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Produciuse un erro descoñecido",
- "Missing recovery key password" : "Falta a chave de recuperación",
- "Please repeat the recovery key password" : "Repita a chave de recuperación",
- "Repeated recovery key password does not match the provided recovery key password" : "A repetición da chave de recuperación non coincide coa chave de recuperación estabelecida",
- "Recovery key successfully enabled" : "Activada satisfactoriamente a chave de recuperación",
- "Could not disable recovery key. Please check your recovery key password!" : "Non foi posíbel desactivar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!",
- "Recovery key successfully disabled" : "Desactivada satisfactoriamente a chave de recuperación",
- "Please provide the old recovery password" : "Introduza a chave de recuperación antiga",
- "Please provide a new recovery password" : "Introduza a nova chave de recuperación",
- "Please repeat the new recovery password" : "Repita a nova chave de recuperación",
- "Password successfully changed." : "O contrasinal foi cambiado satisfactoriamente",
- "Could not change the password. Maybe the old password was not correct." : "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.",
- "Could not update the private key password." : "Non foi posíbel actualizar o contrasinal da chave privada.",
- "The old password was not correct, please try again." : "O contrasinal antigo non é correcto, ténteo de novo.",
- "The current log-in password was not correct, please try again." : "O actual contrasinal de acceso non é correcto, ténteo de novo.",
- "Private key password successfully updated." : "A chave privada foi actualizada correctamente.",
- "File recovery settings updated" : "Actualizouse o ficheiro de axustes de recuperación",
- "Could not update file recovery" : "Non foi posíbel actualizar o ficheiro de recuperación",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Non se iniciou a aplicación de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala para que tamén se inicie a aplicación de cifrado.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior do %s (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pídalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.",
- "Unknown error. Please check your system settings or contact your administrator" : "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou contacte co administrador",
- "Initial encryption started... This can take some time. Please wait." : "Comezou o cifrado inicial... Isto pode levar bastante tempo. Agarde.",
- "Initial encryption running... Please try again later." : "O cifrado inicial está en execución... Tenteo máis tarde.",
- "Missing requirements." : "Non se cumpren os requisitos.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que está instalado o OpenSSL xunto coa extensión PHP e que estean activados e configurados correctamente. Polo de agora foi desactivada a aplicación de cifrado.",
- "Following users are not set up for encryption:" : "Os seguintes usuarios non teñen configuración para o cifrado:",
- "Go directly to your %spersonal settings%s." : "Vaia directamente aos seus %saxustes persoais%s.",
- "Server-side Encryption" : "Cifrado na parte do servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as chaves non foron preparadas, saia da sesión e volva a acceder de novo",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activar a chave de recuperación (permitirá recuperar os ficheiros dos usuarios no caso de perda do contrasinal):",
- "Recovery key password" : "Contrasinal da chave de recuperación",
- "Repeat Recovery key password" : "Repita o contrasinal da chave de recuperación",
- "Enabled" : "Activado",
- "Disabled" : "Desactivado",
- "Change recovery key password:" : "Cambiar o contrasinal da chave de la recuperación:",
- "Old Recovery key password" : "Antigo contrasinal da chave de recuperación",
- "New Recovery key password" : "Novo contrasinal da chave de recuperación",
- "Repeat New Recovery key password" : "Repita o novo contrasinal da chave de recuperación",
- "Change Password" : "Cambiar o contrasinal",
- "Your private key password no longer matches your log-in password." : "O seu contrasinal da chave privada non coincide co seu contrasinal de acceso.",
- "Set your old private key password to your current log-in password:" : "Estabeleza o seu contrasinal antigo da chave de recuperación ao seu contrasinal de acceso actual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se non lembra o seu antigo contrasinal pode pedírllelo ao seu administrador para recuperar os seus ficheiros.",
- "Old log-in password" : "Contrasinal antigo de acceso",
- "Current log-in password" : "Contrasinal actual de acceso",
- "Update Private Key Password" : "Actualizar o contrasinal da chave privada",
- "Enable password recovery:" : "Activar o contrasinal de recuperación:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao activar esta opción permitiráselle volver a obter acceso aos ficheiros cifrados no caso de perda do contrasinal"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/he.js b/apps/files_encryption/l10n/he.js
deleted file mode 100644
index d6a018e358d..00000000000
--- a/apps/files_encryption/l10n/he.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "שגיאה בלתי ידועה"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/he.json b/apps/files_encryption/l10n/he.json
deleted file mode 100644
index 83324968384..00000000000
--- a/apps/files_encryption/l10n/he.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "שגיאה בלתי ידועה"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/hr.js b/apps/files_encryption/l10n/hr.js
deleted file mode 100644
index ec62347f610..00000000000
--- a/apps/files_encryption/l10n/hr.js
+++ /dev/null
@@ -1,42 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Nepoznata pogreška",
- "Recovery key successfully enabled" : "Ključ za oporavak uspješno aktiviran",
- "Could not disable recovery key. Please check your recovery key password!" : "Ključ za oporavak nije moguće deaktivirati. Molimo provjerite svoju lozinku ključa za oporavak!",
- "Recovery key successfully disabled" : "Ključ za ooravak uspješno deaktiviran",
- "Password successfully changed." : "Lozinka uspješno promijenjena.",
- "Could not change the password. Maybe the old password was not correct." : "Lozinku nije moguće promijeniti. Možda je stara lozinka bila neispravna.",
- "Private key password successfully updated." : "Lozinka privatnog ključa uspješno ažurirana.",
- "File recovery settings updated" : "Ažurirane postavke za oporavak datoteke",
- "Could not update file recovery" : "Oporavak datoteke nije moguće ažurirati",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikacija šifriranja nije inicijalizirana! Možda je aplikacija šifriranja bila reaktivirana tijekom vaše sesije.Da biste inicijalizirali aplikaciju šifriranja, molimo, pokušajte se odjaviti i ponovno prijaviti.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Vaš privatni ključ nije ispravan! Vjerojatno je vaša lozinka promijenjena izvan %s(npr. vašega korporativnog direktorija). Lozinku svoga privatnog ključa možete ažuriratiu svojim osobnim postavkama da biste obnovili pristup svojim šifriranim datotekama.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće dešifrirati, vjerojatno je riječ o zajedničkoj datoteci. Molimopitajte vlasnika datoteke da je ponovo podijeli s vama.",
- "Unknown error. Please check your system settings or contact your administrator" : "Pogreška nepoznata. Molimo provjerite svoje sistemske postavke ili kontaktirajte svog administratora.",
- "Initial encryption started... This can take some time. Please wait." : "Počelo inicijalno šifriranje... To može potrajati neko vrijeme. Molimo, pričekajte.",
- "Initial encryption running... Please try again later." : "Inicijalno šifriranje u tijeku... Molimo, pokušajte ponovno kasnije.",
- "Missing requirements." : "Nedostaju preduvjeti.",
- "Following users are not set up for encryption:" : "Sljedeći korisnici nisu određeni za šifriranje:",
- "Go directly to your %spersonal settings%s." : "Idite izravno na svoje %sosobne postavke%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je aktivirana ali vaši ključevi nisu inicijalizirani, molimo odjavite se iponovno prijavite.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivirajte ključ za oporavak (u slučaju gubitka lozinke dozvolite oporavak korisničkih datoteka):",
- "Recovery key password" : "Lozinka ključa za oporavak",
- "Repeat Recovery key password" : "Ponovite lozinku ključa za oporavak",
- "Enabled" : "Aktivirano",
- "Disabled" : "Onemogućeno",
- "Change recovery key password:" : "Promijenite lozinku ključa za oporavak",
- "Old Recovery key password" : "Stara lozinka ključa za oporavak",
- "New Recovery key password" : "Nova lozinka ključa za oporavak",
- "Repeat New Recovery key password" : "Ponovite novu lozinku ključa za oporavak",
- "Change Password" : "Promijenite lozinku",
- "Your private key password no longer matches your log-in password." : "Lozinka vašeg privatnog ključa više se ne slaže s vašom lozinkom za prijavu.",
- "Set your old private key password to your current log-in password:" : "Postavite svoju staru lozinku privatnog ključa u svoju postojeću lozinku za prijavu.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ako se ne sjećate svoje stare lozinke, možete zamoliti administratora da oporavi vaše datoteke.",
- "Old log-in password" : "Stara lozinka za prijavu",
- "Current log-in password" : "Aktualna lozinka za prijavu",
- "Update Private Key Password" : "Ažurirajte lozinku privatnog ključa",
- "Enable password recovery:" : "Omogućite oporavak lozinke:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "U slučaju gubitka lozinke, aktiviranje ove opcije ponovno će vam pribaviti pristup vašim šifriranim datotekama"
-},
-"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
diff --git a/apps/files_encryption/l10n/hr.json b/apps/files_encryption/l10n/hr.json
deleted file mode 100644
index ea1cfe5ed03..00000000000
--- a/apps/files_encryption/l10n/hr.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{ "translations": {
- "Unknown error" : "Nepoznata pogreška",
- "Recovery key successfully enabled" : "Ključ za oporavak uspješno aktiviran",
- "Could not disable recovery key. Please check your recovery key password!" : "Ključ za oporavak nije moguće deaktivirati. Molimo provjerite svoju lozinku ključa za oporavak!",
- "Recovery key successfully disabled" : "Ključ za ooravak uspješno deaktiviran",
- "Password successfully changed." : "Lozinka uspješno promijenjena.",
- "Could not change the password. Maybe the old password was not correct." : "Lozinku nije moguće promijeniti. Možda je stara lozinka bila neispravna.",
- "Private key password successfully updated." : "Lozinka privatnog ključa uspješno ažurirana.",
- "File recovery settings updated" : "Ažurirane postavke za oporavak datoteke",
- "Could not update file recovery" : "Oporavak datoteke nije moguće ažurirati",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikacija šifriranja nije inicijalizirana! Možda je aplikacija šifriranja bila reaktivirana tijekom vaše sesije.Da biste inicijalizirali aplikaciju šifriranja, molimo, pokušajte se odjaviti i ponovno prijaviti.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Vaš privatni ključ nije ispravan! Vjerojatno je vaša lozinka promijenjena izvan %s(npr. vašega korporativnog direktorija). Lozinku svoga privatnog ključa možete ažuriratiu svojim osobnim postavkama da biste obnovili pristup svojim šifriranim datotekama.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće dešifrirati, vjerojatno je riječ o zajedničkoj datoteci. Molimopitajte vlasnika datoteke da je ponovo podijeli s vama.",
- "Unknown error. Please check your system settings or contact your administrator" : "Pogreška nepoznata. Molimo provjerite svoje sistemske postavke ili kontaktirajte svog administratora.",
- "Initial encryption started... This can take some time. Please wait." : "Počelo inicijalno šifriranje... To može potrajati neko vrijeme. Molimo, pričekajte.",
- "Initial encryption running... Please try again later." : "Inicijalno šifriranje u tijeku... Molimo, pokušajte ponovno kasnije.",
- "Missing requirements." : "Nedostaju preduvjeti.",
- "Following users are not set up for encryption:" : "Sljedeći korisnici nisu određeni za šifriranje:",
- "Go directly to your %spersonal settings%s." : "Idite izravno na svoje %sosobne postavke%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je aktivirana ali vaši ključevi nisu inicijalizirani, molimo odjavite se iponovno prijavite.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivirajte ključ za oporavak (u slučaju gubitka lozinke dozvolite oporavak korisničkih datoteka):",
- "Recovery key password" : "Lozinka ključa za oporavak",
- "Repeat Recovery key password" : "Ponovite lozinku ključa za oporavak",
- "Enabled" : "Aktivirano",
- "Disabled" : "Onemogućeno",
- "Change recovery key password:" : "Promijenite lozinku ključa za oporavak",
- "Old Recovery key password" : "Stara lozinka ključa za oporavak",
- "New Recovery key password" : "Nova lozinka ključa za oporavak",
- "Repeat New Recovery key password" : "Ponovite novu lozinku ključa za oporavak",
- "Change Password" : "Promijenite lozinku",
- "Your private key password no longer matches your log-in password." : "Lozinka vašeg privatnog ključa više se ne slaže s vašom lozinkom za prijavu.",
- "Set your old private key password to your current log-in password:" : "Postavite svoju staru lozinku privatnog ključa u svoju postojeću lozinku za prijavu.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ako se ne sjećate svoje stare lozinke, možete zamoliti administratora da oporavi vaše datoteke.",
- "Old log-in password" : "Stara lozinka za prijavu",
- "Current log-in password" : "Aktualna lozinka za prijavu",
- "Update Private Key Password" : "Ažurirajte lozinku privatnog ključa",
- "Enable password recovery:" : "Omogućite oporavak lozinke:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "U slučaju gubitka lozinke, aktiviranje ove opcije ponovno će vam pribaviti pristup vašim šifriranim datotekama"
-},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/hu_HU.js b/apps/files_encryption/l10n/hu_HU.js
deleted file mode 100644
index 6d52e85d667..00000000000
--- a/apps/files_encryption/l10n/hu_HU.js
+++ /dev/null
@@ -1,38 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Ismeretlen hiba",
- "Recovery key successfully enabled" : "A helyreállítási kulcs sikeresen bekapcsolva",
- "Could not disable recovery key. Please check your recovery key password!" : "A helyreállítási kulcsot nem lehetett kikapcsolni. Ellenőrizze a helyreállítási kulcsa jelszavát!",
- "Recovery key successfully disabled" : "A helyreállítási kulcs sikeresen kikapcsolva",
- "Password successfully changed." : "A jelszót sikeresen megváltoztattuk.",
- "Could not change the password. Maybe the old password was not correct." : "A jelszót nem lehet megváltoztatni! Lehet, hogy hibás volt a régi jelszó.",
- "Private key password successfully updated." : "A személyes kulcsának jelszava frissítésre került.",
- "File recovery settings updated" : "A fájlhelyreállítási beállítások frissültek",
- "Could not update file recovery" : "A fájlhelyreállítás nem frissíthető",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A titkosítási modul nincs elindítva! Talán a munkafolyamat közben került engedélyezésre. Kérjük jelentkezzen ki majd ismét jelentkezzen be, hogy a titkosítási modul megfelelően elinduljon!",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Az állományok titkosításához használt titkos kulcsa érvénytelen. Valószínűleg a %s rendszeren kívül változtatta meg a jelszavát (pl. a munkahelyi címtárban). A személyes beállításoknál frissítheti a titkos kulcsát, hogy ismét elérhesse a titkosított állományait.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Az állományt nem sikerült dekódolni, valószínűleg ez egy megosztott fájl. Kérje meg az állomány tulajdonosát, hogy újra ossza meg Önnel ezt az állományt!",
- "Initial encryption started... This can take some time. Please wait." : "A titkosítási folyamat megkezdődött... Ez hosszabb ideig is eltarthat. Kérem várjon.",
- "Initial encryption running... Please try again later." : "Kezedeti titkosítás fut... Próbálja később.",
- "Missing requirements." : "Hiányzó követelmények.",
- "Following users are not set up for encryption:" : "A következő felhasználók nem állították be a titkosítást:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Az állományok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérjük, hogy jelentkezzen ki, és lépjen be újra!",
- "Enable recovery key (allow to recover users files in case of password loss):" : "A helyreállítási kulcs beállítása (lehetővé teszi a felhasználók állományainak visszaállítását, ha elfelejtik a jelszavukat):",
- "Recovery key password" : "A helyreállítási kulcs jelszava",
- "Repeat Recovery key password" : "Ismételje meg a helyreállítási kulcs jelszavát",
- "Enabled" : "Bekapcsolva",
- "Disabled" : "Kikapcsolva",
- "Change recovery key password:" : "A helyreállítási kulcs jelszavának módosítása:",
- "Old Recovery key password" : "Régi Helyreállítási Kulcs Jelszava",
- "New Recovery key password" : "Új Helyreállítási kulcs jelszava",
- "Repeat New Recovery key password" : "Ismételje meg az új helyreállítási kulcs jelszavát",
- "Change Password" : "Jelszó megváltoztatása",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ha nem emlékszik a régi jelszavára akkor megkérheti a rendszergazdát, hogy állítsa vissza az állományait.",
- "Old log-in password" : "Régi bejelentkezési jelszó",
- "Current log-in password" : "Jelenlegi bejelentkezési jelszó",
- "Update Private Key Password" : "A személyest kulcs jelszó frissítése",
- "Enable password recovery:" : "Jelszó-visszaállítás bekapcsolása",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ez az opció lehetővé teszi, hogy a titkosított állományok tartalmát visszanyerjük abban az esetben, ha elfelejti a jelszavát"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/hu_HU.json b/apps/files_encryption/l10n/hu_HU.json
deleted file mode 100644
index 0bb4c40f396..00000000000
--- a/apps/files_encryption/l10n/hu_HU.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{ "translations": {
- "Unknown error" : "Ismeretlen hiba",
- "Recovery key successfully enabled" : "A helyreállítási kulcs sikeresen bekapcsolva",
- "Could not disable recovery key. Please check your recovery key password!" : "A helyreállítási kulcsot nem lehetett kikapcsolni. Ellenőrizze a helyreállítási kulcsa jelszavát!",
- "Recovery key successfully disabled" : "A helyreállítási kulcs sikeresen kikapcsolva",
- "Password successfully changed." : "A jelszót sikeresen megváltoztattuk.",
- "Could not change the password. Maybe the old password was not correct." : "A jelszót nem lehet megváltoztatni! Lehet, hogy hibás volt a régi jelszó.",
- "Private key password successfully updated." : "A személyes kulcsának jelszava frissítésre került.",
- "File recovery settings updated" : "A fájlhelyreállítási beállítások frissültek",
- "Could not update file recovery" : "A fájlhelyreállítás nem frissíthető",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A titkosítási modul nincs elindítva! Talán a munkafolyamat közben került engedélyezésre. Kérjük jelentkezzen ki majd ismét jelentkezzen be, hogy a titkosítási modul megfelelően elinduljon!",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Az állományok titkosításához használt titkos kulcsa érvénytelen. Valószínűleg a %s rendszeren kívül változtatta meg a jelszavát (pl. a munkahelyi címtárban). A személyes beállításoknál frissítheti a titkos kulcsát, hogy ismét elérhesse a titkosított állományait.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Az állományt nem sikerült dekódolni, valószínűleg ez egy megosztott fájl. Kérje meg az állomány tulajdonosát, hogy újra ossza meg Önnel ezt az állományt!",
- "Initial encryption started... This can take some time. Please wait." : "A titkosítási folyamat megkezdődött... Ez hosszabb ideig is eltarthat. Kérem várjon.",
- "Initial encryption running... Please try again later." : "Kezedeti titkosítás fut... Próbálja később.",
- "Missing requirements." : "Hiányzó követelmények.",
- "Following users are not set up for encryption:" : "A következő felhasználók nem állították be a titkosítást:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Az állományok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérjük, hogy jelentkezzen ki, és lépjen be újra!",
- "Enable recovery key (allow to recover users files in case of password loss):" : "A helyreállítási kulcs beállítása (lehetővé teszi a felhasználók állományainak visszaállítását, ha elfelejtik a jelszavukat):",
- "Recovery key password" : "A helyreállítási kulcs jelszava",
- "Repeat Recovery key password" : "Ismételje meg a helyreállítási kulcs jelszavát",
- "Enabled" : "Bekapcsolva",
- "Disabled" : "Kikapcsolva",
- "Change recovery key password:" : "A helyreállítási kulcs jelszavának módosítása:",
- "Old Recovery key password" : "Régi Helyreállítási Kulcs Jelszava",
- "New Recovery key password" : "Új Helyreállítási kulcs jelszava",
- "Repeat New Recovery key password" : "Ismételje meg az új helyreállítási kulcs jelszavát",
- "Change Password" : "Jelszó megváltoztatása",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ha nem emlékszik a régi jelszavára akkor megkérheti a rendszergazdát, hogy állítsa vissza az állományait.",
- "Old log-in password" : "Régi bejelentkezési jelszó",
- "Current log-in password" : "Jelenlegi bejelentkezési jelszó",
- "Update Private Key Password" : "A személyest kulcs jelszó frissítése",
- "Enable password recovery:" : "Jelszó-visszaállítás bekapcsolása",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ez az opció lehetővé teszi, hogy a titkosított állományok tartalmát visszanyerjük abban az esetben, ha elfelejti a jelszavát"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ia.js b/apps/files_encryption/l10n/ia.js
deleted file mode 100644
index 5d480be507c..00000000000
--- a/apps/files_encryption/l10n/ia.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Error Incognite"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/ia.json b/apps/files_encryption/l10n/ia.json
deleted file mode 100644
index de701b407d0..00000000000
--- a/apps/files_encryption/l10n/ia.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "Error Incognite"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/id.js b/apps/files_encryption/l10n/id.js
deleted file mode 100644
index c9137a51a11..00000000000
--- a/apps/files_encryption/l10n/id.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Kesalahan tidak diketahui",
- "Missing recovery key password" : "Sandi kunci pemuliahan hilang",
- "Please repeat the recovery key password" : "Silakan ulangi sandi kunci pemulihan",
- "Repeated recovery key password does not match the provided recovery key password" : "Sandi kunci pemulihan yang diulangi tidak cocok dengan sandi kunci pemulihan yang diberikan",
- "Recovery key successfully enabled" : "Kunci pemulihan berhasil diaktifkan",
- "Could not disable recovery key. Please check your recovery key password!" : "Tidak dapat menonaktifkan kunci pemulihan. Silakan periksa sandi kunci pemulihan Anda!",
- "Recovery key successfully disabled" : "Kunci pemulihan berhasil dinonaktifkan",
- "Please provide the old recovery password" : "Mohon berikan sandi pemulihan lama",
- "Please provide a new recovery password" : "Mohon berikan sandi pemulihan baru",
- "Please repeat the new recovery password" : "Silakan ulangi sandi pemulihan baru",
- "Password successfully changed." : "Sandi berhasil diubah",
- "Could not change the password. Maybe the old password was not correct." : "Tidak dapat mengubah sandi. Kemungkinan sandi lama yang dimasukkan salah.",
- "Could not update the private key password." : "Tidak dapat memperbarui sandi kunci private.",
- "The old password was not correct, please try again." : "Sandi lama salah, mohon coba lagi.",
- "The current log-in password was not correct, please try again." : "Sandi masuk saat ini salah, mohon coba lagi.",
- "Private key password successfully updated." : "Sandi kunci privat berhasil diperbarui.",
- "File recovery settings updated" : "Pengaturan pemulihan berkas diperbarui",
- "Could not update file recovery" : "Tidak dapat memperbarui pemulihan berkas",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikasi enkripsi tidak dimulai! Kemungkinan aplikasi enkripsi telah diaktifkan ulang saat sesi Anda. Silakan coba untuk keluar dan kembali lagi untuk memulai aplikasi enkripsi.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Kunci private Anda tidak sah! Nampaknya sandi Anda telah diubah diluar %s (misal direktori perusahaan Anda). Anda dapat memperbarui sandi kunci private untuk memulihakan akses ke berkas terenkripsi Anda.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tidak dapat mendekripsi berkas ini, mungkin ini adalah berkas bersama. Silakan meminta pemilik berkas ini untuk membagikan kembali dengan Anda.",
- "Unknown error. Please check your system settings or contact your administrator" : "Kesalahan tidak diketahui. Silakan periksa pengaturan sistem Anda atau hubungi administrator",
- "Initial encryption started... This can take some time. Please wait." : "Enskripsi awal dijalankan... Ini dapat memakan waktu. Silakan tunggu.",
- "Initial encryption running... Please try again later." : "Enkripsi awal sedang berjalan... Sialakn coba lagi nanti.",
- "Missing requirements." : "Persyaratan tidak terpenuhi.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Mohon pastikan bahwa OpenSSL bersama ekstensi PHP diaktifkan dan terkonfigurasi dengan benar. Untuk sekarang, aplikasi enkripsi akan dinonaktifkan.",
- "Following users are not set up for encryption:" : "Pengguna berikut belum diatur untuk enkripsi:",
- "Go directly to your %spersonal settings%s." : "Langsung ke %spengaturan pribadi%s Anda.",
- "Server-side Encryption" : "Enkripsi Sisi-Server",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikasi Enskripsi telah diaktifkan tetapi kunci tidak diinisialisasi, silakan log-out dan log-in lagi",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktifkan kunci pemulihan (memungkinkan pengguna untuk memulihkan berkas dalam kasus kehilangan sandi):",
- "Recovery key password" : "Sandi kunci pemulihan",
- "Repeat Recovery key password" : "Ulangi sandi kunci Pemulihan",
- "Enabled" : "Diaktifkan",
- "Disabled" : "Dinonaktifkan",
- "Change recovery key password:" : "Ubah sandi kunci pemulihan:",
- "Old Recovery key password" : "Sandi kunci Pemulihan Lama",
- "New Recovery key password" : "Sandi kunci Pemulihan Baru",
- "Repeat New Recovery key password" : "Ulangi sandi kunci Pemulihan baru",
- "Change Password" : "Ubah Sandi",
- "Your private key password no longer matches your log-in password." : "Sandi kunci private Anda tidak lagi cocok dengan sandi masuk Anda.",
- "Set your old private key password to your current log-in password:" : "Setel sandi kunci private Anda untuk sandi masuk Anda saat ini:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jika Anda tidak ingat sandi lama, Anda dapat meminta administrator Anda untuk memulihkan berkas.",
- "Old log-in password" : "Sandi masuk yang lama",
- "Current log-in password" : "Sandi masuk saat ini",
- "Update Private Key Password" : "Perbarui Sandi Kunci Private",
- "Enable password recovery:" : "Aktifkan sandi pemulihan:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Mengaktifkan opsi ini memungkinkan Anda untuk mendapatkan kembali akses ke berkas terenkripsi Anda dalam kasus kehilangan sandi"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/id.json b/apps/files_encryption/l10n/id.json
deleted file mode 100644
index 5d77cef0b24..00000000000
--- a/apps/files_encryption/l10n/id.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Kesalahan tidak diketahui",
- "Missing recovery key password" : "Sandi kunci pemuliahan hilang",
- "Please repeat the recovery key password" : "Silakan ulangi sandi kunci pemulihan",
- "Repeated recovery key password does not match the provided recovery key password" : "Sandi kunci pemulihan yang diulangi tidak cocok dengan sandi kunci pemulihan yang diberikan",
- "Recovery key successfully enabled" : "Kunci pemulihan berhasil diaktifkan",
- "Could not disable recovery key. Please check your recovery key password!" : "Tidak dapat menonaktifkan kunci pemulihan. Silakan periksa sandi kunci pemulihan Anda!",
- "Recovery key successfully disabled" : "Kunci pemulihan berhasil dinonaktifkan",
- "Please provide the old recovery password" : "Mohon berikan sandi pemulihan lama",
- "Please provide a new recovery password" : "Mohon berikan sandi pemulihan baru",
- "Please repeat the new recovery password" : "Silakan ulangi sandi pemulihan baru",
- "Password successfully changed." : "Sandi berhasil diubah",
- "Could not change the password. Maybe the old password was not correct." : "Tidak dapat mengubah sandi. Kemungkinan sandi lama yang dimasukkan salah.",
- "Could not update the private key password." : "Tidak dapat memperbarui sandi kunci private.",
- "The old password was not correct, please try again." : "Sandi lama salah, mohon coba lagi.",
- "The current log-in password was not correct, please try again." : "Sandi masuk saat ini salah, mohon coba lagi.",
- "Private key password successfully updated." : "Sandi kunci privat berhasil diperbarui.",
- "File recovery settings updated" : "Pengaturan pemulihan berkas diperbarui",
- "Could not update file recovery" : "Tidak dapat memperbarui pemulihan berkas",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikasi enkripsi tidak dimulai! Kemungkinan aplikasi enkripsi telah diaktifkan ulang saat sesi Anda. Silakan coba untuk keluar dan kembali lagi untuk memulai aplikasi enkripsi.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Kunci private Anda tidak sah! Nampaknya sandi Anda telah diubah diluar %s (misal direktori perusahaan Anda). Anda dapat memperbarui sandi kunci private untuk memulihakan akses ke berkas terenkripsi Anda.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tidak dapat mendekripsi berkas ini, mungkin ini adalah berkas bersama. Silakan meminta pemilik berkas ini untuk membagikan kembali dengan Anda.",
- "Unknown error. Please check your system settings or contact your administrator" : "Kesalahan tidak diketahui. Silakan periksa pengaturan sistem Anda atau hubungi administrator",
- "Initial encryption started... This can take some time. Please wait." : "Enskripsi awal dijalankan... Ini dapat memakan waktu. Silakan tunggu.",
- "Initial encryption running... Please try again later." : "Enkripsi awal sedang berjalan... Sialakn coba lagi nanti.",
- "Missing requirements." : "Persyaratan tidak terpenuhi.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Mohon pastikan bahwa OpenSSL bersama ekstensi PHP diaktifkan dan terkonfigurasi dengan benar. Untuk sekarang, aplikasi enkripsi akan dinonaktifkan.",
- "Following users are not set up for encryption:" : "Pengguna berikut belum diatur untuk enkripsi:",
- "Go directly to your %spersonal settings%s." : "Langsung ke %spengaturan pribadi%s Anda.",
- "Server-side Encryption" : "Enkripsi Sisi-Server",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikasi Enskripsi telah diaktifkan tetapi kunci tidak diinisialisasi, silakan log-out dan log-in lagi",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktifkan kunci pemulihan (memungkinkan pengguna untuk memulihkan berkas dalam kasus kehilangan sandi):",
- "Recovery key password" : "Sandi kunci pemulihan",
- "Repeat Recovery key password" : "Ulangi sandi kunci Pemulihan",
- "Enabled" : "Diaktifkan",
- "Disabled" : "Dinonaktifkan",
- "Change recovery key password:" : "Ubah sandi kunci pemulihan:",
- "Old Recovery key password" : "Sandi kunci Pemulihan Lama",
- "New Recovery key password" : "Sandi kunci Pemulihan Baru",
- "Repeat New Recovery key password" : "Ulangi sandi kunci Pemulihan baru",
- "Change Password" : "Ubah Sandi",
- "Your private key password no longer matches your log-in password." : "Sandi kunci private Anda tidak lagi cocok dengan sandi masuk Anda.",
- "Set your old private key password to your current log-in password:" : "Setel sandi kunci private Anda untuk sandi masuk Anda saat ini:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jika Anda tidak ingat sandi lama, Anda dapat meminta administrator Anda untuk memulihkan berkas.",
- "Old log-in password" : "Sandi masuk yang lama",
- "Current log-in password" : "Sandi masuk saat ini",
- "Update Private Key Password" : "Perbarui Sandi Kunci Private",
- "Enable password recovery:" : "Aktifkan sandi pemulihan:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Mengaktifkan opsi ini memungkinkan Anda untuk mendapatkan kembali akses ke berkas terenkripsi Anda dalam kasus kehilangan sandi"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/is.js b/apps/files_encryption/l10n/is.js
deleted file mode 100644
index 8dfc249683e..00000000000
--- a/apps/files_encryption/l10n/is.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Encryption" : "Dulkóðun"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/is.json b/apps/files_encryption/l10n/is.json
deleted file mode 100644
index b4d4708f404..00000000000
--- a/apps/files_encryption/l10n/is.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Encryption" : "Dulkóðun"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/it.js b/apps/files_encryption/l10n/it.js
deleted file mode 100644
index 32fe42ae275..00000000000
--- a/apps/files_encryption/l10n/it.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Errore sconosciuto",
- "Missing recovery key password" : "Manca la password della chiave di recupero",
- "Please repeat the recovery key password" : "Ripeti la password della chiave di recupero",
- "Repeated recovery key password does not match the provided recovery key password" : "La password della chiave di recupero ripetuta non corrisponde alla password della chiave di recupero fornita",
- "Recovery key successfully enabled" : "Chiave di recupero abilitata correttamente",
- "Could not disable recovery key. Please check your recovery key password!" : "Impossibile disabilitare la chiave di recupero. Verifica la password della chiave di recupero.",
- "Recovery key successfully disabled" : "Chiave di recupero disabilitata correttamente",
- "Please provide the old recovery password" : "Fornisci la vecchia password di recupero",
- "Please provide a new recovery password" : "Fornisci una nuova password di recupero",
- "Please repeat the new recovery password" : "Ripeti la nuova password di recupero",
- "Password successfully changed." : "Password modificata correttamente.",
- "Could not change the password. Maybe the old password was not correct." : "Impossibile cambiare la password. Forse la vecchia password non era corretta.",
- "Could not update the private key password." : "Impossibile aggiornare la password della chiave privata.",
- "The old password was not correct, please try again." : "La vecchia password non era corretta, prova di nuovo.",
- "The current log-in password was not correct, please try again." : "La password di accesso attuale non era corretta, prova ancora.",
- "Private key password successfully updated." : "Password della chiave privata aggiornata correttamente.",
- "File recovery settings updated" : "Impostazioni di ripristino dei file aggiornate",
- "Could not update file recovery" : "Impossibile aggiornare il ripristino dei file",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Applicazione di cifratura non inizializzata. Forse l'applicazione è stata riabilitata durante la tua sessione. Prova a disconnetterti e ad effettuare nuovamente l'accesso per inizializzarla.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "La tua chiave privata non è valida! Forse la password è stata cambiata al di fuori di %s (ad es. la directory aziendale). Puoi aggiornare la password della chiave privata nelle impostazioni personali per ottenere nuovamente l'accesso ai file cifrati.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossibile decifrare questo file, probabilmente è un file condiviso. Chiedi al proprietario del file di condividere nuovamente il file con te.",
- "Unknown error. Please check your system settings or contact your administrator" : "Errore sconosciuto. Controlla le impostazioni di sistema o contatta il tuo amministratore",
- "Initial encryption started... This can take some time. Please wait." : "Cifratura iniziale avviata... Potrebbe richiedere del tempo. Attendi.",
- "Initial encryption running... Please try again later." : "Cifratura iniziale in esecuzione... Riprova più tardi.",
- "Missing requirements." : "Requisiti mancanti.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assicurati che OpenSSL e l'estensione PHP sia abilitatati e configurati correttamente. Per ora, l'applicazione di cifratura è disabilitata.",
- "Following users are not set up for encryption:" : "I seguenti utenti non sono configurati per la cifratura:",
- "Go directly to your %spersonal settings%s." : "Vai direttamente alle tue %simpostazioni personali%s.",
- "Server-side Encryption" : "Cifratura lato server",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'applicazione di cifratura è abilitata, ma le chiavi non sono state inizializzate, disconnettiti ed effettua nuovamente l'accesso",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Abilita la chiave di recupero (permette di recuperare i file utenti in caso di perdita della password):",
- "Recovery key password" : "Password della chiave di recupero",
- "Repeat Recovery key password" : "Ripeti la password della chiave di recupero",
- "Enabled" : "Abilitata",
- "Disabled" : "Disabilitata",
- "Change recovery key password:" : "Cambia la password della chiave di recupero:",
- "Old Recovery key password" : "Vecchia password della chiave di recupero",
- "New Recovery key password" : "Nuova password della chiave di recupero",
- "Repeat New Recovery key password" : "Ripeti la nuova password della chiave di recupero",
- "Change Password" : "Modifica password",
- "Your private key password no longer matches your log-in password." : "La password della chiave privata non corrisponde più alla password di accesso.",
- "Set your old private key password to your current log-in password:" : "Imposta la vecchia password della chiave privata sull'attuale password di accesso:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se non ricordi la vecchia password puoi chiedere al tuo amministratore di recuperare i file.",
- "Old log-in password" : "Vecchia password di accesso",
- "Current log-in password" : "Password di accesso attuale",
- "Update Private Key Password" : "Aggiorna la password della chiave privata",
- "Enable password recovery:" : "Abilita il ripristino della password:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "L'abilitazione di questa opzione ti consentirà di accedere nuovamente ai file cifrati in caso di perdita della password"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/it.json b/apps/files_encryption/l10n/it.json
deleted file mode 100644
index e5fa00dca35..00000000000
--- a/apps/files_encryption/l10n/it.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Errore sconosciuto",
- "Missing recovery key password" : "Manca la password della chiave di recupero",
- "Please repeat the recovery key password" : "Ripeti la password della chiave di recupero",
- "Repeated recovery key password does not match the provided recovery key password" : "La password della chiave di recupero ripetuta non corrisponde alla password della chiave di recupero fornita",
- "Recovery key successfully enabled" : "Chiave di recupero abilitata correttamente",
- "Could not disable recovery key. Please check your recovery key password!" : "Impossibile disabilitare la chiave di recupero. Verifica la password della chiave di recupero.",
- "Recovery key successfully disabled" : "Chiave di recupero disabilitata correttamente",
- "Please provide the old recovery password" : "Fornisci la vecchia password di recupero",
- "Please provide a new recovery password" : "Fornisci una nuova password di recupero",
- "Please repeat the new recovery password" : "Ripeti la nuova password di recupero",
- "Password successfully changed." : "Password modificata correttamente.",
- "Could not change the password. Maybe the old password was not correct." : "Impossibile cambiare la password. Forse la vecchia password non era corretta.",
- "Could not update the private key password." : "Impossibile aggiornare la password della chiave privata.",
- "The old password was not correct, please try again." : "La vecchia password non era corretta, prova di nuovo.",
- "The current log-in password was not correct, please try again." : "La password di accesso attuale non era corretta, prova ancora.",
- "Private key password successfully updated." : "Password della chiave privata aggiornata correttamente.",
- "File recovery settings updated" : "Impostazioni di ripristino dei file aggiornate",
- "Could not update file recovery" : "Impossibile aggiornare il ripristino dei file",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Applicazione di cifratura non inizializzata. Forse l'applicazione è stata riabilitata durante la tua sessione. Prova a disconnetterti e ad effettuare nuovamente l'accesso per inizializzarla.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "La tua chiave privata non è valida! Forse la password è stata cambiata al di fuori di %s (ad es. la directory aziendale). Puoi aggiornare la password della chiave privata nelle impostazioni personali per ottenere nuovamente l'accesso ai file cifrati.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossibile decifrare questo file, probabilmente è un file condiviso. Chiedi al proprietario del file di condividere nuovamente il file con te.",
- "Unknown error. Please check your system settings or contact your administrator" : "Errore sconosciuto. Controlla le impostazioni di sistema o contatta il tuo amministratore",
- "Initial encryption started... This can take some time. Please wait." : "Cifratura iniziale avviata... Potrebbe richiedere del tempo. Attendi.",
- "Initial encryption running... Please try again later." : "Cifratura iniziale in esecuzione... Riprova più tardi.",
- "Missing requirements." : "Requisiti mancanti.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assicurati che OpenSSL e l'estensione PHP sia abilitatati e configurati correttamente. Per ora, l'applicazione di cifratura è disabilitata.",
- "Following users are not set up for encryption:" : "I seguenti utenti non sono configurati per la cifratura:",
- "Go directly to your %spersonal settings%s." : "Vai direttamente alle tue %simpostazioni personali%s.",
- "Server-side Encryption" : "Cifratura lato server",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'applicazione di cifratura è abilitata, ma le chiavi non sono state inizializzate, disconnettiti ed effettua nuovamente l'accesso",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Abilita la chiave di recupero (permette di recuperare i file utenti in caso di perdita della password):",
- "Recovery key password" : "Password della chiave di recupero",
- "Repeat Recovery key password" : "Ripeti la password della chiave di recupero",
- "Enabled" : "Abilitata",
- "Disabled" : "Disabilitata",
- "Change recovery key password:" : "Cambia la password della chiave di recupero:",
- "Old Recovery key password" : "Vecchia password della chiave di recupero",
- "New Recovery key password" : "Nuova password della chiave di recupero",
- "Repeat New Recovery key password" : "Ripeti la nuova password della chiave di recupero",
- "Change Password" : "Modifica password",
- "Your private key password no longer matches your log-in password." : "La password della chiave privata non corrisponde più alla password di accesso.",
- "Set your old private key password to your current log-in password:" : "Imposta la vecchia password della chiave privata sull'attuale password di accesso:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se non ricordi la vecchia password puoi chiedere al tuo amministratore di recuperare i file.",
- "Old log-in password" : "Vecchia password di accesso",
- "Current log-in password" : "Password di accesso attuale",
- "Update Private Key Password" : "Aggiorna la password della chiave privata",
- "Enable password recovery:" : "Abilita il ripristino della password:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "L'abilitazione di questa opzione ti consentirà di accedere nuovamente ai file cifrati in caso di perdita della password"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ja.js b/apps/files_encryption/l10n/ja.js
deleted file mode 100644
index 8fb1364e042..00000000000
--- a/apps/files_encryption/l10n/ja.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "不明なエラー",
- "Missing recovery key password" : "復旧キーのパスワードがありません",
- "Please repeat the recovery key password" : "復旧キーのパスワードをもう一度入力",
- "Repeated recovery key password does not match the provided recovery key password" : "入力された復旧キーのパスワードが一致しません。",
- "Recovery key successfully enabled" : "リカバリ用のキーを正常に有効にしました",
- "Could not disable recovery key. Please check your recovery key password!" : "リカバリ用のキーを無効化できませんでした。リカバリ用のキーのパスワードを確認してください!",
- "Recovery key successfully disabled" : "リカバリ用のキーを正常に無効化しました",
- "Please provide the old recovery password" : "古い復旧キーのパスワードを入力",
- "Please provide a new recovery password" : "新しい復旧キーのパスワードを入力",
- "Please repeat the new recovery password" : "新しい復旧キーのパスワードをもう一度入力",
- "Password successfully changed." : "パスワードを変更できました。",
- "Could not change the password. Maybe the old password was not correct." : "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
- "Could not update the private key password." : "秘密鍵のパスワードを更新できませんでした。",
- "The old password was not correct, please try again." : "古いパスワードが一致しませんでした。もう一度入力してください。",
- "The current log-in password was not correct, please try again." : "ログインパスワードが一致しませんでした。もう一度入力してください。",
- "Private key password successfully updated." : "秘密鍵のパスワードが正常に更新されました。",
- "File recovery settings updated" : "ファイルリカバリ設定を更新しました",
- "Could not update file recovery" : "ファイルリカバリを更新できませんでした",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
- "Unknown error. Please check your system settings or contact your administrator" : "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。",
- "Initial encryption started... This can take some time. Please wait." : "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。お待ちください。",
- "Initial encryption running... Please try again later." : "初期暗号化実行中... 後でもう一度お試しください。",
- "Missing requirements." : "必要要件が満たされていません。",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "必ず、OpenSSL及びOpenSSLのPHPの拡張を有効にした上で、適切に設定してください。現時点では暗号化アプリは無効になっています。",
- "Following users are not set up for encryption:" : "以下のユーザーは、暗号化設定がされていません:",
- "Go directly to your %spersonal settings%s." : "直接 %s個人設定%s に進む。",
- "Server-side Encryption" : "サーバー側暗号",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください",
- "Enable recovery key (allow to recover users files in case of password loss):" : "リカバリキーを有効にする (パスワードを忘れた場合にユーザーのファイルを回復できます):",
- "Recovery key password" : "リカバリキーのパスワード",
- "Repeat Recovery key password" : "リカバリキーのパスワードをもう一度入力",
- "Enabled" : "有効",
- "Disabled" : "無効",
- "Change recovery key password:" : "リカバリキーのパスワードを変更:",
- "Old Recovery key password" : "古いリカバリキーのパスワード",
- "New Recovery key password" : "新しいリカバリキーのパスワード",
- "Repeat New Recovery key password" : "新しいリカバリキーのパスワードをもう一度入力",
- "Change Password" : "パスワードを変更",
- "Your private key password no longer matches your log-in password." : "もはや秘密鍵はログインパスワードと一致しません。",
- "Set your old private key password to your current log-in password:" : "古い秘密鍵のパスワードを現在のログインパスワードに設定:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "古いパスワードを覚えていない場合、管理者に尋ねてファイルを回復することができます。",
- "Old log-in password" : "古いログインパスワード",
- "Current log-in password" : "現在のログインパスワード",
- "Update Private Key Password" : "秘密鍵のパスワードを更新",
- "Enable password recovery:" : "パスワードリカバリを有効に:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "このオプションを有効にすると、パスワードを紛失した場合も、暗号化されたファイルに再度アクセスすることができるようになります。"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/ja.json b/apps/files_encryption/l10n/ja.json
deleted file mode 100644
index d88a65fe492..00000000000
--- a/apps/files_encryption/l10n/ja.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "不明なエラー",
- "Missing recovery key password" : "復旧キーのパスワードがありません",
- "Please repeat the recovery key password" : "復旧キーのパスワードをもう一度入力",
- "Repeated recovery key password does not match the provided recovery key password" : "入力された復旧キーのパスワードが一致しません。",
- "Recovery key successfully enabled" : "リカバリ用のキーを正常に有効にしました",
- "Could not disable recovery key. Please check your recovery key password!" : "リカバリ用のキーを無効化できませんでした。リカバリ用のキーのパスワードを確認してください!",
- "Recovery key successfully disabled" : "リカバリ用のキーを正常に無効化しました",
- "Please provide the old recovery password" : "古い復旧キーのパスワードを入力",
- "Please provide a new recovery password" : "新しい復旧キーのパスワードを入力",
- "Please repeat the new recovery password" : "新しい復旧キーのパスワードをもう一度入力",
- "Password successfully changed." : "パスワードを変更できました。",
- "Could not change the password. Maybe the old password was not correct." : "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
- "Could not update the private key password." : "秘密鍵のパスワードを更新できませんでした。",
- "The old password was not correct, please try again." : "古いパスワードが一致しませんでした。もう一度入力してください。",
- "The current log-in password was not correct, please try again." : "ログインパスワードが一致しませんでした。もう一度入力してください。",
- "Private key password successfully updated." : "秘密鍵のパスワードが正常に更新されました。",
- "File recovery settings updated" : "ファイルリカバリ設定を更新しました",
- "Could not update file recovery" : "ファイルリカバリを更新できませんでした",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
- "Unknown error. Please check your system settings or contact your administrator" : "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。",
- "Initial encryption started... This can take some time. Please wait." : "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。お待ちください。",
- "Initial encryption running... Please try again later." : "初期暗号化実行中... 後でもう一度お試しください。",
- "Missing requirements." : "必要要件が満たされていません。",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "必ず、OpenSSL及びOpenSSLのPHPの拡張を有効にした上で、適切に設定してください。現時点では暗号化アプリは無効になっています。",
- "Following users are not set up for encryption:" : "以下のユーザーは、暗号化設定がされていません:",
- "Go directly to your %spersonal settings%s." : "直接 %s個人設定%s に進む。",
- "Server-side Encryption" : "サーバー側暗号",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください",
- "Enable recovery key (allow to recover users files in case of password loss):" : "リカバリキーを有効にする (パスワードを忘れた場合にユーザーのファイルを回復できます):",
- "Recovery key password" : "リカバリキーのパスワード",
- "Repeat Recovery key password" : "リカバリキーのパスワードをもう一度入力",
- "Enabled" : "有効",
- "Disabled" : "無効",
- "Change recovery key password:" : "リカバリキーのパスワードを変更:",
- "Old Recovery key password" : "古いリカバリキーのパスワード",
- "New Recovery key password" : "新しいリカバリキーのパスワード",
- "Repeat New Recovery key password" : "新しいリカバリキーのパスワードをもう一度入力",
- "Change Password" : "パスワードを変更",
- "Your private key password no longer matches your log-in password." : "もはや秘密鍵はログインパスワードと一致しません。",
- "Set your old private key password to your current log-in password:" : "古い秘密鍵のパスワードを現在のログインパスワードに設定:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "古いパスワードを覚えていない場合、管理者に尋ねてファイルを回復することができます。",
- "Old log-in password" : "古いログインパスワード",
- "Current log-in password" : "現在のログインパスワード",
- "Update Private Key Password" : "秘密鍵のパスワードを更新",
- "Enable password recovery:" : "パスワードリカバリを有効に:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "このオプションを有効にすると、パスワードを紛失した場合も、暗号化されたファイルに再度アクセスすることができるようになります。"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ka_GE.js b/apps/files_encryption/l10n/ka_GE.js
deleted file mode 100644
index 7b95616ccdd..00000000000
--- a/apps/files_encryption/l10n/ka_GE.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "უცნობი შეცდომა"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/ka_GE.json b/apps/files_encryption/l10n/ka_GE.json
deleted file mode 100644
index a22007f7789..00000000000
--- a/apps/files_encryption/l10n/ka_GE.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "უცნობი შეცდომა"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/km.js b/apps/files_encryption/l10n/km.js
deleted file mode 100644
index 336b96f96a8..00000000000
--- a/apps/files_encryption/l10n/km.js
+++ /dev/null
@@ -1,11 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "មិន​ស្គាល់​កំហុស",
- "Password successfully changed." : "បាន​ប្ដូរ​ពាក្យ​សម្ងាត់​ដោយ​ជោគជ័យ។",
- "Could not change the password. Maybe the old password was not correct." : "មិន​អាច​ប្ដូរ​ពាក្យ​សម្ងាត់​បាន​ទេ។ ប្រហែល​ពាក្យ​សម្ងាត់​ចាស់​មិន​ត្រឹម​ត្រូវ។",
- "Enabled" : "បាន​បើក",
- "Disabled" : "បាន​បិទ",
- "Change Password" : "ប្ដូរ​ពាក្យ​សម្ងាត់"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/km.json b/apps/files_encryption/l10n/km.json
deleted file mode 100644
index 26b888c0011..00000000000
--- a/apps/files_encryption/l10n/km.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{ "translations": {
- "Unknown error" : "មិន​ស្គាល់​កំហុស",
- "Password successfully changed." : "បាន​ប្ដូរ​ពាក្យ​សម្ងាត់​ដោយ​ជោគជ័យ។",
- "Could not change the password. Maybe the old password was not correct." : "មិន​អាច​ប្ដូរ​ពាក្យ​សម្ងាត់​បាន​ទេ។ ប្រហែល​ពាក្យ​សម្ងាត់​ចាស់​មិន​ត្រឹម​ត្រូវ។",
- "Enabled" : "បាន​បើក",
- "Disabled" : "បាន​បិទ",
- "Change Password" : "ប្ដូរ​ពាក្យ​សម្ងាត់"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/kn.js b/apps/files_encryption/l10n/kn.js
deleted file mode 100644
index e8583cc5a97..00000000000
--- a/apps/files_encryption/l10n/kn.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ",
- "Enabled" : "ಸಕ್ರಿಯಗೊಳಿಸಿದೆ",
- "Disabled" : "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/kn.json b/apps/files_encryption/l10n/kn.json
deleted file mode 100644
index ccb4203c400..00000000000
--- a/apps/files_encryption/l10n/kn.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ",
- "Enabled" : "ಸಕ್ರಿಯಗೊಳಿಸಿದೆ",
- "Disabled" : "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ko.js b/apps/files_encryption/l10n/ko.js
deleted file mode 100644
index 3d09c0abff2..00000000000
--- a/apps/files_encryption/l10n/ko.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "알 수 없는 오류",
- "Missing recovery key password" : "잊어버린 복구 키 암호 복구",
- "Please repeat the recovery key password" : "복구 키 암호를 다시 입력하십시오",
- "Repeated recovery key password does not match the provided recovery key password" : "입력한 복구 키 암호가 서로 다릅니다",
- "Recovery key successfully enabled" : "복구 키가 성공적으로 활성화되었습니다",
- "Could not disable recovery key. Please check your recovery key password!" : "복구 키를 비활성화 할 수 없습니다. 복구 키의 암호를 확인해 주십시오!",
- "Recovery key successfully disabled" : "복구 키가 성공적으로 비활성화 되었습니다",
- "Please provide the old recovery password" : "이전 복구 암호를 입력하십시오",
- "Please provide a new recovery password" : "새 복구 암호를 입력하십시오",
- "Please repeat the new recovery password" : "새 복구 암호를 다시 입력하십시오",
- "Password successfully changed." : "암호가 성공적으로 변경되었습니다",
- "Could not change the password. Maybe the old password was not correct." : "암호를 변경할 수 없습니다. 예전 암호가 정확하지 않은 것 같습니다.",
- "Could not update the private key password." : "개인 키 암호를 업데이트할 수 없습니다",
- "The old password was not correct, please try again." : "이전 암호가 잘못되었습니다. 다시 시도하십시오.",
- "The current log-in password was not correct, please try again." : "현재 로그인 암호가 잘못되었습니다. 다시 시도하십시오.",
- "Private key password successfully updated." : "개인 키 암호가 성공적으로 업데이트 되었습니다.",
- "File recovery settings updated" : "파일 복구 설정 업데이트됨",
- "Could not update file recovery" : "파일 복구를 업데이트할 수 없습니다",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "암호화 앱이 초기화되지 않았습니다! 암호화 앱이 다시 활성화된 것 같습니다. 암호화 앱을 초기화하려면 로그아웃했다 다시 로그인하십시오.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "개인 키가 올바르지 않습니다! 암호가 %s 외부에서(예: 회사 디렉터리) 변경된 것 같습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 수정하십시오.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 복호화할 수 없습니다. 공유된 파일일 수도 있습니다. 파일 소유자에게 공유를 다시 요청하십시오.",
- "Unknown error. Please check your system settings or contact your administrator" : "알 수 없는 오류입니다. 시스템 설정을 확인하거나 관리자에게 문의하십시오",
- "Initial encryption started... This can take some time. Please wait." : "초기 암호화가 시작되었습니다... 시간이 걸릴 수도 있으니 기다려 주십시오.",
- "Initial encryption running... Please try again later." : "초기 암호화가 진행 중입니다... 나중에 다시 시도하십시오.",
- "Missing requirements." : "요구 사항이 부족합니다.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "OpenSSL 및 PHP OpenSSL 확장이 활성화되어 있고 올바르게 설정되어 있는지 확인하십시오. 현재 암호화 앱이 비활성화되었습니다.",
- "Following users are not set up for encryption:" : "다음 사용자는 암호화를 사용할 수 없습니다:",
- "Go directly to your %spersonal settings%s." : "%s개인 설정%s으로 직접 이동하십시오.",
- "Server-side Encryption" : "서버 측 암호화",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "암호화 앱이 활성화되어 있지만 키가 초기화되지 않았습니다. 로그아웃한 후 다시 로그인하십시오",
- "Enable recovery key (allow to recover users files in case of password loss):" : "복구 키 사용 (암호를 잊었을 때 파일을 복구할 수 있도록 함):",
- "Recovery key password" : "복구 키 암호",
- "Repeat Recovery key password" : "복구 키 암호 재입력",
- "Enabled" : "활성화",
- "Disabled" : "비활성화",
- "Change recovery key password:" : "복구 키 암호 변경:",
- "Old Recovery key password" : "이전 복구 키 암호",
- "New Recovery key password" : "새 복구 키 암호",
- "Repeat New Recovery key password" : "새 복구 키 암호 재입력",
- "Change Password" : "암호 변경",
- "Your private key password no longer matches your log-in password." : "개인 키 암호와 로그인 암호가 일치하지 않습니다.",
- "Set your old private key password to your current log-in password:" : "기존 개인 키 암호를 로그인 암호와 동일하게 설정하십시오:",
- " If you don't remember your old password you can ask your administrator to recover your files." : " 이전 암호가 기억나지 않으면 시스템 관리자에게 파일 복구를 요청하십시오.",
- "Old log-in password" : "이전 로그인 암호",
- "Current log-in password" : "현재 로그인 암호",
- "Update Private Key Password" : "개인 키 암호 업데이트",
- "Enable password recovery:" : "암호 복구 사용:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "이 옵션을 사용하면 암호를 잊었을 때 암호화된 파일에 다시 접근할 수 있습니다"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/ko.json b/apps/files_encryption/l10n/ko.json
deleted file mode 100644
index 6e6c6f162c0..00000000000
--- a/apps/files_encryption/l10n/ko.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "알 수 없는 오류",
- "Missing recovery key password" : "잊어버린 복구 키 암호 복구",
- "Please repeat the recovery key password" : "복구 키 암호를 다시 입력하십시오",
- "Repeated recovery key password does not match the provided recovery key password" : "입력한 복구 키 암호가 서로 다릅니다",
- "Recovery key successfully enabled" : "복구 키가 성공적으로 활성화되었습니다",
- "Could not disable recovery key. Please check your recovery key password!" : "복구 키를 비활성화 할 수 없습니다. 복구 키의 암호를 확인해 주십시오!",
- "Recovery key successfully disabled" : "복구 키가 성공적으로 비활성화 되었습니다",
- "Please provide the old recovery password" : "이전 복구 암호를 입력하십시오",
- "Please provide a new recovery password" : "새 복구 암호를 입력하십시오",
- "Please repeat the new recovery password" : "새 복구 암호를 다시 입력하십시오",
- "Password successfully changed." : "암호가 성공적으로 변경되었습니다",
- "Could not change the password. Maybe the old password was not correct." : "암호를 변경할 수 없습니다. 예전 암호가 정확하지 않은 것 같습니다.",
- "Could not update the private key password." : "개인 키 암호를 업데이트할 수 없습니다",
- "The old password was not correct, please try again." : "이전 암호가 잘못되었습니다. 다시 시도하십시오.",
- "The current log-in password was not correct, please try again." : "현재 로그인 암호가 잘못되었습니다. 다시 시도하십시오.",
- "Private key password successfully updated." : "개인 키 암호가 성공적으로 업데이트 되었습니다.",
- "File recovery settings updated" : "파일 복구 설정 업데이트됨",
- "Could not update file recovery" : "파일 복구를 업데이트할 수 없습니다",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "암호화 앱이 초기화되지 않았습니다! 암호화 앱이 다시 활성화된 것 같습니다. 암호화 앱을 초기화하려면 로그아웃했다 다시 로그인하십시오.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "개인 키가 올바르지 않습니다! 암호가 %s 외부에서(예: 회사 디렉터리) 변경된 것 같습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 수정하십시오.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 복호화할 수 없습니다. 공유된 파일일 수도 있습니다. 파일 소유자에게 공유를 다시 요청하십시오.",
- "Unknown error. Please check your system settings or contact your administrator" : "알 수 없는 오류입니다. 시스템 설정을 확인하거나 관리자에게 문의하십시오",
- "Initial encryption started... This can take some time. Please wait." : "초기 암호화가 시작되었습니다... 시간이 걸릴 수도 있으니 기다려 주십시오.",
- "Initial encryption running... Please try again later." : "초기 암호화가 진행 중입니다... 나중에 다시 시도하십시오.",
- "Missing requirements." : "요구 사항이 부족합니다.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "OpenSSL 및 PHP OpenSSL 확장이 활성화되어 있고 올바르게 설정되어 있는지 확인하십시오. 현재 암호화 앱이 비활성화되었습니다.",
- "Following users are not set up for encryption:" : "다음 사용자는 암호화를 사용할 수 없습니다:",
- "Go directly to your %spersonal settings%s." : "%s개인 설정%s으로 직접 이동하십시오.",
- "Server-side Encryption" : "서버 측 암호화",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "암호화 앱이 활성화되어 있지만 키가 초기화되지 않았습니다. 로그아웃한 후 다시 로그인하십시오",
- "Enable recovery key (allow to recover users files in case of password loss):" : "복구 키 사용 (암호를 잊었을 때 파일을 복구할 수 있도록 함):",
- "Recovery key password" : "복구 키 암호",
- "Repeat Recovery key password" : "복구 키 암호 재입력",
- "Enabled" : "활성화",
- "Disabled" : "비활성화",
- "Change recovery key password:" : "복구 키 암호 변경:",
- "Old Recovery key password" : "이전 복구 키 암호",
- "New Recovery key password" : "새 복구 키 암호",
- "Repeat New Recovery key password" : "새 복구 키 암호 재입력",
- "Change Password" : "암호 변경",
- "Your private key password no longer matches your log-in password." : "개인 키 암호와 로그인 암호가 일치하지 않습니다.",
- "Set your old private key password to your current log-in password:" : "기존 개인 키 암호를 로그인 암호와 동일하게 설정하십시오:",
- " If you don't remember your old password you can ask your administrator to recover your files." : " 이전 암호가 기억나지 않으면 시스템 관리자에게 파일 복구를 요청하십시오.",
- "Old log-in password" : "이전 로그인 암호",
- "Current log-in password" : "현재 로그인 암호",
- "Update Private Key Password" : "개인 키 암호 업데이트",
- "Enable password recovery:" : "암호 복구 사용:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "이 옵션을 사용하면 암호를 잊었을 때 암호화된 파일에 다시 접근할 수 있습니다"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ku_IQ.js b/apps/files_encryption/l10n/ku_IQ.js
deleted file mode 100644
index 5a036cc5252..00000000000
--- a/apps/files_encryption/l10n/ku_IQ.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Encryption" : "نهێنیکردن"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/ku_IQ.json b/apps/files_encryption/l10n/ku_IQ.json
deleted file mode 100644
index ab30a5a485b..00000000000
--- a/apps/files_encryption/l10n/ku_IQ.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Encryption" : "نهێنیکردن"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/lb.js b/apps/files_encryption/l10n/lb.js
deleted file mode 100644
index d5e206fddb0..00000000000
--- a/apps/files_encryption/l10n/lb.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Et ass en onbekannte Fehler opgetrueden"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/lb.json b/apps/files_encryption/l10n/lb.json
deleted file mode 100644
index 8cfee6638f4..00000000000
--- a/apps/files_encryption/l10n/lb.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "Et ass en onbekannte Fehler opgetrueden"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/lo.js b/apps/files_encryption/l10n/lo.js
deleted file mode 100644
index b5b586d1028..00000000000
--- a/apps/files_encryption/l10n/lo.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/lo.json b/apps/files_encryption/l10n/lo.json
deleted file mode 100644
index 1a02813027d..00000000000
--- a/apps/files_encryption/l10n/lo.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/lt_LT.js b/apps/files_encryption/l10n/lt_LT.js
deleted file mode 100644
index eb28b3933df..00000000000
--- a/apps/files_encryption/l10n/lt_LT.js
+++ /dev/null
@@ -1,37 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Neatpažinta klaida",
- "Recovery key successfully enabled" : "Atkūrimo raktas sėkmingai įjungtas",
- "Could not disable recovery key. Please check your recovery key password!" : "Neišėjo išjungti jūsų atkūrimo rakto. Prašome jį patikrinti!",
- "Recovery key successfully disabled" : "Atkūrimo raktas sėkmingai išjungtas",
- "Password successfully changed." : "Slaptažodis sėkmingai pakeistas",
- "Could not change the password. Maybe the old password was not correct." : "Slaptažodis nebuvo pakeistas. Gali būti, kad buvo neteisingai suvestas senasis.",
- "Private key password successfully updated." : "Privataus rakto slaptažodis buvo sėkmingai atnaujintas.",
- "File recovery settings updated" : "Failų atkūrimo nustatymai pakeisti",
- "Could not update file recovery" : "Neišėjo atnaujinti failų atkūrimo",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifravimo programa nepaleista! Galbūt šifravimo programa buvo įjungta dar kartą Jūsų sesijos metu. Prašome atsijungti ir vėl prisijungti, kad paleisti šifravimo programą.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Jūsų privatus raktas yra netinkamas! Panašu, kad Jūsų slaptažodis buvo pakeistas už %s (pvz. Jūsų organizacijos kataloge). Galite atnaujinti savo privataus rakto slaptažodį savo asmeniniuose nustatymuose, kad atkurti prieigą prie savo šifruotų failų.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Failo iššifruoti nepavyko, gali būti jog jis yra pasidalintas su jumis. Paprašykite failo savininko, kad jums iš naujo pateiktų šį failą.",
- "Initial encryption started... This can take some time. Please wait." : "Pradėtas pirminis šifravimas... Tai gali užtrukti. Prašome palaukti.",
- "Missing requirements." : "Trūkstami laukai.",
- "Following users are not set up for encryption:" : "Sekantys naudotojai nenustatyti šifravimui:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifravimo programa įjungta, bet Jūsų raktai nėra pritaikyti. Prašome atsijungti ir vėl prisijungti",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Įjunkite atkūrimo raktą, (leisti atkurti naudotojų failus praradus slaptažodį):",
- "Recovery key password" : "Atkūrimo rakto slaptažodis",
- "Repeat Recovery key password" : "Pakartokite atkūrimo rakto slaptažodį",
- "Enabled" : "Įjungta",
- "Disabled" : "Išjungta",
- "Change recovery key password:" : "Pakeisti atkūrimo rakto slaptažodį:",
- "Old Recovery key password" : "Senas atkūrimo rakto slaptažodis",
- "New Recovery key password" : "Naujas atkūrimo rakto slaptažodis",
- "Repeat New Recovery key password" : "Pakartokite naują atkūrimo rakto slaptažodį",
- "Change Password" : "Pakeisti slaptažodį",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jei nepamenate savo seno slaptažodžio, galite paprašyti administratoriaus atkurti Jūsų failus.",
- "Old log-in password" : "Senas prisijungimo slaptažodis",
- "Current log-in password" : "Dabartinis prisijungimo slaptažodis",
- "Update Private Key Password" : "Atnaujinti privataus rakto slaptažodį",
- "Enable password recovery:" : "Įjungti slaptažodžio atkūrimą:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Įjungus šią funkciją jums bus suteiktas pakartotinis priėjimas prie Jūsų šifruotų failų pamiršus slaptažodį."
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/lt_LT.json b/apps/files_encryption/l10n/lt_LT.json
deleted file mode 100644
index f77575b5df4..00000000000
--- a/apps/files_encryption/l10n/lt_LT.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{ "translations": {
- "Unknown error" : "Neatpažinta klaida",
- "Recovery key successfully enabled" : "Atkūrimo raktas sėkmingai įjungtas",
- "Could not disable recovery key. Please check your recovery key password!" : "Neišėjo išjungti jūsų atkūrimo rakto. Prašome jį patikrinti!",
- "Recovery key successfully disabled" : "Atkūrimo raktas sėkmingai išjungtas",
- "Password successfully changed." : "Slaptažodis sėkmingai pakeistas",
- "Could not change the password. Maybe the old password was not correct." : "Slaptažodis nebuvo pakeistas. Gali būti, kad buvo neteisingai suvestas senasis.",
- "Private key password successfully updated." : "Privataus rakto slaptažodis buvo sėkmingai atnaujintas.",
- "File recovery settings updated" : "Failų atkūrimo nustatymai pakeisti",
- "Could not update file recovery" : "Neišėjo atnaujinti failų atkūrimo",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifravimo programa nepaleista! Galbūt šifravimo programa buvo įjungta dar kartą Jūsų sesijos metu. Prašome atsijungti ir vėl prisijungti, kad paleisti šifravimo programą.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Jūsų privatus raktas yra netinkamas! Panašu, kad Jūsų slaptažodis buvo pakeistas už %s (pvz. Jūsų organizacijos kataloge). Galite atnaujinti savo privataus rakto slaptažodį savo asmeniniuose nustatymuose, kad atkurti prieigą prie savo šifruotų failų.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Failo iššifruoti nepavyko, gali būti jog jis yra pasidalintas su jumis. Paprašykite failo savininko, kad jums iš naujo pateiktų šį failą.",
- "Initial encryption started... This can take some time. Please wait." : "Pradėtas pirminis šifravimas... Tai gali užtrukti. Prašome palaukti.",
- "Missing requirements." : "Trūkstami laukai.",
- "Following users are not set up for encryption:" : "Sekantys naudotojai nenustatyti šifravimui:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifravimo programa įjungta, bet Jūsų raktai nėra pritaikyti. Prašome atsijungti ir vėl prisijungti",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Įjunkite atkūrimo raktą, (leisti atkurti naudotojų failus praradus slaptažodį):",
- "Recovery key password" : "Atkūrimo rakto slaptažodis",
- "Repeat Recovery key password" : "Pakartokite atkūrimo rakto slaptažodį",
- "Enabled" : "Įjungta",
- "Disabled" : "Išjungta",
- "Change recovery key password:" : "Pakeisti atkūrimo rakto slaptažodį:",
- "Old Recovery key password" : "Senas atkūrimo rakto slaptažodis",
- "New Recovery key password" : "Naujas atkūrimo rakto slaptažodis",
- "Repeat New Recovery key password" : "Pakartokite naują atkūrimo rakto slaptažodį",
- "Change Password" : "Pakeisti slaptažodį",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jei nepamenate savo seno slaptažodžio, galite paprašyti administratoriaus atkurti Jūsų failus.",
- "Old log-in password" : "Senas prisijungimo slaptažodis",
- "Current log-in password" : "Dabartinis prisijungimo slaptažodis",
- "Update Private Key Password" : "Atnaujinti privataus rakto slaptažodį",
- "Enable password recovery:" : "Įjungti slaptažodžio atkūrimą:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Įjungus šią funkciją jums bus suteiktas pakartotinis priėjimas prie Jūsų šifruotų failų pamiršus slaptažodį."
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/lv.js b/apps/files_encryption/l10n/lv.js
deleted file mode 100644
index 4c9fd2adad8..00000000000
--- a/apps/files_encryption/l10n/lv.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Nezināma kļūda",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifrēšanas lietotnes ir pieslēgta, bet šifrēšanas atslēgas nav uzstādītas. Lūdzu izejiet no sistēmas un ieejiet sistēmā atpakaļ.",
- "Enabled" : "Pievienots"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/lv.json b/apps/files_encryption/l10n/lv.json
deleted file mode 100644
index bacaccd6b92..00000000000
--- a/apps/files_encryption/l10n/lv.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Unknown error" : "Nezināma kļūda",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifrēšanas lietotnes ir pieslēgta, bet šifrēšanas atslēgas nav uzstādītas. Lūdzu izejiet no sistēmas un ieejiet sistēmā atpakaļ.",
- "Enabled" : "Pievienots"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/mk.js b/apps/files_encryption/l10n/mk.js
deleted file mode 100644
index 7996856033b..00000000000
--- a/apps/files_encryption/l10n/mk.js
+++ /dev/null
@@ -1,18 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Непозната грешка",
- "Password successfully changed." : "Лозинката е успешно променета.",
- "Could not change the password. Maybe the old password was not correct." : "Лозинката не можеше да се промени. Можеби старата лозинка не беше исправна.",
- "Missing requirements." : "Барања кои недостасуваат.",
- "Repeat Recovery key password" : "Повтори ја лозинката за клучот на обновување",
- "Enabled" : "Овозможен",
- "Disabled" : "Оневозможен",
- "Old Recovery key password" : "Старата лозинка за клучот на обновување ",
- "Repeat New Recovery key password" : "Повтори ја лозинката за клучот на обновувањето",
- "Change Password" : "Смени лозинка",
- "Old log-in password" : "Старата лозинка за најавување",
- "Current log-in password" : "Тековната лозинка за најавување",
- "Enable password recovery:" : "Овозможи го обновувањето на лозинката:"
-},
-"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/apps/files_encryption/l10n/mk.json b/apps/files_encryption/l10n/mk.json
deleted file mode 100644
index e1929bcfa64..00000000000
--- a/apps/files_encryption/l10n/mk.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{ "translations": {
- "Unknown error" : "Непозната грешка",
- "Password successfully changed." : "Лозинката е успешно променета.",
- "Could not change the password. Maybe the old password was not correct." : "Лозинката не можеше да се промени. Можеби старата лозинка не беше исправна.",
- "Missing requirements." : "Барања кои недостасуваат.",
- "Repeat Recovery key password" : "Повтори ја лозинката за клучот на обновување",
- "Enabled" : "Овозможен",
- "Disabled" : "Оневозможен",
- "Old Recovery key password" : "Старата лозинка за клучот на обновување ",
- "Repeat New Recovery key password" : "Повтори ја лозинката за клучот на обновувањето",
- "Change Password" : "Смени лозинка",
- "Old log-in password" : "Старата лозинка за најавување",
- "Current log-in password" : "Тековната лозинка за најавување",
- "Enable password recovery:" : "Овозможи го обновувањето на лозинката:"
-},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/nb_NO.js b/apps/files_encryption/l10n/nb_NO.js
deleted file mode 100644
index ff52350f98a..00000000000
--- a/apps/files_encryption/l10n/nb_NO.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Ukjent feil",
- "Missing recovery key password" : "Passord for gjenopprettingsnøkkel mangler",
- "Please repeat the recovery key password" : "Gjenta passord for gjenopprettingsnøkkel",
- "Repeated recovery key password does not match the provided recovery key password" : "Gjentatt passord for gjenopprettingsnøkkel stemmer ikke med oppgitt passord for gjenopprettingsnøkkel",
- "Recovery key successfully enabled" : "Gjenopprettingsnøkkel aktivert",
- "Could not disable recovery key. Please check your recovery key password!" : "Klarte ikke å deaktivere gjenopprettingsnøkkel. Sjekk passordet for gjenopprettingsnøkkelen.",
- "Recovery key successfully disabled" : "Gjenopprettingsnøkkel ble deaktivert",
- "Please provide the old recovery password" : "Oppgi det gamle gjenopprettingspassordet",
- "Please provide a new recovery password" : "Oppgi et nytt gjenopprettingspassord",
- "Please repeat the new recovery password" : "Gjenta det nye gjenopprettingspassordet",
- "Password successfully changed." : "Passordet ble endret.",
- "Could not change the password. Maybe the old password was not correct." : "Klarte ikke å endre passordet. Kanskje gammelt passord ikke var korrekt.",
- "Could not update the private key password." : "Klarte ikke å oppdatere privatnøkkelpassordet.",
- "The old password was not correct, please try again." : "Det gamle passordet var feil. Prøv igjen.",
- "The current log-in password was not correct, please try again." : "Det nåværende innloggingspassordet var feil. Prøv igjen.",
- "Private key password successfully updated." : "Passord for privat nøkkel ble oppdatert.",
- "File recovery settings updated" : "Innstillinger for gjenoppretting av filer ble oppdatert",
- "Could not update file recovery" : "Klarte ikke å oppdatere gjenoppretting av filer",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypterings-app ikke initialisert! Kanskje krypterings-appen ble aktivert på nytt i løpet av økten din. Prøv å logge ut og logge inn igjen for å initialisere krypterings-appen.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din private nøkkel er ikke gyldig! Sannsynligvis ble passordet ditt endret utenfor %s. (f.eks. din bedriftskatalog). Du kan oppdatere passordet for din private nøkkel i dine personlige innstillinger for å gjenvinne tilgang til de krypterte filene dine.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke dekryptere denne filen. Dette er sannsynligvis en delt fil. Spør eieren av filen om å dele den med deg på nytt.",
- "Unknown error. Please check your system settings or contact your administrator" : "Ukjent feil. Sjekk systeminnstillingene eller kontakt administratoren.",
- "Initial encryption started... This can take some time. Please wait." : "Førstegangs kryptering startet... Dette kan ta litt tid. Vennligst vent.",
- "Initial encryption running... Please try again later." : "Førstegangs kryptering kjører... Prøv igjen senere.",
- "Missing requirements." : "Manglende krav.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Vennligst se til at OpenSSL sammen med PHP-utvidelsen er aktivert og riktig konfigurert. Krypterings-appen er foreløpig deaktivert.",
- "Following users are not set up for encryption:" : "Følgende brukere er ikke satt opp for kryptering:",
- "Go directly to your %spersonal settings%s." : "Gå direkte til dine %spersonlige innstillinger%s.",
- "Server-side Encryption" : "Serverkryptering",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App for kryptering er aktivert men nøklene dine er ikke satt opp. Logg ut og logg inn igjen.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktiver gjenopprettingsnøkkel (tillat å gjenopprette brukerfiler i tilfelle tap av passord):",
- "Recovery key password" : "Passord for gjenopprettingsnøkkel",
- "Repeat Recovery key password" : "Gjenta passord for gjenopprettingsnøkkel",
- "Enabled" : "Aktiv",
- "Disabled" : "Inaktiv",
- "Change recovery key password:" : "Endre passord for gjenopprettingsnøkkel:",
- "Old Recovery key password" : "Gammelt passord for gjenopprettingsnøkkel",
- "New Recovery key password" : "Nytt passord for gjenopprettingsnøkkel",
- "Repeat New Recovery key password" : "Gjenta nytt passord for gjenopprettingsnøkkel",
- "Change Password" : "Endre passord",
- "Your private key password no longer matches your log-in password." : "Passordet for din private nøkkel stemmer ikke lenger med påloggingspassordet ditt.",
- "Set your old private key password to your current log-in password:" : "Sett ditt gamle passord for privat nøkkel til ditt nåværende påloggingspassord:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Hvis du ikke husker det gamle passordet ditt kan du spørre administratoren om å gjenopprette filene dine.",
- "Old log-in password" : "Gammelt påloggingspassord",
- "Current log-in password" : "Nåværende påloggingspassord",
- "Update Private Key Password" : "Oppdater passord for privat nøkkel",
- "Enable password recovery:" : "Aktiver gjenoppretting av passord:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aktivering av dette valget tillater deg å gjenerobre tilgang til dine krypterte filer i tilfelle du mister passordet ditt."
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/nb_NO.json b/apps/files_encryption/l10n/nb_NO.json
deleted file mode 100644
index 3aa4ec9e868..00000000000
--- a/apps/files_encryption/l10n/nb_NO.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Ukjent feil",
- "Missing recovery key password" : "Passord for gjenopprettingsnøkkel mangler",
- "Please repeat the recovery key password" : "Gjenta passord for gjenopprettingsnøkkel",
- "Repeated recovery key password does not match the provided recovery key password" : "Gjentatt passord for gjenopprettingsnøkkel stemmer ikke med oppgitt passord for gjenopprettingsnøkkel",
- "Recovery key successfully enabled" : "Gjenopprettingsnøkkel aktivert",
- "Could not disable recovery key. Please check your recovery key password!" : "Klarte ikke å deaktivere gjenopprettingsnøkkel. Sjekk passordet for gjenopprettingsnøkkelen.",
- "Recovery key successfully disabled" : "Gjenopprettingsnøkkel ble deaktivert",
- "Please provide the old recovery password" : "Oppgi det gamle gjenopprettingspassordet",
- "Please provide a new recovery password" : "Oppgi et nytt gjenopprettingspassord",
- "Please repeat the new recovery password" : "Gjenta det nye gjenopprettingspassordet",
- "Password successfully changed." : "Passordet ble endret.",
- "Could not change the password. Maybe the old password was not correct." : "Klarte ikke å endre passordet. Kanskje gammelt passord ikke var korrekt.",
- "Could not update the private key password." : "Klarte ikke å oppdatere privatnøkkelpassordet.",
- "The old password was not correct, please try again." : "Det gamle passordet var feil. Prøv igjen.",
- "The current log-in password was not correct, please try again." : "Det nåværende innloggingspassordet var feil. Prøv igjen.",
- "Private key password successfully updated." : "Passord for privat nøkkel ble oppdatert.",
- "File recovery settings updated" : "Innstillinger for gjenoppretting av filer ble oppdatert",
- "Could not update file recovery" : "Klarte ikke å oppdatere gjenoppretting av filer",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypterings-app ikke initialisert! Kanskje krypterings-appen ble aktivert på nytt i løpet av økten din. Prøv å logge ut og logge inn igjen for å initialisere krypterings-appen.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din private nøkkel er ikke gyldig! Sannsynligvis ble passordet ditt endret utenfor %s. (f.eks. din bedriftskatalog). Du kan oppdatere passordet for din private nøkkel i dine personlige innstillinger for å gjenvinne tilgang til de krypterte filene dine.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke dekryptere denne filen. Dette er sannsynligvis en delt fil. Spør eieren av filen om å dele den med deg på nytt.",
- "Unknown error. Please check your system settings or contact your administrator" : "Ukjent feil. Sjekk systeminnstillingene eller kontakt administratoren.",
- "Initial encryption started... This can take some time. Please wait." : "Førstegangs kryptering startet... Dette kan ta litt tid. Vennligst vent.",
- "Initial encryption running... Please try again later." : "Førstegangs kryptering kjører... Prøv igjen senere.",
- "Missing requirements." : "Manglende krav.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Vennligst se til at OpenSSL sammen med PHP-utvidelsen er aktivert og riktig konfigurert. Krypterings-appen er foreløpig deaktivert.",
- "Following users are not set up for encryption:" : "Følgende brukere er ikke satt opp for kryptering:",
- "Go directly to your %spersonal settings%s." : "Gå direkte til dine %spersonlige innstillinger%s.",
- "Server-side Encryption" : "Serverkryptering",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App for kryptering er aktivert men nøklene dine er ikke satt opp. Logg ut og logg inn igjen.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktiver gjenopprettingsnøkkel (tillat å gjenopprette brukerfiler i tilfelle tap av passord):",
- "Recovery key password" : "Passord for gjenopprettingsnøkkel",
- "Repeat Recovery key password" : "Gjenta passord for gjenopprettingsnøkkel",
- "Enabled" : "Aktiv",
- "Disabled" : "Inaktiv",
- "Change recovery key password:" : "Endre passord for gjenopprettingsnøkkel:",
- "Old Recovery key password" : "Gammelt passord for gjenopprettingsnøkkel",
- "New Recovery key password" : "Nytt passord for gjenopprettingsnøkkel",
- "Repeat New Recovery key password" : "Gjenta nytt passord for gjenopprettingsnøkkel",
- "Change Password" : "Endre passord",
- "Your private key password no longer matches your log-in password." : "Passordet for din private nøkkel stemmer ikke lenger med påloggingspassordet ditt.",
- "Set your old private key password to your current log-in password:" : "Sett ditt gamle passord for privat nøkkel til ditt nåværende påloggingspassord:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Hvis du ikke husker det gamle passordet ditt kan du spørre administratoren om å gjenopprette filene dine.",
- "Old log-in password" : "Gammelt påloggingspassord",
- "Current log-in password" : "Nåværende påloggingspassord",
- "Update Private Key Password" : "Oppdater passord for privat nøkkel",
- "Enable password recovery:" : "Aktiver gjenoppretting av passord:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Aktivering av dette valget tillater deg å gjenerobre tilgang til dine krypterte filer i tilfelle du mister passordet ditt."
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/nl.js b/apps/files_encryption/l10n/nl.js
deleted file mode 100644
index 1100abd76fd..00000000000
--- a/apps/files_encryption/l10n/nl.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Onbekende fout",
- "Missing recovery key password" : "Ontbrekende wachtwoord herstelsleutel",
- "Please repeat the recovery key password" : "Herhaal het herstelsleutel wachtwoord",
- "Repeated recovery key password does not match the provided recovery key password" : "Het herhaalde herstelsleutel wachtwoord kwam niet overeen met het eerdere herstelsleutel wachtwoord ",
- "Recovery key successfully enabled" : "Herstelsleutel succesvol geactiveerd",
- "Could not disable recovery key. Please check your recovery key password!" : "Kon herstelsleutel niet deactiveren. Controleer het wachtwoord van uw herstelsleutel!",
- "Recovery key successfully disabled" : "Herstelsleutel succesvol gedeactiveerd",
- "Please provide the old recovery password" : "Geef het oude herstelwachtwoord op",
- "Please provide a new recovery password" : "Geef een nieuw herstelwachtwoord op",
- "Please repeat the new recovery password" : "Herhaal het nieuwe herstelwachtwoord",
- "Password successfully changed." : "Wachtwoord succesvol gewijzigd.",
- "Could not change the password. Maybe the old password was not correct." : "Kon wachtwoord niet wijzigen. Wellicht oude wachtwoord niet juist ingevoerd.",
- "Could not update the private key password." : "Kon het wachtwoord van de privésleutel niet bijwerken.",
- "The old password was not correct, please try again." : "Het oude wachtwoord was onjuist, probeer het opnieuw.",
- "The current log-in password was not correct, please try again." : "Het huidige inlogwachtwoord was niet juist, probeer het opnieuw.",
- "Private key password successfully updated." : "Privésleutel succesvol bijgewerkt.",
- "File recovery settings updated" : "Bestandsherstel instellingen bijgewerkt",
- "Could not update file recovery" : "Kon bestandsherstel niet bijwerken",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Crypto app niet geïnitialiseerd. Misschien werd de crypto app geheractiveerd tijdens de sessie. Log uit en log daarna opnieuw in om de crypto app te initialiseren.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Uw privésleutel is niet geldig! Waarschijnlijk is uw wachtwoord gewijzigd buiten %s (bijv. uw corporate directory). U kunt uw privésleutel wachtwoord in uw persoonlijke instellingen bijwerken om toegang te krijgen tot uw versleutelde bestanden.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan dit bestand niet ontcijferen, waarschijnlijk is het een gedeeld bestand, Vraag de eigenaar om het bestand opnieuw met u te delen.",
- "Unknown error. Please check your system settings or contact your administrator" : "Onbekende fout. Controleer uw systeeminstellingen of neem contact op met de beheerder",
- "Initial encryption started... This can take some time. Please wait." : "initiële versleuteling gestart... Dit kan even duren, geduld a.u.b.",
- "Initial encryption running... Please try again later." : "Initiële versleuteling bezig... Probeer het later opnieuw.",
- "Missing requirements." : "Missende benodigdheden.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Weed er zeker van dat OpenSSL met de PHP extensie is ingeschakeld en goed geconfigureerd. Op dit moment is de encryptie app uitgeschakeld.",
- "Following users are not set up for encryption:" : "De volgende gebruikers hebben geen configuratie voor encryptie:",
- "Go directly to your %spersonal settings%s." : "Ga direct naar uw %spersoonlijke instellingen%s.",
- "Server-side Encryption" : "Server-side versleuteling",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar uw sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activeren herstelsleutel (maakt het mogelijk om gebruikersbestanden terug te halen in geval van verlies van het wachtwoord):",
- "Recovery key password" : "Wachtwoord herstelsleulel",
- "Repeat Recovery key password" : "Herhaal het herstelsleutel wachtwoord",
- "Enabled" : "Geactiveerd",
- "Disabled" : "Gedeactiveerd",
- "Change recovery key password:" : "Wijzig wachtwoord herstelsleutel:",
- "Old Recovery key password" : "Oude wachtwoord herstelsleutel",
- "New Recovery key password" : "Nieuwe wachtwoord herstelsleutel",
- "Repeat New Recovery key password" : "Herhaal het nieuwe herstelsleutel wachtwoord",
- "Change Password" : "Wijzigen wachtwoord",
- "Your private key password no longer matches your log-in password." : "Het wachtwoord van uw privésleutel komt niet meer overeen met uw inlogwachtwoord.",
- "Set your old private key password to your current log-in password:" : "Stel het wachtwoord van uw oude privésleutel in op uw huidige inlogwachtwoord.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Als u uw oude wachtwoord niet meer weet, kunt u uw beheerder vragen uw bestanden terug te halen.",
- "Old log-in password" : "Oude wachtwoord",
- "Current log-in password" : "Huidige wachtwoord",
- "Update Private Key Password" : "Bijwerken wachtwoord Privésleutel",
- "Enable password recovery:" : "Activeren wachtwoord herstel:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Het activeren van deze optie maakt het mogelijk om uw versleutelde bestanden te benaderen als uw wachtwoord kwijt is"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/nl.json b/apps/files_encryption/l10n/nl.json
deleted file mode 100644
index dab88f4a2e2..00000000000
--- a/apps/files_encryption/l10n/nl.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Onbekende fout",
- "Missing recovery key password" : "Ontbrekende wachtwoord herstelsleutel",
- "Please repeat the recovery key password" : "Herhaal het herstelsleutel wachtwoord",
- "Repeated recovery key password does not match the provided recovery key password" : "Het herhaalde herstelsleutel wachtwoord kwam niet overeen met het eerdere herstelsleutel wachtwoord ",
- "Recovery key successfully enabled" : "Herstelsleutel succesvol geactiveerd",
- "Could not disable recovery key. Please check your recovery key password!" : "Kon herstelsleutel niet deactiveren. Controleer het wachtwoord van uw herstelsleutel!",
- "Recovery key successfully disabled" : "Herstelsleutel succesvol gedeactiveerd",
- "Please provide the old recovery password" : "Geef het oude herstelwachtwoord op",
- "Please provide a new recovery password" : "Geef een nieuw herstelwachtwoord op",
- "Please repeat the new recovery password" : "Herhaal het nieuwe herstelwachtwoord",
- "Password successfully changed." : "Wachtwoord succesvol gewijzigd.",
- "Could not change the password. Maybe the old password was not correct." : "Kon wachtwoord niet wijzigen. Wellicht oude wachtwoord niet juist ingevoerd.",
- "Could not update the private key password." : "Kon het wachtwoord van de privésleutel niet bijwerken.",
- "The old password was not correct, please try again." : "Het oude wachtwoord was onjuist, probeer het opnieuw.",
- "The current log-in password was not correct, please try again." : "Het huidige inlogwachtwoord was niet juist, probeer het opnieuw.",
- "Private key password successfully updated." : "Privésleutel succesvol bijgewerkt.",
- "File recovery settings updated" : "Bestandsherstel instellingen bijgewerkt",
- "Could not update file recovery" : "Kon bestandsherstel niet bijwerken",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Crypto app niet geïnitialiseerd. Misschien werd de crypto app geheractiveerd tijdens de sessie. Log uit en log daarna opnieuw in om de crypto app te initialiseren.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Uw privésleutel is niet geldig! Waarschijnlijk is uw wachtwoord gewijzigd buiten %s (bijv. uw corporate directory). U kunt uw privésleutel wachtwoord in uw persoonlijke instellingen bijwerken om toegang te krijgen tot uw versleutelde bestanden.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan dit bestand niet ontcijferen, waarschijnlijk is het een gedeeld bestand, Vraag de eigenaar om het bestand opnieuw met u te delen.",
- "Unknown error. Please check your system settings or contact your administrator" : "Onbekende fout. Controleer uw systeeminstellingen of neem contact op met de beheerder",
- "Initial encryption started... This can take some time. Please wait." : "initiële versleuteling gestart... Dit kan even duren, geduld a.u.b.",
- "Initial encryption running... Please try again later." : "Initiële versleuteling bezig... Probeer het later opnieuw.",
- "Missing requirements." : "Missende benodigdheden.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Weed er zeker van dat OpenSSL met de PHP extensie is ingeschakeld en goed geconfigureerd. Op dit moment is de encryptie app uitgeschakeld.",
- "Following users are not set up for encryption:" : "De volgende gebruikers hebben geen configuratie voor encryptie:",
- "Go directly to your %spersonal settings%s." : "Ga direct naar uw %spersoonlijke instellingen%s.",
- "Server-side Encryption" : "Server-side versleuteling",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar uw sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Activeren herstelsleutel (maakt het mogelijk om gebruikersbestanden terug te halen in geval van verlies van het wachtwoord):",
- "Recovery key password" : "Wachtwoord herstelsleulel",
- "Repeat Recovery key password" : "Herhaal het herstelsleutel wachtwoord",
- "Enabled" : "Geactiveerd",
- "Disabled" : "Gedeactiveerd",
- "Change recovery key password:" : "Wijzig wachtwoord herstelsleutel:",
- "Old Recovery key password" : "Oude wachtwoord herstelsleutel",
- "New Recovery key password" : "Nieuwe wachtwoord herstelsleutel",
- "Repeat New Recovery key password" : "Herhaal het nieuwe herstelsleutel wachtwoord",
- "Change Password" : "Wijzigen wachtwoord",
- "Your private key password no longer matches your log-in password." : "Het wachtwoord van uw privésleutel komt niet meer overeen met uw inlogwachtwoord.",
- "Set your old private key password to your current log-in password:" : "Stel het wachtwoord van uw oude privésleutel in op uw huidige inlogwachtwoord.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Als u uw oude wachtwoord niet meer weet, kunt u uw beheerder vragen uw bestanden terug te halen.",
- "Old log-in password" : "Oude wachtwoord",
- "Current log-in password" : "Huidige wachtwoord",
- "Update Private Key Password" : "Bijwerken wachtwoord Privésleutel",
- "Enable password recovery:" : "Activeren wachtwoord herstel:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Het activeren van deze optie maakt het mogelijk om uw versleutelde bestanden te benaderen als uw wachtwoord kwijt is"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/nn_NO.js b/apps/files_encryption/l10n/nn_NO.js
deleted file mode 100644
index 9cfe232080c..00000000000
--- a/apps/files_encryption/l10n/nn_NO.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Ukjend feil"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/nn_NO.json b/apps/files_encryption/l10n/nn_NO.json
deleted file mode 100644
index 347c2088148..00000000000
--- a/apps/files_encryption/l10n/nn_NO.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "Ukjend feil"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/pa.js b/apps/files_encryption/l10n/pa.js
deleted file mode 100644
index f61063e9459..00000000000
--- a/apps/files_encryption/l10n/pa.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/pa.json b/apps/files_encryption/l10n/pa.json
deleted file mode 100644
index 41690f3aa32..00000000000
--- a/apps/files_encryption/l10n/pa.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/pl.js b/apps/files_encryption/l10n/pl.js
deleted file mode 100644
index c53d1e12cc6..00000000000
--- a/apps/files_encryption/l10n/pl.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Nieznany błąd",
- "Missing recovery key password" : "Brakujące hasło klucza odzyskiwania",
- "Please repeat the recovery key password" : "Proszę powtórz nowe hasło klucza odzyskiwania",
- "Repeated recovery key password does not match the provided recovery key password" : "Hasła klucza odzyskiwania nie zgadzają się",
- "Recovery key successfully enabled" : "Klucz odzyskiwania włączony",
- "Could not disable recovery key. Please check your recovery key password!" : "Nie można wyłączyć klucza odzyskiwania. Proszę sprawdzić swoje hasło odzyskiwania!",
- "Recovery key successfully disabled" : "Klucz odzyskiwania wyłączony",
- "Please provide the old recovery password" : "Podaj stare hasło odzyskiwania",
- "Please provide a new recovery password" : "Podaj nowe hasło odzyskiwania",
- "Please repeat the new recovery password" : "Proszę powtórz nowe hasło odzyskiwania",
- "Password successfully changed." : "Zmiana hasła udana.",
- "Could not change the password. Maybe the old password was not correct." : "Nie można zmienić hasła. Może stare hasło nie było poprawne.",
- "Could not update the private key password." : "Nie można zmienić hasła klucza prywatnego.",
- "The old password was not correct, please try again." : "Stare hasło nie było poprawne. Spróbuj jeszcze raz.",
- "The current log-in password was not correct, please try again." : "Obecne hasło logowania nie było poprawne. Spróbuj ponownie.",
- "Private key password successfully updated." : "Pomyślnie zaktualizowano hasło klucza prywatnego.",
- "File recovery settings updated" : "Ustawienia odzyskiwania plików zmienione",
- "Could not update file recovery" : "Nie można zmienić pliku odzyskiwania",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Szyfrowanie aplikacja nie została zainicjowane! Może szyfrowanie aplikacji zostało ponownie włączone podczas tej sesji. Spróbuj się wylogować i zalogować ponownie aby zainicjować szyfrowanie aplikacji.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Klucz prywatny nie jest poprawny! Prawdopodobnie Twoje hasło zostało zmienione poza %s (np. w katalogu firmy). Aby odzyskać dostęp do zaszyfrowanych plików można zaktualizować hasło klucza prywatnego w ustawieniach osobistych.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.",
- "Unknown error. Please check your system settings or contact your administrator" : "Nieznany błąd. Proszę sprawdzić ustawienia systemowe lub skontaktować się z administratorem",
- "Initial encryption started... This can take some time. Please wait." : "Rozpoczęto szyfrowanie... To może chwilę potrwać. Proszę czekać.",
- "Initial encryption running... Please try again later." : "Trwa szyfrowanie początkowe...Spróbuj ponownie.",
- "Missing requirements." : "Brak wymagań.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Upewnij się, że OpenSSL jest włączony razem z rozszerzeniem PHP i poprawnie skonfigurowany, Obecnie aplikacja szyfrowania została wyłączona.",
- "Following users are not set up for encryption:" : "Następujący użytkownicy nie mają skonfigurowanego szyfrowania:",
- "Go directly to your %spersonal settings%s." : "Przejdź bezpośrednio do %spersonal settings%s.",
- "Server-side Encryption" : "Szyfrowanie po stronie serwera",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacja szyfrująca jest aktywna, ale twoje klucze nie zostały zainicjowane, prosze wyloguj się i zaloguj ponownie.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Włączhasło klucza odzyskiwania (pozwala odzyskać pliki użytkowników w przypadku utraty hasła):",
- "Recovery key password" : "Hasło klucza odzyskiwania",
- "Repeat Recovery key password" : "Powtórz hasło klucza odzyskiwania",
- "Enabled" : "Włączone",
- "Disabled" : "Wyłączone",
- "Change recovery key password:" : "Zmień hasło klucza odzyskiwania",
- "Old Recovery key password" : "Stare hasło klucza odzyskiwania",
- "New Recovery key password" : "Nowe hasło klucza odzyskiwania",
- "Repeat New Recovery key password" : "Powtórz nowe hasło klucza odzyskiwania",
- "Change Password" : "Zmień hasło",
- "Your private key password no longer matches your log-in password." : "Hasło Twojego klucza prywatnego nie pasuje już do Twojego hasła logowania.",
- "Set your old private key password to your current log-in password:" : "Ustaw stare hasło klucza prywatnego na aktualne hasło logowania:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jeśli nie pamiętasz swojego starego hasła, poproś swojego administratora, aby odzyskać pliki.",
- "Old log-in password" : "Stare hasło logowania",
- "Current log-in password" : "Bieżące hasło logowania",
- "Update Private Key Password" : "Aktualizacja hasła klucza prywatnego",
- "Enable password recovery:" : "Włącz hasło odzyskiwania:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Włączenie tej opcji umożliwia otrzymać dostęp do zaszyfrowanych plików w przypadku utraty hasła"
-},
-"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/pl.json b/apps/files_encryption/l10n/pl.json
deleted file mode 100644
index d9d22b2c327..00000000000
--- a/apps/files_encryption/l10n/pl.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Nieznany błąd",
- "Missing recovery key password" : "Brakujące hasło klucza odzyskiwania",
- "Please repeat the recovery key password" : "Proszę powtórz nowe hasło klucza odzyskiwania",
- "Repeated recovery key password does not match the provided recovery key password" : "Hasła klucza odzyskiwania nie zgadzają się",
- "Recovery key successfully enabled" : "Klucz odzyskiwania włączony",
- "Could not disable recovery key. Please check your recovery key password!" : "Nie można wyłączyć klucza odzyskiwania. Proszę sprawdzić swoje hasło odzyskiwania!",
- "Recovery key successfully disabled" : "Klucz odzyskiwania wyłączony",
- "Please provide the old recovery password" : "Podaj stare hasło odzyskiwania",
- "Please provide a new recovery password" : "Podaj nowe hasło odzyskiwania",
- "Please repeat the new recovery password" : "Proszę powtórz nowe hasło odzyskiwania",
- "Password successfully changed." : "Zmiana hasła udana.",
- "Could not change the password. Maybe the old password was not correct." : "Nie można zmienić hasła. Może stare hasło nie było poprawne.",
- "Could not update the private key password." : "Nie można zmienić hasła klucza prywatnego.",
- "The old password was not correct, please try again." : "Stare hasło nie było poprawne. Spróbuj jeszcze raz.",
- "The current log-in password was not correct, please try again." : "Obecne hasło logowania nie było poprawne. Spróbuj ponownie.",
- "Private key password successfully updated." : "Pomyślnie zaktualizowano hasło klucza prywatnego.",
- "File recovery settings updated" : "Ustawienia odzyskiwania plików zmienione",
- "Could not update file recovery" : "Nie można zmienić pliku odzyskiwania",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Szyfrowanie aplikacja nie została zainicjowane! Może szyfrowanie aplikacji zostało ponownie włączone podczas tej sesji. Spróbuj się wylogować i zalogować ponownie aby zainicjować szyfrowanie aplikacji.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Klucz prywatny nie jest poprawny! Prawdopodobnie Twoje hasło zostało zmienione poza %s (np. w katalogu firmy). Aby odzyskać dostęp do zaszyfrowanych plików można zaktualizować hasło klucza prywatnego w ustawieniach osobistych.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.",
- "Unknown error. Please check your system settings or contact your administrator" : "Nieznany błąd. Proszę sprawdzić ustawienia systemowe lub skontaktować się z administratorem",
- "Initial encryption started... This can take some time. Please wait." : "Rozpoczęto szyfrowanie... To może chwilę potrwać. Proszę czekać.",
- "Initial encryption running... Please try again later." : "Trwa szyfrowanie początkowe...Spróbuj ponownie.",
- "Missing requirements." : "Brak wymagań.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Upewnij się, że OpenSSL jest włączony razem z rozszerzeniem PHP i poprawnie skonfigurowany, Obecnie aplikacja szyfrowania została wyłączona.",
- "Following users are not set up for encryption:" : "Następujący użytkownicy nie mają skonfigurowanego szyfrowania:",
- "Go directly to your %spersonal settings%s." : "Przejdź bezpośrednio do %spersonal settings%s.",
- "Server-side Encryption" : "Szyfrowanie po stronie serwera",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacja szyfrująca jest aktywna, ale twoje klucze nie zostały zainicjowane, prosze wyloguj się i zaloguj ponownie.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Włączhasło klucza odzyskiwania (pozwala odzyskać pliki użytkowników w przypadku utraty hasła):",
- "Recovery key password" : "Hasło klucza odzyskiwania",
- "Repeat Recovery key password" : "Powtórz hasło klucza odzyskiwania",
- "Enabled" : "Włączone",
- "Disabled" : "Wyłączone",
- "Change recovery key password:" : "Zmień hasło klucza odzyskiwania",
- "Old Recovery key password" : "Stare hasło klucza odzyskiwania",
- "New Recovery key password" : "Nowe hasło klucza odzyskiwania",
- "Repeat New Recovery key password" : "Powtórz nowe hasło klucza odzyskiwania",
- "Change Password" : "Zmień hasło",
- "Your private key password no longer matches your log-in password." : "Hasło Twojego klucza prywatnego nie pasuje już do Twojego hasła logowania.",
- "Set your old private key password to your current log-in password:" : "Ustaw stare hasło klucza prywatnego na aktualne hasło logowania:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Jeśli nie pamiętasz swojego starego hasła, poproś swojego administratora, aby odzyskać pliki.",
- "Old log-in password" : "Stare hasło logowania",
- "Current log-in password" : "Bieżące hasło logowania",
- "Update Private Key Password" : "Aktualizacja hasła klucza prywatnego",
- "Enable password recovery:" : "Włącz hasło odzyskiwania:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Włączenie tej opcji umożliwia otrzymać dostęp do zaszyfrowanych plików w przypadku utraty hasła"
-},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/pt_BR.js b/apps/files_encryption/l10n/pt_BR.js
deleted file mode 100644
index 4dd588929e3..00000000000
--- a/apps/files_encryption/l10n/pt_BR.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Erro desconhecido",
- "Missing recovery key password" : "Senha da chave de recuperação em falta",
- "Please repeat the recovery key password" : "Por favor, repita a senha da chave de recuperação",
- "Repeated recovery key password does not match the provided recovery key password" : "A senha repetidas da chave de valorização não corresponde a senha da chave de recuperação prevista",
- "Recovery key successfully enabled" : "Recuperação de chave habilitada com sucesso",
- "Could not disable recovery key. Please check your recovery key password!" : "Impossível desabilitar recuperação de chave. Por favor verifique sua senha para recuperação de chave!",
- "Recovery key successfully disabled" : "Recuperação de chave desabilitada com sucesso",
- "Please provide the old recovery password" : "Por favor, forneça a antiga senha de recuperação",
- "Please provide a new recovery password" : "Por favor, forneça a nova senha de recuperação",
- "Please repeat the new recovery password" : "Por favor, repita a nova senha de recuperação",
- "Password successfully changed." : "Senha alterada com sucesso.",
- "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estava correta.",
- "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.",
- "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente novamente.",
- "The current log-in password was not correct, please try again." : "A senha atual do log-in não estava correta, por favor, tente novamente.",
- "Private key password successfully updated." : "Senha de chave privada atualizada com sucesso.",
- "File recovery settings updated" : "Configurações de recuperação de arquivo atualizado",
- "Could not update file recovery" : "Não foi possível atualizar a recuperação de arquivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplicativo de criptografia não foi inicializado! Talvez o aplicativo de criptografia tenha sido reativado durante essa sessão. Por favor, tente fazer logoff e login novamente para inicializar o aplicativo de criptografia.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Sua chave privada não é válida! Provavelmente sua senha foi alterada fora de %s (por exemplo, seu diretório corporativo). Você pode atualizar sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Poe favoe peça ao dono do arquivo para compartilha-lo com você.",
- "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contato com o administrador",
- "Initial encryption started... This can take some time. Please wait." : "Criptografia inicial inicializada... Isto pode tomar algum tempo. Por favor espere.",
- "Initial encryption running... Please try again later." : "Criptografia inicial em execução ... Por favor, tente novamente mais tarde.",
- "Missing requirements." : "Requisitos não encontrados.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se de que o OpenSSL em conjunto com a extensão PHP está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.",
- "Following users are not set up for encryption:" : "Seguintes usuários não estão configurados para criptografia:",
- "Go directly to your %spersonal settings%s." : "Ir direto para suas %spersonal settings%s.",
- "Server-side Encryption" : "Criptografia do lado do servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App de criptografia está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar chave de recuperação (permite recuperar arquivos de usuários em caso de perda de senha):",
- "Recovery key password" : "Senha da chave de recuperação",
- "Repeat Recovery key password" : "Repita Recuperação de senha da chave",
- "Enabled" : "Habilitado",
- "Disabled" : "Desabilitado",
- "Change recovery key password:" : "Mudar a senha da chave de recuperação:",
- "Old Recovery key password" : "Senha antiga da chave de recuperação",
- "New Recovery key password" : "Nova senha da chave de recuperação",
- "Repeat New Recovery key password" : "Repita Nova senha da chave de recuperação",
- "Change Password" : "Trocar Senha",
- "Your private key password no longer matches your log-in password." : "A sua senha de chave privada não corresponde a sua senha de login.",
- "Set your old private key password to your current log-in password:" : "Defina a sua antiga senha da chave privada para sua senha de login atual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se você não se lembra de sua antiga senha você pode pedir ao administrador que recupere seus arquivos.",
- "Old log-in password" : "Senha antiga de login",
- "Current log-in password" : "Senha de login atual",
- "Update Private Key Password" : "Atualizar Senha de Chave Privada",
- "Enable password recovery:" : "Habilitar recuperação de senha:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar essa opção vai permitir que você obtenha novamente acesso aos seus arquivos encriptados em caso de perda de senha"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_encryption/l10n/pt_BR.json b/apps/files_encryption/l10n/pt_BR.json
deleted file mode 100644
index 59484331a50..00000000000
--- a/apps/files_encryption/l10n/pt_BR.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Erro desconhecido",
- "Missing recovery key password" : "Senha da chave de recuperação em falta",
- "Please repeat the recovery key password" : "Por favor, repita a senha da chave de recuperação",
- "Repeated recovery key password does not match the provided recovery key password" : "A senha repetidas da chave de valorização não corresponde a senha da chave de recuperação prevista",
- "Recovery key successfully enabled" : "Recuperação de chave habilitada com sucesso",
- "Could not disable recovery key. Please check your recovery key password!" : "Impossível desabilitar recuperação de chave. Por favor verifique sua senha para recuperação de chave!",
- "Recovery key successfully disabled" : "Recuperação de chave desabilitada com sucesso",
- "Please provide the old recovery password" : "Por favor, forneça a antiga senha de recuperação",
- "Please provide a new recovery password" : "Por favor, forneça a nova senha de recuperação",
- "Please repeat the new recovery password" : "Por favor, repita a nova senha de recuperação",
- "Password successfully changed." : "Senha alterada com sucesso.",
- "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estava correta.",
- "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.",
- "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente novamente.",
- "The current log-in password was not correct, please try again." : "A senha atual do log-in não estava correta, por favor, tente novamente.",
- "Private key password successfully updated." : "Senha de chave privada atualizada com sucesso.",
- "File recovery settings updated" : "Configurações de recuperação de arquivo atualizado",
- "Could not update file recovery" : "Não foi possível atualizar a recuperação de arquivos",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplicativo de criptografia não foi inicializado! Talvez o aplicativo de criptografia tenha sido reativado durante essa sessão. Por favor, tente fazer logoff e login novamente para inicializar o aplicativo de criptografia.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Sua chave privada não é válida! Provavelmente sua senha foi alterada fora de %s (por exemplo, seu diretório corporativo). Você pode atualizar sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Poe favoe peça ao dono do arquivo para compartilha-lo com você.",
- "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contato com o administrador",
- "Initial encryption started... This can take some time. Please wait." : "Criptografia inicial inicializada... Isto pode tomar algum tempo. Por favor espere.",
- "Initial encryption running... Please try again later." : "Criptografia inicial em execução ... Por favor, tente novamente mais tarde.",
- "Missing requirements." : "Requisitos não encontrados.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se de que o OpenSSL em conjunto com a extensão PHP está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.",
- "Following users are not set up for encryption:" : "Seguintes usuários não estão configurados para criptografia:",
- "Go directly to your %spersonal settings%s." : "Ir direto para suas %spersonal settings%s.",
- "Server-side Encryption" : "Criptografia do lado do servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App de criptografia está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar chave de recuperação (permite recuperar arquivos de usuários em caso de perda de senha):",
- "Recovery key password" : "Senha da chave de recuperação",
- "Repeat Recovery key password" : "Repita Recuperação de senha da chave",
- "Enabled" : "Habilitado",
- "Disabled" : "Desabilitado",
- "Change recovery key password:" : "Mudar a senha da chave de recuperação:",
- "Old Recovery key password" : "Senha antiga da chave de recuperação",
- "New Recovery key password" : "Nova senha da chave de recuperação",
- "Repeat New Recovery key password" : "Repita Nova senha da chave de recuperação",
- "Change Password" : "Trocar Senha",
- "Your private key password no longer matches your log-in password." : "A sua senha de chave privada não corresponde a sua senha de login.",
- "Set your old private key password to your current log-in password:" : "Defina a sua antiga senha da chave privada para sua senha de login atual:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se você não se lembra de sua antiga senha você pode pedir ao administrador que recupere seus arquivos.",
- "Old log-in password" : "Senha antiga de login",
- "Current log-in password" : "Senha de login atual",
- "Update Private Key Password" : "Atualizar Senha de Chave Privada",
- "Enable password recovery:" : "Habilitar recuperação de senha:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar essa opção vai permitir que você obtenha novamente acesso aos seus arquivos encriptados em caso de perda de senha"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/pt_PT.js b/apps/files_encryption/l10n/pt_PT.js
deleted file mode 100644
index 7d392923094..00000000000
--- a/apps/files_encryption/l10n/pt_PT.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Erro desconhecido",
- "Missing recovery key password" : "Senha da chave de recuperação em falta",
- "Please repeat the recovery key password" : "Por favor, insira a contrassenha da chave de recuperação",
- "Repeated recovery key password does not match the provided recovery key password" : "A palavra-passe de recuperação repetida não corresponde à palavra-passe fornecida",
- "Recovery key successfully enabled" : "A chave de recuperação foi ativada com sucesso",
- "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a senha da chave de recuperação.",
- "Recovery key successfully disabled" : "A chave de recuperação foi desativada com sucesso",
- "Please provide the old recovery password" : "Escreva a palavra-passe de recuperação antiga",
- "Please provide a new recovery password" : "Escreva a nova palavra-passe de recuperação",
- "Please repeat the new recovery password" : "Escreva de novo a nova palavra-passe de recuperação",
- "Password successfully changed." : "Palavra-passe alterada com sucesso.",
- "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Possivelmente a senha antiga não está correta.",
- "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.",
- "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente de novo.",
- "The current log-in password was not correct, please try again." : "A senha de iniciar a sessão atual não estava correta, por favor, tente de novo.",
- "Private key password successfully updated." : "A senha da chave privada foi atualizada com sucesso. ",
- "File recovery settings updated" : "As definições da recuperação de ficheiro foram atualizadas",
- "Could not update file recovery" : "Não foi possível atualizar a recuperação de ficheiro",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A app de encriptação não foi inicializada! A app de encriptação poderá ter sido reativada durante a sua sessão. Por favor, tente terminar a sessão e iniciá-la de seguida para inicializar a app de encriptação.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "A sua chave privada não é válida! Provavelmente a senha foi alterada fora do %s (ex. a sua diretoria corporativa). Pode atualizar a sua senha da chave privada nas definições pessoais para recuperar o acesso aos seus ficheiros encriptados. ",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.",
- "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contacto com o seu administrador ",
- "Initial encryption started... This can take some time. Please wait." : "A encriptação inicial foi iniciada ... Esta pode demorar algum tempo. Aguarde, por favor.",
- "Initial encryption running... Please try again later." : "A encriptação inicial está em execução ... Por favor, tente de novo mais tarde.",
- "Missing requirements." : "Requisitos em falta.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se de que o OpenSSL, em conjunto com a extensão PHP, está ativado e configurado corretamente. Por agora, a aplicação de encriptação está desactivada.",
- "Following users are not set up for encryption:" : "Os utilizadores seguintes não estão configurados para encriptação:",
- "Go directly to your %spersonal settings%s." : "Ir diretamente para as %sdefinições pessoais%s.",
- "Server-side Encryption" : "Encriptação do lado do Servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Ativar a chave de recuperação (permite recuperar os ficheiros do utilizador, se perder a senha):",
- "Recovery key password" : "Senha da chave de recuperação",
- "Repeat Recovery key password" : "Contrassenha da chave de recuperação",
- "Enabled" : "Ativada",
- "Disabled" : "Desactivada",
- "Change recovery key password:" : "Alterar a senha da chave de recuperação:",
- "Old Recovery key password" : "Senha da chave de recuperação antiga",
- "New Recovery key password" : "Nova senha da chave de recuperação",
- "Repeat New Recovery key password" : "Contrassenha da nova chave de recuperação",
- "Change Password" : "Alterar a Senha",
- "Your private key password no longer matches your log-in password." : "A Password da sua chave privada não coincide mais com a password do seu login.",
- "Set your old private key password to your current log-in password:" : "Altere a password antiga da chave privada para a nova password do login:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da senha antiga pode pedir ao administrador para recuperar os seus ficheiros. ",
- "Old log-in password" : "Senha de iniciar sessão antiga",
- "Current log-in password" : "Senha de iniciar sessão atual",
- "Update Private Key Password" : "Atualizar Senha da Chave Privada ",
- "Enable password recovery:" : "Ativar a recuperação da senha:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao ativar esta opção, irá poder obter o acesso aos seus ficheiros encriptados, se perder a senha"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/pt_PT.json b/apps/files_encryption/l10n/pt_PT.json
deleted file mode 100644
index 5f7d0a22f34..00000000000
--- a/apps/files_encryption/l10n/pt_PT.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Erro desconhecido",
- "Missing recovery key password" : "Senha da chave de recuperação em falta",
- "Please repeat the recovery key password" : "Por favor, insira a contrassenha da chave de recuperação",
- "Repeated recovery key password does not match the provided recovery key password" : "A palavra-passe de recuperação repetida não corresponde à palavra-passe fornecida",
- "Recovery key successfully enabled" : "A chave de recuperação foi ativada com sucesso",
- "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a senha da chave de recuperação.",
- "Recovery key successfully disabled" : "A chave de recuperação foi desativada com sucesso",
- "Please provide the old recovery password" : "Escreva a palavra-passe de recuperação antiga",
- "Please provide a new recovery password" : "Escreva a nova palavra-passe de recuperação",
- "Please repeat the new recovery password" : "Escreva de novo a nova palavra-passe de recuperação",
- "Password successfully changed." : "Palavra-passe alterada com sucesso.",
- "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Possivelmente a senha antiga não está correta.",
- "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.",
- "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente de novo.",
- "The current log-in password was not correct, please try again." : "A senha de iniciar a sessão atual não estava correta, por favor, tente de novo.",
- "Private key password successfully updated." : "A senha da chave privada foi atualizada com sucesso. ",
- "File recovery settings updated" : "As definições da recuperação de ficheiro foram atualizadas",
- "Could not update file recovery" : "Não foi possível atualizar a recuperação de ficheiro",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A app de encriptação não foi inicializada! A app de encriptação poderá ter sido reativada durante a sua sessão. Por favor, tente terminar a sessão e iniciá-la de seguida para inicializar a app de encriptação.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "A sua chave privada não é válida! Provavelmente a senha foi alterada fora do %s (ex. a sua diretoria corporativa). Pode atualizar a sua senha da chave privada nas definições pessoais para recuperar o acesso aos seus ficheiros encriptados. ",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.",
- "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contacto com o seu administrador ",
- "Initial encryption started... This can take some time. Please wait." : "A encriptação inicial foi iniciada ... Esta pode demorar algum tempo. Aguarde, por favor.",
- "Initial encryption running... Please try again later." : "A encriptação inicial está em execução ... Por favor, tente de novo mais tarde.",
- "Missing requirements." : "Requisitos em falta.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se de que o OpenSSL, em conjunto com a extensão PHP, está ativado e configurado corretamente. Por agora, a aplicação de encriptação está desactivada.",
- "Following users are not set up for encryption:" : "Os utilizadores seguintes não estão configurados para encriptação:",
- "Go directly to your %spersonal settings%s." : "Ir diretamente para as %sdefinições pessoais%s.",
- "Server-side Encryption" : "Encriptação do lado do Servidor",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Ativar a chave de recuperação (permite recuperar os ficheiros do utilizador, se perder a senha):",
- "Recovery key password" : "Senha da chave de recuperação",
- "Repeat Recovery key password" : "Contrassenha da chave de recuperação",
- "Enabled" : "Ativada",
- "Disabled" : "Desactivada",
- "Change recovery key password:" : "Alterar a senha da chave de recuperação:",
- "Old Recovery key password" : "Senha da chave de recuperação antiga",
- "New Recovery key password" : "Nova senha da chave de recuperação",
- "Repeat New Recovery key password" : "Contrassenha da nova chave de recuperação",
- "Change Password" : "Alterar a Senha",
- "Your private key password no longer matches your log-in password." : "A Password da sua chave privada não coincide mais com a password do seu login.",
- "Set your old private key password to your current log-in password:" : "Altere a password antiga da chave privada para a nova password do login:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da senha antiga pode pedir ao administrador para recuperar os seus ficheiros. ",
- "Old log-in password" : "Senha de iniciar sessão antiga",
- "Current log-in password" : "Senha de iniciar sessão atual",
- "Update Private Key Password" : "Atualizar Senha da Chave Privada ",
- "Enable password recovery:" : "Ativar a recuperação da senha:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ao ativar esta opção, irá poder obter o acesso aos seus ficheiros encriptados, se perder a senha"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ro.js b/apps/files_encryption/l10n/ro.js
deleted file mode 100644
index 242d7c26ecc..00000000000
--- a/apps/files_encryption/l10n/ro.js
+++ /dev/null
@@ -1,18 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Eroare necunoscută",
- "Recovery key successfully enabled" : "Cheia de recupeare a fost activata cu succes",
- "Could not disable recovery key. Please check your recovery key password!" : "Nu am putut dezactiva cheia de recuperare. Verifica parola de recuperare!",
- "Recovery key successfully disabled" : "Cheia de recuperare dezactivata cu succes",
- "Password successfully changed." : "Parola a fost modificată cu succes.",
- "Could not change the password. Maybe the old password was not correct." : "Parola nu a putut fi schimbata. Poate ca parola veche este incorecta.",
- "Private key password successfully updated." : "Cheia privata a fost actualizata cu succes",
- "File recovery settings updated" : "Setarile pentru recuperarea fisierelor au fost actualizate",
- "Could not update file recovery" : "Nu am putut actualiza recuperarea de fisiere",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicatia de criptare este activata dar tastatura nu este initializata , va rugam deconectati-va si reconectati-va",
- "Enabled" : "Activat",
- "Disabled" : "Dezactivat",
- "Change Password" : "Schimbă parola"
-},
-"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/files_encryption/l10n/ro.json b/apps/files_encryption/l10n/ro.json
deleted file mode 100644
index 950bf395d73..00000000000
--- a/apps/files_encryption/l10n/ro.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{ "translations": {
- "Unknown error" : "Eroare necunoscută",
- "Recovery key successfully enabled" : "Cheia de recupeare a fost activata cu succes",
- "Could not disable recovery key. Please check your recovery key password!" : "Nu am putut dezactiva cheia de recuperare. Verifica parola de recuperare!",
- "Recovery key successfully disabled" : "Cheia de recuperare dezactivata cu succes",
- "Password successfully changed." : "Parola a fost modificată cu succes.",
- "Could not change the password. Maybe the old password was not correct." : "Parola nu a putut fi schimbata. Poate ca parola veche este incorecta.",
- "Private key password successfully updated." : "Cheia privata a fost actualizata cu succes",
- "File recovery settings updated" : "Setarile pentru recuperarea fisierelor au fost actualizate",
- "Could not update file recovery" : "Nu am putut actualiza recuperarea de fisiere",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicatia de criptare este activata dar tastatura nu este initializata , va rugam deconectati-va si reconectati-va",
- "Enabled" : "Activat",
- "Disabled" : "Dezactivat",
- "Change Password" : "Schimbă parola"
-},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ru.js b/apps/files_encryption/l10n/ru.js
deleted file mode 100644
index bda0d26d80b..00000000000
--- a/apps/files_encryption/l10n/ru.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Неизвестная ошибка",
- "Missing recovery key password" : "Отсутствует пароль восстановления ключа",
- "Please repeat the recovery key password" : "Повторите ввод пароля ключа восстановления",
- "Repeated recovery key password does not match the provided recovery key password" : "Пароль ключа восстановления и повтор пароля не совпадают",
- "Recovery key successfully enabled" : "Ключ восстановления успешно установлен",
- "Could not disable recovery key. Please check your recovery key password!" : "Невозможно выключить ключ восстановления. Проверьте правильность пароля от ключа!",
- "Recovery key successfully disabled" : "Ключ восстановления успешно отключен",
- "Please provide the old recovery password" : "Введите старый пароль восстановления",
- "Please provide a new recovery password" : "Введите новый пароль восстановления",
- "Please repeat the new recovery password" : "Повторите новый пароль восстановления",
- "Password successfully changed." : "Пароль успешно изменен.",
- "Could not change the password. Maybe the old password was not correct." : "Невозможно изменить пароль. Возможно, указанный старый пароль не верен.",
- "Could not update the private key password." : "Невозможно обновить пароль закрытого ключа.",
- "The old password was not correct, please try again." : "Указан неверный старый пароль, повторите попытку.",
- "The current log-in password was not correct, please try again." : "Текущий пароль для учётной записи введён неверно, пожалуйста повторите попытку.",
- "Private key password successfully updated." : "Пароль закрытого ключа успешно обновлён.",
- "File recovery settings updated" : "Настройки восстановления файлов обновлены",
- "Could not update file recovery" : "Невозможно обновить настройки восстановления файлов",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Приложение шифрования не инициализировано! Возможно приложение шифрования было выключено и включено снова во время вашей сессии. Попробуйте выйти и войти снова чтобы инициализировать приложение шифрования.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ недействителен! Вероятно, пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить закрытый ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удалось расшифровать файл, возможно это опубликованный файл. Попросите владельца файла повторно открыть к нему доступ.",
- "Unknown error. Please check your system settings or contact your administrator" : "Неизвестная ошибка. Проверьте системные настройки или свяжитесь с вашим администратором",
- "Initial encryption started... This can take some time. Please wait." : "Запущено первоначальное шифрование... Это может занять некоторое время. Пожалуйста, подождите.",
- "Initial encryption running... Please try again later." : "Работает первоначальное шифрование... Пожалуйста, повторите попытку позже.",
- "Missing requirements." : "Отсутствуют зависимости.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Убедитесь, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования выключено.",
- "Following users are not set up for encryption:" : "Для следующих пользователей шифрование не настроено:",
- "Go directly to your %spersonal settings%s." : "Перейти к вашим %sличным настройкам%s.",
- "Server-side Encryption" : "Шифрование на стороне сервера",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите заново",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Включить ключ восстановления (позволяет пользователям восстановить файлы при потере пароля):",
- "Recovery key password" : "Пароль ключа восстановления",
- "Repeat Recovery key password" : "Повторите пароль ключа восстановления",
- "Enabled" : "Включено",
- "Disabled" : "Отключено",
- "Change recovery key password:" : "Смена пароля ключа восстановления:",
- "Old Recovery key password" : "Старый пароль ключа восстановления",
- "New Recovery key password" : "Новый пароль ключа восстановления",
- "Repeat New Recovery key password" : "Повторите новый пароль ключа восстановления",
- "Change Password" : "Изменить пароль",
- "Your private key password no longer matches your log-in password." : "Пароль закрытого ключа больше не соответствует паролю вашей учетной записи.",
- "Set your old private key password to your current log-in password:" : "Замените старый пароль закрытого ключа на текущий пароль учётной записи.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Если вы не помните свой старый пароль, вы можете попросить своего администратора восстановить ваши файлы",
- "Old log-in password" : "Старый пароль учётной записи",
- "Current log-in password" : "Текущий пароль учётной записи",
- "Update Private Key Password" : "Обновить пароль закрытого ключа",
- "Enable password recovery:" : "Включить восстановление пароля:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включение этой опции позволит вам получить доступ к своим зашифрованным файлам в случае утери пароля"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/ru.json b/apps/files_encryption/l10n/ru.json
deleted file mode 100644
index 3fe5bea497a..00000000000
--- a/apps/files_encryption/l10n/ru.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Неизвестная ошибка",
- "Missing recovery key password" : "Отсутствует пароль восстановления ключа",
- "Please repeat the recovery key password" : "Повторите ввод пароля ключа восстановления",
- "Repeated recovery key password does not match the provided recovery key password" : "Пароль ключа восстановления и повтор пароля не совпадают",
- "Recovery key successfully enabled" : "Ключ восстановления успешно установлен",
- "Could not disable recovery key. Please check your recovery key password!" : "Невозможно выключить ключ восстановления. Проверьте правильность пароля от ключа!",
- "Recovery key successfully disabled" : "Ключ восстановления успешно отключен",
- "Please provide the old recovery password" : "Введите старый пароль восстановления",
- "Please provide a new recovery password" : "Введите новый пароль восстановления",
- "Please repeat the new recovery password" : "Повторите новый пароль восстановления",
- "Password successfully changed." : "Пароль успешно изменен.",
- "Could not change the password. Maybe the old password was not correct." : "Невозможно изменить пароль. Возможно, указанный старый пароль не верен.",
- "Could not update the private key password." : "Невозможно обновить пароль закрытого ключа.",
- "The old password was not correct, please try again." : "Указан неверный старый пароль, повторите попытку.",
- "The current log-in password was not correct, please try again." : "Текущий пароль для учётной записи введён неверно, пожалуйста повторите попытку.",
- "Private key password successfully updated." : "Пароль закрытого ключа успешно обновлён.",
- "File recovery settings updated" : "Настройки восстановления файлов обновлены",
- "Could not update file recovery" : "Невозможно обновить настройки восстановления файлов",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Приложение шифрования не инициализировано! Возможно приложение шифрования было выключено и включено снова во время вашей сессии. Попробуйте выйти и войти снова чтобы инициализировать приложение шифрования.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ недействителен! Вероятно, пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить закрытый ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удалось расшифровать файл, возможно это опубликованный файл. Попросите владельца файла повторно открыть к нему доступ.",
- "Unknown error. Please check your system settings or contact your administrator" : "Неизвестная ошибка. Проверьте системные настройки или свяжитесь с вашим администратором",
- "Initial encryption started... This can take some time. Please wait." : "Запущено первоначальное шифрование... Это может занять некоторое время. Пожалуйста, подождите.",
- "Initial encryption running... Please try again later." : "Работает первоначальное шифрование... Пожалуйста, повторите попытку позже.",
- "Missing requirements." : "Отсутствуют зависимости.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Убедитесь, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования выключено.",
- "Following users are not set up for encryption:" : "Для следующих пользователей шифрование не настроено:",
- "Go directly to your %spersonal settings%s." : "Перейти к вашим %sличным настройкам%s.",
- "Server-side Encryption" : "Шифрование на стороне сервера",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите заново",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Включить ключ восстановления (позволяет пользователям восстановить файлы при потере пароля):",
- "Recovery key password" : "Пароль ключа восстановления",
- "Repeat Recovery key password" : "Повторите пароль ключа восстановления",
- "Enabled" : "Включено",
- "Disabled" : "Отключено",
- "Change recovery key password:" : "Смена пароля ключа восстановления:",
- "Old Recovery key password" : "Старый пароль ключа восстановления",
- "New Recovery key password" : "Новый пароль ключа восстановления",
- "Repeat New Recovery key password" : "Повторите новый пароль ключа восстановления",
- "Change Password" : "Изменить пароль",
- "Your private key password no longer matches your log-in password." : "Пароль закрытого ключа больше не соответствует паролю вашей учетной записи.",
- "Set your old private key password to your current log-in password:" : "Замените старый пароль закрытого ключа на текущий пароль учётной записи.",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Если вы не помните свой старый пароль, вы можете попросить своего администратора восстановить ваши файлы",
- "Old log-in password" : "Старый пароль учётной записи",
- "Current log-in password" : "Текущий пароль учётной записи",
- "Update Private Key Password" : "Обновить пароль закрытого ключа",
- "Enable password recovery:" : "Включить восстановление пароля:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включение этой опции позволит вам получить доступ к своим зашифрованным файлам в случае утери пароля"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/si_LK.js b/apps/files_encryption/l10n/si_LK.js
deleted file mode 100644
index befc19388e0..00000000000
--- a/apps/files_encryption/l10n/si_LK.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Encryption" : "ගුප්ත කේතනය"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/si_LK.json b/apps/files_encryption/l10n/si_LK.json
deleted file mode 100644
index 3c619c7d8c4..00000000000
--- a/apps/files_encryption/l10n/si_LK.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Encryption" : "ගුප්ත කේතනය"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/sk_SK.js b/apps/files_encryption/l10n/sk_SK.js
deleted file mode 100644
index 799a2c1d21f..00000000000
--- a/apps/files_encryption/l10n/sk_SK.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Neznáma chyba",
- "Missing recovery key password" : "Chýba kľúč pre obnovu hesla",
- "Please repeat the recovery key password" : "Prosím zopakujte heslo kľúča pre obnovu",
- "Repeated recovery key password does not match the provided recovery key password" : "Zopakované heslo kľúča pre obnovenie nesúhlasí zo zadaným heslom",
- "Recovery key successfully enabled" : "Záchranný kľúč bol úspešne povolený",
- "Could not disable recovery key. Please check your recovery key password!" : "Nepodarilo sa zakázať záchranný kľúč. Skontrolujte prosím Vaše heslo záchranného kľúča!",
- "Recovery key successfully disabled" : "Záchranný kľúč bol úspešne zakázaný",
- "Please provide the old recovery password" : "Zadajte prosím staré heslo pre obnovenie",
- "Please provide a new recovery password" : "Zadajte prosím nové heslo pre obnovenie",
- "Please repeat the new recovery password" : "Zopakujte prosím nové heslo pre obnovenie",
- "Password successfully changed." : "Heslo úspešne zmenené.",
- "Could not change the password. Maybe the old password was not correct." : "Nemožno zmeniť heslo. Pravdepodobne nebolo staré heslo zadané správne.",
- "Could not update the private key password." : "Nemožno aktualizovať heslo súkromného kľúča.",
- "The old password was not correct, please try again." : "Staré heslo nebolo zadané správne, prosím skúste to ešte raz.",
- "The current log-in password was not correct, please try again." : "Toto heslo nebolo správne, prosím skúste to ešte raz.",
- "Private key password successfully updated." : "Heslo súkromného kľúča je úspešne aktualizované.",
- "File recovery settings updated" : "Nastavenie obnovy súborov aktualizované",
- "Could not update file recovery" : "Nemožno aktualizovať obnovenie súborov",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifrovacia aplikácia nie je inicializovaná. Je možné, že aplikácia bola znova aktivovaná počas vášho prihlasovania. Pokúste sa odhlásiť a znova prihlásiť pre inicializáciu šifrovania.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš súkromný kľúč nie je platný! Možno bolo vaše heslo zmenené mimo %s (napr. firemný priečinok). Môžete si aktualizovať heslo svojho ​​súkromného kľúča vo vašom osobnom nastavení, ak si chcete obnoviť prístup k šifrovaným súborom.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor sa nepodarilo dešifrovať, pravdepodobne je zdieľaný. Požiadajte majiteľa súboru, aby ho s vami znovu vyzdieľal.",
- "Unknown error. Please check your system settings or contact your administrator" : "Neznáma chyba. Skontrolujte si vaše systémové nastavenia alebo kontaktujte administrátora",
- "Initial encryption started... This can take some time. Please wait." : "Počiatočné šifrovanie započalo ... To môže nejakú dobu trvať. Čakajte prosím.",
- "Initial encryption running... Please try again later." : "Počiatočné šifrovanie beží... Skúste to neskôr znovu.",
- "Missing requirements." : "Chýbajúce požiadavky.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Uistite sa, že OpenSSL spoločne s rozšírením pre PHP je povolené a správne nakonfigurované. V tejto chvíli je šifrovanie dočasne vypnuté.",
- "Following users are not set up for encryption:" : "Nasledujúci používatelia nie sú nastavení pre šifrovanie:",
- "Go directly to your %spersonal settings%s." : "Prejsť priamo do svojho %sosobného nastavenia%s.",
- "Server-side Encryption" : "Šifrovanie na serveri",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Povoliť obnovovací kľúč (umožňuje obnoviť používateľské súbory v prípade straty hesla):",
- "Recovery key password" : "Heslo obnovovacieho kľúča",
- "Repeat Recovery key password" : "Zopakujte heslo kľúča pre obnovu",
- "Enabled" : "Povolené",
- "Disabled" : "Zakázané",
- "Change recovery key password:" : "Zmeniť heslo obnovovacieho kľúča:",
- "Old Recovery key password" : "Staré heslo obnovovacieho kľúča",
- "New Recovery key password" : "Nové heslo obnovovacieho kľúča",
- "Repeat New Recovery key password" : "Zopakujte nové heslo kľúča pre obnovu",
- "Change Password" : "Zmeniť heslo",
- "Your private key password no longer matches your log-in password." : "Heslo vášho súkromného kľúča sa nezhoduje v vašim prihlasovacím heslom.",
- "Set your old private key password to your current log-in password:" : "Zmeňte si vaše staré heslo súkromného kľúča na rovnaké, aké je vaše aktuálne prihlasovacie heslo:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ak si nepamätáte svoje staré heslo, môžete požiadať administrátora o obnovenie svojich súborov.",
- "Old log-in password" : "Staré prihlasovacie heslo",
- "Current log-in password" : "Súčasné prihlasovacie heslo",
- "Update Private Key Password" : "Aktualizovať heslo súkromného kľúča",
- "Enable password recovery:" : "Povoliť obnovu hesla:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Povolenie Vám umožní znovu získať prístup k Vašim zašifrovaným súborom, ak stratíte heslo"
-},
-"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_encryption/l10n/sk_SK.json b/apps/files_encryption/l10n/sk_SK.json
deleted file mode 100644
index 08e9d42638f..00000000000
--- a/apps/files_encryption/l10n/sk_SK.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Neznáma chyba",
- "Missing recovery key password" : "Chýba kľúč pre obnovu hesla",
- "Please repeat the recovery key password" : "Prosím zopakujte heslo kľúča pre obnovu",
- "Repeated recovery key password does not match the provided recovery key password" : "Zopakované heslo kľúča pre obnovenie nesúhlasí zo zadaným heslom",
- "Recovery key successfully enabled" : "Záchranný kľúč bol úspešne povolený",
- "Could not disable recovery key. Please check your recovery key password!" : "Nepodarilo sa zakázať záchranný kľúč. Skontrolujte prosím Vaše heslo záchranného kľúča!",
- "Recovery key successfully disabled" : "Záchranný kľúč bol úspešne zakázaný",
- "Please provide the old recovery password" : "Zadajte prosím staré heslo pre obnovenie",
- "Please provide a new recovery password" : "Zadajte prosím nové heslo pre obnovenie",
- "Please repeat the new recovery password" : "Zopakujte prosím nové heslo pre obnovenie",
- "Password successfully changed." : "Heslo úspešne zmenené.",
- "Could not change the password. Maybe the old password was not correct." : "Nemožno zmeniť heslo. Pravdepodobne nebolo staré heslo zadané správne.",
- "Could not update the private key password." : "Nemožno aktualizovať heslo súkromného kľúča.",
- "The old password was not correct, please try again." : "Staré heslo nebolo zadané správne, prosím skúste to ešte raz.",
- "The current log-in password was not correct, please try again." : "Toto heslo nebolo správne, prosím skúste to ešte raz.",
- "Private key password successfully updated." : "Heslo súkromného kľúča je úspešne aktualizované.",
- "File recovery settings updated" : "Nastavenie obnovy súborov aktualizované",
- "Could not update file recovery" : "Nemožno aktualizovať obnovenie súborov",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifrovacia aplikácia nie je inicializovaná. Je možné, že aplikácia bola znova aktivovaná počas vášho prihlasovania. Pokúste sa odhlásiť a znova prihlásiť pre inicializáciu šifrovania.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš súkromný kľúč nie je platný! Možno bolo vaše heslo zmenené mimo %s (napr. firemný priečinok). Môžete si aktualizovať heslo svojho ​​súkromného kľúča vo vašom osobnom nastavení, ak si chcete obnoviť prístup k šifrovaným súborom.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor sa nepodarilo dešifrovať, pravdepodobne je zdieľaný. Požiadajte majiteľa súboru, aby ho s vami znovu vyzdieľal.",
- "Unknown error. Please check your system settings or contact your administrator" : "Neznáma chyba. Skontrolujte si vaše systémové nastavenia alebo kontaktujte administrátora",
- "Initial encryption started... This can take some time. Please wait." : "Počiatočné šifrovanie započalo ... To môže nejakú dobu trvať. Čakajte prosím.",
- "Initial encryption running... Please try again later." : "Počiatočné šifrovanie beží... Skúste to neskôr znovu.",
- "Missing requirements." : "Chýbajúce požiadavky.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Uistite sa, že OpenSSL spoločne s rozšírením pre PHP je povolené a správne nakonfigurované. V tejto chvíli je šifrovanie dočasne vypnuté.",
- "Following users are not set up for encryption:" : "Nasledujúci používatelia nie sú nastavení pre šifrovanie:",
- "Go directly to your %spersonal settings%s." : "Prejsť priamo do svojho %sosobného nastavenia%s.",
- "Server-side Encryption" : "Šifrovanie na serveri",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Povoliť obnovovací kľúč (umožňuje obnoviť používateľské súbory v prípade straty hesla):",
- "Recovery key password" : "Heslo obnovovacieho kľúča",
- "Repeat Recovery key password" : "Zopakujte heslo kľúča pre obnovu",
- "Enabled" : "Povolené",
- "Disabled" : "Zakázané",
- "Change recovery key password:" : "Zmeniť heslo obnovovacieho kľúča:",
- "Old Recovery key password" : "Staré heslo obnovovacieho kľúča",
- "New Recovery key password" : "Nové heslo obnovovacieho kľúča",
- "Repeat New Recovery key password" : "Zopakujte nové heslo kľúča pre obnovu",
- "Change Password" : "Zmeniť heslo",
- "Your private key password no longer matches your log-in password." : "Heslo vášho súkromného kľúča sa nezhoduje v vašim prihlasovacím heslom.",
- "Set your old private key password to your current log-in password:" : "Zmeňte si vaše staré heslo súkromného kľúča na rovnaké, aké je vaše aktuálne prihlasovacie heslo:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ak si nepamätáte svoje staré heslo, môžete požiadať administrátora o obnovenie svojich súborov.",
- "Old log-in password" : "Staré prihlasovacie heslo",
- "Current log-in password" : "Súčasné prihlasovacie heslo",
- "Update Private Key Password" : "Aktualizovať heslo súkromného kľúča",
- "Enable password recovery:" : "Povoliť obnovu hesla:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Povolenie Vám umožní znovu získať prístup k Vašim zašifrovaným súborom, ak stratíte heslo"
-},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/sl.js b/apps/files_encryption/l10n/sl.js
deleted file mode 100644
index 529e5652187..00000000000
--- a/apps/files_encryption/l10n/sl.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Neznana napaka",
- "Missing recovery key password" : "Manjka ključ za obnovitev",
- "Please repeat the recovery key password" : "Ponovite vpis ključa za obnovitev",
- "Repeated recovery key password does not match the provided recovery key password" : "Ponovljen vpis ključa za obnovitev ni enak prvemu vpisu tega ključa",
- "Recovery key successfully enabled" : "Ključ za obnovitev gesla je uspešno nastavljen",
- "Could not disable recovery key. Please check your recovery key password!" : "Ključa za obnovitev gesla ni mogoče onemogočiti. Preverite ključ!",
- "Recovery key successfully disabled" : "Ključ za obnovitev gesla je uspešno onemogočen",
- "Please provide the old recovery password" : "Vpišite star ključ za obnovitev",
- "Please provide a new recovery password" : "Vpišite nov ključ za obnovitev",
- "Please repeat the new recovery password" : "Ponovno vpišite nov ključ za obnovitev",
- "Password successfully changed." : "Geslo je uspešno spremenjeno.",
- "Could not change the password. Maybe the old password was not correct." : "Gesla ni mogoče spremeniti. Morda vnos starega gesla ni pravilen.",
- "Could not update the private key password." : "Ni mogoče posodobiti gesla zasebnega ključa.",
- "The old password was not correct, please try again." : "Staro geslo ni vpisana pravilno. Poskusite znova.",
- "The current log-in password was not correct, please try again." : "Trenutno geslo za prijavo ni vpisano pravilno. Poskusite znova.",
- "Private key password successfully updated." : "Zasebni ključ za geslo je uspešno posodobljen.",
- "File recovery settings updated" : "Nastavitve obnavljanja dokumentov so posodobljene",
- "Could not update file recovery" : "Nastavitev za obnavljanje dokumentov ni mogoče posodobiti",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Program za šifriranje ni začet. Morda je bil program ponovno omogočen šele med zagonom trenutne seje. Odjavite se in se nato prijavite nazaj. S tem morda razrešite napako.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Zasebni ključ ni veljaven. Najverjetneje je bilo geslo spremenjeno izven %s (najverjetneje je to poslovna mapa). Geslo lahko posodobite med osebnimi nastavitvami in s tem obnovite dostop do šifriranih datotek.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Te datoteke ni mogoče šifrirati, ker je to najverjetneje datoteka v souporabi. Prosite lastnika datoteke, da jo da ponovno v souporabo.",
- "Unknown error. Please check your system settings or contact your administrator" : "Neznana napaka. Preverite nastavitve sistema ali pa stopite v stik s skrbnikom sistema.",
- "Initial encryption started... This can take some time. Please wait." : "Začetno šifriranje je začeto ... Opravilo je lahko dolgotrajno.",
- "Initial encryption running... Please try again later." : "Začetno šifriranje je v teku ... Poskusite kasneje.",
- "Missing requirements." : "Manjkajoče zahteve",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Preverite, ali je OpenSSL z ustrezno razširitvijo PHP omogočen in ustrezno nastavljen. Trenutno je šifriranje onemogočeno.",
- "Following users are not set up for encryption:" : "Navedeni uporabniki še nimajo nastavljenega šifriranja:",
- "Go directly to your %spersonal settings%s." : "Oglejte si %sosebne nastavitve%s.",
- "Server-side Encryption" : "Strežniško šifriranje",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Program za šifriranje je omogočen, vendar ni začet. Odjavite se in nato ponovno prijavite.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Omogoči ključ za obnovitev datotek (v primeru izgube gesla):",
- "Recovery key password" : "Ključ za obnovitev gesla",
- "Repeat Recovery key password" : "Ponovi ključ za obnovitev gesla",
- "Enabled" : "Omogočeno",
- "Disabled" : "Onemogočeno",
- "Change recovery key password:" : "Spremeni ključ za obnovitev gesla:",
- "Old Recovery key password" : "Stari ključ za obnovitev gesla",
- "New Recovery key password" : "Novi ključ za obnovitev gesla",
- "Repeat New Recovery key password" : "Ponovi novi ključ za obnovitev gesla",
- "Change Password" : "Spremeni geslo",
- "Your private key password no longer matches your log-in password." : "Zasebno geslo ni več skladno s prijavnim geslom.",
- "Set your old private key password to your current log-in password:" : "Nastavite star zasebni ključ na trenutno prijavno geslo:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Če ste pozabili svoje geslo, lahko vaše datoteke obnovi le skrbnik sistema.",
- "Old log-in password" : "Staro geslo",
- "Current log-in password" : "Trenutno geslo",
- "Update Private Key Password" : "Posodobi zasebni ključ",
- "Enable password recovery:" : "Omogoči obnovitev gesla:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Nastavitev te možnosti omogoča ponovno pridobitev dostopa do šifriranih datotek, v primeru, da boste geslo pozabili."
-},
-"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/files_encryption/l10n/sl.json b/apps/files_encryption/l10n/sl.json
deleted file mode 100644
index 6c3ffd97b89..00000000000
--- a/apps/files_encryption/l10n/sl.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Neznana napaka",
- "Missing recovery key password" : "Manjka ključ za obnovitev",
- "Please repeat the recovery key password" : "Ponovite vpis ključa za obnovitev",
- "Repeated recovery key password does not match the provided recovery key password" : "Ponovljen vpis ključa za obnovitev ni enak prvemu vpisu tega ključa",
- "Recovery key successfully enabled" : "Ključ za obnovitev gesla je uspešno nastavljen",
- "Could not disable recovery key. Please check your recovery key password!" : "Ključa za obnovitev gesla ni mogoče onemogočiti. Preverite ključ!",
- "Recovery key successfully disabled" : "Ključ za obnovitev gesla je uspešno onemogočen",
- "Please provide the old recovery password" : "Vpišite star ključ za obnovitev",
- "Please provide a new recovery password" : "Vpišite nov ključ za obnovitev",
- "Please repeat the new recovery password" : "Ponovno vpišite nov ključ za obnovitev",
- "Password successfully changed." : "Geslo je uspešno spremenjeno.",
- "Could not change the password. Maybe the old password was not correct." : "Gesla ni mogoče spremeniti. Morda vnos starega gesla ni pravilen.",
- "Could not update the private key password." : "Ni mogoče posodobiti gesla zasebnega ključa.",
- "The old password was not correct, please try again." : "Staro geslo ni vpisana pravilno. Poskusite znova.",
- "The current log-in password was not correct, please try again." : "Trenutno geslo za prijavo ni vpisano pravilno. Poskusite znova.",
- "Private key password successfully updated." : "Zasebni ključ za geslo je uspešno posodobljen.",
- "File recovery settings updated" : "Nastavitve obnavljanja dokumentov so posodobljene",
- "Could not update file recovery" : "Nastavitev za obnavljanje dokumentov ni mogoče posodobiti",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Program za šifriranje ni začet. Morda je bil program ponovno omogočen šele med zagonom trenutne seje. Odjavite se in se nato prijavite nazaj. S tem morda razrešite napako.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Zasebni ključ ni veljaven. Najverjetneje je bilo geslo spremenjeno izven %s (najverjetneje je to poslovna mapa). Geslo lahko posodobite med osebnimi nastavitvami in s tem obnovite dostop do šifriranih datotek.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Te datoteke ni mogoče šifrirati, ker je to najverjetneje datoteka v souporabi. Prosite lastnika datoteke, da jo da ponovno v souporabo.",
- "Unknown error. Please check your system settings or contact your administrator" : "Neznana napaka. Preverite nastavitve sistema ali pa stopite v stik s skrbnikom sistema.",
- "Initial encryption started... This can take some time. Please wait." : "Začetno šifriranje je začeto ... Opravilo je lahko dolgotrajno.",
- "Initial encryption running... Please try again later." : "Začetno šifriranje je v teku ... Poskusite kasneje.",
- "Missing requirements." : "Manjkajoče zahteve",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Preverite, ali je OpenSSL z ustrezno razširitvijo PHP omogočen in ustrezno nastavljen. Trenutno je šifriranje onemogočeno.",
- "Following users are not set up for encryption:" : "Navedeni uporabniki še nimajo nastavljenega šifriranja:",
- "Go directly to your %spersonal settings%s." : "Oglejte si %sosebne nastavitve%s.",
- "Server-side Encryption" : "Strežniško šifriranje",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Program za šifriranje je omogočen, vendar ni začet. Odjavite se in nato ponovno prijavite.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Omogoči ključ za obnovitev datotek (v primeru izgube gesla):",
- "Recovery key password" : "Ključ za obnovitev gesla",
- "Repeat Recovery key password" : "Ponovi ključ za obnovitev gesla",
- "Enabled" : "Omogočeno",
- "Disabled" : "Onemogočeno",
- "Change recovery key password:" : "Spremeni ključ za obnovitev gesla:",
- "Old Recovery key password" : "Stari ključ za obnovitev gesla",
- "New Recovery key password" : "Novi ključ za obnovitev gesla",
- "Repeat New Recovery key password" : "Ponovi novi ključ za obnovitev gesla",
- "Change Password" : "Spremeni geslo",
- "Your private key password no longer matches your log-in password." : "Zasebno geslo ni več skladno s prijavnim geslom.",
- "Set your old private key password to your current log-in password:" : "Nastavite star zasebni ključ na trenutno prijavno geslo:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Če ste pozabili svoje geslo, lahko vaše datoteke obnovi le skrbnik sistema.",
- "Old log-in password" : "Staro geslo",
- "Current log-in password" : "Trenutno geslo",
- "Update Private Key Password" : "Posodobi zasebni ključ",
- "Enable password recovery:" : "Omogoči obnovitev gesla:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Nastavitev te možnosti omogoča ponovno pridobitev dostopa do šifriranih datotek, v primeru, da boste geslo pozabili."
-},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/sq.js b/apps/files_encryption/l10n/sq.js
deleted file mode 100644
index 61d02be4a15..00000000000
--- a/apps/files_encryption/l10n/sq.js
+++ /dev/null
@@ -1,7 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Gabim panjohur",
- "Enabled" : "Aktivizuar"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/sq.json b/apps/files_encryption/l10n/sq.json
deleted file mode 100644
index 2fd483d1689..00000000000
--- a/apps/files_encryption/l10n/sq.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{ "translations": {
- "Unknown error" : "Gabim panjohur",
- "Enabled" : "Aktivizuar"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/sr.js b/apps/files_encryption/l10n/sr.js
deleted file mode 100644
index dec2970e359..00000000000
--- a/apps/files_encryption/l10n/sr.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Непозната грешка",
- "Missing recovery key password" : "Недостаје лозинка кључа за опоравак",
- "Please repeat the recovery key password" : "Поновите лозинку кључа за опоравак",
- "Repeated recovery key password does not match the provided recovery key password" : "Поновљена лозинка кључа за опоравак се не поклапа",
- "Recovery key successfully enabled" : "Кључ за опоравак успешно укључен",
- "Could not disable recovery key. Please check your recovery key password!" : "Не могу да искључим кључ за опоравак. Проверите лозинку!",
- "Recovery key successfully disabled" : "Кључ за опоравак успешно искључен",
- "Please provide the old recovery password" : "Унесите стару лозинку опоравка",
- "Please provide a new recovery password" : "Унесите нову лозинку опоравка",
- "Please repeat the new recovery password" : "Поновите нову лозинку опоравка",
- "Password successfully changed." : "Лозинка успешно промењена.",
- "Could not change the password. Maybe the old password was not correct." : "Не могу да променим лозинку. Можда стара лозинка није исправна.",
- "Could not update the private key password." : "Не могу да ажурирам лозинку личног кључа.",
- "The old password was not correct, please try again." : "Стара лозинка није исправна. Покушајте поново.",
- "The current log-in password was not correct, please try again." : "Лозинка за пријаву није исправна. Покушајте поново.",
- "Private key password successfully updated." : "Лозинка личног кључа је успешно ажурирана.",
- "File recovery settings updated" : "Поставке опоравка фајла су ажуриране",
- "Could not update file recovery" : "Не могу да ажурирам опоравак фајла",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Апликација шифровања није иницијализована! Можда је поновно покренута током сесије. Покушајте да се одјавите па пријавите да се иницијализује поново.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ваш лични кључ није исправан! Вероватно сте лозинку променили изван %s (нпр. ваш корпоративни директоријум). Лозинку личног кључа можете ажурирати у личним поставкама да бисте опоравили приступ вашим шифрованим фајловима.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника фајла да га поново подели са вама.",
- "Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Проверите поставке вашег система или контактирајте администратора.",
- "Initial encryption started... This can take some time. Please wait." : "Почетно шифровање је покренуто... Ово може потрајати. Молим, сачекајте.",
- "Initial encryption running... Please try again later." : "Почетно шифровање ради... Покушајте касније.",
- "Missing requirements." : "Захтеви нису испуњени.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Проверите да је ОпенССЛ заједно са ПХП проширењем, укључен и прописно подешен. За сада, шифровање је искључено.",
- "Following users are not set up for encryption:" : "Следећи корисници нису подешени за шифровање:",
- "Go directly to your %spersonal settings%s." : "Идите право на ваше %sличне поставке%s.",
- "Server-side Encryption" : "Шифровање на страни сервера",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација шифровања је укључена али ваши кључеви нису иницијализовани. Одјавите се и поново се пријавите.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Омогући кључ за опоравак (омогућава опоравак корисничких фајлова у случају губитка лозинке):",
- "Recovery key password" : "Лозинка кључа за опоравак",
- "Repeat Recovery key password" : "Поновите лозинку кључа за опоравак",
- "Enabled" : "укључено",
- "Disabled" : "искључено",
- "Change recovery key password:" : "Измена лозинке кључа опоравка:",
- "Old Recovery key password" : "Стара лозинка кључа опоравка",
- "New Recovery key password" : "Нова лозинка кључа опоравка",
- "Repeat New Recovery key password" : "Поновите лозинку кључа опоравка",
- "Change Password" : "Измени лозинку",
- "Your private key password no longer matches your log-in password." : "Лозинка вашег личног кључа више није иста као ваша лозинка за пријаву.",
- "Set your old private key password to your current log-in password:" : "Промените ваш стари приватни кључ-лозинку у вашу тренутну улазну лозинку:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ако се не сећате старе лозинке, можете затражити од администратора да опорави ваше фајлове.",
- "Old log-in password" : "Стара лозинка за пријаву",
- "Current log-in password" : "Тренутна лозинка за пријаву",
- "Update Private Key Password" : "Ажурирај лозинку личног кључа",
- "Enable password recovery:" : "Укључи опоравак лозинке:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Укључивање ове опције омогућиће поновно добијање приступа вашим шифрованим фајловима у случају губитка лозинке"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/sr.json b/apps/files_encryption/l10n/sr.json
deleted file mode 100644
index 6c39d417e38..00000000000
--- a/apps/files_encryption/l10n/sr.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Непозната грешка",
- "Missing recovery key password" : "Недостаје лозинка кључа за опоравак",
- "Please repeat the recovery key password" : "Поновите лозинку кључа за опоравак",
- "Repeated recovery key password does not match the provided recovery key password" : "Поновљена лозинка кључа за опоравак се не поклапа",
- "Recovery key successfully enabled" : "Кључ за опоравак успешно укључен",
- "Could not disable recovery key. Please check your recovery key password!" : "Не могу да искључим кључ за опоравак. Проверите лозинку!",
- "Recovery key successfully disabled" : "Кључ за опоравак успешно искључен",
- "Please provide the old recovery password" : "Унесите стару лозинку опоравка",
- "Please provide a new recovery password" : "Унесите нову лозинку опоравка",
- "Please repeat the new recovery password" : "Поновите нову лозинку опоравка",
- "Password successfully changed." : "Лозинка успешно промењена.",
- "Could not change the password. Maybe the old password was not correct." : "Не могу да променим лозинку. Можда стара лозинка није исправна.",
- "Could not update the private key password." : "Не могу да ажурирам лозинку личног кључа.",
- "The old password was not correct, please try again." : "Стара лозинка није исправна. Покушајте поново.",
- "The current log-in password was not correct, please try again." : "Лозинка за пријаву није исправна. Покушајте поново.",
- "Private key password successfully updated." : "Лозинка личног кључа је успешно ажурирана.",
- "File recovery settings updated" : "Поставке опоравка фајла су ажуриране",
- "Could not update file recovery" : "Не могу да ажурирам опоравак фајла",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Апликација шифровања није иницијализована! Можда је поновно покренута током сесије. Покушајте да се одјавите па пријавите да се иницијализује поново.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ваш лични кључ није исправан! Вероватно сте лозинку променили изван %s (нпр. ваш корпоративни директоријум). Лозинку личног кључа можете ажурирати у личним поставкама да бисте опоравили приступ вашим шифрованим фајловима.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника фајла да га поново подели са вама.",
- "Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Проверите поставке вашег система или контактирајте администратора.",
- "Initial encryption started... This can take some time. Please wait." : "Почетно шифровање је покренуто... Ово може потрајати. Молим, сачекајте.",
- "Initial encryption running... Please try again later." : "Почетно шифровање ради... Покушајте касније.",
- "Missing requirements." : "Захтеви нису испуњени.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Проверите да је ОпенССЛ заједно са ПХП проширењем, укључен и прописно подешен. За сада, шифровање је искључено.",
- "Following users are not set up for encryption:" : "Следећи корисници нису подешени за шифровање:",
- "Go directly to your %spersonal settings%s." : "Идите право на ваше %sличне поставке%s.",
- "Server-side Encryption" : "Шифровање на страни сервера",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација шифровања је укључена али ваши кључеви нису иницијализовани. Одјавите се и поново се пријавите.",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Омогући кључ за опоравак (омогућава опоравак корисничких фајлова у случају губитка лозинке):",
- "Recovery key password" : "Лозинка кључа за опоравак",
- "Repeat Recovery key password" : "Поновите лозинку кључа за опоравак",
- "Enabled" : "укључено",
- "Disabled" : "искључено",
- "Change recovery key password:" : "Измена лозинке кључа опоравка:",
- "Old Recovery key password" : "Стара лозинка кључа опоравка",
- "New Recovery key password" : "Нова лозинка кључа опоравка",
- "Repeat New Recovery key password" : "Поновите лозинку кључа опоравка",
- "Change Password" : "Измени лозинку",
- "Your private key password no longer matches your log-in password." : "Лозинка вашег личног кључа више није иста као ваша лозинка за пријаву.",
- "Set your old private key password to your current log-in password:" : "Промените ваш стари приватни кључ-лозинку у вашу тренутну улазну лозинку:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Ако се не сећате старе лозинке, можете затражити од администратора да опорави ваше фајлове.",
- "Old log-in password" : "Стара лозинка за пријаву",
- "Current log-in password" : "Тренутна лозинка за пријаву",
- "Update Private Key Password" : "Ажурирај лозинку личног кључа",
- "Enable password recovery:" : "Укључи опоравак лозинке:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Укључивање ове опције омогућиће поновно добијање приступа вашим шифрованим фајловима у случају губитка лозинке"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/sr@latin.js b/apps/files_encryption/l10n/sr@latin.js
deleted file mode 100644
index e89299ed05b..00000000000
--- a/apps/files_encryption/l10n/sr@latin.js
+++ /dev/null
@@ -1,8 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Nepoznata greška",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija za šifrovanje je omogućena ali Vaši ključevi nisu inicijalizovani, molimo Vas da se izlogujete i ulogujete ponovo.",
- "Disabled" : "Onemogućeno"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/sr@latin.json b/apps/files_encryption/l10n/sr@latin.json
deleted file mode 100644
index 34f0264e031..00000000000
--- a/apps/files_encryption/l10n/sr@latin.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "translations": {
- "Unknown error" : "Nepoznata greška",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija za šifrovanje je omogućena ali Vaši ključevi nisu inicijalizovani, molimo Vas da se izlogujete i ulogujete ponovo.",
- "Disabled" : "Onemogućeno"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/sv.js b/apps/files_encryption/l10n/sv.js
deleted file mode 100644
index 023fa92d36c..00000000000
--- a/apps/files_encryption/l10n/sv.js
+++ /dev/null
@@ -1,52 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Okänt fel",
- "Missing recovery key password" : "Saknar lösenord för återställningsnyckel",
- "Please repeat the recovery key password" : "Vänligen upprepa lösenordet för återställningsnyckel",
- "Repeated recovery key password does not match the provided recovery key password" : "Det upprepade lösenordet för återställningsnyckeln matchar inte tillhandahållna lösenordet för återställningsnyckeln",
- "Recovery key successfully enabled" : "Återställningsnyckeln har framgångsrikt aktiverats",
- "Could not disable recovery key. Please check your recovery key password!" : "Kunde inte inaktivera återställningsnyckeln. Vänligen kontrollera ditt lösenord för återställningsnyckeln!",
- "Recovery key successfully disabled" : "Återställningsnyckeln har framgångsrikt inaktiverats",
- "Please provide the old recovery password" : "Vänligen tillhandahåll det gamla återställningslösenordet ",
- "Please provide a new recovery password" : "Vänligen tillhandahåll ett nytt återställningslösenord",
- "Please repeat the new recovery password" : "Vänligen upprepa det nya återställningslösenordet",
- "Password successfully changed." : "Ändringen av lösenordet lyckades.",
- "Could not change the password. Maybe the old password was not correct." : "Kunde inte ändra lösenordet. Kanske det gamla lösenordet inte var rätt.",
- "Could not update the private key password." : "Kunde inte uppdatera lösenord för den privata nyckeln",
- "The old password was not correct, please try again." : "Det gamla lösenordet var inte korrekt. Vänligen försök igen.",
- "The current log-in password was not correct, please try again." : "Det nuvarande inloggningslösenordet var inte korrekt. Vänligen försök igen.",
- "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades utan problem.",
- "File recovery settings updated" : "Inställningarna för filåterställning har uppdaterats",
- "Could not update file recovery" : "Kunde inte uppdatera filåterställning",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet kunde inte initieras! Möjligen blev krypteringsprogrammet återaktiverad under din session. Försök med att logga ut och in igen för att initiera krypteringsprogrammet.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din privata lösenordsnyckel är inte giltig! Troligen har ditt lösenord ändrats utanför %s (t.ex. i företagets katalogtjänst). Du kan uppdatera den privata lösenordsnyckeln under dina personliga inställningar för att återfå tillgång till dina filer.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.",
- "Unknown error. Please check your system settings or contact your administrator" : "Okänt fel. Kontrollera dina systeminställningar eller kontakta din administratör",
- "Initial encryption started... This can take some time. Please wait." : "Initiala krypteringen har påbörjats... Detta kan ta lite tid. Var god vänta.",
- "Initial encryption running... Please try again later." : "Initiala krypteringen körs... Var god försök igen senare.",
- "Missing requirements." : "Krav som saknas",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Se till att OpenSSL tillsammans med PHP-tillägget är aktiverat och korrekt konfigurerat. För nu har krypteringsappen inaktiverats.",
- "Following users are not set up for encryption:" : "Följande användare har inte aktiverat kryptering:",
- "Go directly to your %spersonal settings%s." : "Gå direkt till dina %segna inställningar%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivera återställningsnyckel (för att kunna återfå användarens filer vid glömt eller förlorat lösenord):",
- "Recovery key password" : "Lösenord för återställningsnyckel",
- "Repeat Recovery key password" : "Upprepa återställningsnyckelns lösenord",
- "Enabled" : "Aktiverad",
- "Disabled" : "Inaktiverad",
- "Change recovery key password:" : "Ändra lösenord för återställningsnyckel:",
- "Old Recovery key password" : "Gammalt lösenord för återställningsnyckel",
- "New Recovery key password" : "Nytt lösenord för återställningsnyckel",
- "Repeat New Recovery key password" : "Upprepa lösenord för ny återställningsnyckel",
- "Change Password" : "Byt lösenord",
- "Your private key password no longer matches your log-in password." : "Ditt lösenord för din privata nyckel matchar inte längre ditt inloggningslösenord.",
- "Set your old private key password to your current log-in password:" : "Sätt ditt gamla privatnyckellösenord till ditt aktuella inloggningslösenord:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
- "Old log-in password" : "Gammalt inloggningslösenord",
- "Current log-in password" : "Nuvarande inloggningslösenord",
- "Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
- "Enable password recovery:" : "Aktivera lösenordsåterställning",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Genom att aktivera detta alternativ kommer du kunna återfå tillgång till dina krypterade filer om du skulle förlora/glömma ditt lösenord"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/sv.json b/apps/files_encryption/l10n/sv.json
deleted file mode 100644
index 1d69d8255d8..00000000000
--- a/apps/files_encryption/l10n/sv.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{ "translations": {
- "Unknown error" : "Okänt fel",
- "Missing recovery key password" : "Saknar lösenord för återställningsnyckel",
- "Please repeat the recovery key password" : "Vänligen upprepa lösenordet för återställningsnyckel",
- "Repeated recovery key password does not match the provided recovery key password" : "Det upprepade lösenordet för återställningsnyckeln matchar inte tillhandahållna lösenordet för återställningsnyckeln",
- "Recovery key successfully enabled" : "Återställningsnyckeln har framgångsrikt aktiverats",
- "Could not disable recovery key. Please check your recovery key password!" : "Kunde inte inaktivera återställningsnyckeln. Vänligen kontrollera ditt lösenord för återställningsnyckeln!",
- "Recovery key successfully disabled" : "Återställningsnyckeln har framgångsrikt inaktiverats",
- "Please provide the old recovery password" : "Vänligen tillhandahåll det gamla återställningslösenordet ",
- "Please provide a new recovery password" : "Vänligen tillhandahåll ett nytt återställningslösenord",
- "Please repeat the new recovery password" : "Vänligen upprepa det nya återställningslösenordet",
- "Password successfully changed." : "Ändringen av lösenordet lyckades.",
- "Could not change the password. Maybe the old password was not correct." : "Kunde inte ändra lösenordet. Kanske det gamla lösenordet inte var rätt.",
- "Could not update the private key password." : "Kunde inte uppdatera lösenord för den privata nyckeln",
- "The old password was not correct, please try again." : "Det gamla lösenordet var inte korrekt. Vänligen försök igen.",
- "The current log-in password was not correct, please try again." : "Det nuvarande inloggningslösenordet var inte korrekt. Vänligen försök igen.",
- "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades utan problem.",
- "File recovery settings updated" : "Inställningarna för filåterställning har uppdaterats",
- "Could not update file recovery" : "Kunde inte uppdatera filåterställning",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet kunde inte initieras! Möjligen blev krypteringsprogrammet återaktiverad under din session. Försök med att logga ut och in igen för att initiera krypteringsprogrammet.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din privata lösenordsnyckel är inte giltig! Troligen har ditt lösenord ändrats utanför %s (t.ex. i företagets katalogtjänst). Du kan uppdatera den privata lösenordsnyckeln under dina personliga inställningar för att återfå tillgång till dina filer.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.",
- "Unknown error. Please check your system settings or contact your administrator" : "Okänt fel. Kontrollera dina systeminställningar eller kontakta din administratör",
- "Initial encryption started... This can take some time. Please wait." : "Initiala krypteringen har påbörjats... Detta kan ta lite tid. Var god vänta.",
- "Initial encryption running... Please try again later." : "Initiala krypteringen körs... Var god försök igen senare.",
- "Missing requirements." : "Krav som saknas",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Se till att OpenSSL tillsammans med PHP-tillägget är aktiverat och korrekt konfigurerat. För nu har krypteringsappen inaktiverats.",
- "Following users are not set up for encryption:" : "Följande användare har inte aktiverat kryptering:",
- "Go directly to your %spersonal settings%s." : "Gå direkt till dina %segna inställningar%s.",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Aktivera återställningsnyckel (för att kunna återfå användarens filer vid glömt eller förlorat lösenord):",
- "Recovery key password" : "Lösenord för återställningsnyckel",
- "Repeat Recovery key password" : "Upprepa återställningsnyckelns lösenord",
- "Enabled" : "Aktiverad",
- "Disabled" : "Inaktiverad",
- "Change recovery key password:" : "Ändra lösenord för återställningsnyckel:",
- "Old Recovery key password" : "Gammalt lösenord för återställningsnyckel",
- "New Recovery key password" : "Nytt lösenord för återställningsnyckel",
- "Repeat New Recovery key password" : "Upprepa lösenord för ny återställningsnyckel",
- "Change Password" : "Byt lösenord",
- "Your private key password no longer matches your log-in password." : "Ditt lösenord för din privata nyckel matchar inte längre ditt inloggningslösenord.",
- "Set your old private key password to your current log-in password:" : "Sätt ditt gamla privatnyckellösenord till ditt aktuella inloggningslösenord:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
- "Old log-in password" : "Gammalt inloggningslösenord",
- "Current log-in password" : "Nuvarande inloggningslösenord",
- "Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
- "Enable password recovery:" : "Aktivera lösenordsåterställning",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Genom att aktivera detta alternativ kommer du kunna återfå tillgång till dina krypterade filer om du skulle förlora/glömma ditt lösenord"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ta_LK.js b/apps/files_encryption/l10n/ta_LK.js
deleted file mode 100644
index e37ff4a78c4..00000000000
--- a/apps/files_encryption/l10n/ta_LK.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Encryption" : "மறைக்குறியீடு"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/ta_LK.json b/apps/files_encryption/l10n/ta_LK.json
deleted file mode 100644
index a52ff1c3215..00000000000
--- a/apps/files_encryption/l10n/ta_LK.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Encryption" : "மறைக்குறியீடு"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/th_TH.js b/apps/files_encryption/l10n/th_TH.js
deleted file mode 100644
index ce8a64ef9c2..00000000000
--- a/apps/files_encryption/l10n/th_TH.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "ข้อผิดพลาดที่ไม่ทราบสาเหตุ"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/th_TH.json b/apps/files_encryption/l10n/th_TH.json
deleted file mode 100644
index 2f6f34edf72..00000000000
--- a/apps/files_encryption/l10n/th_TH.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "ข้อผิดพลาดที่ไม่ทราบสาเหตุ"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/tr.js b/apps/files_encryption/l10n/tr.js
deleted file mode 100644
index 0ff5a227b54..00000000000
--- a/apps/files_encryption/l10n/tr.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Bilinmeyen hata",
- "Missing recovery key password" : "Eksik kurtarma anahtarı parolası",
- "Please repeat the recovery key password" : "Lütfen kurtarma anahtarı parolasını yenileyin",
- "Repeated recovery key password does not match the provided recovery key password" : "Yenilenen kurtarma anahtarı parolası, belirtilen kurtarma anahtarı parolası ile eşleşmiyor",
- "Recovery key successfully enabled" : "Kurtarma anahtarı başarıyla etkinleştirildi",
- "Could not disable recovery key. Please check your recovery key password!" : "Kurtarma anahtarı devre dışı bırakılamadı. Lütfen kurtarma anahtarı parolanızı kontrol edin!",
- "Recovery key successfully disabled" : "Kurtarma anahtarı başarıyla devre dışı bırakıldı",
- "Please provide the old recovery password" : "Lütfen eski kurtarma parolasını girin",
- "Please provide a new recovery password" : "Lütfen yeni bir kurtarma parolası girin",
- "Please repeat the new recovery password" : "Lütfen yeni kurtarma parolasını yenileyin",
- "Password successfully changed." : "Parola başarıyla değiştirildi.",
- "Could not change the password. Maybe the old password was not correct." : "Parola değiştirilemedi. Eski parolanız doğru olmayabilir.",
- "Could not update the private key password." : "Özel anahtar parolası güncellenemedi",
- "The old password was not correct, please try again." : "Eski parola doğru değil, lütfen yeniden deneyin.",
- "The current log-in password was not correct, please try again." : "Geçerli oturum parolası doğru değil, lütfen yeniden deneyin.",
- "Private key password successfully updated." : "Özel anahtar parolası başarıyla güncellendi.",
- "File recovery settings updated" : "Dosya kurtarma ayarları güncellendi",
- "Could not update file recovery" : "Dosya kurtarma güncellenemedi",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Şifreleme uygulaması başlatılamadı! Oturumunuz sırasında şifreleme uygulaması tekrar etkinleştirilmiş olabilir. Lütfen şifreleme uygulamasını başlatmak için oturumu kapatıp yeniden oturum açmayı deneyin.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Özel anahtarınız geçerli değil! Muhtemelen parolanız %s dışarısında değiştirildi (örn. şirket dizininde). Gizli anahtar parolanızı kişisel ayarlarınızda güncelleyerek şifreli dosyalarınıza erişimi kurtarabilirsiniz.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan şifrelemesi kaldırılamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.",
- "Unknown error. Please check your system settings or contact your administrator" : "Bilinmeyen hata. Lütfen sistem ayarlarınızı denetleyin veya yöneticiniz ile iletişime geçin",
- "Initial encryption started... This can take some time. Please wait." : "İlk şifreleme başladı... Bu biraz zaman alabilir. Lütfen bekleyin.",
- "Initial encryption running... Please try again later." : "İlk şifreleme çalışıyor... Lütfen daha sonra tekrar deneyin.",
- "Missing requirements." : "Gereklilikler eksik.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "OpenSSL'nin PHP uzantısıyla birlikte etkin ve düzgün yapılandırılmış olduğundan emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı.",
- "Following users are not set up for encryption:" : "Aşağıdaki kullanıcılar şifreleme için ayarlanmamış:",
- "Go directly to your %spersonal settings%s." : "Doğrudan %skişisel ayarlarınıza%s gidin.",
- "Server-side Encryption" : "Sunucu Taraflı Şifreleme",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Şifreleme Uygulaması etkin ancak anahtarlarınız başlatılmamış. Lütfen oturumu kapatıp yeniden açın",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Kurtarma anahtarını etkinleştir (parola kaybı durumunda kullanıcı dosyalarının kurtarılmasına izin verir):",
- "Recovery key password" : "Kurtarma anahtarı parolası",
- "Repeat Recovery key password" : "Kurtarma anahtarı parolasını yineleyin",
- "Enabled" : "Etkin",
- "Disabled" : "Devre Dışı",
- "Change recovery key password:" : "Kurtarma anahtarı parolasını değiştir:",
- "Old Recovery key password" : "Eski Kurtarma anahtarı parolası",
- "New Recovery key password" : "Yeni Kurtarma anahtarı parolası",
- "Repeat New Recovery key password" : "Yeni Kurtarma anahtarı parolasını yineleyin",
- "Change Password" : "Parola Değiştir",
- "Your private key password no longer matches your log-in password." : "Özel anahtar parolanız artık oturum açma parolanız ile eşleşmiyor.",
- "Set your old private key password to your current log-in password:" : "Eski özel anahtar parolanızı, geçerli oturum açma parolanız olarak ayarlayın:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Eğer eski parolanızı hatırlamıyorsanız, yöneticinizden dosyalarınızı kurtarmasını talep edebilirsiniz.",
- "Old log-in password" : "Eski oturum açma parolası",
- "Current log-in password" : "Geçerli oturum açma parolası",
- "Update Private Key Password" : "Özel Anahtar Parolasını Güncelle",
- "Enable password recovery:" : "Parola kurtarmayı etkinleştir:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Bu seçeneği etkinleştirmek, parola kaybı durumunda şifrelenmiş dosyalarınıza erişimi yeniden kazanmanızı sağlayacaktır"
-},
-"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_encryption/l10n/tr.json b/apps/files_encryption/l10n/tr.json
deleted file mode 100644
index c35db71b49b..00000000000
--- a/apps/files_encryption/l10n/tr.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Bilinmeyen hata",
- "Missing recovery key password" : "Eksik kurtarma anahtarı parolası",
- "Please repeat the recovery key password" : "Lütfen kurtarma anahtarı parolasını yenileyin",
- "Repeated recovery key password does not match the provided recovery key password" : "Yenilenen kurtarma anahtarı parolası, belirtilen kurtarma anahtarı parolası ile eşleşmiyor",
- "Recovery key successfully enabled" : "Kurtarma anahtarı başarıyla etkinleştirildi",
- "Could not disable recovery key. Please check your recovery key password!" : "Kurtarma anahtarı devre dışı bırakılamadı. Lütfen kurtarma anahtarı parolanızı kontrol edin!",
- "Recovery key successfully disabled" : "Kurtarma anahtarı başarıyla devre dışı bırakıldı",
- "Please provide the old recovery password" : "Lütfen eski kurtarma parolasını girin",
- "Please provide a new recovery password" : "Lütfen yeni bir kurtarma parolası girin",
- "Please repeat the new recovery password" : "Lütfen yeni kurtarma parolasını yenileyin",
- "Password successfully changed." : "Parola başarıyla değiştirildi.",
- "Could not change the password. Maybe the old password was not correct." : "Parola değiştirilemedi. Eski parolanız doğru olmayabilir.",
- "Could not update the private key password." : "Özel anahtar parolası güncellenemedi",
- "The old password was not correct, please try again." : "Eski parola doğru değil, lütfen yeniden deneyin.",
- "The current log-in password was not correct, please try again." : "Geçerli oturum parolası doğru değil, lütfen yeniden deneyin.",
- "Private key password successfully updated." : "Özel anahtar parolası başarıyla güncellendi.",
- "File recovery settings updated" : "Dosya kurtarma ayarları güncellendi",
- "Could not update file recovery" : "Dosya kurtarma güncellenemedi",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Şifreleme uygulaması başlatılamadı! Oturumunuz sırasında şifreleme uygulaması tekrar etkinleştirilmiş olabilir. Lütfen şifreleme uygulamasını başlatmak için oturumu kapatıp yeniden oturum açmayı deneyin.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Özel anahtarınız geçerli değil! Muhtemelen parolanız %s dışarısında değiştirildi (örn. şirket dizininde). Gizli anahtar parolanızı kişisel ayarlarınızda güncelleyerek şifreli dosyalarınıza erişimi kurtarabilirsiniz.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan şifrelemesi kaldırılamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.",
- "Unknown error. Please check your system settings or contact your administrator" : "Bilinmeyen hata. Lütfen sistem ayarlarınızı denetleyin veya yöneticiniz ile iletişime geçin",
- "Initial encryption started... This can take some time. Please wait." : "İlk şifreleme başladı... Bu biraz zaman alabilir. Lütfen bekleyin.",
- "Initial encryption running... Please try again later." : "İlk şifreleme çalışıyor... Lütfen daha sonra tekrar deneyin.",
- "Missing requirements." : "Gereklilikler eksik.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "OpenSSL'nin PHP uzantısıyla birlikte etkin ve düzgün yapılandırılmış olduğundan emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı.",
- "Following users are not set up for encryption:" : "Aşağıdaki kullanıcılar şifreleme için ayarlanmamış:",
- "Go directly to your %spersonal settings%s." : "Doğrudan %skişisel ayarlarınıza%s gidin.",
- "Server-side Encryption" : "Sunucu Taraflı Şifreleme",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Şifreleme Uygulaması etkin ancak anahtarlarınız başlatılmamış. Lütfen oturumu kapatıp yeniden açın",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Kurtarma anahtarını etkinleştir (parola kaybı durumunda kullanıcı dosyalarının kurtarılmasına izin verir):",
- "Recovery key password" : "Kurtarma anahtarı parolası",
- "Repeat Recovery key password" : "Kurtarma anahtarı parolasını yineleyin",
- "Enabled" : "Etkin",
- "Disabled" : "Devre Dışı",
- "Change recovery key password:" : "Kurtarma anahtarı parolasını değiştir:",
- "Old Recovery key password" : "Eski Kurtarma anahtarı parolası",
- "New Recovery key password" : "Yeni Kurtarma anahtarı parolası",
- "Repeat New Recovery key password" : "Yeni Kurtarma anahtarı parolasını yineleyin",
- "Change Password" : "Parola Değiştir",
- "Your private key password no longer matches your log-in password." : "Özel anahtar parolanız artık oturum açma parolanız ile eşleşmiyor.",
- "Set your old private key password to your current log-in password:" : "Eski özel anahtar parolanızı, geçerli oturum açma parolanız olarak ayarlayın:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Eğer eski parolanızı hatırlamıyorsanız, yöneticinizden dosyalarınızı kurtarmasını talep edebilirsiniz.",
- "Old log-in password" : "Eski oturum açma parolası",
- "Current log-in password" : "Geçerli oturum açma parolası",
- "Update Private Key Password" : "Özel Anahtar Parolasını Güncelle",
- "Enable password recovery:" : "Parola kurtarmayı etkinleştir:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Bu seçeneği etkinleştirmek, parola kaybı durumunda şifrelenmiş dosyalarınıza erişimi yeniden kazanmanızı sağlayacaktır"
-},"pluralForm" :"nplurals=2; plural=(n > 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ug.js b/apps/files_encryption/l10n/ug.js
deleted file mode 100644
index c712dd03209..00000000000
--- a/apps/files_encryption/l10n/ug.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "يوچۇن خاتالىق"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/ug.json b/apps/files_encryption/l10n/ug.json
deleted file mode 100644
index f42ffe18018..00000000000
--- a/apps/files_encryption/l10n/ug.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "يوچۇن خاتالىق"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/uk.js b/apps/files_encryption/l10n/uk.js
deleted file mode 100644
index a5f70cf8589..00000000000
--- a/apps/files_encryption/l10n/uk.js
+++ /dev/null
@@ -1,53 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Невідома помилка",
- "Missing recovery key password" : "Відсутній пароль ключа відновлення",
- "Please repeat the recovery key password" : "Введіть ще раз пароль для ключа відновлення",
- "Repeated recovery key password does not match the provided recovery key password" : "Введені паролі ключа відновлення не співпадають",
- "Recovery key successfully enabled" : "Ключ відновлення підключено",
- "Could not disable recovery key. Please check your recovery key password!" : "Не вдалося відключити ключ відновлення. Будь ласка, перевірте пароль ключа відновлення!",
- "Recovery key successfully disabled" : "Ключ відновлення відключено",
- "Please provide the old recovery password" : "Будь ласка, введіть старий пароль відновлення",
- "Please provide a new recovery password" : "Будь ласка, введіть новий пароль відновлення",
- "Please repeat the new recovery password" : "Будь ласка, введіть новий пароль відновлення ще раз",
- "Password successfully changed." : "Пароль змінено.",
- "Could not change the password. Maybe the old password was not correct." : "Не вдалося змінити пароль. Можливо ви неправильно ввели старий пароль.",
- "Could not update the private key password." : "Не вдалося оновити пароль секретного ключа.",
- "The old password was not correct, please try again." : "Старий пароль введено не вірно, спробуйте ще раз.",
- "The current log-in password was not correct, please try again." : "Невірний пароль входу, будь ласка, спробуйте ще раз.",
- "Private key password successfully updated." : "Пароль секретного ключа оновлено.",
- "File recovery settings updated" : "Налаштування файла відновлення оновлено",
- "Could not update file recovery" : "Не вдалося оновити файл відновлення ",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Додаток шифрувння не ініціалізовано! Можливо цей додаток редагувався під час вашої сесії. Будь ласка, спробуйте вийти і зайти знову щоб проініціалізувати додаток шифрування.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ваш секретний ключ не дійсний! Ймовірно ваш пароль був змінений ззовні %s (наприклад, корпоративний каталог). Ви можете оновити секретний ключ в особистих налаштуваннях на сторінці відновлення доступу до зашифрованих файлів.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.",
- "Unknown error. Please check your system settings or contact your administrator" : "Невідома помилка. Будь ласка, перевірте налаштування системи або зверніться до адміністратора.",
- "Initial encryption started... This can take some time. Please wait." : "Початкове шифрування почалося... Це може зайняти деякий час. Будь ласка, почекайте.",
- "Initial encryption running... Please try again later." : "Початкове шифрування працює... Це може зайняти деякий час. Будь ласка, почекайте.",
- "Missing requirements." : "Відсутні вимоги.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Будь ласка, переконайтеся, що OpenSSL разом з розширенням PHP включена і налаштована належним чином. В даний час, шифрування додатку було відключено.",
- "Following users are not set up for encryption:" : "Для наступних користувачів шифрування не налаштоване:",
- "Go directly to your %spersonal settings%s." : "Перейти навпростець до ваших %spersonal settings%s.",
- "Server-side Encryption" : "Серверне шіфрування",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Ввімкнути ключ відновлення (дозволяє користувачам відновлювати файли при втраті паролю):",
- "Recovery key password" : "Пароль ключа відновлення",
- "Repeat Recovery key password" : "Введіть ще раз пароль ключа відновлення",
- "Enabled" : "Увімкнено",
- "Disabled" : "Вимкнено",
- "Change recovery key password:" : "Змінити пароль ключа відновлення:",
- "Old Recovery key password" : "Старий пароль ключа відновлення",
- "New Recovery key password" : "Новий пароль ключа відновлення",
- "Repeat New Recovery key password" : "Введіть ще раз новий пароль ключа відновлення",
- "Change Password" : "Змінити Пароль",
- "Your private key password no longer matches your log-in password." : "Пароль вашого закритого ключа більше не відповідає паролю від вашого облікового запису.",
- "Set your old private key password to your current log-in password:" : "Замініть старий пароль від закритого ключа на новий пароль входу:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Якщо ви не пам'ятаєте ваш старий пароль, ви можете звернутися до адміністратора щоб його відновити.",
- "Old log-in password" : "Старий пароль входу",
- "Current log-in password" : "Поточний пароль входу",
- "Update Private Key Password" : "Оновити пароль для закритого ключа",
- "Enable password recovery:" : "Ввімкнути відновлення паролю:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включення цієї опції дозволить вам отримати доступ до своїх зашифрованих файлів у випадку втрати паролю"
-},
-"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_encryption/l10n/uk.json b/apps/files_encryption/l10n/uk.json
deleted file mode 100644
index 69c44021eae..00000000000
--- a/apps/files_encryption/l10n/uk.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{ "translations": {
- "Unknown error" : "Невідома помилка",
- "Missing recovery key password" : "Відсутній пароль ключа відновлення",
- "Please repeat the recovery key password" : "Введіть ще раз пароль для ключа відновлення",
- "Repeated recovery key password does not match the provided recovery key password" : "Введені паролі ключа відновлення не співпадають",
- "Recovery key successfully enabled" : "Ключ відновлення підключено",
- "Could not disable recovery key. Please check your recovery key password!" : "Не вдалося відключити ключ відновлення. Будь ласка, перевірте пароль ключа відновлення!",
- "Recovery key successfully disabled" : "Ключ відновлення відключено",
- "Please provide the old recovery password" : "Будь ласка, введіть старий пароль відновлення",
- "Please provide a new recovery password" : "Будь ласка, введіть новий пароль відновлення",
- "Please repeat the new recovery password" : "Будь ласка, введіть новий пароль відновлення ще раз",
- "Password successfully changed." : "Пароль змінено.",
- "Could not change the password. Maybe the old password was not correct." : "Не вдалося змінити пароль. Можливо ви неправильно ввели старий пароль.",
- "Could not update the private key password." : "Не вдалося оновити пароль секретного ключа.",
- "The old password was not correct, please try again." : "Старий пароль введено не вірно, спробуйте ще раз.",
- "The current log-in password was not correct, please try again." : "Невірний пароль входу, будь ласка, спробуйте ще раз.",
- "Private key password successfully updated." : "Пароль секретного ключа оновлено.",
- "File recovery settings updated" : "Налаштування файла відновлення оновлено",
- "Could not update file recovery" : "Не вдалося оновити файл відновлення ",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Додаток шифрувння не ініціалізовано! Можливо цей додаток редагувався під час вашої сесії. Будь ласка, спробуйте вийти і зайти знову щоб проініціалізувати додаток шифрування.",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ваш секретний ключ не дійсний! Ймовірно ваш пароль був змінений ззовні %s (наприклад, корпоративний каталог). Ви можете оновити секретний ключ в особистих налаштуваннях на сторінці відновлення доступу до зашифрованих файлів.",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.",
- "Unknown error. Please check your system settings or contact your administrator" : "Невідома помилка. Будь ласка, перевірте налаштування системи або зверніться до адміністратора.",
- "Initial encryption started... This can take some time. Please wait." : "Початкове шифрування почалося... Це може зайняти деякий час. Будь ласка, почекайте.",
- "Initial encryption running... Please try again later." : "Початкове шифрування працює... Це може зайняти деякий час. Будь ласка, почекайте.",
- "Missing requirements." : "Відсутні вимоги.",
- "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Будь ласка, переконайтеся, що OpenSSL разом з розширенням PHP включена і налаштована належним чином. В даний час, шифрування додатку було відключено.",
- "Following users are not set up for encryption:" : "Для наступних користувачів шифрування не налаштоване:",
- "Go directly to your %spersonal settings%s." : "Перейти навпростець до ваших %spersonal settings%s.",
- "Server-side Encryption" : "Серверне шіфрування",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову",
- "Enable recovery key (allow to recover users files in case of password loss):" : "Ввімкнути ключ відновлення (дозволяє користувачам відновлювати файли при втраті паролю):",
- "Recovery key password" : "Пароль ключа відновлення",
- "Repeat Recovery key password" : "Введіть ще раз пароль ключа відновлення",
- "Enabled" : "Увімкнено",
- "Disabled" : "Вимкнено",
- "Change recovery key password:" : "Змінити пароль ключа відновлення:",
- "Old Recovery key password" : "Старий пароль ключа відновлення",
- "New Recovery key password" : "Новий пароль ключа відновлення",
- "Repeat New Recovery key password" : "Введіть ще раз новий пароль ключа відновлення",
- "Change Password" : "Змінити Пароль",
- "Your private key password no longer matches your log-in password." : "Пароль вашого закритого ключа більше не відповідає паролю від вашого облікового запису.",
- "Set your old private key password to your current log-in password:" : "Замініть старий пароль від закритого ключа на новий пароль входу:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Якщо ви не пам'ятаєте ваш старий пароль, ви можете звернутися до адміністратора щоб його відновити.",
- "Old log-in password" : "Старий пароль входу",
- "Current log-in password" : "Поточний пароль входу",
- "Update Private Key Password" : "Оновити пароль для закритого ключа",
- "Enable password recovery:" : "Ввімкнути відновлення паролю:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включення цієї опції дозволить вам отримати доступ до своїх зашифрованих файлів у випадку втрати паролю"
-},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/ur_PK.js b/apps/files_encryption/l10n/ur_PK.js
deleted file mode 100644
index f2fd4d3419d..00000000000
--- a/apps/files_encryption/l10n/ur_PK.js
+++ /dev/null
@@ -1,6 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "غیر معروف خرابی"
-},
-"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_encryption/l10n/ur_PK.json b/apps/files_encryption/l10n/ur_PK.json
deleted file mode 100644
index 7d7738b3811..00000000000
--- a/apps/files_encryption/l10n/ur_PK.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "translations": {
- "Unknown error" : "غیر معروف خرابی"
-},"pluralForm" :"nplurals=2; plural=(n != 1);"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/vi.js b/apps/files_encryption/l10n/vi.js
deleted file mode 100644
index 5b660cbf5b8..00000000000
--- a/apps/files_encryption/l10n/vi.js
+++ /dev/null
@@ -1,24 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "Lỗi chưa biết",
- "Recovery key successfully enabled" : "Khóa khôi phục kích hoạt thành công",
- "Could not disable recovery key. Please check your recovery key password!" : "Không thể vô hiệu hóa khóa khôi phục. Vui lòng kiểm tra mật khẩu khóa khôi phục!",
- "Recovery key successfully disabled" : "Vô hiệu hóa khóa khôi phục thành công",
- "Password successfully changed." : "Đã đổi mật khẩu.",
- "Could not change the password. Maybe the old password was not correct." : "Không thể đổi mật khẩu. Có lẽ do mật khẩu cũ không đúng.",
- "Private key password successfully updated." : "Cập nhật thành công mật khẩu khóa cá nhân",
- "File recovery settings updated" : "Đã cập nhật thiết lập khôi phục tập tin ",
- "Could not update file recovery" : "Không thể cập nhật khôi phục tập tin",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Ứng dụng mã hóa đã được kích hoạt nhưng bạn chưa khởi tạo khóa. Vui lòng đăng xuất ra và đăng nhập lại",
- "Enabled" : "Bật",
- "Disabled" : "Tắt",
- "Change Password" : "Đổi Mật khẩu",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Nếu bạn không nhớ mật khẩu cũ, bạn có thể yêu cầu quản trị viên khôi phục tập tin của bạn.",
- "Old log-in password" : "Mật khẩu đăng nhập cũ",
- "Current log-in password" : "Mật khẩu đăng nhập hiện tại",
- "Update Private Key Password" : "Cập nhật mật khẩu khóa cá nhân",
- "Enable password recovery:" : "Kích hoạt khôi phục mật khẩu:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Tùy chọn này sẽ cho phép bạn tái truy cập đến các tập tin mã hóa trong trường hợp mất mật khẩu"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/vi.json b/apps/files_encryption/l10n/vi.json
deleted file mode 100644
index 85c2f363664..00000000000
--- a/apps/files_encryption/l10n/vi.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{ "translations": {
- "Unknown error" : "Lỗi chưa biết",
- "Recovery key successfully enabled" : "Khóa khôi phục kích hoạt thành công",
- "Could not disable recovery key. Please check your recovery key password!" : "Không thể vô hiệu hóa khóa khôi phục. Vui lòng kiểm tra mật khẩu khóa khôi phục!",
- "Recovery key successfully disabled" : "Vô hiệu hóa khóa khôi phục thành công",
- "Password successfully changed." : "Đã đổi mật khẩu.",
- "Could not change the password. Maybe the old password was not correct." : "Không thể đổi mật khẩu. Có lẽ do mật khẩu cũ không đúng.",
- "Private key password successfully updated." : "Cập nhật thành công mật khẩu khóa cá nhân",
- "File recovery settings updated" : "Đã cập nhật thiết lập khôi phục tập tin ",
- "Could not update file recovery" : "Không thể cập nhật khôi phục tập tin",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Ứng dụng mã hóa đã được kích hoạt nhưng bạn chưa khởi tạo khóa. Vui lòng đăng xuất ra và đăng nhập lại",
- "Enabled" : "Bật",
- "Disabled" : "Tắt",
- "Change Password" : "Đổi Mật khẩu",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Nếu bạn không nhớ mật khẩu cũ, bạn có thể yêu cầu quản trị viên khôi phục tập tin của bạn.",
- "Old log-in password" : "Mật khẩu đăng nhập cũ",
- "Current log-in password" : "Mật khẩu đăng nhập hiện tại",
- "Update Private Key Password" : "Cập nhật mật khẩu khóa cá nhân",
- "Enable password recovery:" : "Kích hoạt khôi phục mật khẩu:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Tùy chọn này sẽ cho phép bạn tái truy cập đến các tập tin mã hóa trong trường hợp mất mật khẩu"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/zh_CN.js b/apps/files_encryption/l10n/zh_CN.js
deleted file mode 100644
index f6038cc6fdf..00000000000
--- a/apps/files_encryption/l10n/zh_CN.js
+++ /dev/null
@@ -1,48 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "未知错误",
- "Missing recovery key password" : "丢失的回复密钥",
- "Please repeat the recovery key password" : "请替换恢复密钥",
- "Recovery key successfully enabled" : "恢复密钥成功启用",
- "Could not disable recovery key. Please check your recovery key password!" : "不能禁用恢复密钥。请检查恢复密钥密码!",
- "Recovery key successfully disabled" : "恢复密钥成功禁用",
- "Please provide the old recovery password" : "请提供原来的恢复密码",
- "Please provide a new recovery password" : "请提供一个新的恢复密码",
- "Please repeat the new recovery password" : "请替换新的恢复密码",
- "Password successfully changed." : "密码修改成功。",
- "Could not change the password. Maybe the old password was not correct." : "不能修改密码。旧密码可能不正确。",
- "Could not update the private key password." : "不能更新私有密钥。",
- "The old password was not correct, please try again." : "原始密码错误,请重试。",
- "Private key password successfully updated." : "私钥密码成功更新。",
- "File recovery settings updated" : "文件恢复设置已更新",
- "Could not update file recovery" : "不能更新文件恢复",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密应用还没有初始化!可能加密应用在你会话期间已被重新启用。请注销并重新登录,以初始化加密应用。",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "您的私有密钥无效!也许是您在 %s 外更改了密码 (比如,在您的公司目录)。您可以在个人设置里更新您的私钥密码来恢复访问你的加密文件。",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : " 无法解密这个文件(或许这是一个共享文件?),请询问文件所有者重新与您分享这个文件。",
- "Unknown error. Please check your system settings or contact your administrator" : "未知错误。请检查系统设置或联系您的管理员",
- "Initial encryption started... This can take some time. Please wait." : "初始加密启动中....这可能会花一些时间,请稍后再试。",
- "Initial encryption running... Please try again later." : "初始加密运行中....请稍后再试。",
- "Missing requirements." : "必填项未填写。",
- "Following users are not set up for encryption:" : "以下用户还没有设置加密:",
- "Go directly to your %spersonal settings%s." : "直接访问您的%s个人设置%s。",
- "Server-side Encryption" : "服务器端加密",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "加密应用被启用了,但是你的加密密钥没有初始化,请重新登出登录系统一次。",
- "Enable recovery key (allow to recover users files in case of password loss):" : "启用恢复密钥(允许你在密码丢失后恢复文件):",
- "Recovery key password" : "恢复密钥密码",
- "Repeat Recovery key password" : "重复恢复密钥密码",
- "Enabled" : "开启",
- "Disabled" : "禁用",
- "Change recovery key password:" : "更改恢复密钥密码",
- "Old Recovery key password" : "旧的恢复密钥密码",
- "New Recovery key password" : "新的恢复密钥密码",
- "Repeat New Recovery key password" : "重复新的密钥恢复密码",
- "Change Password" : "修改密码",
- " If you don't remember your old password you can ask your administrator to recover your files." : "如果您记不住旧的密码,您可以请求管理员恢复您的文件。",
- "Old log-in password" : "旧登录密码",
- "Current log-in password" : "当前登录密码",
- "Update Private Key Password" : "更新私钥密码",
- "Enable password recovery:" : "启用密码恢复:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "启用该项将允许你在密码丢失后取回您的加密文件"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/zh_CN.json b/apps/files_encryption/l10n/zh_CN.json
deleted file mode 100644
index 0a98a5d858b..00000000000
--- a/apps/files_encryption/l10n/zh_CN.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{ "translations": {
- "Unknown error" : "未知错误",
- "Missing recovery key password" : "丢失的回复密钥",
- "Please repeat the recovery key password" : "请替换恢复密钥",
- "Recovery key successfully enabled" : "恢复密钥成功启用",
- "Could not disable recovery key. Please check your recovery key password!" : "不能禁用恢复密钥。请检查恢复密钥密码!",
- "Recovery key successfully disabled" : "恢复密钥成功禁用",
- "Please provide the old recovery password" : "请提供原来的恢复密码",
- "Please provide a new recovery password" : "请提供一个新的恢复密码",
- "Please repeat the new recovery password" : "请替换新的恢复密码",
- "Password successfully changed." : "密码修改成功。",
- "Could not change the password. Maybe the old password was not correct." : "不能修改密码。旧密码可能不正确。",
- "Could not update the private key password." : "不能更新私有密钥。",
- "The old password was not correct, please try again." : "原始密码错误,请重试。",
- "Private key password successfully updated." : "私钥密码成功更新。",
- "File recovery settings updated" : "文件恢复设置已更新",
- "Could not update file recovery" : "不能更新文件恢复",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密应用还没有初始化!可能加密应用在你会话期间已被重新启用。请注销并重新登录,以初始化加密应用。",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "您的私有密钥无效!也许是您在 %s 外更改了密码 (比如,在您的公司目录)。您可以在个人设置里更新您的私钥密码来恢复访问你的加密文件。",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : " 无法解密这个文件(或许这是一个共享文件?),请询问文件所有者重新与您分享这个文件。",
- "Unknown error. Please check your system settings or contact your administrator" : "未知错误。请检查系统设置或联系您的管理员",
- "Initial encryption started... This can take some time. Please wait." : "初始加密启动中....这可能会花一些时间,请稍后再试。",
- "Initial encryption running... Please try again later." : "初始加密运行中....请稍后再试。",
- "Missing requirements." : "必填项未填写。",
- "Following users are not set up for encryption:" : "以下用户还没有设置加密:",
- "Go directly to your %spersonal settings%s." : "直接访问您的%s个人设置%s。",
- "Server-side Encryption" : "服务器端加密",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "加密应用被启用了,但是你的加密密钥没有初始化,请重新登出登录系统一次。",
- "Enable recovery key (allow to recover users files in case of password loss):" : "启用恢复密钥(允许你在密码丢失后恢复文件):",
- "Recovery key password" : "恢复密钥密码",
- "Repeat Recovery key password" : "重复恢复密钥密码",
- "Enabled" : "开启",
- "Disabled" : "禁用",
- "Change recovery key password:" : "更改恢复密钥密码",
- "Old Recovery key password" : "旧的恢复密钥密码",
- "New Recovery key password" : "新的恢复密钥密码",
- "Repeat New Recovery key password" : "重复新的密钥恢复密码",
- "Change Password" : "修改密码",
- " If you don't remember your old password you can ask your administrator to recover your files." : "如果您记不住旧的密码,您可以请求管理员恢复您的文件。",
- "Old log-in password" : "旧登录密码",
- "Current log-in password" : "当前登录密码",
- "Update Private Key Password" : "更新私钥密码",
- "Enable password recovery:" : "启用密码恢复:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "启用该项将允许你在密码丢失后取回您的加密文件"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/zh_HK.js b/apps/files_encryption/l10n/zh_HK.js
deleted file mode 100644
index 071be6c554c..00000000000
--- a/apps/files_encryption/l10n/zh_HK.js
+++ /dev/null
@@ -1,9 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "不明錯誤",
- "Enabled" : "啟用",
- "Disabled" : "停用",
- "Change Password" : "更改密碼"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/zh_HK.json b/apps/files_encryption/l10n/zh_HK.json
deleted file mode 100644
index eea42097843..00000000000
--- a/apps/files_encryption/l10n/zh_HK.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{ "translations": {
- "Unknown error" : "不明錯誤",
- "Enabled" : "啟用",
- "Disabled" : "停用",
- "Change Password" : "更改密碼"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/l10n/zh_TW.js b/apps/files_encryption/l10n/zh_TW.js
deleted file mode 100644
index fb80249b709..00000000000
--- a/apps/files_encryption/l10n/zh_TW.js
+++ /dev/null
@@ -1,39 +0,0 @@
-OC.L10N.register(
- "files_encryption",
- {
- "Unknown error" : "未知的錯誤",
- "Recovery key successfully enabled" : "還原金鑰已成功開啟",
- "Could not disable recovery key. Please check your recovery key password!" : "無法停用還原金鑰。請檢查您的還原金鑰密碼!",
- "Recovery key successfully disabled" : "還原金鑰已成功停用",
- "Password successfully changed." : "成功變更密碼。",
- "Could not change the password. Maybe the old password was not correct." : "無法變更密碼,或許是輸入的舊密碼不正確。",
- "Private key password successfully updated." : "私人金鑰密碼已成功更新。",
- "File recovery settings updated" : "檔案還原設定已更新",
- "Could not update file recovery" : "無法更新檔案還原設定",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密功能未初始化!可能加密功能需要重新啟用在現在的連線上。請試著登出再登入來初始化加密功能。",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "您的私人金鑰不正確!可能您的密碼已經變更在外部的 %s (例如:您的企業目錄)。您可以在您的個人設定中更新私人金鑰密碼來還原存取您的加密檔案。",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
- "Unknown error. Please check your system settings or contact your administrator" : "未知錯誤請檢查您的系統設定或是聯絡您的管理員",
- "Initial encryption started... This can take some time. Please wait." : "加密初始已啟用...這個需要一些時間。請稍等。",
- "Initial encryption running... Please try again later." : "加密初始執行中...請晚點再試。",
- "Missing requirements." : "遺失必要條件。",
- "Following users are not set up for encryption:" : "以下的使用者無法設定加密:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次",
- "Enable recovery key (allow to recover users files in case of password loss):" : "啟用還原金鑰 (因忘記密碼仍允許還原使用者檔案):",
- "Recovery key password" : "還原金鑰密碼",
- "Repeat Recovery key password" : "再輸入還原金鑰密碼一次",
- "Enabled" : "已啓用",
- "Disabled" : "已停用",
- "Change recovery key password:" : "變更還原金鑰密碼:",
- "Old Recovery key password" : "舊的還原金鑰密碼",
- "New Recovery key password" : "新的還原金鑰密碼",
- "Repeat New Recovery key password" : "再輸入新的還原金鑰密碼一次",
- "Change Password" : "變更密碼",
- " If you don't remember your old password you can ask your administrator to recover your files." : "如果您忘記舊密碼,可以請求管理員協助取回檔案。",
- "Old log-in password" : "舊登入密碼",
- "Current log-in password" : "目前的登入密碼",
- "Update Private Key Password" : "更新私人金鑰密碼",
- "Enable password recovery:" : "啟用密碼還原:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "啟用這個選項將會允許您因忘記密碼但需要存取您的加密檔案"
-},
-"nplurals=1; plural=0;");
diff --git a/apps/files_encryption/l10n/zh_TW.json b/apps/files_encryption/l10n/zh_TW.json
deleted file mode 100644
index 06ff2ed3fe3..00000000000
--- a/apps/files_encryption/l10n/zh_TW.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{ "translations": {
- "Unknown error" : "未知的錯誤",
- "Recovery key successfully enabled" : "還原金鑰已成功開啟",
- "Could not disable recovery key. Please check your recovery key password!" : "無法停用還原金鑰。請檢查您的還原金鑰密碼!",
- "Recovery key successfully disabled" : "還原金鑰已成功停用",
- "Password successfully changed." : "成功變更密碼。",
- "Could not change the password. Maybe the old password was not correct." : "無法變更密碼,或許是輸入的舊密碼不正確。",
- "Private key password successfully updated." : "私人金鑰密碼已成功更新。",
- "File recovery settings updated" : "檔案還原設定已更新",
- "Could not update file recovery" : "無法更新檔案還原設定",
- "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密功能未初始化!可能加密功能需要重新啟用在現在的連線上。請試著登出再登入來初始化加密功能。",
- "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "您的私人金鑰不正確!可能您的密碼已經變更在外部的 %s (例如:您的企業目錄)。您可以在您的個人設定中更新私人金鑰密碼來還原存取您的加密檔案。",
- "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。",
- "Unknown error. Please check your system settings or contact your administrator" : "未知錯誤請檢查您的系統設定或是聯絡您的管理員",
- "Initial encryption started... This can take some time. Please wait." : "加密初始已啟用...這個需要一些時間。請稍等。",
- "Initial encryption running... Please try again later." : "加密初始執行中...請晚點再試。",
- "Missing requirements." : "遺失必要條件。",
- "Following users are not set up for encryption:" : "以下的使用者無法設定加密:",
- "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次",
- "Enable recovery key (allow to recover users files in case of password loss):" : "啟用還原金鑰 (因忘記密碼仍允許還原使用者檔案):",
- "Recovery key password" : "還原金鑰密碼",
- "Repeat Recovery key password" : "再輸入還原金鑰密碼一次",
- "Enabled" : "已啓用",
- "Disabled" : "已停用",
- "Change recovery key password:" : "變更還原金鑰密碼:",
- "Old Recovery key password" : "舊的還原金鑰密碼",
- "New Recovery key password" : "新的還原金鑰密碼",
- "Repeat New Recovery key password" : "再輸入新的還原金鑰密碼一次",
- "Change Password" : "變更密碼",
- " If you don't remember your old password you can ask your administrator to recover your files." : "如果您忘記舊密碼,可以請求管理員協助取回檔案。",
- "Old log-in password" : "舊登入密碼",
- "Current log-in password" : "目前的登入密碼",
- "Update Private Key Password" : "更新私人金鑰密碼",
- "Enable password recovery:" : "啟用密碼還原:",
- "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "啟用這個選項將會允許您因忘記密碼但需要存取您的加密檔案"
-},"pluralForm" :"nplurals=1; plural=0;"
-} \ No newline at end of file
diff --git a/apps/files_encryption/lib/capabilities.php b/apps/files_encryption/lib/capabilities.php
deleted file mode 100644
index 0ed696fc7cb..00000000000
--- a/apps/files_encryption/lib/capabilities.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Tom Needham <tom@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\Files_Encryption;
-
-class Capabilities {
-
- public static function getCapabilities() {
- return new \OC_OCS_Result(array(
- 'capabilities' => array(
- 'files' => array(
- 'encryption' => true,
- ),
- ),
- ));
- }
-
-}
diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php
deleted file mode 100644
index 784121c7ed1..00000000000
--- a/apps/files_encryption/lib/crypt.php
+++ /dev/null
@@ -1,581 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Owen Winkler <a_github@midnightcircus.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Scott Arciszewski <scott@arciszewski.me>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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\Files_Encryption;
-
-/**
- * Class for common cryptography functionality
- */
-
-class Crypt {
-
- const ENCRYPTION_UNKNOWN_ERROR = -1;
- const ENCRYPTION_NOT_INITIALIZED_ERROR = 1;
- const ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR = 2;
- const ENCRYPTION_NO_SHARE_KEY_FOUND = 3;
-
- const BLOCKSIZE = 8192; // block size will always be 8192 for a PHP stream https://bugs.php.net/bug.php?id=21641
- const DEFAULT_CIPHER = 'AES-256-CFB';
-
- const HEADERSTART = 'HBEGIN';
- const HEADEREND = 'HEND';
-
- /**
- * return encryption mode client or server side encryption
- * @param string $user name (use system wide setting if name=null)
- * @return string 'client' or 'server'
- * @note at the moment we only support server side encryption
- */
- public static function mode($user = null) {
-
- return 'server';
-
- }
-
- /**
- * Create a new encryption keypair
- * @return array publicKey, privatekey
- */
- public static function createKeypair() {
-
- $return = false;
-
- $res = Helper::getOpenSSLPkey();
-
- if ($res === false) {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t generate users key-pair for ' . \OCP\User::getUser(), \OCP\Util::ERROR);
- while ($msg = openssl_error_string()) {
- \OCP\Util::writeLog('Encryption library', 'openssl_pkey_new() fails: ' . $msg, \OCP\Util::ERROR);
- }
- } elseif (openssl_pkey_export($res, $privateKey, null, Helper::getOpenSSLConfig())) {
- // Get public key
- $keyDetails = openssl_pkey_get_details($res);
- $publicKey = $keyDetails['key'];
-
- $return = array(
- 'publicKey' => $publicKey,
- 'privateKey' => $privateKey
- );
- } else {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t export users private key, please check your servers openSSL configuration.' . \OCP\User::getUser(), \OCP\Util::ERROR);
- while($errMsg = openssl_error_string()) {
- \OCP\Util::writeLog('Encryption library', $errMsg, \OCP\Util::ERROR);
- }
- }
-
- return $return;
- }
-
- /**
- * Add arbitrary padding to encrypted data
- * @param string $data data to be padded
- * @return string padded data
- * @note In order to end up with data exactly 8192 bytes long we must
- * add two letters. It is impossible to achieve exactly 8192 length
- * blocks with encryption alone, hence padding is added to achieve the
- * required length.
- */
- private static function addPadding($data) {
-
- $padded = $data . 'xx';
-
- return $padded;
-
- }
-
- /**
- * Remove arbitrary padding to encrypted data
- * @param string $padded padded data to remove padding from
- * @return string unpadded data on success, false on error
- */
- private static function removePadding($padded) {
-
- if (substr($padded, -2) === 'xx') {
-
- $data = substr($padded, 0, -2);
-
- return $data;
-
- } else {
-
- // TODO: log the fact that unpadded data was submitted for removal of padding
- return false;
-
- }
-
- }
-
- /**
- * Check if a file's contents contains an IV and is symmetrically encrypted
- * @param string $content
- * @return boolean
- * @note see also \OCA\Files_Encryption\Util->isEncryptedPath()
- */
- public static function isCatfileContent($content) {
-
- if (!$content) {
-
- return false;
-
- }
-
- $noPadding = self::removePadding($content);
-
- // Fetch encryption metadata from end of file
- $meta = substr($noPadding, -22);
-
- // Fetch identifier from start of metadata
- $identifier = substr($meta, 0, 6);
-
- if ($identifier === '00iv00') {
-
- return true;
-
- } else {
-
- return false;
-
- }
-
- }
-
- /**
- * Check if a file is encrypted according to database file cache
- * @param string $path
- * @return bool
- */
- public static function isEncryptedMeta($path) {
-
- // TODO: Use DI to get \OC\Files\Filesystem out of here
-
- // Fetch all file metadata from DB
- $metadata = \OC\Files\Filesystem::getFileInfo($path);
-
- // Return encryption status
- return isset($metadata['encrypted']) && ( bool )$metadata['encrypted'];
-
- }
-
- /**
- * Symmetrically encrypt a string
- * @param string $plainContent
- * @param string $iv
- * @param string $passphrase
- * @param string $cypher used for encryption, currently we support AES-128-CFB and AES-256-CFB
- * @return string encrypted file content
- * @throws \OCA\Files_Encryption\Exception\EncryptionException
- */
- private static function encrypt($plainContent, $iv, $passphrase = '', $cipher = Crypt::DEFAULT_CIPHER) {
-
- $encryptedContent = openssl_encrypt($plainContent, $cipher, $passphrase, false, $iv);
-
- if (!$encryptedContent) {
- $error = "Encryption (symmetric) of content failed: " . openssl_error_string();
- \OCP\Util::writeLog('Encryption library', $error, \OCP\Util::ERROR);
- throw new Exception\EncryptionException($error, Exception\EncryptionException::ENCRYPTION_FAILED);
- }
-
- return $encryptedContent;
-
- }
-
- /**
- * Symmetrically decrypt a string
- * @param string $encryptedContent
- * @param string $iv
- * @param string $passphrase
- * @param string $cipher cipher user for decryption, currently we support aes128 and aes256
- * @throws \Exception
- * @return string decrypted file content
- */
- private static function decrypt($encryptedContent, $iv, $passphrase, $cipher = Crypt::DEFAULT_CIPHER) {
-
- $plainContent = openssl_decrypt($encryptedContent, $cipher, $passphrase, false, $iv);
-
- if ($plainContent) {
- return $plainContent;
- } else {
- throw new \Exception('Encryption library: Decryption (symmetric) of content failed');
- }
-
- }
-
- /**
- * Concatenate encrypted data with its IV and padding
- * @param string $content content to be concatenated
- * @param string $iv IV to be concatenated
- * @return string concatenated content
- */
- private static function concatIv($content, $iv) {
-
- $combined = $content . '00iv00' . $iv;
-
- return $combined;
-
- }
-
- /**
- * Split concatenated data and IV into respective parts
- * @param string $catFile concatenated data to be split
- * @return array keys: encrypted, iv
- */
- private static function splitIv($catFile) {
-
- // Fetch encryption metadata from end of file
- $meta = substr($catFile, -22);
-
- // Fetch IV from end of file
- $iv = substr($meta, -16);
-
- // Remove IV and IV identifier text to expose encrypted content
- $encrypted = substr($catFile, 0, -22);
-
- $split = array(
- 'encrypted' => $encrypted,
- 'iv' => $iv
- );
-
- return $split;
-
- }
-
- /**
- * Symmetrically encrypts a string and returns keyfile content
- * @param string $plainContent content to be encrypted in keyfile
- * @param string $passphrase
- * @param string $cypher used for encryption, currently we support AES-128-CFB and AES-256-CFB
- * @return false|string encrypted content combined with IV
- * @note IV need not be specified, as it will be stored in the returned keyfile
- * and remain accessible therein.
- */
- public static function symmetricEncryptFileContent($plainContent, $passphrase = '', $cipher = Crypt::DEFAULT_CIPHER) {
-
- if (!$plainContent) {
- \OCP\Util::writeLog('Encryption library', 'symmetrically encryption failed, no content given.', \OCP\Util::ERROR);
- return false;
- }
-
- $iv = self::generateIv();
-
- try {
- $encryptedContent = self::encrypt($plainContent, $iv, $passphrase, $cipher);
- // Combine content to encrypt with IV identifier and actual IV
- $catfile = self::concatIv($encryptedContent, $iv);
- $padded = self::addPadding($catfile);
-
- return $padded;
- } catch (Exception\EncryptionException $e) {
- $message = 'Could not encrypt file content (code: ' . $e->getCode() . '): ';
- \OCP\Util::writeLog('files_encryption', $message . $e->getMessage(), \OCP\Util::ERROR);
- return false;
- }
-
- }
-
-
- /**
- * Symmetrically decrypts keyfile content
- * @param string $keyfileContent
- * @param string $passphrase
- * @param string $cipher cipher used for decryption, currently aes128 and aes256 is supported.
- * @throws \Exception
- * @return string|false
- * @internal param string $source
- * @internal param string $target
- * @internal param string $key the decryption key
- * @return string decrypted content
- *
- * This function decrypts a file
- */
- public static function symmetricDecryptFileContent($keyfileContent, $passphrase = '', $cipher = Crypt::DEFAULT_CIPHER) {
-
- if (!$keyfileContent) {
-
- throw new \Exception('Encryption library: no data provided for decryption');
-
- }
-
- // Remove padding
- $noPadding = self::removePadding($keyfileContent);
-
- // Split into enc data and catfile
- $catfile = self::splitIv($noPadding);
-
- if ($plainContent = self::decrypt($catfile['encrypted'], $catfile['iv'], $passphrase, $cipher)) {
-
- return $plainContent;
-
- } else {
- return false;
- }
-
- }
-
- /**
- * Decrypt private key and check if the result is a valid keyfile
- *
- * @param string $encryptedKey encrypted keyfile
- * @param string $passphrase to decrypt keyfile
- * @return string|false encrypted private key or false
- *
- * This function decrypts a file
- */
- public static function decryptPrivateKey($encryptedKey, $passphrase) {
-
- $header = self::parseHeader($encryptedKey);
- $cipher = self::getCipher($header);
-
- // if we found a header we need to remove it from the key we want to decrypt
- if (!empty($header)) {
- $encryptedKey = substr($encryptedKey, strpos($encryptedKey, self::HEADEREND) + strlen(self::HEADEREND));
- }
-
- $plainKey = self::symmetricDecryptFileContent($encryptedKey, $passphrase, $cipher);
-
- // check if this a valid private key
- $res = openssl_pkey_get_private($plainKey);
- if (is_resource($res)) {
- $sslInfo = openssl_pkey_get_details($res);
- if (!isset($sslInfo['key'])) {
- $plainKey = false;
- }
- } else {
- $plainKey = false;
- }
-
- return $plainKey;
-
- }
-
- /**
- * Create asymmetrically encrypted keyfile content using a generated key
- * @param string $plainContent content to be encrypted
- * @param array $publicKeys array keys must be the userId of corresponding user
- * @return array keys: keys (array, key = userId), data
- * @throws \OCA\Files_Encryption\Exception\MultiKeyEncryptException if encryption failed
- * @note symmetricDecryptFileContent() can decrypt files created using this method
- */
- public static function multiKeyEncrypt($plainContent, array $publicKeys) {
-
- // openssl_seal returns false without errors if $plainContent
- // is empty, so trigger our own error
- if (empty($plainContent)) {
- throw new Exception\MultiKeyEncryptException('Cannot multiKeyEncrypt empty plain content', Exception\MultiKeyEncryptException::EMPTY_DATA);
- }
-
- // Set empty vars to be set by openssl by reference
- $sealed = '';
- $shareKeys = array();
- $mappedShareKeys = array();
-
- if (openssl_seal($plainContent, $sealed, $shareKeys, $publicKeys)) {
-
- $i = 0;
-
- // Ensure each shareKey is labelled with its
- // corresponding userId
- foreach ($publicKeys as $userId => $publicKey) {
-
- $mappedShareKeys[$userId] = $shareKeys[$i];
- $i++;
-
- }
-
- return array(
- 'keys' => $mappedShareKeys,
- 'data' => $sealed
- );
-
- } else {
- throw new Exception\MultiKeyEncryptException('multi key encryption failed: ' . openssl_error_string(),
- Exception\MultiKeyEncryptException::OPENSSL_SEAL_FAILED);
- }
-
- }
-
- /**
- * Asymmetrically encrypt a file using multiple public keys
- * @param string $encryptedContent
- * @param string $shareKey
- * @param mixed $privateKey
- * @throws \OCA\Files_Encryption\Exception\MultiKeyDecryptException if decryption failed
- * @internal param string $plainContent contains decrypted content
- * @return string $plainContent decrypted string
- * @note symmetricDecryptFileContent() can be used to decrypt files created using this method
- *
- * This function decrypts a file
- */
- public static function multiKeyDecrypt($encryptedContent, $shareKey, $privateKey) {
-
- if (!$encryptedContent) {
- throw new Exception\MultiKeyDecryptException('Cannot mutliKeyDecrypt empty plain content',
- Exception\MultiKeyDecryptException::EMPTY_DATA);
- }
-
- if (openssl_open($encryptedContent, $plainContent, $shareKey, $privateKey)) {
-
- return $plainContent;
-
- } else {
- throw new Exception\MultiKeyDecryptException('multiKeyDecrypt with share-key' . $shareKey . 'failed: ' . openssl_error_string(),
- Exception\MultiKeyDecryptException::OPENSSL_OPEN_FAILED);
- }
-
- }
-
- /**
- * Generates a pseudo random initialisation vector
- * @return String $iv generated IV
- */
- private static function generateIv() {
-
- if ($random = openssl_random_pseudo_bytes(12, $strong)) {
-
- if (!$strong) {
-
- // If OpenSSL indicates randomness is insecure, log error
- \OCP\Util::writeLog('Encryption library', 'Insecure symmetric key was generated using openssl_random_pseudo_bytes()', \OCP\Util::WARN);
-
- }
-
- // We encode the iv purely for string manipulation
- // purposes - it gets decoded before use
- $iv = base64_encode($random);
-
- return $iv;
-
- } else {
-
- throw new \Exception('Generating IV failed');
-
- }
-
- }
-
- /**
- * Generate a pseudo random 256-bit ASCII key, used as file key
- * @return string|false Generated key
- */
- public static function generateKey() {
-
- // Generate key
- if ($key = base64_encode(openssl_random_pseudo_bytes(32, $strong))) {
-
- if (!$strong) {
-
- // If OpenSSL indicates randomness is insecure, log error
- throw new \Exception('Encryption library, Insecure symmetric key was generated using openssl_random_pseudo_bytes()');
-
- }
-
- return $key;
-
- } else {
-
- return false;
-
- }
-
- }
-
- /**
- * read header into array
- *
- * @param string $data
- * @return array
- */
- public static function parseHeader($data) {
-
- $result = array();
-
- if (substr($data, 0, strlen(self::HEADERSTART)) === self::HEADERSTART) {
- $endAt = strpos($data, self::HEADEREND);
- $header = substr($data, 0, $endAt + strlen(self::HEADEREND));
-
- // +1 to not start with an ':' which would result in empty element at the beginning
- $exploded = explode(':', substr($header, strlen(self::HEADERSTART)+1));
-
- $element = array_shift($exploded);
- while ($element !== self::HEADEREND) {
-
- $result[$element] = array_shift($exploded);
-
- $element = array_shift($exploded);
-
- }
- }
-
- return $result;
- }
-
- /**
- * check if data block is the header
- *
- * @param string $data
- * @return boolean
- */
- public static function isHeader($data) {
-
- if (substr($data, 0, strlen(self::HEADERSTART)) === self::HEADERSTART) {
- return true;
- }
-
- return false;
- }
-
- /**
- * get chiper from header
- *
- * @param array $header
- * @throws \OCA\Files_Encryption\Exception\EncryptionException
- */
- public static function getCipher($header) {
- $cipher = isset($header['cipher']) ? $header['cipher'] : 'AES-128-CFB';
-
- if ($cipher !== 'AES-256-CFB' && $cipher !== 'AES-128-CFB') {
-
- throw new Exception\EncryptionException('file header broken, no supported cipher defined',
- Exception\EncryptionException::UNKNOWN_CIPHER);
- }
-
- return $cipher;
- }
-
- /**
- * generate header for encrypted file
- */
- public static function generateHeader() {
- $cipher = Helper::getCipher();
- $header = self::HEADERSTART . ':cipher:' . $cipher . ':' . self::HEADEREND;
-
- return $header;
- }
-
-}
diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php
deleted file mode 100644
index df90afa864a..00000000000
--- a/apps/files_encryption/lib/helper.php
+++ /dev/null
@@ -1,532 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Owen Winkler <a_github@midnightcircus.com>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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\Files_Encryption;
-
-/**
- * Class to manage registration of hooks an various helper methods
- * @package OCA\Files_Encryption
- */
-class Helper {
-
- private static $tmpFileMapping; // Map tmp files to files in data/user/files
-
- /**
- * register share related hooks
- *
- */
- public static function registerShareHooks() {
-
- \OCP\Util::connectHook('OCP\Share', 'pre_shared', 'OCA\Files_Encryption\Hooks', 'preShared');
- \OCP\Util::connectHook('OCP\Share', 'post_shared', 'OCA\Files_Encryption\Hooks', 'postShared');
- \OCP\Util::connectHook('OCP\Share', 'post_unshare', 'OCA\Files_Encryption\Hooks', 'postUnshare');
- }
-
- /**
- * register user related hooks
- *
- */
- public static function registerUserHooks() {
-
- \OCP\Util::connectHook('OC_User', 'post_login', 'OCA\Files_Encryption\Hooks', 'login');
- \OCP\Util::connectHook('OC_User', 'logout', 'OCA\Files_Encryption\Hooks', 'logout');
- \OCP\Util::connectHook('OC_User', 'post_setPassword', 'OCA\Files_Encryption\Hooks', 'setPassphrase');
- \OCP\Util::connectHook('OC_User', 'pre_setPassword', 'OCA\Files_Encryption\Hooks', 'preSetPassphrase');
- \OCP\Util::connectHook('OC_User', 'post_createUser', 'OCA\Files_Encryption\Hooks', 'postCreateUser');
- \OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OCA\Files_Encryption\Hooks', 'postDeleteUser');
- }
-
- /**
- * register filesystem related hooks
- *
- */
- public static function registerFilesystemHooks() {
-
- \OCP\Util::connectHook('OC_Filesystem', 'rename', 'OCA\Files_Encryption\Hooks', 'preRename');
- \OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Files_Encryption\Hooks', 'postRenameOrCopy');
- \OCP\Util::connectHook('OC_Filesystem', 'copy', 'OCA\Files_Encryption\Hooks', 'preCopy');
- \OCP\Util::connectHook('OC_Filesystem', 'post_copy', 'OCA\Files_Encryption\Hooks', 'postRenameOrCopy');
- \OCP\Util::connectHook('OC_Filesystem', 'post_delete', 'OCA\Files_Encryption\Hooks', 'postDelete');
- \OCP\Util::connectHook('OC_Filesystem', 'delete', 'OCA\Files_Encryption\Hooks', 'preDelete');
- \OCP\Util::connectHook('\OC\Core\LostPassword\Controller\LostController', 'post_passwordReset', 'OCA\Files_Encryption\Hooks', 'postPasswordReset');
- \OCP\Util::connectHook('OC_Filesystem', 'post_umount', 'OCA\Files_Encryption\Hooks', 'postUnmount');
- \OCP\Util::connectHook('OC_Filesystem', 'umount', 'OCA\Files_Encryption\Hooks', 'preUnmount');
- }
-
- /**
- * register app management related hooks
- *
- */
- public static function registerAppHooks() {
-
- \OCP\Util::connectHook('OC_App', 'pre_disable', 'OCA\Files_Encryption\Hooks', 'preDisable');
- \OCP\Util::connectHook('OC_App', 'post_disable', 'OCA\Files_Encryption\Hooks', 'postEnable');
- }
-
- /**
- * setup user for files_encryption
- *
- * @param Util $util
- * @param string $password
- * @return bool
- */
- public static function setupUser(Util $util, $password) {
- // Check files_encryption infrastructure is ready for action
- if (!$util->ready()) {
-
- \OCP\Util::writeLog('Encryption library', 'User account "' . $util->getUserId()
- . '" is not ready for encryption; configuration started', \OCP\Util::DEBUG);
-
- if (!$util->setupServerSide($password)) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * get recovery key id
- *
- * @return string|bool recovery key ID or false
- */
- public static function getRecoveryKeyId() {
- $appConfig = \OC::$server->getAppConfig();
- $key = $appConfig->getValue('files_encryption', 'recoveryKeyId');
-
- return ($key === null) ? false : $key;
- }
-
- public static function getPublicShareKeyId() {
- $appConfig = \OC::$server->getAppConfig();
- $key = $appConfig->getValue('files_encryption', 'publicShareKeyId');
-
- return ($key === null) ? false : $key;
- }
-
- /**
- * enable recovery
- *
- * @param string $recoveryKeyId
- * @param string $recoveryPassword
- * @return bool
- */
- public static function adminEnableRecovery($recoveryKeyId, $recoveryPassword) {
-
- $view = new \OC\Files\View('/');
- $appConfig = \OC::$server->getAppConfig();
-
- if ($recoveryKeyId === null) {
- $recoveryKeyId = 'recovery_' . substr(md5(time()), 0, 8);
- $appConfig->setValue('files_encryption', 'recoveryKeyId', $recoveryKeyId);
- }
-
- if (!Keymanager::recoveryKeyExists($view)) {
-
- $keypair = Crypt::createKeypair();
-
- // Save public key
- Keymanager::setPublicKey($keypair['publicKey'], $recoveryKeyId);
-
- $cipher = Helper::getCipher();
- $encryptedKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $recoveryPassword, $cipher);
- if ($encryptedKey) {
- Keymanager::setPrivateSystemKey($encryptedKey, $recoveryKeyId);
- // Set recoveryAdmin as enabled
- $appConfig->setValue('files_encryption', 'recoveryAdminEnabled', 1);
- $return = true;
- }
-
- } else { // get recovery key and check the password
- $util = new Util(new \OC\Files\View('/'), \OCP\User::getUser());
- $return = $util->checkRecoveryPassword($recoveryPassword);
- if ($return) {
- $appConfig->setValue('files_encryption', 'recoveryAdminEnabled', 1);
- }
- }
-
- return $return;
- }
-
- /**
- * Check if a path is a .part file
- * @param string $path Path that may identify a .part file
- * @return bool
- */
- public static function isPartialFilePath($path) {
-
- $extension = pathinfo($path, PATHINFO_EXTENSION);
- if ( $extension === 'part') {
- return true;
- } else {
- return false;
- }
-
- }
-
-
- /**
- * Remove .path extension from a file path
- * @param string $path Path that may identify a .part file
- * @return string File path without .part extension
- * @note this is needed for reusing keys
- */
- public static function stripPartialFileExtension($path) {
- $extension = pathinfo($path, PATHINFO_EXTENSION);
-
- if ( $extension === 'part') {
-
- $newLength = strlen($path) - 5; // 5 = strlen(".part") = strlen(".etmp")
- $fPath = substr($path, 0, $newLength);
-
- // if path also contains a transaction id, we remove it too
- $extension = pathinfo($fPath, PATHINFO_EXTENSION);
- if(substr($extension, 0, 12) === 'ocTransferId') { // 12 = strlen("ocTransferId")
- $newLength = strlen($fPath) - strlen($extension) -1;
- $fPath = substr($fPath, 0, $newLength);
- }
- return $fPath;
-
- } else {
- return $path;
- }
- }
-
- /**
- * disable recovery
- *
- * @param string $recoveryPassword
- * @return bool
- */
- public static function adminDisableRecovery($recoveryPassword) {
- $util = new Util(new \OC\Files\View('/'), \OCP\User::getUser());
- $return = $util->checkRecoveryPassword($recoveryPassword);
-
- if ($return) {
- // Set recoveryAdmin as disabled
- \OC::$server->getAppConfig()->setValue('files_encryption', 'recoveryAdminEnabled', 0);
- }
-
- return $return;
- }
-
- /**
- * checks if access is public/anonymous user
- * @return bool
- */
- public static function isPublicAccess() {
- if (\OCP\User::getUser() === false) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Format a path to be relative to the /user/files/ directory
- * @param string $path the absolute path
- * @return string e.g. turns '/admin/files/test.txt' into 'test.txt'
- */
- public static function stripUserFilesPath($path) {
- $split = self::splitPath($path);
-
- // it is not a file relative to data/user/files
- if (count($split) < 4 || $split[2] !== 'files') {
- return false;
- }
-
- $sliced = array_slice($split, 3);
- $relPath = implode('/', $sliced);
-
- return $relPath;
- }
-
- /**
- * try to get the user from the path if no user is logged in
- * @param string $path
- * @return string user
- */
- public static function getUser($path) {
-
- $user = \OCP\User::getUser();
-
-
- // if we are logged in, then we return the userid
- if ($user) {
- return $user;
- }
-
- // if no user is logged in we try to access a publicly shared files.
- // In this case we need to try to get the user from the path
- return self::getUserFromPath($path);
- }
-
- /**
- * extract user from path
- *
- * @param string $path
- * @return string user id
- * @throws Exception\EncryptionException
- */
- public static function getUserFromPath($path) {
- $split = self::splitPath($path);
-
- if (count($split) > 2 && (
- $split[2] === 'files' || $split[2] === 'files_versions' || $split[2] === 'cache' || $split[2] === 'files_trashbin')) {
-
- $user = $split[1];
-
- if (\OCP\User::userExists($user)) {
- return $user;
- }
- }
-
- throw new Exception\EncryptionException('Could not determine user', Exception\EncryptionException::GENERIC);
- }
-
- /**
- * get path to the corresponding file in data/user/files if path points
- * to a file in cache
- *
- * @param string $path path to a file in cache
- * @return string path to corresponding file relative to data/user/files
- * @throws Exception\EncryptionException
- */
- public static function getPathFromCachedFile($path) {
- $split = self::splitPath($path);
-
- if (count($split) < 5) {
- throw new Exception\EncryptionException('no valid cache file path', Exception\EncryptionException::GENERIC);
- }
-
- // we skip /user/cache/transactionId
- $sliced = array_slice($split, 4);
-
- return implode('/', $sliced);
- }
-
-
- /**
- * get path to the corresponding file in data/user/files for a version
- *
- * @param string $path path to a version
- * @return string path to corresponding file relative to data/user/files
- * @throws Exception\EncryptionException
- */
- public static function getPathFromVersion($path) {
- $split = self::splitPath($path);
-
- if (count($split) < 4) {
- throw new Exception\EncryptionException('no valid path to a version', Exception\EncryptionException::GENERIC);
- }
-
- // we skip user/files_versions
- $sliced = array_slice($split, 3);
- $relPath = implode('/', $sliced);
- //remove the last .v
- $realPath = substr($relPath, 0, strrpos($relPath, '.v'));
-
- return $realPath;
- }
-
- /**
- * create directory recursively
- *
- * @param string $path
- * @param \OC\Files\View $view
- */
- public static function mkdirr($path, \OC\Files\View $view) {
- $dirParts = self::splitPath(dirname($path));
- $dir = "";
- foreach ($dirParts as $part) {
- $dir = $dir . '/' . $part;
- if (!$view->file_exists($dir)) {
- $view->mkdir($dir);
- }
- }
- }
-
- /**
- * redirect to a error page
- * @param Session $session
- * @param int|null $errorCode
- * @throws \Exception
- */
- public static function redirectToErrorPage(Session $session, $errorCode = null) {
-
- if ($errorCode === null) {
- $init = $session->getInitialized();
- switch ($init) {
- case Session::INIT_EXECUTED:
- $errorCode = Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR;
- break;
- case Session::NOT_INITIALIZED:
- $errorCode = Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR;
- break;
- default:
- $errorCode = Crypt::ENCRYPTION_UNKNOWN_ERROR;
- }
- }
-
- $location = \OC_Helper::linkToAbsolute('apps/files_encryption/files', 'error.php');
- $post = 0;
- if(count($_POST) > 0) {
- $post = 1;
- }
-
- if(defined('PHPUNIT_RUN') and PHPUNIT_RUN) {
- throw new \Exception("Encryption error: $errorCode");
- }
-
- header('Location: ' . $location . '?p=' . $post . '&errorCode=' . $errorCode);
- exit();
- }
-
- /**
- * check requirements for encryption app.
- * @return bool true if requirements are met
- */
- public static function checkRequirements() {
-
- //openssl extension needs to be loaded
- return extension_loaded("openssl");
-
- }
-
- /**
- * check some common errors if the server isn't configured properly for encryption
- * @return bool true if configuration seems to be OK
- */
- public static function checkConfiguration() {
- if(self::getOpenSSLPkey()) {
- return true;
- } else {
- while ($msg = openssl_error_string()) {
- \OCP\Util::writeLog('Encryption library', 'openssl_pkey_new() fails: ' . $msg, \OCP\Util::ERROR);
- }
- return false;
- }
- }
-
- /**
- * Create an openssl pkey with config-supplied settings
- * WARNING: This initializes a new private keypair, which is computationally expensive
- * @return resource The pkey resource created
- */
- public static function getOpenSSLPkey() {
- return openssl_pkey_new(self::getOpenSSLConfig());
- }
-
- /**
- * Return an array of OpenSSL config options, default + config
- * Used for multiple OpenSSL functions
- * @return array The combined defaults and config settings
- */
- public static function getOpenSSLConfig() {
- $config = array('private_key_bits' => 4096);
- $config = array_merge(\OC::$server->getConfig()->getSystemValue('openssl', array()), $config);
- return $config;
- }
-
- /**
- * remember from which file the tmp file (getLocalFile() call) was created
- * @param string $tmpFile path of tmp file
- * @param string $originalFile path of the original file relative to data/
- */
- public static function addTmpFileToMapper($tmpFile, $originalFile) {
- self::$tmpFileMapping[$tmpFile] = $originalFile;
- }
-
- /**
- * get the path of the original file
- * @param string $tmpFile path of the tmp file
- * @return string|false path of the original file or false
- */
- public static function getPathFromTmpFile($tmpFile) {
- if (isset(self::$tmpFileMapping[$tmpFile])) {
- return self::$tmpFileMapping[$tmpFile];
- }
-
- return false;
- }
-
- /**
- * detect file type, encryption can read/write regular files, versions
- * and cached files
- *
- * @param string $path
- * @return int
- * @throws Exception\EncryptionException
- */
- public static function detectFileType($path) {
- $parts = self::splitPath($path);
-
- if (count($parts) > 2) {
- switch ($parts[2]) {
- case 'files':
- return Util::FILE_TYPE_FILE;
- case 'files_versions':
- return Util::FILE_TYPE_VERSION;
- case 'cache':
- return Util::FILE_TYPE_CACHE;
- }
- }
-
- // thow exception if we couldn't detect a valid file type
- throw new Exception\EncryptionException('Could not detect file type', Exception\EncryptionException::GENERIC);
- }
-
- /**
- * read the cipher used for encryption from the config.php
- *
- * @return string
- */
- public static function getCipher() {
-
- $cipher = \OC::$server->getConfig()->getSystemValue('cipher', Crypt::DEFAULT_CIPHER);
-
- if ($cipher !== 'AES-256-CFB' && $cipher !== 'AES-128-CFB') {
- \OCP\Util::writeLog('files_encryption',
- 'wrong cipher defined in config.php, only AES-128-CFB and AES-256-CFB is supported. Fall back ' . Crypt::DEFAULT_CIPHER,
- \OCP\Util::WARN);
-
- $cipher = Crypt::DEFAULT_CIPHER;
- }
-
- return $cipher;
- }
-
- public static function splitPath($path) {
- $normalized = \OC\Files\Filesystem::normalizePath($path);
- return explode('/', $normalized);
- }
-
-}
-
diff --git a/apps/files_encryption/lib/hooks.php b/apps/files_encryption/lib/hooks.php
deleted file mode 100644
index 4a29ffaaedf..00000000000
--- a/apps/files_encryption/lib/hooks.php
+++ /dev/null
@@ -1,625 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @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\Files_Encryption;
-
-/**
- * Class for hook specific logic
- */
-class Hooks {
-
- // file for which we want to rename the keys after the rename operation was successful
- private static $renamedFiles = array();
- // file for which we want to delete the keys after the delete operation was successful
- private static $deleteFiles = array();
- // file for which we want to delete the keys after the delete operation was successful
- private static $unmountedFiles = array();
-
- /**
- * Startup encryption backend upon user login
- * @note This method should never be called for users using client side encryption
- */
- public static function login($params) {
-
- if (\OCP\App::isEnabled('files_encryption') === false) {
- return true;
- }
-
-
- $l = new \OC_L10N('files_encryption');
-
- $view = new \OC\Files\View('/');
-
- // ensure filesystem is loaded
- if (!\OC\Files\Filesystem::$loaded) {
- \OC_Util::setupFS($params['uid']);
- }
-
- $privateKey = Keymanager::getPrivateKey($view, $params['uid']);
-
- // if no private key exists, check server configuration
- if (!$privateKey) {
- //check if all requirements are met
- if (!Helper::checkRequirements() || !Helper::checkConfiguration()) {
- $error_msg = $l->t("Missing requirements.");
- $hint = $l->t('Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.');
- \OC_App::disable('files_encryption');
- \OCP\Util::writeLog('Encryption library', $error_msg . ' ' . $hint, \OCP\Util::ERROR);
- \OCP\Template::printErrorPage($error_msg, $hint);
- }
- }
-
- $util = new Util($view, $params['uid']);
-
- // setup user, if user not ready force relogin
- if (Helper::setupUser($util, $params['password']) === false) {
- return false;
- }
-
- $session = $util->initEncryption($params);
-
- // Check if first-run file migration has already been performed
- $ready = false;
- $migrationStatus = $util->getMigrationStatus();
- if ($migrationStatus === Util::MIGRATION_OPEN && $session !== false) {
- $ready = $util->beginMigration();
- } elseif ($migrationStatus === Util::MIGRATION_IN_PROGRESS) {
- // refuse login as long as the initial encryption is running
- sleep(5);
- \OCP\User::logout();
- return false;
- }
-
- $result = true;
-
- // If migration not yet done
- if ($ready) {
-
- // Encrypt existing user files
- try {
- $result = $util->encryptAll('/' . $params['uid'] . '/' . 'files');
- } catch (\Exception $ex) {
- \OCP\Util::writeLog('Encryption library', 'Initial encryption failed! Error: ' . $ex->getMessage(), \OCP\Util::FATAL);
- $result = false;
- }
-
- if ($result) {
- \OC_Log::write(
- 'Encryption library', 'Encryption of existing files belonging to "' . $params['uid'] . '" completed'
- , \OC_Log::INFO
- );
- // Register successful migration in DB
- $util->finishMigration();
- } else {
- \OCP\Util::writeLog('Encryption library', 'Initial encryption failed!', \OCP\Util::FATAL);
- $util->resetMigrationStatus();
- \OCP\User::logout();
- }
- }
-
- return $result;
- }
-
- /**
- * remove keys from session during logout
- */
- public static function logout() {
- $session = new Session(new \OC\Files\View());
- $session->removeKeys();
- }
-
- /**
- * setup encryption backend upon user created
- * @note This method should never be called for users using client side encryption
- */
- public static function postCreateUser($params) {
-
- if (\OCP\App::isEnabled('files_encryption')) {
- $view = new \OC\Files\View('/');
- $util = new Util($view, $params['uid']);
- Helper::setupUser($util, $params['password']);
- }
- }
-
- /**
- * cleanup encryption backend upon user deleted
- * @note This method should never be called for users using client side encryption
- */
- public static function postDeleteUser($params) {
-
- if (\OCP\App::isEnabled('files_encryption')) {
- Keymanager::deletePublicKey(new \OC\Files\View(), $params['uid']);
- }
- }
-
- /**
- * If the password can't be changed within ownCloud, than update the key password in advance.
- */
- public static function preSetPassphrase($params) {
- if (\OCP\App::isEnabled('files_encryption')) {
- if ( ! \OC_User::canUserChangePassword($params['uid']) ) {
- self::setPassphrase($params);
- }
- }
- }
-
- /**
- * Change a user's encryption passphrase
- * @param array $params keys: uid, password
- */
- public static function setPassphrase($params) {
- if (\OCP\App::isEnabled('files_encryption') === false) {
- return true;
- }
-
- // Only attempt to change passphrase if server-side encryption
- // is in use (client-side encryption does not have access to
- // the necessary keys)
- if (Crypt::mode() === 'server') {
-
- $view = new \OC\Files\View('/');
- $session = new Session($view);
-
- // Get existing decrypted private key
- $privateKey = $session->getPrivateKey();
-
- if ($params['uid'] === \OCP\User::getUser() && $privateKey) {
-
- // Encrypt private key with new user pwd as passphrase
- $encryptedPrivateKey = Crypt::symmetricEncryptFileContent($privateKey, $params['password'], Helper::getCipher());
-
- // Save private key
- if ($encryptedPrivateKey) {
- Keymanager::setPrivateKey($encryptedPrivateKey, \OCP\User::getUser());
- } else {
- \OCP\Util::writeLog('files_encryption', 'Could not update users encryption password', \OCP\Util::ERROR);
- }
-
- // NOTE: Session does not need to be updated as the
- // private key has not changed, only the passphrase
- // used to decrypt it has changed
-
-
- } else { // admin changed the password for a different user, create new keys and reencrypt file keys
-
- $user = $params['uid'];
- $util = new Util($view, $user);
- $recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null;
-
- // we generate new keys if...
- // ...we have a recovery password and the user enabled the recovery key
- // ...encryption was activated for the first time (no keys exists)
- // ...the user doesn't have any files
- if (($util->recoveryEnabledForUser() && $recoveryPassword)
- || !$util->userKeysExists()
- || !$view->file_exists($user . '/files')) {
-
- // backup old keys
- $util->backupAllKeys('recovery');
-
- $newUserPassword = $params['password'];
-
- // make sure that the users home is mounted
- \OC\Files\Filesystem::initMountPoints($user);
-
- $keypair = Crypt::createKeypair();
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Save public key
- Keymanager::setPublicKey($keypair['publicKey'], $user);
-
- // Encrypt private key with new password
- $encryptedKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword, Helper::getCipher());
- if ($encryptedKey) {
- Keymanager::setPrivateKey($encryptedKey, $user);
-
- if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
- $util = new Util($view, $user);
- $util->recoverUsersFiles($recoveryPassword);
- }
- } else {
- \OCP\Util::writeLog('files_encryption', 'Could not update users encryption password', \OCP\Util::ERROR);
- }
-
- \OC_FileProxy::$enabled = $proxyStatus;
- }
- }
- }
- }
-
- /**
- * after password reset we create a new key pair for the user
- *
- * @param array $params
- */
- public static function postPasswordReset($params) {
- $uid = $params['uid'];
- $password = $params['password'];
-
- $util = new Util(new \OC\Files\View(), $uid);
- $util->replaceUserKeys($password);
- }
-
- /*
- * check if files can be encrypted to every user.
- */
- /**
- * @param array $params
- */
- public static function preShared($params) {
-
- if (\OCP\App::isEnabled('files_encryption') === false) {
- return true;
- }
-
- $l = new \OC_L10N('files_encryption');
- $users = array();
- $view = new \OC\Files\View('/');
-
- switch ($params['shareType']) {
- case \OCP\Share::SHARE_TYPE_USER:
- $users[] = $params['shareWith'];
- break;
- case \OCP\Share::SHARE_TYPE_GROUP:
- $users = \OC_Group::usersInGroup($params['shareWith']);
- break;
- }
-
- $notConfigured = array();
- foreach ($users as $user) {
- if (!Keymanager::publicKeyExists($view, $user)) {
- $notConfigured[] = $user;
- }
- }
-
- if (count($notConfigured) > 0) {
- $params['run'] = false;
- $params['error'] = $l->t('Following users are not set up for encryption:') . ' ' . join(', ' , $notConfigured);
- }
-
- }
-
- /**
- * update share keys if a file was shared
- */
- public static function postShared($params) {
-
- if (\OCP\App::isEnabled('files_encryption') === false) {
- return true;
- }
-
- if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
-
- $path = \OC\Files\Filesystem::getPath($params['fileSource']);
-
- self::updateKeyfiles($path);
- }
- }
-
- /**
- * update keyfiles and share keys recursively
- *
- * @param string $path to the file/folder
- */
- private static function updateKeyfiles($path) {
- $view = new \OC\Files\View('/');
- $userId = \OCP\User::getUser();
- $session = new Session($view);
- $util = new Util($view, $userId);
- $sharingEnabled = \OCP\Share::isEnabled();
-
- $mountManager = \OC\Files\Filesystem::getMountManager();
- $mount = $mountManager->find('/' . $userId . '/files' . $path);
- $mountPoint = $mount->getMountPoint();
-
- // if a folder was shared, get a list of all (sub-)folders
- if ($view->is_dir('/' . $userId . '/files' . $path)) {
- $allFiles = $util->getAllFiles($path, $mountPoint);
- } else {
- $allFiles = array($path);
- }
-
- foreach ($allFiles as $path) {
- $usersSharing = $util->getSharingUsersArray($sharingEnabled, $path);
- $util->setSharedFileKeyfiles($session, $usersSharing, $path);
- }
- }
-
- /**
- * unshare file/folder from a user with whom you shared the file before
- */
- public static function postUnshare($params) {
-
- if (\OCP\App::isEnabled('files_encryption') === false) {
- return true;
- }
-
- if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
-
- $view = new \OC\Files\View('/');
- $userId = $params['uidOwner'];
- $userView = new \OC\Files\View('/' . $userId . '/files');
- $util = new Util($view, $userId);
- $path = $userView->getPath($params['fileSource']);
-
- // for group shares get a list of the group members
- if ($params['shareType'] === \OCP\Share::SHARE_TYPE_GROUP) {
- $userIds = \OC_Group::usersInGroup($params['shareWith']);
- } else {
- if ($params['shareType'] === \OCP\Share::SHARE_TYPE_LINK || $params['shareType'] === \OCP\Share::SHARE_TYPE_REMOTE) {
- $userIds = array($util->getPublicShareKeyId());
- } else {
- $userIds = array($params['shareWith']);
- }
- }
-
- $mountManager = \OC\Files\Filesystem::getMountManager();
- $mount = $mountManager->find('/' . $userId . '/files' . $path);
- $mountPoint = $mount->getMountPoint();
-
- // if we unshare a folder we need a list of all (sub-)files
- if ($params['itemType'] === 'folder') {
- $allFiles = $util->getAllFiles($path, $mountPoint);
- } else {
- $allFiles = array($path);
- }
-
- foreach ($allFiles as $path) {
-
- // check if the user still has access to the file, otherwise delete share key
- $sharingUsers = $util->getSharingUsersArray(true, $path);
-
- // Unshare every user who no longer has access to the file
- $delUsers = array_diff($userIds, $sharingUsers);
- $keyPath = Keymanager::getKeyPath($view, $util, $path);
-
- // delete share key
- Keymanager::delShareKey($view, $delUsers, $keyPath, $userId, $path);
- }
-
- }
- }
-
- /**
- * mark file as renamed so that we know the original source after the file was renamed
- * @param array $params with the old path and the new path
- */
- public static function preRename($params) {
- self::preRenameOrCopy($params, 'rename');
- }
-
- /**
- * mark file as copied so that we know the original source after the file was copied
- * @param array $params with the old path and the new path
- */
- public static function preCopy($params) {
- self::preRenameOrCopy($params, 'copy');
- }
-
- private static function preRenameOrCopy($params, $operation) {
- $user = \OCP\User::getUser();
- $view = new \OC\Files\View('/');
- $util = new Util($view, $user);
-
- // we only need to rename the keys if the rename happens on the same mountpoint
- // otherwise we perform a stream copy, so we get a new set of keys
- $oldPath = \OC\Files\Filesystem::normalizePath('/' . $user . '/files/' . $params['oldpath']);
- $newPath = \OC\Files\Filesystem::normalizePath('/' . $user . '/files/' . $params['newpath']);
- $mp1 = $view->getMountPoint($oldPath);
- $mp2 = $view->getMountPoint($newPath);
-
- $oldKeysPath = Keymanager::getKeyPath($view, $util, $params['oldpath']);
-
- if ($mp1 === $mp2) {
- self::$renamedFiles[$params['oldpath']] = array(
- 'operation' => $operation,
- 'oldKeysPath' => $oldKeysPath,
- );
- } elseif ($mp1 !== $oldPath . '/') {
- self::$renamedFiles[$params['oldpath']] = array(
- 'operation' => 'cleanup',
- 'oldKeysPath' => $oldKeysPath,
- );
- }
- }
-
- /**
- * after a file is renamed/copied, rename/copy its keyfile and share-keys also fix the file size and fix also the sharing
- *
- * @param array $params array with oldpath and newpath
- */
- public static function postRenameOrCopy($params) {
-
- if (\OCP\App::isEnabled('files_encryption') === false) {
- return true;
- }
-
- $view = new \OC\Files\View('/');
- $userId = \OCP\User::getUser();
- $util = new Util($view, $userId);
-
- if (isset(self::$renamedFiles[$params['oldpath']]['operation']) &&
- isset(self::$renamedFiles[$params['oldpath']]['oldKeysPath'])) {
- $operation = self::$renamedFiles[$params['oldpath']]['operation'];
- $oldKeysPath = self::$renamedFiles[$params['oldpath']]['oldKeysPath'];
- unset(self::$renamedFiles[$params['oldpath']]);
- if ($operation === 'cleanup') {
- return $view->unlink($oldKeysPath);
- }
- } else {
- \OCP\Util::writeLog('Encryption library', "can't get path and owner from the file before it was renamed", \OCP\Util::DEBUG);
- return false;
- }
-
- list($ownerNew, $pathNew) = $util->getUidAndFilename($params['newpath']);
-
- if ($util->isSystemWideMountPoint($pathNew)) {
- $newKeysPath = 'files_encryption/keys/' . $pathNew;
- } else {
- $newKeysPath = $ownerNew . '/files_encryption/keys/' . $pathNew;
- }
-
- // create key folders if it doesn't exists
- if (!$view->file_exists(dirname($newKeysPath))) {
- $view->mkdir(dirname($newKeysPath));
- }
-
- $view->$operation($oldKeysPath, $newKeysPath);
-
- // update sharing-keys
- self::updateKeyfiles($params['newpath']);
- }
-
- /**
- * set migration status and the init status back to '0' so that all new files get encrypted
- * if the app gets enabled again
- * @param array $params contains the app ID
- */
- public static function preDisable($params) {
- if ($params['app'] === 'files_encryption') {
-
- \OC::$server->getConfig()->deleteAppFromAllUsers('files_encryption');
-
- $session = new Session(new \OC\Files\View('/'));
- $session->setInitialized(Session::NOT_INITIALIZED);
- }
- }
-
- /**
- * set the init status to 'NOT_INITIALIZED' (0) if the app gets enabled
- * @param array $params contains the app ID
- */
- public static function postEnable($params) {
- if ($params['app'] === 'files_encryption') {
- $session = new Session(new \OC\Files\View('/'));
- $session->setInitialized(Session::NOT_INITIALIZED);
- }
- }
-
- /**
- * if the file was really deleted we remove the encryption keys
- * @param array $params
- * @return boolean|null
- */
- public static function postDelete($params) {
-
- $path = $params[\OC\Files\Filesystem::signal_param_path];
-
- if (!isset(self::$deleteFiles[$path])) {
- return true;
- }
-
- $deletedFile = self::$deleteFiles[$path];
- $keyPath = $deletedFile['keyPath'];
-
- // we don't need to remember the file any longer
- unset(self::$deleteFiles[$path]);
-
- $view = new \OC\Files\View('/');
-
- // return if the file still exists and wasn't deleted correctly
- if ($view->file_exists('/' . \OCP\User::getUser() . '/files/' . $path)) {
- return true;
- }
-
- // Delete keyfile & shareKey so it isn't orphaned
- $view->unlink($keyPath);
-
- }
-
- /**
- * remember the file which should be deleted and it's owner
- * @param array $params
- * @return boolean|null
- */
- public static function preDelete($params) {
- $view = new \OC\Files\View('/');
- $path = $params[\OC\Files\Filesystem::signal_param_path];
-
- // skip this method if the trash bin is enabled or if we delete a file
- // outside of /data/user/files
- if (\OCP\App::isEnabled('files_trashbin')) {
- return true;
- }
-
- $util = new Util($view, \OCP\USER::getUser());
-
- $keysPath = Keymanager::getKeyPath($view, $util, $path);
-
- self::$deleteFiles[$path] = array(
- 'keyPath' => $keysPath);
- }
-
- /**
- * unmount file from yourself
- * remember files/folders which get unmounted
- */
- public static function preUnmount($params) {
- $view = new \OC\Files\View('/');
- $user = \OCP\User::getUser();
- $path = $params[\OC\Files\Filesystem::signal_param_path];
-
- $util = new Util($view, $user);
- list($owner, $ownerPath) = $util->getUidAndFilename($path);
-
- $keysPath = Keymanager::getKeyPath($view, $util, $path);
-
- self::$unmountedFiles[$path] = array(
- 'keyPath' => $keysPath,
- 'owner' => $owner,
- 'ownerPath' => $ownerPath
- );
- }
-
- /**
- * unmount file from yourself
- */
- public static function postUnmount($params) {
-
- $path = $params[\OC\Files\Filesystem::signal_param_path];
- $user = \OCP\User::getUser();
-
- if (!isset(self::$unmountedFiles[$path])) {
- return true;
- }
-
- $umountedFile = self::$unmountedFiles[$path];
- $keyPath = $umountedFile['keyPath'];
- $owner = $umountedFile['owner'];
- $ownerPath = $umountedFile['ownerPath'];
-
- $view = new \OC\Files\View();
-
- // we don't need to remember the file any longer
- unset(self::$unmountedFiles[$path]);
-
- // check if the user still has access to the file, otherwise delete share key
- $sharingUsers = \OCP\Share::getUsersSharingFile($path, $user);
- if (!in_array($user, $sharingUsers['users'])) {
- Keymanager::delShareKey($view, array($user), $keyPath, $owner, $ownerPath);
- }
- }
-
-}
diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php
deleted file mode 100644
index 5e33372e9c6..00000000000
--- a/apps/files_encryption/lib/keymanager.php
+++ /dev/null
@@ -1,500 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption;
-
-/**
- * Class to manage storage and retrieval of encryption keys
- * @note Where a method requires a view object, it's root must be '/'
- */
-class Keymanager {
-
- // base dir where all the file related keys are stored
- private static $keys_base_dir = '/files_encryption/keys/';
- private static $encryption_base_dir = '/files_encryption';
- private static $public_key_dir = '/files_encryption/public_keys';
-
- private static $key_cache = array(); // cache keys
-
- /**
- * read key from hard disk
- *
- * @param string $path to key
- * @param \OC\Files\View $view
- * @return string|bool either the key or false
- */
- private static function getKey($path, $view) {
-
- $key = false;
-
- if (isset(self::$key_cache[$path])) {
- $key = self::$key_cache[$path];
- } else {
-
- /** @var \OCP\Files\Storage $storage */
- list($storage, $internalPath) = $view->resolvePath($path);
-
- if ($storage->file_exists($internalPath)) {
- $key = $storage->file_get_contents($internalPath);
- self::$key_cache[$path] = $key;
- }
-
- }
-
- return $key;
- }
-
- /**
- * write key to disk
- *
- *
- * @param string $path path to key directory
- * @param string $name key name
- * @param string $key key
- * @param \OC\Files\View $view
- * @return bool
- */
- private static function setKey($path, $name, $key, $view) {
- self::keySetPreparation($view, $path);
-
- /** @var \OCP\Files\Storage $storage */
- $pathToKey = \OC\Files\Filesystem::normalizePath($path . '/' . $name);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($pathToKey);
- $result = $storage->file_put_contents($internalPath, $key);
-
- if (is_int($result) && $result > 0) {
- self::$key_cache[$pathToKey] = $key;
- return true;
- }
-
- return false;
- }
-
- /**
- * retrieve the ENCRYPTED private key from a user
- *
- * @param \OC\Files\View $view
- * @param string $user
- * @return string private key or false (hopefully)
- * @note the key returned by this method must be decrypted before use
- */
- public static function getPrivateKey(\OC\Files\View $view, $user) {
- $path = '/' . $user . '/' . 'files_encryption' . '/' . $user . '.privateKey';
- return self::getKey($path, $view);
- }
-
- /**
- * retrieve public key for a specified user
- * @param \OC\Files\View $view
- * @param string $userId
- * @return string public key or false
- */
- public static function getPublicKey(\OC\Files\View $view, $userId) {
- $path = self::$public_key_dir . '/' . $userId . '.publicKey';
- return self::getKey($path, $view);
- }
-
- public static function getPublicKeyPath() {
- return self::$public_key_dir;
- }
-
- /**
- * Retrieve a user's public and private key
- * @param \OC\Files\View $view
- * @param string $userId
- * @return array keys: privateKey, publicKey
- */
- public static function getUserKeys(\OC\Files\View $view, $userId) {
-
- return array(
- 'publicKey' => self::getPublicKey($view, $userId),
- 'privateKey' => self::getPrivateKey($view, $userId)
- );
-
- }
-
- /**
- * Retrieve public keys for given users
- * @param \OC\Files\View $view
- * @param array $userIds
- * @return array of public keys for the specified users
- */
- public static function getPublicKeys(\OC\Files\View $view, array $userIds) {
-
- $keys = array();
- foreach ($userIds as $userId) {
- $keys[$userId] = self::getPublicKey($view, $userId);
- }
-
- return $keys;
-
- }
-
- /**
- * store file encryption key
- *
- * @param \OC\Files\View $view
- * @param \OCA\Files_Encryption\Util $util
- * @param string $path relative path of the file, including filename
- * @param string $catfile keyfile content
- * @return bool true/false
- * @note The keyfile is not encrypted here. Client code must
- * asymmetrically encrypt the keyfile before passing it to this method
- */
- public static function setFileKey(\OC\Files\View $view, $util, $path, $catfile) {
- $path = self::getKeyPath($view, $util, $path);
- return self::setKey($path, 'fileKey', $catfile, $view);
-
- }
-
- /**
- * get path to key folder for a given file
- *
- * @param \OC\Files\View $view relative to data directory
- * @param \OCA\Files_Encryption\Util $util
- * @param string $path path to the file, relative to the users file directory
- * @return string
- */
- public static function getKeyPath($view, $util, $path) {
-
- if ($view->is_dir('/' . \OCP\User::getUser() . '/' . $path)) {
- throw new Exception\EncryptionException('file was expected but directoy was given', Exception\EncryptionException::GENERIC);
- }
-
- list($owner, $filename) = $util->getUidAndFilename($path);
- $filename = Helper::stripPartialFileExtension($filename);
- $filePath_f = ltrim($filename, '/');
-
- // in case of system wide mount points the keys are stored directly in the data directory
- if ($util->isSystemWideMountPoint($filename)) {
- $keyPath = self::$keys_base_dir . $filePath_f . '/';
- } else {
- $keyPath = '/' . $owner . self::$keys_base_dir . $filePath_f . '/';
- }
-
- return $keyPath;
- }
-
- /**
- * get path to file key for a given file
- *
- * @param \OC\Files\View $view relative to data directory
- * @param \OCA\Files_Encryption\Util $util
- * @param string $path path to the file, relative to the users file directory
- * @return string
- */
- public static function getFileKeyPath($view, $util, $path) {
- $keyDir = self::getKeyPath($view, $util, $path);
- return $keyDir . 'fileKey';
- }
-
- /**
- * get path to share key for a given user
- *
- * @param \OC\Files\View $view relateive to data directory
- * @param \OCA\Files_Encryption\Util $util
- * @param string $path path to file relative to the users files directoy
- * @param string $uid user for whom we want the share-key path
- * @retrun string
- */
- public static function getShareKeyPath($view, $util, $path, $uid) {
- $keyDir = self::getKeyPath($view, $util, $path);
- return $keyDir . $uid . '.shareKey';
- }
-
- /**
- * delete key
- *
- * @param \OC\Files\View $view
- * @param string $path
- * @return boolean
- */
- private static function deleteKey($view, $path) {
- $normalizedPath = \OC\Files\Filesystem::normalizePath($path);
- $result = $view->unlink($normalizedPath);
-
- if ($result) {
- unset(self::$key_cache[$normalizedPath]);
- return true;
- }
-
- return false;
- }
-
- /**
- * delete public key from a given user
- *
- * @param \OC\Files\View $view
- * @param string $uid user
- * @return bool
- */
- public static function deletePublicKey($view, $uid) {
-
- $result = false;
-
- if (!\OCP\User::userExists($uid)) {
- $publicKey = self::$public_key_dir . '/' . $uid . '.publicKey';
- self::deleteKey($view, $publicKey);
- }
-
- return $result;
- }
-
- /**
- * check if public key for user exists
- *
- * @param \OC\Files\View $view
- * @param string $uid
- */
- public static function publicKeyExists($view, $uid) {
- return $view->file_exists(self::$public_key_dir . '/'. $uid . '.publicKey');
- }
-
-
-
- /**
- * retrieve keyfile for an encrypted file
- * @param \OC\Files\View $view
- * @param \OCA\Files_Encryption\Util $util
- * @param string|false $filePath
- * @return string file key or false
- * @note The keyfile returned is asymmetrically encrypted. Decryption
- * of the keyfile must be performed by client code
- */
- public static function getFileKey($view, $util, $filePath) {
- $path = self::getFileKeyPath($view, $util, $filePath);
- return self::getKey($path, $view);
- }
-
- /**
- * store private key from the user
- * @param string $key
- * @return bool
- * @note Encryption of the private key must be performed by client code
- * as no encryption takes place here
- */
- public static function setPrivateKey($key, $user = '') {
-
- $user = $user === '' ? \OCP\User::getUser() : $user;
- $path = '/' . $user . '/files_encryption';
- $header = Crypt::generateHeader();
-
- return self::setKey($path, $user . '.privateKey', $header . $key, new \OC\Files\View());
-
- }
-
- /**
- * check if recovery key exists
- *
- * @param \OC\Files\View $view
- * @return bool
- */
- public static function recoveryKeyExists($view) {
-
- $result = false;
-
- $recoveryKeyId = Helper::getRecoveryKeyId();
- if ($recoveryKeyId) {
- $result = ($view->file_exists(self::$public_key_dir . '/' . $recoveryKeyId . ".publicKey")
- && $view->file_exists(self::$encryption_base_dir . '/' . $recoveryKeyId . ".privateKey"));
- }
-
- return $result;
- }
-
- public static function publicShareKeyExists($view) {
- $result = false;
-
- $publicShareKeyId = Helper::getPublicShareKeyId();
- if ($publicShareKeyId) {
- $result = ($view->file_exists(self::$public_key_dir . '/' . $publicShareKeyId . ".publicKey")
- && $view->file_exists(self::$encryption_base_dir . '/' . $publicShareKeyId . ".privateKey"));
-
- }
-
- return $result;
- }
-
- /**
- * store public key from the user
- * @param string $key
- * @param string $user
- *
- * @return bool
- */
- public static function setPublicKey($key, $user = '') {
-
- $user = $user === '' ? \OCP\User::getUser() : $user;
-
- return self::setKey(self::$public_key_dir, $user . '.publicKey', $key, new \OC\Files\View('/'));
- }
-
- /**
- * write private system key (recovery and public share key) to disk
- *
- * @param string $key encrypted key
- * @param string $keyName name of the key
- * @return boolean
- */
- public static function setPrivateSystemKey($key, $keyName) {
-
- $keyName = $keyName . '.privateKey';
- $header = Crypt::generateHeader();
-
- return self::setKey(self::$encryption_base_dir, $keyName,$header . $key, new \OC\Files\View());
- }
-
- /**
- * read private system key (recovery and public share key) from disk
- *
- * @param string $keyName name of the key
- * @return string|boolean private system key or false
- */
- public static function getPrivateSystemKey($keyName) {
- $path = $keyName . '.privateKey';
- return self::getKey($path, new \OC\Files\View(self::$encryption_base_dir));
- }
-
- /**
- * store multiple share keys for a single file
- * @param \OC\Files\View $view
- * @param \OCA\Files_Encryption\Util $util
- * @param string $path
- * @param array $shareKeys
- * @return bool
- */
- public static function setShareKeys($view, $util, $path, array $shareKeys) {
-
- // in case of system wide mount points the keys are stored directly in the data directory
- $basePath = Keymanager::getKeyPath($view, $util, $path);
-
- self::keySetPreparation($view, $basePath);
-
- $result = true;
-
- foreach ($shareKeys as $userId => $shareKey) {
- if (!self::setKey($basePath, $userId . '.shareKey', $shareKey, $view)) {
- // If any of the keys are not set, flag false
- $result = false;
- }
- }
-
- // Returns false if any of the keys weren't set
- return $result;
- }
-
- /**
- * retrieve shareKey for an encrypted file
- * @param \OC\Files\View $view
- * @param string $userId
- * @param \OCA\Files_Encryption\Util $util
- * @param string $filePath
- * @return string file key or false
- * @note The sharekey returned is encrypted. Decryption
- * of the keyfile must be performed by client code
- */
- public static function getShareKey($view, $userId, $util, $filePath) {
- $path = self::getShareKeyPath($view, $util, $filePath, $userId);
- return self::getKey($path, $view);
- }
-
- /**
- * Delete a single user's shareKey for a single file
- *
- * @param \OC\Files\View $view relative to data/
- * @param array $userIds list of users we want to remove
- * @param string $keyPath
- * @param string $owner the owner of the file
- * @param string $ownerPath the owners name of the file for which we want to remove the users relative to data/user/files
- */
- public static function delShareKey($view, $userIds, $keysPath, $owner, $ownerPath) {
-
- $key = array_search($owner, $userIds, true);
- if ($key !== false && $view->file_exists('/' . $owner . '/files/' . $ownerPath)) {
- unset($userIds[$key]);
- }
-
- self::recursiveDelShareKeys($keysPath, $userIds, $view);
-
- }
-
- /**
- * recursively delete share keys from given users
- *
- * @param string $dir directory
- * @param array $userIds user ids for which the share keys should be deleted
- * @param \OC\Files\View $view view relative to data/
- */
- private static function recursiveDelShareKeys($dir, $userIds, $view) {
-
- $dirContent = $view->opendir($dir);
-
- if (is_resource($dirContent)) {
- while (($file = readdir($dirContent)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
- if ($view->is_dir($dir . '/' . $file)) {
- self::recursiveDelShareKeys($dir . '/' . $file, $userIds, $view);
- } else {
- foreach ($userIds as $userId) {
- if ($userId . '.shareKey' === $file) {
- \OCP\Util::writeLog('files_encryption', 'recursiveDelShareKey: delete share key: ' . $file, \OCP\Util::DEBUG);
- self::deleteKey($view, $dir . '/' . $file);
- }
- }
- }
- }
- }
- closedir($dirContent);
- }
- }
-
- /**
- * Make preparations to vars and filesystem for saving a keyfile
- *
- * @param \OC\Files\View $view
- * @param string $path relatvie to the views root
- * @param string $basePath
- */
- protected static function keySetPreparation($view, $path) {
- // If the file resides within a subdirectory, create it
- if (!$view->file_exists($path)) {
- $sub_dirs = explode('/', $path);
- $dir = '';
- foreach ($sub_dirs as $sub_dir) {
- $dir .= '/' . $sub_dir;
- if (!$view->is_dir($dir)) {
- $view->mkdir($dir);
- }
- }
- }
- }
-
-}
diff --git a/apps/files_encryption/lib/migration.php b/apps/files_encryption/lib/migration.php
deleted file mode 100644
index 3f8ca9f4e23..00000000000
--- a/apps/files_encryption/lib/migration.php
+++ /dev/null
@@ -1,302 +0,0 @@
-<?php
-/**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption;
-
-
-class Migration {
-
- /**
- * @var \OC\Files\View
- */
- private $view;
- private $public_share_key_id;
- private $recovery_key_id;
-
- public function __construct() {
- $this->view = new \OC\Files\View();
- $this->view->getUpdater()->disable();
- $this->public_share_key_id = Helper::getPublicShareKeyId();
- $this->recovery_key_id = Helper::getRecoveryKeyId();
- }
-
- public function reorganizeFolderStructure() {
- $this->reorganizeSystemFolderStructure();
-
- $limit = 500;
- $offset = 0;
- do {
- $users = \OCP\User::getUsers('', $limit, $offset);
- foreach ($users as $user) {
- $this->reorganizeFolderStructureForUser($user);
- }
- $offset += $limit;
- } while (count($users) >= $limit);
- }
-
- public function reorganizeSystemFolderStructure() {
-
- $this->createPathForKeys('/files_encryption');
-
- // backup system wide folders
- $this->backupSystemWideKeys();
-
- // rename public keys
- $this->renamePublicKeys();
-
- // rename system wide mount point
- $this->renameFileKeys('', '/files_encryption/keyfiles');
-
- // rename system private keys
- $this->renameSystemPrivateKeys();
-
- // delete old system wide folders
- $this->view->deleteAll('/public-keys');
- $this->view->deleteAll('/owncloud_private_key');
- $this->view->deleteAll('/files_encryption/share-keys');
- $this->view->deleteAll('/files_encryption/keyfiles');
- $storage = $this->view->getMount('')->getStorage();
- $storage->getScanner()->scan('files_encryption');
- $storage->getCache()->remove('owncloud_private_key');
- $storage->getCache()->remove('public-keys');
- }
-
-
- public function reorganizeFolderStructureForUser($user) {
- // backup all keys
- \OC_Util::tearDownFS();
- \OC_Util::setupFS($user);
- if ($this->backupUserKeys($user)) {
- // create new 'key' folder
- $this->view->mkdir($user . '/files_encryption/keys');
- // rename users private key
- $this->renameUsersPrivateKey($user);
- // rename file keys
- $path = $user . '/files_encryption/keyfiles';
- $this->renameFileKeys($user, $path);
- $trashPath = $user . '/files_trashbin/keyfiles';
- if (\OC_App::isEnabled('files_trashbin') && $this->view->is_dir($trashPath)) {
- $this->renameFileKeys($user, $trashPath, true);
- $this->view->deleteAll($trashPath);
- $this->view->deleteAll($user . '/files_trashbin/share-keys');
- }
- // delete old folders
- $this->deleteOldKeys($user);
- $this->view->getMount('/' . $user)->getStorage()->getScanner()->scan('files_encryption');
- }
- }
-
- private function backupSystemWideKeys() {
- $backupDir = 'encryption_migration_backup_' . date("Y-m-d_H-i-s");
- $this->view->mkdir($backupDir);
- $this->view->copy('owncloud_private_key', $backupDir . '/owncloud_private_key');
- $this->view->copy('public-keys', $backupDir . '/public-keys');
- $this->view->copy('files_encryption', $backupDir . '/files_encryption');
- }
-
- private function backupUserKeys($user) {
- $encryptionDir = $user . '/files_encryption';
- if ($this->view->is_dir($encryptionDir)) {
- $backupDir = $user . '/encryption_migration_backup_' . date("Y-m-d_H-i-s");
- $this->view->mkdir($backupDir);
- $this->view->copy($encryptionDir, $backupDir);
- return true;
- }
- return false;
- }
-
- private function renamePublicKeys() {
- $dh = $this->view->opendir('public-keys');
-
- $this->createPathForKeys('files_encryption/public_keys');
-
- if (is_resource($dh)) {
- while (($oldPublicKey = readdir($dh)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($oldPublicKey)) {
- $newPublicKey = substr($oldPublicKey, 0, strlen($oldPublicKey) - strlen('.public.key')) . '.publicKey';
- $this->view->rename('public-keys/' . $oldPublicKey, 'files_encryption/public_keys/' . $newPublicKey);
- }
- }
- closedir($dh);
- }
- }
-
- private function renameSystemPrivateKeys() {
- $dh = $this->view->opendir('owncloud_private_key');
-
- if (is_resource($dh)) {
- while (($oldPrivateKey = readdir($dh)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($oldPrivateKey)) {
- $newPrivateKey = substr($oldPrivateKey, 0, strlen($oldPrivateKey) - strlen('.private.key')) . '.privateKey';
- $this->view->rename('owncloud_private_key/' . $oldPrivateKey, 'files_encryption/' . $newPrivateKey);
- }
- }
- closedir($dh);
- }
- }
-
- private function renameUsersPrivateKey($user) {
- $oldPrivateKey = $user . '/files_encryption/' . $user . '.private.key';
- $newPrivateKey = substr($oldPrivateKey, 0, strlen($oldPrivateKey) - strlen('.private.key')) . '.privateKey';
-
- $this->view->rename($oldPrivateKey, $newPrivateKey);
- }
-
- private function getFileName($file, $trash) {
-
- $extLength = strlen('.key');
-
- if ($trash) {
- $parts = explode('.', $file);
- if ($parts[count($parts) - 1] !== 'key') {
- $extLength = $extLength + strlen('.' . $parts[count($parts) - 1]);
- }
- }
-
- $filename = substr($file, 0, strlen($file) - $extLength);
-
- return $filename;
- }
-
- private function getExtension($file, $trash) {
-
- $extension = '';
-
- if ($trash) {
- $parts = explode('.', $file);
- if ($parts[count($parts) - 1] !== 'key') {
- $extension = '.' . $parts[count($parts) - 1];
- }
- }
-
- return $extension;
- }
-
- private function getFilePath($path, $user, $trash) {
- $offset = $trash ? strlen($user . '/files_trashbin/keyfiles') : strlen($user . '/files_encryption/keyfiles');
- return substr($path, $offset);
- }
-
- private function getTargetDir($user, $filePath, $filename, $extension, $trash) {
- if ($trash) {
- $targetDir = $user . '/files_trashbin/keys/' . $filePath . '/' . $filename . $extension;
- } else {
- $targetDir = $user . '/files_encryption/keys/' . $filePath . '/' . $filename . $extension;
- }
-
- return $targetDir;
- }
-
- private function renameFileKeys($user, $path, $trash = false) {
-
- $dh = $this->view->opendir($path);
-
- if (is_resource($dh)) {
- while (($file = readdir($dh)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
- if ($this->view->is_dir($path . '/' . $file)) {
- $this->renameFileKeys($user, $path . '/' . $file, $trash);
- } else {
- $filename = $this->getFileName($file, $trash);
- $filePath = $this->getFilePath($path, $user, $trash);
- $extension = $this->getExtension($file, $trash);
- $targetDir = $this->getTargetDir($user, $filePath, $filename, $extension, $trash);
- $this->createPathForKeys($targetDir);
- $this->view->rename($path . '/' . $file, $targetDir . '/fileKey');
- $this->renameShareKeys($user, $filePath, $filename, $targetDir, $trash);
- }
- }
- }
- closedir($dh);
- }
- }
-
- private function getOldShareKeyPath($user, $filePath, $trash) {
- if ($trash) {
- $oldShareKeyPath = $user . '/files_trashbin/share-keys/' . $filePath;
- } else {
- $oldShareKeyPath = $user . '/files_encryption/share-keys/' . $filePath;
- }
-
- return $oldShareKeyPath;
- }
-
- private function getUidFromShareKey($file, $filename, $trash) {
- $extLength = strlen('.shareKey');
- if ($trash) {
- $parts = explode('.', $file);
- if ($parts[count($parts) - 1] !== 'shareKey') {
- $extLength = $extLength + strlen('.' . $parts[count($parts) - 1]);
- }
- }
-
- $uid = substr($file, strlen($filename) + 1, $extLength * -1);
-
- return $uid;
- }
-
- private function renameShareKeys($user, $filePath, $filename, $target, $trash) {
- $oldShareKeyPath = $this->getOldShareKeyPath($user, $filePath, $trash);
- $dh = $this->view->opendir($oldShareKeyPath);
-
- if (is_resource($dh)) {
- while (($file = readdir($dh)) !== false) {
- if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
- if ($this->view->is_dir($oldShareKeyPath . '/' . $file)) {
- continue;
- } else {
- if (substr($file, 0, strlen($filename) + 1) === $filename . '.') {
-
- $uid = $this->getUidFromShareKey($file, $filename, $trash);
- $this->view->rename($oldShareKeyPath . '/' . $file, $target . '/' . $uid . '.shareKey');
- }
- }
-
- }
- }
- closedir($dh);
- }
- }
-
- private function deleteOldKeys($user) {
- $this->view->deleteAll($user . '/files_encryption/keyfiles');
- $this->view->deleteAll($user . '/files_encryption/share-keys');
- }
-
- private function createPathForKeys($path) {
- if (!$this->view->file_exists($path)) {
- $sub_dirs = explode('/', $path);
- $dir = '';
- foreach ($sub_dirs as $sub_dir) {
- $dir .= '/' . $sub_dir;
- if (!$this->view->is_dir($dir)) {
- $this->view->mkdir($dir);
- }
- }
- }
- }
-}
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
deleted file mode 100644
index b452c0d4e27..00000000000
--- a/apps/files_encryption/lib/proxy.php
+++ /dev/null
@@ -1,401 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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/>
- *
- */
-
-/**
- * Encryption proxy which handles filesystem operations before and after
- * execution and encrypts, and handles keyfiles accordingly. Used for
- * webui.
- */
-
-namespace OCA\Files_Encryption;
-
-/**
- * Class Proxy
- * @package OCA\Files_Encryption
- */
-class Proxy extends \OC_FileProxy {
-
- private static $unencryptedSizes = array(); // remember unencrypted size
- private static $fopenMode = array(); // remember the fopen mode
- private static $enableEncryption = false; // Enable encryption for the given path
-
-
- /**
- * check if path is excluded from encryption
- *
- * @param string $path relative to data/
- * @return boolean
- */
- protected function isExcludedPath($path) {
-
- $view = new \OC\Files\View();
-
- $normalizedPath = \OC\Files\Filesystem::normalizePath($path);
-
- $parts = explode('/', $normalizedPath);
-
- // we only encrypt/decrypt files in the files and files_versions folder
- if (sizeof($parts) < 3) {
- /**
- * Less then 3 parts means, we can't match:
- * - /{$uid}/files/* nor
- * - /{$uid}/files_versions/*
- * So this is not a path we are looking for.
- */
- return true;
- }
- if(
- !($parts[2] === 'files' && \OCP\User::userExists($parts[1])) &&
- !($parts[2] === 'files_versions' && \OCP\User::userExists($parts[1]))) {
-
- return true;
- }
-
- if (!$view->file_exists($normalizedPath)) {
- $normalizedPath = dirname($normalizedPath);
- }
-
- // we don't encrypt server-to-server shares
- list($storage, ) = \OC\Files\Filesystem::resolvePath($normalizedPath);
- /**
- * @var \OCP\Files\Storage $storage
- */
- if ($storage->instanceOfStorage('OCA\Files_Sharing\External\Storage')) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Check if a file requires encryption
- * @param string $path
- * @param string $mode type of access
- * @return bool
- *
- * Tests if server side encryption is enabled, and if we should call the
- * crypt stream wrapper for the given file
- */
- private function shouldEncrypt($path, $mode = 'w') {
-
- // don't call the crypt stream wrapper, if...
- if (
- Crypt::mode() !== 'server' // we are not in server-side-encryption mode
- || $this->isExcludedPath($path) // if path is excluded from encryption
- || substr($path, 0, 8) === 'crypt://' // we are already in crypt mode
- ) {
- return false;
- }
-
- $userId = Helper::getUser($path);
- $view = new \OC\Files\View('');
- $util = new Util($view, $userId);
-
- // for write operation we always encrypt the files, for read operations
- // we check if the existing file is encrypted or not decide if it needs to
- // decrypt it.
- if (($mode !== 'r' && $mode !== 'rb') || $util->isEncryptedPath($path)) {
- return true;
- }
-
- return false;
- }
-
- /**
- * @param string $path
- * @param string $data
- * @return bool
- */
- public function preFile_put_contents($path, &$data) {
-
- if ($this->shouldEncrypt($path)) {
-
- if (!is_resource($data)) {
-
- // get root view
- $view = new \OC\Files\View('/');
-
- // get relative path
- $relativePath = Helper::stripUserFilesPath($path);
-
- if (!isset($relativePath)) {
- return true;
- }
-
- // create random cache folder
- $cacheFolder = rand();
- $path_slices = explode('/', \OC\Files\Filesystem::normalizePath($path));
- $path_slices[2] = "cache/".$cacheFolder;
- $tmpPath = implode('/', $path_slices);
-
- $handle = fopen('crypt://' . $tmpPath, 'w');
- if (is_resource($handle)) {
-
- // write data to stream
- fwrite($handle, $data);
-
- // close stream
- fclose($handle);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get encrypted content
- $data = $view->file_get_contents($tmpPath);
-
- // store new unenecrypted size so that it can be updated
- // in the post proxy
- $tmpFileInfo = $view->getFileInfo($tmpPath);
- if ( isset($tmpFileInfo['unencrypted_size']) ) {
- self::$unencryptedSizes[\OC\Files\Filesystem::normalizePath($path)] = $tmpFileInfo['unencrypted_size'];
- }
-
- // remove our temp file
- $view->deleteAll('/' . \OCP\User::getUser() . '/cache/' . $cacheFolder);
-
- // re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
- } else {
- return false;
- }
- }
- }
-
- return true;
-
- }
-
- /**
- * update file cache with the new unencrypted size after file was written
- * @param string $path
- * @param mixed $result
- * @return mixed
- */
- public function postFile_put_contents($path, $result) {
- $normalizedPath = \OC\Files\Filesystem::normalizePath($path);
- if ( isset(self::$unencryptedSizes[$normalizedPath]) ) {
- $view = new \OC\Files\View('/');
- $view->putFileInfo($normalizedPath,
- array('encrypted' => true, 'unencrypted_size' => self::$unencryptedSizes[$normalizedPath]));
- unset(self::$unencryptedSizes[$normalizedPath]);
- }
-
- return $result;
- }
-
- /**
- * @param string $path Path of file from which has been read
- * @param string $data Data that has been read from file
- */
- public function postFile_get_contents($path, $data) {
-
- $plainData = null;
-
- // If data is a catfile
- if (
- Crypt::mode() === 'server'
- && $this->shouldEncrypt($path)
- && Crypt::isCatfileContent($data)
- ) {
-
- $handle = fopen('crypt://' . $path, 'r');
-
- if (is_resource($handle)) {
- while (($plainDataChunk = fgets($handle, 8192)) !== false) {
- $plainData .= $plainDataChunk;
- }
- }
-
- }
-
- if (!isset($plainData)) {
-
- $plainData = $data;
-
- }
-
- return $plainData;
-
- }
-
- /**
- * remember initial fopen mode because sometimes it gets changed during the request
- * @param string $path path
- * @param string $mode type of access
- */
- public function preFopen($path, $mode) {
-
- self::$fopenMode[$path] = $mode;
- self::$enableEncryption = $this->shouldEncrypt($path, $mode);
-
- }
-
-
- /**
- * @param string $path
- * @param resource $result
- * @return resource
- */
- public function postFopen($path, $result) {
-
- $path = \OC\Files\Filesystem::normalizePath($path);
-
- if (!$result || self::$enableEncryption === false) {
-
- return $result;
-
- }
-
- // if we remember the mode from the pre proxy we re-use it
- // otherwise we fall back to stream_get_meta_data()
- if (isset(self::$fopenMode[$path])) {
- $mode = self::$fopenMode[$path];
- unset(self::$fopenMode[$path]);
- } else {
- $meta = stream_get_meta_data($result);
- $mode = $meta['mode'];
- }
-
- // Close the original encrypted file
- fclose($result);
-
- // Open the file using the crypto stream wrapper
- // protocol and let it do the decryption work instead
- $result = fopen('crypt://' . $path, $mode);
-
- return $result;
-
- }
-
- /**
- * @param string $path
- * @param array $data
- * @return array
- */
- public function postGetFileInfo($path, $data) {
-
- // if path is a folder do nothing
- if (\OCP\App::isEnabled('files_encryption') && $data !== false && array_key_exists('size', $data)) {
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get file size
- $data['size'] = self::postFileSize($path, $data['size'], $data);
-
- // Re-enable the proxy
- \OC_FileProxy::$enabled = $proxyStatus;
- }
-
- return $data;
- }
-
- /**
- * @param string $path
- * @param int $size
- * @return int|bool
- */
- public function postFileSize($path, $size, $fileInfo = null) {
-
- $view = new \OC\Files\View('/');
-
- $userId = Helper::getUser($path);
- $util = new Util($view, $userId);
-
- // if encryption is no longer enabled or if the files aren't migrated yet
- // we return the default file size
- if(!\OCP\App::isEnabled('files_encryption') ||
- $util->getMigrationStatus() !== Util::MIGRATION_COMPLETED) {
- return $size;
- }
-
- // if path is a folder do nothing
- if ($view->is_dir($path)) {
- $proxyState = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
- $fileInfo = $view->getFileInfo($path);
- \OC_FileProxy::$enabled = $proxyState;
- if (isset($fileInfo['unencrypted_size']) && $fileInfo['unencrypted_size'] > 0) {
- return $fileInfo['unencrypted_size'];
- }
- return $size;
- }
-
- // get relative path
- $relativePath = Helper::stripUserFilesPath($path);
-
- // if path is empty we cannot resolve anything
- if (empty($relativePath)) {
- return $size;
- }
-
- // get file info from database/cache
- if (empty($fileInfo)) {
- $proxyState = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
- $fileInfo = $view->getFileInfo($path);
- \OC_FileProxy::$enabled = $proxyState;
- }
-
- // if file is encrypted return real file size
- if (isset($fileInfo['encrypted']) && $fileInfo['encrypted'] === true) {
- // try to fix unencrypted file size if it doesn't look plausible
- if ((int)$fileInfo['size'] > 0 && (int)$fileInfo['unencrypted_size'] === 0 ) {
- $fixSize = $util->getFileSize($path);
- $fileInfo['unencrypted_size'] = $fixSize;
- // put file info if not .part file
- if (!Helper::isPartialFilePath($relativePath)) {
- $view->putFileInfo($path, array('unencrypted_size' => $fixSize));
- }
- }
- $size = $fileInfo['unencrypted_size'];
- } else {
-
- $fileInfoUpdates = array();
-
- $fixSize = $util->getFileSize($path);
- if ($fixSize > 0) {
- $size = $fixSize;
-
- $fileInfoUpdates['encrypted'] = true;
- $fileInfoUpdates['unencrypted_size'] = $size;
-
- // put file info if not .part file
- if (!Helper::isPartialFilePath($relativePath)) {
- $view->putFileInfo($path, $fileInfoUpdates);
- }
- }
-
- }
- return $size;
- }
-
-}
diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php
deleted file mode 100644
index 10e4c061b30..00000000000
--- a/apps/files_encryption/lib/session.php
+++ /dev/null
@@ -1,203 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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\Files_Encryption;
-
-/**
- * Class for handling encryption related session data
- */
-
-class Session {
-
- private $view;
- private static $publicShareKey = false;
-
- const NOT_INITIALIZED = '0';
- const INIT_EXECUTED = '1';
- const INIT_SUCCESSFUL = '2';
-
-
- /**
- * if session is started, check if ownCloud key pair is set up, if not create it
- * @param \OC\Files\View $view
- *
- * @note The ownCloud key pair is used to allow public link sharing even if encryption is enabled
- */
- public function __construct($view) {
-
- $this->view = $view;
-
- if (!$this->view->is_dir('files_encryption')) {
-
- $this->view->mkdir('files_encryption');
-
- }
-
- $appConfig = \OC::$server->getAppConfig();
-
- $publicShareKeyId = Helper::getPublicShareKeyId();
-
- if ($publicShareKeyId === false) {
- $publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8);
- $appConfig->setValue('files_encryption', 'publicShareKeyId', $publicShareKeyId);
- }
-
- if (!Keymanager::publicShareKeyExists($view)) {
-
- $keypair = Crypt::createKeypair();
-
-
- // Save public key
- Keymanager::setPublicKey($keypair['publicKey'], $publicShareKeyId);
-
- // Encrypt private key empty passphrase
- $cipher = Helper::getCipher();
- $encryptedKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], '', $cipher);
- if ($encryptedKey) {
- Keymanager::setPrivateSystemKey($encryptedKey, $publicShareKeyId);
- } else {
- \OCP\Util::writeLog('files_encryption', 'Could not create public share keys', \OCP\Util::ERROR);
- }
-
- }
-
- if (Helper::isPublicAccess() && !self::getPublicSharePrivateKey()) {
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $encryptedKey = Keymanager::getPrivateSystemKey($publicShareKeyId);
- $privateKey = Crypt::decryptPrivateKey($encryptedKey, '');
- self::setPublicSharePrivateKey($privateKey);
-
- \OC_FileProxy::$enabled = $proxyStatus;
- }
- }
-
- /**
- * Sets user private key to session
- * @param string $privateKey
- * @return bool
- *
- * @note this should only be set on login
- */
- public function setPrivateKey($privateKey) {
-
- \OC::$server->getSession()->set('privateKey', $privateKey);
-
- return true;
-
- }
-
- /**
- * remove keys from session
- */
- public function removeKeys() {
- \OC::$server->getSession()->remove('publicSharePrivateKey');
- \OC::$server->getSession()->remove('privateKey');
- }
-
- /**
- * Sets status of encryption app
- * @param string $init INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
- * @return bool
- *
- * @note this doesn not indicate of the init was successful, we just remeber the try!
- */
- public function setInitialized($init) {
-
- \OC::$server->getSession()->set('encryptionInitialized', $init);
-
- return true;
-
- }
-
- /**
- * remove encryption keys and init status from session
- */
- public function closeSession() {
- \OC::$server->getSession()->remove('encryptionInitialized');
- \OC::$server->getSession()->remove('privateKey');
- }
-
-
- /**
- * Gets status if we already tried to initialize the encryption app
- * @return string init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
- *
- * @note this doesn not indicate of the init was successful, we just remeber the try!
- */
- public function getInitialized() {
- if (!is_null(\OC::$server->getSession()->get('encryptionInitialized'))) {
- return \OC::$server->getSession()->get('encryptionInitialized');
- } else if (Helper::isPublicAccess() && self::getPublicSharePrivateKey()) {
- return self::INIT_SUCCESSFUL;
- } else {
- return self::NOT_INITIALIZED;
- }
- }
-
- /**
- * Gets user or public share private key from session
- * @return string $privateKey The user's plaintext private key
- *
- */
- public function getPrivateKey() {
- // return the public share private key if this is a public access
- if (Helper::isPublicAccess()) {
- return self::getPublicSharePrivateKey();
- } else {
- if (!is_null(\OC::$server->getSession()->get('privateKey'))) {
- return \OC::$server->getSession()->get('privateKey');
- } else {
- return false;
- }
- }
- }
-
- /**
- * Sets public user private key to session
- * @param string $privateKey
- * @return bool
- */
- private static function setPublicSharePrivateKey($privateKey) {
- self::$publicShareKey = $privateKey;
- return true;
- }
-
- /**
- * Gets public share private key from session
- * @return string $privateKey
- *
- */
- private static function getPublicSharePrivateKey() {
- return self::$publicShareKey;
- }
-
-}
diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php
deleted file mode 100644
index 4cbf9e4a4b7..00000000000
--- a/apps/files_encryption/lib/stream.php
+++ /dev/null
@@ -1,700 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author jknockaert <jasper@knockaert.nl>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Vincent Petry <pvince81@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/>
- *
- */
-
-/**
- * transparently encrypted filestream
- *
- * you can use it as wrapper around an existing stream by setting CryptStream::$sourceStreams['foo']=array('path'=>$path,'stream'=>$stream)
- * and then fopen('crypt://streams/foo');
- */
-
-namespace OCA\Files_Encryption;
-
-use OCA\Files_Encryption\Exception\EncryptionException;
-
-/**
- * Provides 'crypt://' stream wrapper protocol.
- * @note We use a stream wrapper because it is the most secure way to handle
- * decrypted content transfers. There is no safe way to decrypt the entire file
- * somewhere on the server, so we have to encrypt and decrypt blocks on the fly.
- * @note Paths used with this protocol MUST BE RELATIVE. Use URLs like:
- * crypt://filename, or crypt://subdirectory/filename, NOT
- * crypt:///home/user/owncloud/data. Otherwise keyfiles will be put in
- * [owncloud]/data/user/files_encryption/keyfiles/home/user/owncloud/data and
- * will not be accessible to other methods.
- * @note Data read and written must always be 8192 bytes long, as this is the
- * buffer size used internally by PHP. The encryption process makes the input
- * data longer, and input is chunked into smaller pieces in order to result in
- * a 8192 encrypted block size.
- * @note When files are deleted via webdav, or when they are updated and the
- * previous version deleted, this is handled by OC\Files\View, and thus the
- * encryption proxies are used and keyfiles deleted.
- */
-class Stream {
-
- const PADDING_CHAR = '-';
-
- private $plainKey;
- private $encKeyfiles;
- private $rawPath; // The raw path relative to the data dir
- private $relPath; // rel path to users file dir
- private $userId;
- private $keyId;
- private $handle; // Resource returned by fopen
- private $meta = array(); // Header / meta for source stream
- private $cache; // Current block unencrypted
- private $position; // Current pointer position in the unencrypted stream
- private $writeFlag; // Flag to write current block when leaving it
- private $size;
- private $headerSize = 0; // Size of header
- private $unencryptedSize;
- private $publicKey;
- private $encKeyfile;
- private $newFile; // helper var, we only need to write the keyfile for new files
- private $isLocalTmpFile = false; // do we operate on a local tmp file
- private $localTmpFile; // path of local tmp file
- private $containHeader = false; // the file contain a header
- private $cipher; // cipher used for encryption/decryption
- /** @var \OCA\Files_Encryption\Util */
- private $util;
-
- /**
- * @var \OC\Files\View
- */
- private $rootView; // a fsview object set to '/'
-
- /**
- * @var \OCA\Files_Encryption\Session
- */
- private $session;
- private $privateKey;
-
- /**
- * @param string $path raw path relative to data/
- * @param string $mode
- * @param int $options
- * @param string $opened_path
- * @return bool
- * @throw \OCA\Files_Encryption\Exception\EncryptionException
- */
- public function stream_open($path, $mode, $options, &$opened_path) {
-
- // read default cipher from config
- $this->cipher = Helper::getCipher();
-
- // assume that the file already exist before we decide it finally in getKey()
- $this->newFile = false;
-
- $this->rootView = new \OC\Files\View('/');
-
- $this->session = new Session($this->rootView);
-
- $this->privateKey = $this->session->getPrivateKey();
- if ($this->privateKey === false) {
- throw new EncryptionException('Session does not contain a private key, maybe your login password changed?',
- EncryptionException::PRIVATE_KEY_MISSING);
- }
-
- $normalizedPath = \OC\Files\Filesystem::normalizePath(str_replace('crypt://', '', $path));
- $originalFile = Helper::getPathFromTmpFile($normalizedPath);
- if ($originalFile) {
- $this->rawPath = $originalFile;
- $this->isLocalTmpFile = true;
- $this->localTmpFile = $normalizedPath;
- } else {
- $this->rawPath = $normalizedPath;
- }
-
- $this->util = new Util($this->rootView, Helper::getUser($this->rawPath));
-
- // get the key ID which we want to use, can be the users key or the
- // public share key
- $this->keyId = $this->util->getKeyId();
-
- $fileType = Helper::detectFileType($this->rawPath);
-
- switch ($fileType) {
- case Util::FILE_TYPE_FILE:
- $this->relPath = Helper::stripUserFilesPath($this->rawPath);
- $user = \OC::$server->getUserSession()->getUser();
- $this->userId = $user ? $user->getUID() : Helper::getUserFromPath($this->rawPath);
- break;
- case Util::FILE_TYPE_VERSION:
- $this->relPath = Helper::getPathFromVersion($this->rawPath);
- $this->userId = Helper::getUserFromPath($this->rawPath);
- break;
- case Util::FILE_TYPE_CACHE:
- $this->relPath = Helper::getPathFromCachedFile($this->rawPath);
- Helper::mkdirr($this->rawPath, new \OC\Files\View('/'));
- $user = \OC::$server->getUserSession()->getUser();
- $this->userId = $user ? $user->getUID() : Helper::getUserFromPath($this->rawPath);
- break;
- default:
- \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to "files", "files_versions" or "cache"', \OCP\Util::ERROR);
- return false;
- }
-
- // Disable fileproxies so we can get the file size and open the source file without recursive encryption
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $this->position = 0;
- $this->cache = '';
- $this->writeFlag = 0;
-
- // Setting handle so it can be used for reading the header
- if ($this->isLocalTmpFile) {
- $this->handle = fopen($this->localTmpFile, $mode);
- } else {
- $this->handle = $this->rootView->fopen($this->rawPath, $mode);
- }
-
- if (
- $mode === 'w'
- or $mode === 'w+'
- or $mode === 'wb'
- or $mode === 'wb+'
- ) {
- // We're writing a new file so start write counter with 0 bytes
- $this->size = 0;
- $this->unencryptedSize = 0;
- } else {
- $this->size = $this->rootView->filesize($this->rawPath);
- \OC_FileProxy::$enabled = true;
- $this->unencryptedSize = $this->rootView->filesize($this->rawPath);
- \OC_FileProxy::$enabled = false;
- $this->readHeader();
- }
-
- \OC_FileProxy::$enabled = $proxyStatus;
-
- if (!is_resource($this->handle)) {
-
- \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR);
-
- } else {
-
- $this->meta = stream_get_meta_data($this->handle);
- // sometimes fopen changes the mode, e.g. for a url "r" convert to "r+"
- // but we need to remember the original access type
- $this->meta['mode'] = $mode;
-
- }
-
-
- return is_resource($this->handle);
-
- }
-
- private function readHeader() {
-
- if (is_resource($this->handle)) {
- $data = fread($this->handle, Crypt::BLOCKSIZE);
-
- $header = Crypt::parseHeader($data);
- $this->cipher = Crypt::getCipher($header);
-
- // remeber that we found a header
- if (!empty($header)) {
- $this->containHeader = true;
- $this->headerSize = Crypt::BLOCKSIZE;
- // if there's no header then decrypt the block and store it in the cache
- } else {
- if (!$this->getKey()) {
- throw new \Exception('Encryption key not found for "' . $this->rawPath . '" during attempted read via stream');
- } else {
- $this->cache = Crypt::symmetricDecryptFileContent($data, $this->plainKey, $this->cipher);
- }
- }
-
- }
- }
-
- /**
- * Returns the current position of the file pointer
- * @return int position of the file pointer
- */
- public function stream_tell() {
- return $this->position;
- }
-
- /**
- * @param int $offset
- * @param int $whence
- * @return bool true if fseek was successful, otherwise false
- */
-
- // seeking the stream tries to move the pointer on the encrypted stream to the beginning of the target block
- // if that works, it flushes the current block and changes the position in the unencrypted stream
- public function stream_seek($offset, $whence = SEEK_SET) {
- // this wrapper needs to return "true" for success.
- // the fseek call itself returns 0 on succeess
-
- $return=false;
-
- switch($whence) {
- case SEEK_SET:
- if($offset < $this->unencryptedSize && $offset >= 0) {
- $newPosition=$offset;
- }
- break;
- case SEEK_CUR:
- if($offset>=0) {
- $newPosition=$offset+$this->position;
- }
- break;
- case SEEK_END:
- if($this->unencryptedSize + $offset >= 0) {
- $newPosition=$this->unencryptedSize+$offset;
- }
- break;
- default:
- return $return;
- }
- $newFilePosition=floor($newPosition/6126)*Crypt::BLOCKSIZE+$this->headerSize;
- if (fseek($this->handle, $newFilePosition)===0) {
- $this->flush();
- $this->position=$newPosition;
- $return=true;
- }
- return $return;
-
- }
-
- /**
- * @param int $count
- * @return bool|string
- * @throws \OCA\Files_Encryption\Exception\EncryptionException
- */
- public function stream_read($count) {
-
- $result = '';
-
- // limit to the end of the unencrypted file; otherwise getFileSize will fail and it is good practise anyway
- $count=min($count,$this->unencryptedSize - $this->position);
-
- // loop over the 6126 sized unencrypted blocks
- while ($count > 0) {
-
- $remainingLength = $count;
-
- // update the cache of the current block
- $this->readCache();
-
- // determine the relative position in the current block
- $blockPosition=($this->position % 6126);
-
- // if entire read inside current block then only position needs to be updated
- if ($remainingLength<(6126 - $blockPosition)) {
- $result .= substr($this->cache,$blockPosition,$remainingLength);
- $this->position += $remainingLength;
- $count=0;
- // otherwise remainder of current block is fetched, the block is flushed and the position updated
- } else {
- $result .= substr($this->cache,$blockPosition);
- $this->flush();
- $this->position += (6126 - $blockPosition);
- $count -= (6126 - $blockPosition);
- }
-
- }
-
- return $result;
-
- }
-
- /**
- * Encrypt and pad data ready for writing to disk
- * @param string $plainData data to be encrypted
- * @param string $key key to use for encryption
- * @return string encrypted data on success, false on failure
- */
- public function preWriteEncrypt($plainData, $key) {
-
- // Encrypt data to 'catfile', which includes IV
- if ($encrypted = Crypt::symmetricEncryptFileContent($plainData, $key, $this->cipher)) {
-
- return $encrypted;
-
- } else {
-
- return false;
-
- }
-
- }
-
- /**
- * Fetch the plain encryption key for the file and set it as plainKey property
- * @internal param bool $generate if true, a new key will be generated if none can be found
- * @return bool true on key found and set, false on key not found and new key generated and set
- */
- public function getKey() {
-
- // Check if key is already set
- if (isset($this->plainKey) && isset($this->encKeyfile)) {
-
- return true;
-
- }
-
- // Fetch and decrypt keyfile
- // Fetch existing keyfile
- $this->encKeyfile = Keymanager::getFileKey($this->rootView, $this->util, $this->relPath);
-
- // If a keyfile already exists
- if ($this->encKeyfile) {
-
- $shareKey = Keymanager::getShareKey($this->rootView, $this->keyId, $this->util, $this->relPath);
-
- // if there is no valid private key return false
- if ($this->privateKey === false) {
- // if private key is not valid redirect user to a error page
- Helper::redirectToErrorPage($this->session);
- return false;
- }
-
- if ($shareKey === false) {
- // if no share key is available redirect user to a error page
- Helper::redirectToErrorPage($this->session, Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND);
- return false;
- }
-
- $this->plainKey = Crypt::multiKeyDecrypt($this->encKeyfile, $shareKey, $this->privateKey);
-
- return true;
-
- } else {
-
- $this->newFile = true;
-
- return false;
-
- }
-
- }
-
- /**
- * write header at beginning of encrypted file
- *
- * @throws \OCA\Files_Encryption\Exception\EncryptionException
- */
- private function writeHeader() {
-
- $header = Crypt::generateHeader();
-
- if (strlen($header) > Crypt::BLOCKSIZE) {
- throw new EncryptionException('max header size exceeded', EncryptionException::ENCRYPTION_HEADER_TO_LARGE);
- }
-
- $paddedHeader = str_pad($header, Crypt::BLOCKSIZE, self::PADDING_CHAR, STR_PAD_RIGHT);
-
- fwrite($this->handle, $paddedHeader);
- $this->headerWritten = true;
- $this->containHeader = true;
- $this->headerSize = Crypt::BLOCKSIZE;
- $this->size += $this->headerSize;
- }
-
- /**
- * Handle plain data from the stream, and write it in 8192 byte blocks
- * @param string $data data to be written to disk
- * @note the data will be written to the path stored in the stream handle, set in stream_open()
- * @note $data is only ever be a maximum of 8192 bytes long. This is set by PHP internally. stream_write() is called multiple times in a loop on data larger than 8192 bytes
- * @note Because the encryption process used increases the length of $data, a cache is used to carry over data which would not fit in the required block size
- * @note Padding is added to each encrypted block to ensure that the resulting block is exactly 8192 bytes. This is removed during stream_read
- * @note PHP automatically updates the file pointer after writing data to reflect it's length. There is generally no need to update the poitner manually using fseek
- */
- public function stream_write($data) {
-
- // if there is no valid private key return false
- if ($this->privateKey === false) {
- $this->size = 0;
- return strlen($data);
- }
-
- if ($this->size === 0) {
- $this->writeHeader();
- }
-
- // Get / generate the keyfile for the file we're handling
- // If we're writing a new file (not overwriting an existing
- // one), save the newly generated keyfile
- if (!$this->getKey()) {
-
- $this->plainKey = Crypt::generateKey();
-
- }
-
- $length=0;
-
- // loop over $data to fit it in 6126 sized unencrypted blocks
- while (strlen($data) > 0) {
-
- $remainingLength = strlen($data);
-
- // set the cache to the current 6126 block
- $this->readCache();
-
- // only allow writes on seekable streams, or at the end of the encrypted stream
- // for seekable streams the pointer is moved back to the beginning of the encrypted block
- // flush will start writing there when the position moves to another block
- if((fseek($this->handle, floor($this->position/6126)*Crypt::BLOCKSIZE + $this->headerSize) === 0) || (floor($this->position/6126)*Crypt::BLOCKSIZE + $this->headerSize === $this->size)) {
-
- // switch the writeFlag so flush() will write the block
- $this->writeFlag=1;
-
- // determine the relative position in the current block
- $blockPosition=($this->position % 6126);
-
- // check if $data fits in current block
- // if so, overwrite existing data (if any)
- // update position and liberate $data
- if ($remainingLength<(6126 - $blockPosition)) {
- $this->cache=substr($this->cache,0,$blockPosition).$data.substr($this->cache,$blockPosition+$remainingLength);
- $this->position += $remainingLength;
- $length += $remainingLength;
- $data = '';
- // if $data doens't fit the current block, the fill the current block and reiterate
- // after the block is filled, it is flushed and $data is updated
- } else {
- $this->cache=substr($this->cache,0,$blockPosition).substr($data,0,6126-$blockPosition);
- $this->flush();
- $this->position += (6126 - $blockPosition);
- $length += (6126 - $blockPosition);
- $data = substr($data, 6126 - $blockPosition);
- }
-
- } else {
- $data='';
- }
- }
-
- $this->unencryptedSize = max($this->unencryptedSize,$this->position);
-
- return $length;
-
- }
-
-
- /**
- * @param int $option
- * @param int $arg1
- * @param int|null $arg2
- */
- public function stream_set_option($option, $arg1, $arg2) {
- $return = false;
- switch ($option) {
- case STREAM_OPTION_BLOCKING:
- $return = stream_set_blocking($this->handle, $arg1);
- break;
- case STREAM_OPTION_READ_TIMEOUT:
- $return = stream_set_timeout($this->handle, $arg1, $arg2);
- break;
- case STREAM_OPTION_WRITE_BUFFER:
- $return = stream_set_write_buffer($this->handle, $arg1);
- }
-
- return $return;
- }
-
- /**
- * @return array
- */
- public function stream_stat() {
- return fstat($this->handle);
- }
-
- /**
- * @param int $mode
- */
- public function stream_lock($mode) {
- return flock($this->handle, $mode);
- }
-
- /**
- * @return bool
- */
- public function stream_flush() {
-
- $this->flush();
- return fflush($this->handle);
- // Not a typo: http://php.net/manual/en/function.fflush.php
-
- }
-
- /**
- * @return bool
- */
- public function stream_eof() {
- return ($this->position>=$this->unencryptedSize);
- }
-
- private function flush() {
-
- // write to disk only when writeFlag was set to 1
- if ($this->writeFlag === 1) {
- // Disable the file proxies so that encryption is not
- // automatically attempted when the file is written to disk -
- // we are handling that separately here and we don't want to
- // get into an infinite loop
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
- // Set keyfile property for file in question
- $this->getKey();
- $encrypted = $this->preWriteEncrypt($this->cache, $this->plainKey);
- fwrite($this->handle, $encrypted);
- $this->writeFlag = 0;
- $this->size = max($this->size,ftell($this->handle));
- \OC_FileProxy::$enabled = $proxyStatus;
- }
- // always empty the cache (otherwise readCache() will not fill it with the new block)
- $this->cache = '';
- }
-
- private function readCache() {
- // cache should always be empty string when this function is called
- // don't try to fill the cache when trying to write at the end of the unencrypted file when it coincides with new block
- if ($this->cache === '' && !($this->position===$this->unencryptedSize && ($this->position % 6126)===0)) {
- // Get the data from the file handle
- $data = fread($this->handle, Crypt::BLOCKSIZE);
- $result = '';
- if (strlen($data)) {
- if (!$this->getKey()) {
- // Error! We don't have a key to decrypt the file with
- throw new \Exception('Encryption key not found for "'. $this->rawPath . '" during attempted read via stream');
- } else {
- // Decrypt data
- $result = Crypt::symmetricDecryptFileContent($data, $this->plainKey, $this->cipher);
- }
- }
- $this->cache = $result;
- }
- }
-
- /**
- * @return bool
- */
- public function stream_close() {
-
- $this->flush();
-
- // if there is no valid private key return false
- if ($this->privateKey === false) {
-
- // cleanup
- if ($this->meta['mode'] !== 'r' && $this->meta['mode'] !== 'rb' && !$this->isLocalTmpFile) {
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- if ($this->rootView->file_exists($this->rawPath) && $this->size === $this->headerSize) {
- fclose($this->handle);
- $this->rootView->unlink($this->rawPath);
- }
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
- }
-
- // if private key is not valid redirect user to a error page
- Helper::redirectToErrorPage($this->session);
- }
-
- if (
- $this->meta['mode'] !== 'r' &&
- $this->meta['mode'] !== 'rb' &&
- $this->isLocalTmpFile === false &&
- $this->size > $this->headerSize &&
- $this->unencryptedSize > 0
- ) {
-
- // only write keyfiles if it was a new file
- if ($this->newFile === true) {
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Fetch user's public key
- $this->publicKey = Keymanager::getPublicKey($this->rootView, $this->keyId);
-
- // Check if OC sharing api is enabled
- $sharingEnabled = \OCP\Share::isEnabled();
-
- // Get all users sharing the file includes current user
- $uniqueUserIds = $this->util->getSharingUsersArray($sharingEnabled, $this->relPath);
- $checkedUserIds = $this->util->filterShareReadyUsers($uniqueUserIds);
-
- // Fetch public keys for all sharing users
- $publicKeys = Keymanager::getPublicKeys($this->rootView, $checkedUserIds['ready']);
-
- // Encrypt enc key for all sharing users
- $this->encKeyfiles = Crypt::multiKeyEncrypt($this->plainKey, $publicKeys);
-
- // Save the new encrypted file key
- Keymanager::setFileKey($this->rootView, $this->util, $this->relPath, $this->encKeyfiles['data']);
-
- // Save the sharekeys
- Keymanager::setShareKeys($this->rootView, $this->util, $this->relPath, $this->encKeyfiles['keys']);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
- }
-
- // we need to update the file info for the real file, not for the
- // part file.
- $path = Helper::stripPartialFileExtension($this->rawPath);
-
- $fileInfo = array(
- 'mimetype' => $this->rootView->getMimeType($this->rawPath),
- 'encrypted' => true,
- 'unencrypted_size' => $this->unencryptedSize,
- );
-
- // if we write a part file we also store the unencrypted size for
- // the part file so that it can be re-used later
- $this->rootView->putFileInfo($this->rawPath, $fileInfo);
- if ($path !== $this->rawPath) {
- $this->rootView->putFileInfo($path, $fileInfo);
- }
-
- }
-
- $result = fclose($this->handle);
-
- if ($result === false) {
- \OCP\Util::writeLog('Encryption library', 'Could not close stream, file could be corrupted', \OCP\Util::FATAL);
- }
-
- return $result;
-
- }
-
-}
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
deleted file mode 100644
index d8dd96d653f..00000000000
--- a/apps/files_encryption/lib/util.php
+++ /dev/null
@@ -1,1700 +0,0 @@
-<?php
-/**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author jknockaert <jasper@knockaert.nl>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Markus Goetz <markus@woboq.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption;
-
-/**
- * Class for utilities relating to encrypted file storage system
- * @param \OC\Files\View $view expected to have OC '/' as root path
- * @param string $userId ID of the logged in user
- * @param int $client indicating status of client side encryption. Currently
- * unused, likely to become obsolete shortly
- */
-
-class Util {
-
- const MIGRATION_COMPLETED = 1; // migration to new encryption completed
- const MIGRATION_IN_PROGRESS = -1; // migration is running
- const MIGRATION_OPEN = 0; // user still needs to be migrated
-
- const FILE_TYPE_FILE = 0;
- const FILE_TYPE_VERSION = 1;
- const FILE_TYPE_CACHE = 2;
-
- /**
- * @var \OC\Files\View
- */
- private $view; // OC\Files\View object for filesystem operations
-
- /**
- * @var string
- */
- private $userId; // ID of the user we use to encrypt/decrypt files
-
- /**
- * @var string
- */
- private $keyId; // ID of the key we want to manipulate
-
- /**
- * @var bool
- */
- private $client; // Client side encryption mode flag
-
- /**
- * @var string
- */
- private $publicKeyDir; // Dir containing all public user keys
-
- /**
- * @var string
- */
- private $encryptionDir; // Dir containing user's files_encryption
-
- /**
- * @var string
- */
- private $keysPath; // Dir containing all file related encryption keys
-
- /**
- * @var string
- */
- private $publicKeyPath; // Path to user's public key
-
- /**
- * @var string
- */
- private $privateKeyPath; // Path to user's private key
-
- /**
- * @var string
- */
- private $userFilesDir;
-
- /**
- * @var string
- */
- private $publicShareKeyId;
-
- /**
- * @var string
- */
- private $recoveryKeyId;
-
- /**
- * @var bool
- */
- private $isPublic;
-
- /**
- * @param \OC\Files\View $view
- * @param string $userId
- * @param bool $client
- */
- public function __construct($view, $userId, $client = false) {
-
- $this->view = $view;
- $this->client = $client;
- $this->userId = $userId;
-
- $appConfig = \OC::$server->getAppConfig();
-
- $this->publicShareKeyId = $appConfig->getValue('files_encryption', 'publicShareKeyId');
- $this->recoveryKeyId = $appConfig->getValue('files_encryption', 'recoveryKeyId');
-
- $this->userDir = '/' . $this->userId;
- $this->fileFolderName = 'files';
- $this->userFilesDir =
- '/' . $userId . '/' . $this->fileFolderName; // TODO: Does this need to be user configurable?
- $this->publicKeyDir = Keymanager::getPublicKeyPath();
- $this->encryptionDir = '/' . $this->userId . '/' . 'files_encryption';
- $this->keysPath = $this->encryptionDir . '/' . 'keys';
- $this->publicKeyPath =
- $this->publicKeyDir . '/' . $this->userId . '.publicKey'; // e.g. data/public-keys/admin.publicKey
- $this->privateKeyPath =
- $this->encryptionDir . '/' . $this->userId . '.privateKey'; // e.g. data/admin/admin.privateKey
- // make sure that the owners home is mounted
- \OC\Files\Filesystem::initMountPoints($userId);
-
- if (Helper::isPublicAccess()) {
- $this->keyId = $this->publicShareKeyId;
- $this->isPublic = true;
- } else {
- $this->keyId = $this->userId;
- $this->isPublic = false;
- }
- }
-
- /**
- * @return bool
- */
- public function ready() {
-
- if (
- !$this->view->file_exists($this->encryptionDir)
- or !$this->view->file_exists($this->keysPath)
- or !$this->view->file_exists($this->publicKeyPath)
- or !$this->view->file_exists($this->privateKeyPath)
- ) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * check if the users private & public key exists
- * @return boolean
- */
- public function userKeysExists() {
- if (
- $this->view->file_exists($this->privateKeyPath) &&
- $this->view->file_exists($this->publicKeyPath)) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * create a new public/private key pair for the user
- *
- * @param string $password password for the private key
- */
- public function replaceUserKeys($password) {
- $this->backupAllKeys('password_reset');
- $this->view->unlink($this->publicKeyPath);
- $this->view->unlink($this->privateKeyPath);
- $this->setupServerSide($password);
- }
-
- /**
- * Sets up user folders and keys for serverside encryption
- *
- * @param string $passphrase to encrypt server-stored private key with
- * @return bool
- */
- public function setupServerSide($passphrase = null) {
-
- // Set directories to check / create
- $setUpDirs = array(
- $this->userDir,
- $this->publicKeyDir,
- $this->encryptionDir,
- $this->keysPath
- );
-
- // Check / create all necessary dirs
- foreach ($setUpDirs as $dirPath) {
-
- if (!$this->view->file_exists($dirPath)) {
-
- $this->view->mkdir($dirPath);
-
- }
-
- }
-
- // Create user keypair
- // we should never override a keyfile
- if (
- !$this->view->file_exists($this->publicKeyPath)
- && !$this->view->file_exists($this->privateKeyPath)
- ) {
-
- // Generate keypair
- $keypair = Crypt::createKeypair();
-
- if ($keypair) {
-
- \OC_FileProxy::$enabled = false;
-
- // Encrypt private key with user pwd as passphrase
- $encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $passphrase, Helper::getCipher());
-
- // Save key-pair
- if ($encryptedPrivateKey) {
- $header = crypt::generateHeader();
- $this->view->file_put_contents($this->privateKeyPath, $header . $encryptedPrivateKey);
- $this->view->file_put_contents($this->publicKeyPath, $keypair['publicKey']);
- }
-
- \OC_FileProxy::$enabled = true;
- }
-
- } else {
- // check if public-key exists but private-key is missing
- if ($this->view->file_exists($this->publicKeyPath) && !$this->view->file_exists($this->privateKeyPath)) {
- \OCP\Util::writeLog('Encryption library',
- 'public key exists but private key is missing for "' . $this->keyId . '"', \OCP\Util::FATAL);
- return false;
- } else {
- if (!$this->view->file_exists($this->publicKeyPath) && $this->view->file_exists($this->privateKeyPath)
- ) {
- \OCP\Util::writeLog('Encryption library',
- 'private key exists but public key is missing for "' . $this->keyId . '"', \OCP\Util::FATAL);
- return false;
- }
- }
- }
-
- return true;
-
- }
-
- /**
- * @return string
- */
- public function getPublicShareKeyId() {
- return $this->publicShareKeyId;
- }
-
- /**
- * Check whether pwd recovery is enabled for a given user
- * @return bool 1 = yes, 0 = no, false = no record
- *
- * @note If records are not being returned, check for a hidden space
- * at the start of the uid in db
- */
- public function recoveryEnabledForUser() {
-
- $recoveryMode = \OC::$server->getConfig()->getUserValue($this->userId, 'files_encryption', 'recovery_enabled', '0');
-
- return ($recoveryMode === '1') ? true : false;
-
- }
-
- /**
- * Enable / disable pwd recovery for a given user
- * @param bool $enabled Whether to enable or disable recovery
- * @return bool
- */
- public function setRecoveryForUser($enabled) {
-
- $value = $enabled ? '1' : '0';
- try {
- \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'recovery_enabled', $value);
- return true;
- } catch(\OCP\PreConditionNotMetException $e) {
- return false;
- }
-
- }
-
- /**
- * Find all files and their encryption status within a directory
- * @param string $directory The path of the parent directory to search
- * @param bool $found the founded files if called again
- * @return array keys: plain, encrypted, broken
- * @note $directory needs to be a path relative to OC data dir. e.g.
- * /admin/files NOT /backup OR /home/www/oc/data/admin/files
- */
- public function findEncFiles($directory, &$found = false) {
-
- // Disable proxy - we don't want files to be decrypted before
- // we handle them
- \OC_FileProxy::$enabled = false;
-
- if ($found === false) {
- $found = array(
- 'plain' => array(),
- 'encrypted' => array(),
- 'broken' => array(),
- );
- }
-
- if ($this->view->is_dir($directory) && $handle = $this->view->opendir($directory)){
- if (is_resource($handle)) {
- while (false !== ($file = readdir($handle))) {
-
- if ($file !== "." && $file !== "..") {
- // skip stray part files
- if (Helper::isPartialFilePath($file)) {
- continue;
- }
-
- $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file);
- $relPath = Helper::stripUserFilesPath($filePath);
-
- // If the path is a directory, search
- // its contents
- if ($this->view->is_dir($filePath)) {
-
- $this->findEncFiles($filePath, $found);
-
- // If the path is a file, determine
- // its encryption status
- } elseif ($this->view->is_file($filePath)) {
-
- // Disable proxies again, some-
- // where they got re-enabled :/
- \OC_FileProxy::$enabled = false;
-
- $isEncryptedPath = $this->isEncryptedPath($filePath);
- // If the file is encrypted
- // NOTE: If the userId is
- // empty or not set, file will
- // detected as plain
- // NOTE: This is inefficient;
- // scanning every file like this
- // will eat server resources :(
- if ($isEncryptedPath) {
-
- $fileKey = Keymanager::getFileKey($this->view, $this, $relPath);
- $shareKey = Keymanager::getShareKey($this->view, $this->userId, $this, $relPath);
- // if file is encrypted but now file key is available, throw exception
- if ($fileKey === false || $shareKey === false) {
- \OCP\Util::writeLog('encryption library', 'No keys available to decrypt the file: ' . $filePath, \OCP\Util::ERROR);
- $found['broken'][] = array(
- 'name' => $file,
- 'path' => $filePath,
- );
- } else {
- $found['encrypted'][] = array(
- 'name' => $file,
- 'path' => $filePath,
- );
- }
-
- // If the file is not encrypted
- } else {
-
- $found['plain'][] = array(
- 'name' => $file,
- 'path' => $relPath
- );
- }
- }
- }
- }
- }
- }
-
- \OC_FileProxy::$enabled = true;
-
- return $found;
- }
-
- /**
- * Check if a given path identifies an encrypted file
- * @param string $path
- * @return boolean
- */
- public function isEncryptedPath($path) {
-
- // Disable encryption proxy so data retrieved is in its
- // original form
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $data = '';
-
- // we only need 24 byte from the last chunk
- if ($this->view->file_exists($path)) {
- $handle = $this->view->fopen($path, 'r');
- if (is_resource($handle)) {
- // suppress fseek warining, we handle the case that fseek doesn't
- // work in the else branch
- if (@fseek($handle, -24, SEEK_END) === 0) {
- $data = fgets($handle);
- } else {
- // if fseek failed on the storage we create a local copy from the file
- // and read this one
- fclose($handle);
- $localFile = $this->view->getLocalFile($path);
- $handle = fopen($localFile, 'r');
- if (is_resource($handle) && fseek($handle, -24, SEEK_END) === 0) {
- $data = fgets($handle);
- }
- }
- fclose($handle);
- }
- }
-
- // re-enable proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- return Crypt::isCatfileContent($data);
- }
-
- /**
- * get the file size of the unencrypted file
- * @param string $path absolute path
- * @return bool
- */
- public function getFileSize($path) {
-
- $result = 0;
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // split the path parts
- $pathParts = explode('/', $path);
-
- if (isset($pathParts[2]) && $pathParts[2] === 'files' && $this->view->file_exists($path)
- && $this->isEncryptedPath($path)
- ) {
-
- $cipher = 'AES-128-CFB';
- $realSize = 0;
-
- // get the size from filesystem
- $size = $this->view->filesize($path);
-
- // open stream
- $stream = $this->view->fopen($path, "r");
-
- if (is_resource($stream)) {
-
- // if the file contains a encryption header we
- // we set the cipher
- // and we update the size
- if ($this->containHeader($path)) {
- $data = fread($stream,Crypt::BLOCKSIZE);
- $header = Crypt::parseHeader($data);
- $cipher = Crypt::getCipher($header);
- $size -= Crypt::BLOCKSIZE;
- }
-
- // fast path, else the calculation for $lastChunkNr is bogus
- if ($size === 0) {
- \OC_FileProxy::$enabled = $proxyStatus;
- return 0;
- }
-
- // calculate last chunk nr
- // next highest is end of chunks, one subtracted is last one
- // we have to read the last chunk, we can't just calculate it (because of padding etc)
- $lastChunkNr = ceil($size/Crypt::BLOCKSIZE)-1;
-
- // calculate last chunk position
- $lastChunkPos = ($lastChunkNr * Crypt::BLOCKSIZE);
-
- // get the content of the last chunk
- if (@fseek($stream, $lastChunkPos, SEEK_CUR) === 0) {
- $realSize+=$lastChunkNr*6126;
- }
- $lastChunkContentEncrypted='';
- $count=Crypt::BLOCKSIZE;
- while ($count>0) {
- $data=fread($stream,Crypt::BLOCKSIZE);
- $count=strlen($data);
- $lastChunkContentEncrypted.=$data;
- if(strlen($lastChunkContentEncrypted)>Crypt::BLOCKSIZE) {
- $realSize+=6126;
- $lastChunkContentEncrypted=substr($lastChunkContentEncrypted,Crypt::BLOCKSIZE);
- }
- }
- fclose($stream);
- $relPath = Helper::stripUserFilesPath($path);
- $shareKey = Keymanager::getShareKey($this->view, $this->keyId, $this, $relPath);
- if($shareKey===false) {
- \OC_FileProxy::$enabled = $proxyStatus;
- return $result;
- }
- $session = new Session($this->view);
- $privateKey = $session->getPrivateKey();
- $plainKeyfile = $this->decryptKeyfile($relPath, $privateKey);
- $plainKey = Crypt::multiKeyDecrypt($plainKeyfile, $shareKey, $privateKey);
- $lastChunkContent=Crypt::symmetricDecryptFileContent($lastChunkContentEncrypted, $plainKey, $cipher);
-
- // calc the real file size with the size of the last chunk
- $realSize += strlen($lastChunkContent);
-
- // store file size
- $result = $realSize;
- }
- }
-
- \OC_FileProxy::$enabled = $proxyStatus;
-
- return $result;
- }
-
- /**
- * check if encrypted file contain a encryption header
- *
- * @param string $path
- * @return boolean
- */
- private function containHeader($path) {
- // Disable encryption proxy to read the raw data
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $isHeader = false;
- $handle = $this->view->fopen($path, 'r');
-
- if (is_resource($handle)) {
- $firstBlock = fread($handle, Crypt::BLOCKSIZE);
- $isHeader = Crypt::isHeader($firstBlock);
- }
-
- \OC_FileProxy::$enabled = $proxyStatus;
-
- return $isHeader;
- }
-
- /**
- * fix the file size of the encrypted file
- * @param string $path absolute path
- * @return boolean true / false if file is encrypted
- */
- public function fixFileSize($path) {
-
- $result = false;
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $realSize = $this->getFileSize($path);
-
- if ($realSize > 0) {
-
- $cached = $this->view->getFileInfo($path);
- $cached['encrypted'] = true;
-
- // set the size
- $cached['unencrypted_size'] = $realSize;
-
- // put file info
- $this->view->putFileInfo($path, $cached);
-
- $result = true;
-
- }
-
- \OC_FileProxy::$enabled = $proxyStatus;
-
- return $result;
- }
-
- /**
- * encrypt versions from given file
- * @param array $filelist list of encrypted files, relative to data/user/files
- * @return boolean
- */
- private function encryptVersions($filelist) {
-
- $successful = true;
-
- if (\OCP\App::isEnabled('files_versions')) {
-
- foreach ($filelist as $filename) {
-
- $versions = \OCA\Files_Versions\Storage::getVersions($this->userId, $filename);
- foreach ($versions as $version) {
-
- $path = '/' . $this->userId . '/files_versions/' . $version['path'] . '.v' . $version['version'];
-
- $encHandle = fopen('crypt://' . $path . '.part', 'wb');
-
- if ($encHandle === false) {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '", decryption failed!', \OCP\Util::FATAL);
- $successful = false;
- continue;
- }
-
- $plainHandle = $this->view->fopen($path, 'rb');
- if ($plainHandle === false) {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '.part", decryption failed!', \OCP\Util::FATAL);
- $successful = false;
- continue;
- }
-
- stream_copy_to_stream($plainHandle, $encHandle);
-
- fclose($encHandle);
- fclose($plainHandle);
-
- $this->view->rename($path . '.part', $path);
- }
- }
- }
-
- return $successful;
- }
-
- /**
- * decrypt versions from given file
- * @param string $filelist list of decrypted files, relative to data/user/files
- * @return boolean
- */
- private function decryptVersions($filelist) {
-
- $successful = true;
-
- if (\OCP\App::isEnabled('files_versions')) {
-
- foreach ($filelist as $filename) {
-
- $versions = \OCA\Files_Versions\Storage::getVersions($this->userId, $filename);
- foreach ($versions as $version) {
-
- $path = '/' . $this->userId . '/files_versions/' . $version['path'] . '.v' . $version['version'];
-
- $encHandle = fopen('crypt://' . $path, 'rb');
-
- if ($encHandle === false) {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '", decryption failed!', \OCP\Util::FATAL);
- $successful = false;
- continue;
- }
-
- $plainHandle = $this->view->fopen($path . '.part', 'wb');
- if ($plainHandle === false) {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $path . '.part", decryption failed!', \OCP\Util::FATAL);
- $successful = false;
- continue;
- }
-
- stream_copy_to_stream($encHandle, $plainHandle);
-
- fclose($encHandle);
- fclose($plainHandle);
-
- $this->view->rename($path . '.part', $path);
- }
- }
- }
-
- return $successful;
- }
-
- /**
- * Decrypt all files
- * @return bool
- */
- public function decryptAll() {
-
- $found = $this->findEncFiles($this->userId . '/files');
-
- $successful = true;
-
- if ($found) {
-
- $versionStatus = \OCP\App::isEnabled('files_versions');
- \OC_App::disable('files_versions');
-
- $decryptedFiles = array();
-
- // Encrypt unencrypted files
- foreach ($found['encrypted'] as $encryptedFile) {
-
- //relative to data/<user>/file
- $relPath = Helper::stripUserFilesPath($encryptedFile['path']);
-
- //get file info
- $fileInfo = \OC\Files\Filesystem::getFileInfo($relPath);
-
- //relative to /data
- $rawPath = $encryptedFile['path'];
-
- //get timestamp
- $timestamp = $fileInfo['mtime'];
-
- //enable proxy to use OC\Files\View to access the original file
- \OC_FileProxy::$enabled = true;
-
- // Open enc file handle for binary reading
- $encHandle = $this->view->fopen($rawPath, 'rb');
-
- // Disable proxy to prevent file being encrypted again
- \OC_FileProxy::$enabled = false;
-
- if ($encHandle === false) {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $rawPath . '", decryption failed!', \OCP\Util::FATAL);
- $successful = false;
- continue;
- }
-
- // Open plain file handle for binary writing, with same filename as original plain file
- $plainHandle = $this->view->fopen($rawPath . '.part', 'wb');
- if ($plainHandle === false) {
- \OCP\Util::writeLog('Encryption library', 'couldn\'t open "' . $rawPath . '.part", decryption failed!', \OCP\Util::FATAL);
- $successful = false;
- continue;
- }
-
- // Move plain file to a temporary location
- $size = stream_copy_to_stream($encHandle, $plainHandle);
- if ($size === 0) {
- \OCP\Util::writeLog('Encryption library', 'Zero bytes copied of "' . $rawPath . '", decryption failed!', \OCP\Util::FATAL);
- $successful = false;
- continue;
- }
-
- fclose($encHandle);
- fclose($plainHandle);
-
- $fakeRoot = $this->view->getRoot();
- $this->view->chroot('/' . $this->userId . '/files');
-
- $this->view->rename($relPath . '.part', $relPath);
-
- //set timestamp
- $this->view->touch($relPath, $timestamp);
-
- $this->view->chroot($fakeRoot);
-
- // Add the file to the cache
- \OC\Files\Filesystem::putFileInfo($relPath, array(
- 'encrypted' => false,
- 'size' => $size,
- 'unencrypted_size' => 0,
- 'etag' => $fileInfo['etag']
- ));
-
- $decryptedFiles[] = $relPath;
-
- }
-
- if ($versionStatus) {
- \OC_App::enable('files_versions');
- }
-
- if (!$this->decryptVersions($decryptedFiles)) {
- $successful = false;
- }
-
- // if there are broken encrypted files than the complete decryption
- // was not successful
- if (!empty($found['broken'])) {
- $successful = false;
- }
-
- if ($successful) {
- $this->backupAllKeys('decryptAll', false, false);
- $this->view->deleteAll($this->keysPath);
- }
-
- \OC_FileProxy::$enabled = true;
- }
-
- return $successful;
- }
-
- /**
- * Encrypt all files in a directory
- * @param string $dirPath the directory whose files will be encrypted
- * @return bool
- * @note Encryption is recursive
- */
- public function encryptAll($dirPath) {
-
- $result = true;
-
- $found = $this->findEncFiles($dirPath);
-
- // Disable proxy to prevent file being encrypted twice
- \OC_FileProxy::$enabled = false;
-
- $versionStatus = \OCP\App::isEnabled('files_versions');
- \OC_App::disable('files_versions');
-
- $encryptedFiles = array();
-
- // Encrypt unencrypted files
- foreach ($found['plain'] as $plainFile) {
-
- //get file info
- $fileInfo = \OC\Files\Filesystem::getFileInfo($plainFile['path']);
-
- //relative to data/<user>/file
- $relPath = $plainFile['path'];
-
- //relative to /data
- $rawPath = '/' . $this->userId . '/files/' . $plainFile['path'];
-
- // keep timestamp
- $timestamp = $fileInfo['mtime'];
-
- // Open plain file handle for binary reading
- $plainHandle = $this->view->fopen($rawPath, 'rb');
-
- // Open enc file handle for binary writing, with same filename as original plain file
- $encHandle = fopen('crypt://' . $rawPath . '.part', 'wb');
-
- if (is_resource($encHandle) && is_resource($plainHandle)) {
- // Move plain file to a temporary location
- $size = stream_copy_to_stream($plainHandle, $encHandle);
-
- fclose($encHandle);
- fclose($plainHandle);
-
- $fakeRoot = $this->view->getRoot();
- $this->view->chroot('/' . $this->userId . '/files');
-
- $this->view->rename($relPath . '.part', $relPath);
-
- // set timestamp
- $this->view->touch($relPath, $timestamp);
-
- $encSize = $this->view->filesize($relPath);
-
- $this->view->chroot($fakeRoot);
-
- // Add the file to the cache
- \OC\Files\Filesystem::putFileInfo($relPath, array(
- 'encrypted' => true,
- 'size' => $encSize,
- 'unencrypted_size' => $size,
- 'etag' => $fileInfo['etag']
- ));
-
- $encryptedFiles[] = $relPath;
- } else {
- \OCP\Util::writeLog('files_encryption', 'initial encryption: could not encrypt ' . $rawPath, \OCP\Util::FATAL);
- $result = false;
- }
- }
-
- \OC_FileProxy::$enabled = true;
-
- if ($versionStatus) {
- \OC_App::enable('files_versions');
- }
-
- $result = $result && $this->encryptVersions($encryptedFiles);
-
- return $result;
-
- }
-
- /**
- * Return important encryption related paths
- * @param string $pathName Name of the directory to return the path of
- * @return string path
- */
- public function getPath($pathName) {
-
- switch ($pathName) {
-
- case 'publicKeyDir':
-
- return $this->publicKeyDir;
-
- break;
-
- case 'encryptionDir':
-
- return $this->encryptionDir;
-
- break;
-
- case 'keysPath':
-
- return $this->keysPath;
-
- break;
-
- case 'publicKeyPath':
-
- return $this->publicKeyPath;
-
- break;
-
- case 'privateKeyPath':
-
- return $this->privateKeyPath;
-
- break;
- }
-
- return false;
-
- }
-
- /**
- * Returns whether the given user is ready for encryption.
- * Also returns true if the given user is the public user
- * or the recovery key user.
- *
- * @param string $user user to check
- *
- * @return boolean true if the user is ready, false otherwise
- */
- private function isUserReady($user) {
- if ($user === $this->publicShareKeyId
- || $user === $this->recoveryKeyId
- ) {
- return true;
- }
- $util = new Util($this->view, $user);
- return $util->ready();
- }
-
- /**
- * Filter an array of UIDs to return only ones ready for sharing
- * @param array $unfilteredUsers users to be checked for sharing readiness
- * @return array as multi-dimensional array. keys: ready, unready
- */
- public function filterShareReadyUsers($unfilteredUsers) {
-
- // This array will collect the filtered IDs
- $readyIds = $unreadyIds = array();
-
- // Loop through users and create array of UIDs that need new keyfiles
- foreach ($unfilteredUsers as $user) {
- // Check that the user is encryption capable, or is the
- // public system user (for public shares)
- if ($this->isUserReady($user)) {
-
- // Construct array of ready UIDs for Keymanager{}
- $readyIds[] = $user;
-
- } else {
-
- // Construct array of unready UIDs for Keymanager{}
- $unreadyIds[] = $user;
-
- // Log warning; we can't do necessary setup here
- // because we don't have the user passphrase
- \OCP\Util::writeLog('Encryption library',
- '"' . $user . '" is not setup for encryption', \OCP\Util::WARN);
-
- }
-
- }
-
- return array(
- 'ready' => $readyIds,
- 'unready' => $unreadyIds
- );
-
- }
-
- /**
- * Decrypt a keyfile
- * @param string $filePath
- * @param string $privateKey
- * @return false|string
- */
- private function decryptKeyfile($filePath, $privateKey) {
-
- // Get the encrypted keyfile
- $encKeyfile = Keymanager::getFileKey($this->view, $this, $filePath);
-
- // The file has a shareKey and must use it for decryption
- $shareKey = Keymanager::getShareKey($this->view, $this->keyId, $this, $filePath);
-
- $plainKeyfile = Crypt::multiKeyDecrypt($encKeyfile, $shareKey, $privateKey);
-
- return $plainKeyfile;
- }
-
- /**
- * Encrypt keyfile to multiple users
- * @param Session $session
- * @param array $users list of users which should be able to access the file
- * @param string $filePath path of the file to be shared
- * @return bool
- */
- public function setSharedFileKeyfiles(Session $session, array $users, $filePath) {
-
- // Make sure users are capable of sharing
- $filteredUids = $this->filterShareReadyUsers($users);
-
- // If we're attempting to share to unready users
- if (!empty($filteredUids['unready'])) {
-
- \OCP\Util::writeLog('Encryption library',
- 'Sharing to these user(s) failed as they are unready for encryption:"'
- . print_r($filteredUids['unready'], 1), \OCP\Util::WARN);
-
- return false;
-
- }
-
- // Get public keys for each user, ready for generating sharekeys
- $userPubKeys = Keymanager::getPublicKeys($this->view, $filteredUids['ready']);
-
- // Note proxy status then disable it
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Get the current users's private key for decrypting existing keyfile
- $privateKey = $session->getPrivateKey();
-
- try {
- // Decrypt keyfile
- $plainKeyfile = $this->decryptKeyfile($filePath, $privateKey);
- // Re-enc keyfile to (additional) sharekeys
- $multiEncKey = Crypt::multiKeyEncrypt($plainKeyfile, $userPubKeys);
- } catch (Exception\EncryptionException $e) {
- $msg = 'set shareFileKeyFailed (code: ' . $e->getCode() . '): ' . $e->getMessage();
- \OCP\Util::writeLog('files_encryption', $msg, \OCP\Util::FATAL);
- return false;
- } catch (\Exception $e) {
- $msg = 'set shareFileKeyFailed (unknown error): ' . $e->getMessage();
- \OCP\Util::writeLog('files_encryption', $msg, \OCP\Util::FATAL);
- return false;
- }
-
- // Save the recrypted key to it's owner's keyfiles directory
- // Save new sharekeys to all necessary user directory
- if (
- !Keymanager::setFileKey($this->view, $this, $filePath, $multiEncKey['data'])
- || !Keymanager::setShareKeys($this->view, $this, $filePath, $multiEncKey['keys'])
- ) {
-
- \OCP\Util::writeLog('Encryption library',
- 'Keyfiles could not be saved for users sharing ' . $filePath, \OCP\Util::ERROR);
-
- return false;
-
- }
-
- // Return proxy to original status
- \OC_FileProxy::$enabled = $proxyStatus;
-
- return true;
- }
-
- /**
- * Find, sanitise and format users sharing a file
- * @note This wraps other methods into a portable bundle
- * @param boolean $sharingEnabled
- * @param string $filePath path relativ to current users files folder
- */
- public function getSharingUsersArray($sharingEnabled, $filePath) {
-
- $appConfig = \OC::$server->getAppConfig();
-
- // Check if key recovery is enabled
- if (
- $appConfig->getValue('files_encryption', 'recoveryAdminEnabled')
- && $this->recoveryEnabledForUser()
- ) {
- $recoveryEnabled = true;
- } else {
- $recoveryEnabled = false;
- }
-
- // Make sure that a share key is generated for the owner too
- list($owner, $ownerPath) = $this->getUidAndFilename($filePath);
-
- $ownerPath = Helper::stripPartialFileExtension($ownerPath);
-
- // always add owner to the list of users with access to the file
- $userIds = array($owner);
-
- if ($sharingEnabled) {
-
- // Find out who, if anyone, is sharing the file
- $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner);
- $userIds = \array_merge($userIds, $result['users']);
- if ($result['public'] || $result['remote']) {
- $userIds[] = $this->publicShareKeyId;
- }
-
- }
-
- // If recovery is enabled, add the
- // Admin UID to list of users to share to
- if ($recoveryEnabled) {
- // Find recoveryAdmin user ID
- $recoveryKeyId = $appConfig->getValue('files_encryption', 'recoveryKeyId');
- // Add recoveryAdmin to list of users sharing
- $userIds[] = $recoveryKeyId;
- }
-
- // check if it is a group mount
- if (\OCP\App::isEnabled("files_external")) {
- $mounts = \OC_Mount_Config::getSystemMountPoints();
- foreach ($mounts as $mount) {
- if ($mount['mountpoint'] == substr($ownerPath, 1, strlen($mount['mountpoint']))) {
- $userIds = array_merge($userIds, $this->getUserWithAccessToMountPoint($mount['applicable']['users'], $mount['applicable']['groups']));
- }
- }
- }
-
- // Remove duplicate UIDs
- $uniqueUserIds = array_unique($userIds);
-
- return $uniqueUserIds;
-
- }
-
- private function getUserWithAccessToMountPoint($users, $groups) {
- $result = array();
- if (in_array('all', $users)) {
- $result = \OCP\User::getUsers();
- } else {
- $result = array_merge($result, $users);
- foreach ($groups as $group) {
- $result = array_merge($result, \OC_Group::usersInGroup($group));
- }
- }
-
- return $result;
- }
-
- /**
- * set migration status
- * @param int $status
- * @param int $preCondition only update migration status if the previous value equals $preCondition
- * @return boolean
- */
- private function setMigrationStatus($status, $preCondition = null) {
-
- // convert to string if preCondition is set
- $preCondition = ($preCondition === null) ? null : (string)$preCondition;
-
- try {
- \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'migration_status', (string)$status, $preCondition);
- return true;
- } catch(\OCP\PreConditionNotMetException $e) {
- return false;
- }
-
- }
-
- /**
- * start migration mode to initially encrypt users data
- * @return boolean
- */
- public function beginMigration() {
-
- $result = $this->setMigrationStatus(self::MIGRATION_IN_PROGRESS, self::MIGRATION_OPEN);
-
- if ($result) {
- \OCP\Util::writeLog('Encryption library', "Start migration to encryption mode for " . $this->userId, \OCP\Util::INFO);
- } else {
- \OCP\Util::writeLog('Encryption library', "Could not activate migration mode for " . $this->userId . ". Probably another process already started the initial encryption", \OCP\Util::WARN);
- }
-
- return $result;
- }
-
- public function resetMigrationStatus() {
- return $this->setMigrationStatus(self::MIGRATION_OPEN);
-
- }
-
- /**
- * close migration mode after users data has been encrypted successfully
- * @return boolean
- */
- public function finishMigration() {
- $result = $this->setMigrationStatus(self::MIGRATION_COMPLETED);
-
- if ($result) {
- \OCP\Util::writeLog('Encryption library', "Finish migration successfully for " . $this->userId, \OCP\Util::INFO);
- } else {
- \OCP\Util::writeLog('Encryption library', "Could not deactivate migration mode for " . $this->userId, \OCP\Util::WARN);
- }
-
- return $result;
- }
-
- /**
- * check if files are already migrated to the encryption system
- * @return int|false migration status, false = in case of no record
- * @note If records are not being returned, check for a hidden space
- * at the start of the uid in db
- */
- public function getMigrationStatus() {
-
- $migrationStatus = false;
- if (\OCP\User::userExists($this->userId)) {
- $migrationStatus = \OC::$server->getConfig()->getUserValue($this->userId, 'files_encryption', 'migration_status', null);
- if ($migrationStatus === null) {
- \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'migration_status', (string)self::MIGRATION_OPEN);
- $migrationStatus = self::MIGRATION_OPEN;
- }
- }
-
- return (int)$migrationStatus;
-
- }
-
- /**
- * get uid of the owners of the file and the path to the file
- * @param string $path Path of the file to check
- * @throws \Exception
- * @note $shareFilePath must be relative to data/UID/files. Files
- * relative to /Shared are also acceptable
- * @return array
- */
- public function getUidAndFilename($path) {
-
- $pathinfo = pathinfo($path);
- $partfile = false;
- $parentFolder = false;
- if (array_key_exists('extension', $pathinfo) && $pathinfo['extension'] === 'part') {
- // if the real file exists we check this file
- $filePath = $this->userFilesDir . '/' .$pathinfo['dirname'] . '/' . $pathinfo['filename'];
- if ($this->view->file_exists($filePath)) {
- $pathToCheck = $pathinfo['dirname'] . '/' . $pathinfo['filename'];
- } else { // otherwise we look for the parent
- $pathToCheck = $pathinfo['dirname'];
- $parentFolder = true;
- }
- $partfile = true;
- } else {
- $pathToCheck = $path;
- }
-
- $view = new \OC\Files\View($this->userFilesDir);
- $fileOwnerUid = $view->getOwner($pathToCheck);
-
- // handle public access
- if ($this->isPublic) {
- return array($this->userId, $path);
- } else {
-
- // Check that UID is valid
- if (!\OCP\User::userExists($fileOwnerUid)) {
- throw new \Exception(
- 'Could not find owner (UID = "' . var_export($fileOwnerUid, 1) . '") of file "' . $path . '"');
- }
-
- // NOTE: Bah, this dependency should be elsewhere
- \OC\Files\Filesystem::initMountPoints($fileOwnerUid);
-
- // If the file owner is the currently logged in user
- if ($fileOwnerUid === $this->userId) {
-
- // Assume the path supplied is correct
- $filename = $path;
-
- } else {
- $info = $view->getFileInfo($pathToCheck);
- $ownerView = new \OC\Files\View('/' . $fileOwnerUid . '/files');
-
- // Fetch real file path from DB
- $filename = $ownerView->getPath($info['fileid']);
- if ($parentFolder) {
- $filename = $filename . '/'. $pathinfo['filename'];
- }
-
- if ($partfile) {
- $filename = $filename . '.' . $pathinfo['extension'];
- }
-
- }
-
- return array(
- $fileOwnerUid,
- \OC\Files\Filesystem::normalizePath($filename)
- );
- }
- }
-
- /**
- * go recursively through a dir and collect all files and sub files.
- * @param string $dir relative to the users files folder
- * @return array with list of files relative to the users files folder
- */
- public function getAllFiles($dir, $mountPoint = '') {
- $result = array();
- $dirList = array($dir);
-
- while ($dirList) {
- $dir = array_pop($dirList);
- $content = $this->view->getDirectoryContent(\OC\Files\Filesystem::normalizePath(
- $this->userFilesDir . '/' . $dir));
-
- foreach ($content as $c) {
- // getDirectoryContent() returns the paths relative to the mount points, so we need
- // to re-construct the complete path
- $path = ($mountPoint !== '') ? $mountPoint . '/' . $c['path'] : $c['path'];
- $path = \OC\Files\Filesystem::normalizePath($path);
- if ($c['type'] === 'dir') {
- $dirList[] = substr($path, strlen('/' . \OCP\User::getUser() . "/files"));
- } else {
- $result[] = substr($path, strlen('/' . \OCP\User::getUser() . "/files"));
- }
- }
-
- }
-
- return $result;
- }
-
- /**
- * get owner of the shared files.
- * @param int $id ID of a share
- * @return string owner
- */
- public function getOwnerFromSharedFile($id) {
-
- $query = \OCP\DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
-
- $result = $query->execute(array($id));
-
- $source = null;
- if (\OCP\DB::isError($result)) {
- \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
- } else {
- $source = $result->fetchRow();
- }
-
- $fileOwner = false;
-
- if ($source && isset($source['parent'])) {
-
- $parent = $source['parent'];
-
- while (isset($parent)) {
-
- $query = \OCP\DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
-
- $result = $query->execute(array($parent));
-
- $item = null;
- if (\OCP\DB::isError($result)) {
- \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
- } else {
- $item = $result->fetchRow();
- }
-
- if ($item && isset($item['parent'])) {
-
- $parent = $item['parent'];
-
- } else {
-
- $fileOwner = $item['uid_owner'];
-
- break;
-
- }
- }
-
- } else {
-
- $fileOwner = $source['uid_owner'];
-
- }
-
- return $fileOwner;
-
- }
-
- /**
- * @return string
- */
- public function getUserId() {
- return $this->userId;
- }
-
- /**
- * @return string
- */
- public function getKeyId() {
- return $this->keyId;
- }
-
- /**
- * @return string
- */
- public function getUserFilesDir() {
- return $this->userFilesDir;
- }
-
- /**
- * @param string $password
- * @return bool
- */
- public function checkRecoveryPassword($password) {
-
- $result = false;
-
- $recoveryKey = Keymanager::getPrivateSystemKey($this->recoveryKeyId);
- $decryptedRecoveryKey = Crypt::decryptPrivateKey($recoveryKey, $password);
-
- if ($decryptedRecoveryKey) {
- $result = true;
- }
-
- return $result;
- }
-
- /**
- * @return string
- */
- public function getRecoveryKeyId() {
- return $this->recoveryKeyId;
- }
-
- /**
- * add recovery key to all encrypted files
- */
- public function addRecoveryKeys($path = '/') {
- $dirContent = $this->view->getDirectoryContent($this->keysPath . '/' . $path);
- foreach ($dirContent as $item) {
- // get relative path from files_encryption/keyfiles/
- $filePath = substr($item['path'], strlen('files_encryption/keys'));
- if ($this->view->is_dir($this->userFilesDir . '/' . $filePath)) {
- $this->addRecoveryKeys($filePath . '/');
- } else {
- $session = new Session(new \OC\Files\View('/'));
- $sharingEnabled = \OCP\Share::isEnabled();
- $usersSharing = $this->getSharingUsersArray($sharingEnabled, $filePath);
- $this->setSharedFileKeyfiles($session, $usersSharing, $filePath);
- }
- }
- }
-
- /**
- * remove recovery key to all encrypted files
- */
- public function removeRecoveryKeys($path = '/') {
- $dirContent = $this->view->getDirectoryContent($this->keysPath . '/' . $path);
- foreach ($dirContent as $item) {
- // get relative path from files_encryption/keyfiles
- $filePath = substr($item['path'], strlen('files_encryption/keys'));
- if ($this->view->is_dir($this->userFilesDir . '/' . $filePath)) {
- $this->removeRecoveryKeys($filePath . '/');
- } else {
- $this->view->unlink($this->keysPath . '/' . $filePath . '/' . $this->recoveryKeyId . '.shareKey');
- }
- }
- }
-
- /**
- * decrypt given file with recovery key and encrypt it again to the owner and his new key
- * @param string $file
- * @param string $privateKey recovery key to decrypt the file
- */
- private function recoverFile($file, $privateKey) {
-
- $sharingEnabled = \OCP\Share::isEnabled();
-
- // Find out who, if anyone, is sharing the file
- if ($sharingEnabled) {
- $result = \OCP\Share::getUsersSharingFile($file, $this->userId, true);
- $userIds = $result['users'];
- $userIds[] = $this->recoveryKeyId;
- if ($result['public']) {
- $userIds[] = $this->publicShareKeyId;
- }
- } else {
- $userIds = array(
- $this->userId,
- $this->recoveryKeyId
- );
- }
- $filteredUids = $this->filterShareReadyUsers($userIds);
-
- //decrypt file key
- $encKeyfile = Keymanager::getFileKey($this->view, $this, $file);
- $shareKey = Keymanager::getShareKey($this->view, $this->recoveryKeyId, $this, $file);
- $plainKeyfile = Crypt::multiKeyDecrypt($encKeyfile, $shareKey, $privateKey);
- // encrypt file key again to all users, this time with the new public key for the recovered use
- $userPubKeys = Keymanager::getPublicKeys($this->view, $filteredUids['ready']);
- $multiEncKey = Crypt::multiKeyEncrypt($plainKeyfile, $userPubKeys);
-
- Keymanager::setFileKey($this->view, $this, $file, $multiEncKey['data']);
- Keymanager::setShareKeys($this->view, $this, $file, $multiEncKey['keys']);
-
- }
-
- /**
- * collect all files and recover them one by one
- * @param string $path to look for files keys
- * @param string $privateKey private recovery key which is used to decrypt the files
- */
- private function recoverAllFiles($path, $privateKey) {
- $dirContent = $this->view->getDirectoryContent($this->keysPath . '/' . $path);
- foreach ($dirContent as $item) {
- // get relative path from files_encryption/keyfiles
- $filePath = substr($item['path'], strlen('files_encryption/keys'));
- if ($this->view->is_dir($this->userFilesDir . '/' . $filePath)) {
- $this->recoverAllFiles($filePath . '/', $privateKey);
- } else {
- $this->recoverFile($filePath, $privateKey);
- }
- }
- }
-
- /**
- * recover users files in case of password lost
- * @param string $recoveryPassword
- */
- public function recoverUsersFiles($recoveryPassword) {
-
- $encryptedKey = Keymanager::getPrivateSystemKey( $this->recoveryKeyId);
- $privateKey = Crypt::decryptPrivateKey($encryptedKey, $recoveryPassword);
-
- $this->recoverAllFiles('/', $privateKey);
- }
-
- /**
- * create a backup of all keys from the user
- *
- * @param string $purpose define the purpose of the backup, will be part of the backup folder name
- * @param boolean $timestamp (optional) should a timestamp be added, default true
- * @param boolean $includeUserKeys (optional) include users private-/public-key, default true
- */
- public function backupAllKeys($purpose, $timestamp = true, $includeUserKeys = true) {
- $this->userId;
- $backupDir = $this->encryptionDir . '/backup.' . $purpose;
- $backupDir .= ($timestamp) ? '.' . date("Y-m-d_H-i-s") . '/' : '/';
- $this->view->mkdir($backupDir);
- $this->view->copy($this->keysPath, $backupDir . 'keys/');
- if ($includeUserKeys) {
- $this->view->copy($this->privateKeyPath, $backupDir . $this->userId . '.privateKey');
- $this->view->copy($this->publicKeyPath, $backupDir . $this->userId . '.publicKey');
- }
- }
-
- /**
- * restore backup
- *
- * @param string $backup complete name of the backup
- * @return boolean
- */
- public function restoreBackup($backup) {
- $backupDir = $this->encryptionDir . '/backup.' . $backup . '/';
-
- $fileKeysRestored = $this->view->rename($backupDir . 'keys', $this->encryptionDir . '/keys');
-
- $pubKeyRestored = $privKeyRestored = true;
- if (
- $this->view->file_exists($backupDir . $this->userId . '.privateKey') &&
- $this->view->file_exists($backupDir . $this->userId . '.privateKey')
- ) {
-
- $pubKeyRestored = $this->view->rename($backupDir . $this->userId . '.publicKey', $this->publicKeyPath);
- $privKeyRestored = $this->view->rename($backupDir . $this->userId . '.privateKey', $this->privateKeyPath);
- }
-
- if ($fileKeysRestored && $pubKeyRestored && $privKeyRestored) {
- $this->view->deleteAll($backupDir);
-
- return true;
- }
-
- return false;
- }
-
- /**
- * delete backup
- *
- * @param string $backup complete name of the backup
- * @return boolean
- */
- public function deleteBackup($backup) {
- $backupDir = $this->encryptionDir . '/backup.' . $backup . '/';
- return $this->view->deleteAll($backupDir);
- }
-
- /**
- * check if the file is stored on a system wide mount point
- * @param string $path relative to /data/user with leading '/'
- * @return boolean
- */
- public function isSystemWideMountPoint($path) {
- $normalizedPath = ltrim($path, '/');
- if (\OCP\App::isEnabled("files_external")) {
- $mounts = \OC_Mount_Config::getSystemMountPoints();
- foreach ($mounts as $mount) {
- if ($mount['mountpoint'] == substr($normalizedPath, 0, strlen($mount['mountpoint']))) {
- if ($this->isMountPointApplicableToUser($mount)) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- /**
- * check if mount point is applicable to user
- *
- * @param array $mount contains $mount['applicable']['users'], $mount['applicable']['groups']
- * @return boolean
- */
- protected function isMountPointApplicableToUser($mount) {
- $uid = \OCP\User::getUser();
- $acceptedUids = array('all', $uid);
- // check if mount point is applicable for the user
- $intersection = array_intersect($acceptedUids, $mount['applicable']['users']);
- if (!empty($intersection)) {
- return true;
- }
- // check if mount point is applicable for group where the user is a member
- foreach ($mount['applicable']['groups'] as $gid) {
- if (\OC_Group::inGroup($uid, $gid)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * decrypt private key and add it to the current session
- * @param array $params with 'uid' and 'password'
- * @return mixed session or false
- */
- public function initEncryption($params) {
-
- $session = new Session($this->view);
-
- // we tried to initialize the encryption app for this session
- $session->setInitialized(Session::INIT_EXECUTED);
-
- $encryptedKey = Keymanager::getPrivateKey($this->view, $params['uid']);
-
- $privateKey = false;
- if ($encryptedKey) {
- $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']);
- }
-
- if ($privateKey === false) {
- \OCP\Util::writeLog('Encryption library', 'Private key for user "' . $params['uid']
- . '" is not valid! Maybe the user password was changed from outside if so please change it back to gain access', \OCP\Util::ERROR);
- return false;
- }
-
- $session->setPrivateKey($privateKey);
- $session->setInitialized(Session::INIT_SUCCESSFUL);
-
- return $session;
- }
-
- /*
- * remove encryption related keys from the session
- */
- public function closeEncryptionSession() {
- $session = new Session($this->view);
- $session->closeSession();
- }
-
-}
diff --git a/apps/files_encryption/settings-personal.php b/apps/files_encryption/settings-personal.php
deleted file mode 100644
index e3658fb0605..00000000000
--- a/apps/files_encryption/settings-personal.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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/>
- *
- */
-
-// Add CSS stylesheet
-\OC_Util::addStyle('files_encryption', 'settings-personal');
-
-$tmpl = new OCP\Template('files_encryption', 'settings-personal');
-
-$user = \OCP\USER::getUser();
-$view = new \OC\Files\View('/');
-$util = new \OCA\Files_Encryption\Util($view, $user);
-$session = new \OCA\Files_Encryption\Session($view);
-
-$privateKeySet = $session->getPrivateKey() !== false;
-// did we tried to initialize the keys for this session?
-$initialized = $session->getInitialized();
-
-$recoveryAdminEnabled = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled');
-$recoveryEnabledForUser = $util->recoveryEnabledForUser();
-
-$result = false;
-
-if ($recoveryAdminEnabled || !$privateKeySet) {
-
- \OCP\Util::addscript('files_encryption', 'settings-personal');
-
- $tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
- $tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser);
- $tmpl->assign('privateKeySet', $privateKeySet);
- $tmpl->assign('initialized', $initialized);
-
- $result = $tmpl->fetchPage();
-}
-
-return $result;
-
diff --git a/apps/files_encryption/templates/invalid_private_key.php b/apps/files_encryption/templates/invalid_private_key.php
deleted file mode 100644
index b148e65b199..00000000000
--- a/apps/files_encryption/templates/invalid_private_key.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<ul>
- <li class='error'>
- <?php $location = \OC_Helper::linkToRoute( "settings_personal" ).'#changePKPasswd' ?>
-
- <?php p($_['message']); ?>
- <br/>
- <?php if($_['errorCode'] === \OCA\Files_Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR): ?>
- <?php p($l->t('Go directly to your %spersonal settings%s.', array('<a href="'.$location.'">', '</a>'))); ?>
- <?php endif; ?>
- <br/>
- </li>
-</ul>
diff --git a/apps/files_encryption/tests/binary b/apps/files_encryption/tests/binary
deleted file mode 100644
index 79bc99479da..00000000000
--- a/apps/files_encryption/tests/binary
+++ /dev/null
Binary files differ
diff --git a/apps/files_encryption/tests/crypt.php b/apps/files_encryption/tests/crypt.php
deleted file mode 100755
index 4ce8f9a926d..00000000000
--- a/apps/files_encryption/tests/crypt.php
+++ /dev/null
@@ -1,678 +0,0 @@
-<?php
-/**
- * @author Andreas Fischer <bantu@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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\Files_Encryption\Tests;
-
-/**
- * Class Crypt
- */
-class Crypt extends TestCase {
-
- const TEST_ENCRYPTION_CRYPT_USER1 = "test-crypt-user1";
-
- public $userId;
- public $pass;
- public $stateFilesTrashbin;
- public $dataLong;
- public $dataUrl;
- public $dataShort;
- /**
- * @var \OC\Files\View
- */
- public $view;
- public $legacyEncryptedData;
- public $genPrivateKey;
- public $genPublicKey;
-
- /** @var \OCP\IConfig */
- private $config;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // create test user
- self::loginHelper(self::TEST_ENCRYPTION_CRYPT_USER1, true);
- }
-
- protected function setUp() {
- parent::setUp();
-
- // set user id
- self::loginHelper(self::TEST_ENCRYPTION_CRYPT_USER1);
- $this->userId = self::TEST_ENCRYPTION_CRYPT_USER1;
- $this->pass = self::TEST_ENCRYPTION_CRYPT_USER1;
-
- // set content for encrypting / decrypting in tests
- $this->dataLong = file_get_contents(__DIR__ . '/../lib/crypt.php');
- $this->dataShort = 'hats';
- $this->dataUrl = __DIR__ . '/../lib/crypt.php';
- $this->legacyData = __DIR__ . '/legacy-text.txt';
- $this->legacyEncryptedData = __DIR__ . '/legacy-encrypted-text.txt';
- $this->legacyEncryptedDataKey = __DIR__ . '/encryption.key';
- $this->randomKey = \OCA\Files_Encryption\Crypt::generateKey();
-
- $keypair = \OCA\Files_Encryption\Crypt::createKeypair();
- $this->genPublicKey = $keypair['publicKey'];
- $this->genPrivateKey = $keypair['privateKey'];
-
- $this->view = new \OC\Files\View('/');
-
- // remember files_trashbin state
- $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we don't want to tests with app files_trashbin enabled
- \OC_App::disable('files_trashbin');
-
- $this->config = \OC::$server->getConfig();
- }
-
- protected function tearDown() {
- // reset app files_trashbin
- if ($this->stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- } else {
- \OC_App::disable('files_trashbin');
- }
-
- $this->assertTrue(\OC_FileProxy::$enabled);
- $this->config->deleteSystemValue('cipher');
-
- parent::tearDown();
- }
-
- public static function tearDownAfterClass() {
- // cleanup test user
- \OC_User::deleteUser(self::TEST_ENCRYPTION_CRYPT_USER1);
-
- parent::tearDownAfterClass();
- }
-
- /**
- * @medium
- */
- public function testGenerateKey() {
-
- # TODO: use more accurate (larger) string length for test confirmation
-
- $key = \OCA\Files_Encryption\Crypt::generateKey();
-
- $this->assertTrue(strlen($key) > 16);
-
- }
-
- public function testDecryptPrivateKey() {
-
- // test successful decrypt
- $crypted = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->genPrivateKey, 'hat');
-
- $header = \OCA\Files_Encryption\Crypt::generateHeader();
-
- $decrypted = \OCA\Files_Encryption\Crypt::decryptPrivateKey($header . $crypted, 'hat');
-
- $this->assertEquals($this->genPrivateKey, $decrypted);
-
- //test private key decrypt with wrong password
- $wrongPasswd = \OCA\Files_Encryption\Crypt::decryptPrivateKey($crypted, 'hat2');
-
- $this->assertEquals(false, $wrongPasswd);
-
- }
-
-
- /**
- * @medium
- */
- public function testSymmetricEncryptFileContent() {
-
- # TODO: search in keyfile for actual content as IV will ensure this test always passes
-
- $crypted = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->dataShort, 'hat');
-
- $this->assertNotEquals($this->dataShort, $crypted);
-
-
- $decrypt = \OCA\Files_Encryption\Crypt::symmetricDecryptFileContent($crypted, 'hat');
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- }
-
- /**
- * @medium
- */
- public function testSymmetricEncryptFileContentAes128() {
-
- # TODO: search in keyfile for actual content as IV will ensure this test always passes
-
- $crypted = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->dataShort, 'hat', 'AES-128-CFB');
-
- $this->assertNotEquals($this->dataShort, $crypted);
-
-
- $decrypt = \OCA\Files_Encryption\Crypt::symmetricDecryptFileContent($crypted, 'hat', 'AES-128-CFB');
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- }
-
- /**
- * @medium
- */
- public function testSymmetricStreamEncryptShortFileContent() {
-
- $filename = 'tmp-' . $this->getUniqueID() . '.test';
-
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/'. $filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Get file contents without using any wrapper to get it's actual contents on disk
- $retreivedCryptedFile = $this->view->file_get_contents($this->userId . '/files/' . $filename);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // Check that the file was encrypted before being written to disk
- $this->assertNotEquals($this->dataShort, $retreivedCryptedFile);
-
- // Get file contents with the encryption wrapper
- $decrypted = file_get_contents('crypt:///' . $this->userId . '/files/'. $filename);
-
- // Check that decrypted data matches
- $this->assertEquals($this->dataShort, $decrypted);
-
- // Teardown
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- /**
- * @medium
- */
- public function testSymmetricStreamEncryptShortFileContentAes128() {
-
- $filename = 'tmp-' . $this->getUniqueID() . '.test';
-
- $this->config->setSystemValue('cipher', 'AES-128-CFB');
-
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/'. $filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- $this->config->deleteSystemValue('cipher');
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Get file contents without using any wrapper to get it's actual contents on disk
- $retreivedCryptedFile = $this->view->file_get_contents($this->userId . '/files/' . $filename);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // Check that the file was encrypted before being written to disk
- $this->assertNotEquals($this->dataShort, $retreivedCryptedFile);
-
- // Get file contents with the encryption wrapper
- $decrypted = file_get_contents('crypt:///' . $this->userId . '/files/'. $filename);
-
- // Check that decrypted data matches
- $this->assertEquals($this->dataShort, $decrypted);
-
- // Teardown
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- /**
- * @medium
- * Test that data that is written by the crypto stream wrapper
- * @note Encrypted data is manually prepared and decrypted here to avoid dependency on success of stream_read
- * @note If this test fails with truncate content, check that enough array slices are being rejoined to form $e, as the crypt.php file may have gotten longer and broken the manual
- * reassembly of its data
- */
- public function testSymmetricStreamEncryptLongFileContent() {
-
- // Generate a a random filename
- $filename = 'tmp-' . $this->getUniqueID() . '.test';
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong . $this->dataLong);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Get file contents without using any wrapper to get it's actual contents on disk
- $retreivedCryptedFile = $this->view->file_get_contents($this->userId . '/files/' . $filename);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
-
-
- // Check that the file was encrypted before being written to disk
- $this->assertNotEquals($this->dataLong . $this->dataLong, $retreivedCryptedFile);
-
- $decrypted = file_get_contents('crypt:///' . $this->userId . '/files/'. $filename);
-
- $this->assertEquals($this->dataLong . $this->dataLong, $decrypted);
-
- // Teardown
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- /**
- * @medium
- * Test that data that is written by the crypto stream wrapper with AES 128
- * @note Encrypted data is manually prepared and decrypted here to avoid dependency on success of stream_read
- * @note If this test fails with truncate content, check that enough array slices are being rejoined to form $e, as the crypt.php file may have gotten longer and broken the manual
- * reassembly of its data
- */
- public function testSymmetricStreamEncryptLongFileContentAes128() {
-
- // Generate a a random filename
- $filename = 'tmp-' . $this->getUniqueID() . '.test';
-
- $this->config->setSystemValue('cipher', 'AES-128-CFB');
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong . $this->dataLong);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $this->config->deleteSystemValue('cipher');
-
- // Get file contents without using any wrapper to get it's actual contents on disk
- $retreivedCryptedFile = $this->view->file_get_contents($this->userId . '/files/' . $filename);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
-
-
- // Check that the file was encrypted before being written to disk
- $this->assertNotEquals($this->dataLong . $this->dataLong, $retreivedCryptedFile);
-
- $decrypted = file_get_contents('crypt:///' . $this->userId . '/files/'. $filename);
-
- $this->assertEquals($this->dataLong . $this->dataLong, $decrypted);
-
- // Teardown
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- /**
- * @medium
- * Test that data that is written by the crypto stream wrapper with AES 128
- * @note Encrypted data is manually prepared and decrypted here to avoid dependency on success of stream_read
- * @note If this test fails with truncate content, check that enough array slices are being rejoined to form $e, as the crypt.php file may have gotten longer and broken the manual
- * reassembly of its data
- */
- public function testStreamDecryptLongFileContentWithoutHeader() {
-
- // Generate a a random filename
- $filename = 'tmp-' . $this->getUniqueID() . '.test';
-
- $this->config->setSystemValue('cipher', 'AES-128-CFB');
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong . $this->dataLong);
-
- $this->config->deleteSystemValue('cipher');
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // Get file contents without using any wrapper to get it's actual contents on disk
- $retreivedCryptedFile = $this->view->file_get_contents($this->userId . '/files/' . $filename);
-
- // Check that the file was encrypted before being written to disk
- $this->assertNotEquals($this->dataLong . $this->dataLong, $retreivedCryptedFile);
-
- // remove the header to check if we can also decrypt old files without a header,
- // this files should fall back to AES-128
- $cryptedWithoutHeader = substr($retreivedCryptedFile, \OCA\Files_Encryption\Crypt::BLOCKSIZE);
- $this->view->file_put_contents($this->userId . '/files/' . $filename, $cryptedWithoutHeader);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
-
- $decrypted = file_get_contents('crypt:///' . $this->userId . '/files/'. $filename);
-
- $this->assertEquals($this->dataLong . $this->dataLong, $decrypted);
-
- // Teardown
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- /**
- * @medium
- */
- public function testIsEncryptedContent() {
-
- $this->assertFalse(\OCA\Files_Encryption\Crypt::isCatfileContent($this->dataUrl));
-
- $this->assertFalse(\OCA\Files_Encryption\Crypt::isCatfileContent($this->legacyEncryptedData));
-
- $keyfileContent = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->dataUrl, 'hat', 'AES-128-CFB');
-
- $this->assertTrue(\OCA\Files_Encryption\Crypt::isCatfileContent($keyfileContent));
-
- }
-
- /**
- * @large
- */
- public function testMultiKeyEncrypt() {
-
- # TODO: search in keyfile for actual content as IV will ensure this test always passes
-
- $pair1 = \OCA\Files_Encryption\Crypt::createKeypair();
-
- $this->assertEquals(2, count($pair1));
-
- $this->assertTrue(strlen($pair1['publicKey']) > 1);
-
- $this->assertTrue(strlen($pair1['privateKey']) > 1);
-
-
- $crypted = \OCA\Files_Encryption\Crypt::multiKeyEncrypt($this->dataShort, array($pair1['publicKey']));
-
- $this->assertNotEquals($this->dataShort, $crypted['data']);
-
-
- $decrypt = \OCA\Files_Encryption\Crypt::multiKeyDecrypt($crypted['data'], $crypted['keys'][0], $pair1['privateKey']);
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- }
-
- /**
- * @medium
- */
- public function testRenameFile() {
-
- $filename = 'tmp-' . $this->getUniqueID();
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Get file decrypted contents
- $decrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $filename);
-
- $this->assertEquals($this->dataLong, $decrypt);
-
- $newFilename = 'tmp-new-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
- $view->rename($filename, $newFilename);
-
- // Get file decrypted contents
- $newDecrypt = file_get_contents('crypt:///'. $this->userId . '/files/' . $newFilename);
-
- $this->assertEquals($this->dataLong, $newDecrypt);
-
- // tear down
- $view->unlink($newFilename);
- }
-
- /**
- * @medium
- */
- public function testMoveFileIntoFolder() {
-
- $filename = 'tmp-' . $this->getUniqueID();
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Get file decrypted contents
- $decrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $filename);
-
- $this->assertEquals($this->dataLong, $decrypt);
-
- $newFolder = '/newfolder' . $this->getUniqueID();
- $newFilename = 'tmp-new-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
- $view->mkdir($newFolder);
- $view->rename($filename, $newFolder . '/' . $newFilename);
-
- // Get file decrypted contents
- $newDecrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $newFolder . '/' . $newFilename);
-
- $this->assertEquals($this->dataLong, $newDecrypt);
-
- // tear down
- $view->unlink($newFolder);
- }
-
- /**
- * @medium
- */
- public function testMoveFolder() {
-
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- $filename = '/tmp-' . $this->getUniqueID();
- $folder = '/folder' . $this->getUniqueID();
-
- $view->mkdir($folder);
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $folder . $filename, $this->dataLong);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Get file decrypted contents
- $decrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $folder . $filename);
-
- $this->assertEquals($this->dataLong, $decrypt);
-
- $newFolder = '/newfolder/subfolder' . $this->getUniqueID();
- $view->mkdir('/newfolder');
-
- $view->rename($folder, $newFolder);
-
- // Get file decrypted contents
- $newDecrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $newFolder . $filename);
-
- $this->assertEquals($this->dataLong, $newDecrypt);
-
- // tear down
- $view->unlink($newFolder);
- $view->unlink('/newfolder');
- }
-
- /**
- * @medium
- */
- public function testChangePassphrase() {
- $filename = 'tmp-' . $this->getUniqueID();
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Get file decrypted contents
- $decrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $filename);
-
- $this->assertEquals($this->dataLong, $decrypt);
-
- // change password
- \OC_User::setPassword($this->userId, 'test', null);
-
- // relogin
- $params['uid'] = $this->userId;
- $params['password'] = 'test';
- \OCA\Files_Encryption\Hooks::login($params);
-
- // Get file decrypted contents
- $newDecrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $filename);
-
- $this->assertEquals($this->dataLong, $newDecrypt);
-
- // tear down
- // change password back
- \OC_User::setPassword($this->userId, $this->pass);
- $view = new \OC\Files\View('/' . $this->userId . '/files');
- $view->unlink($filename);
- }
-
- /**
- * @medium
- */
- public function testViewFilePutAndGetContents() {
-
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Get file decrypted contents
- $decrypt = $view->file_get_contents($filename);
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFileLong = $view->file_put_contents($filename, $this->dataLong);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFileLong));
-
- // Get file decrypted contents
- $decryptLong = $view->file_get_contents($filename);
-
- $this->assertEquals($this->dataLong, $decryptLong);
-
- // tear down
- $view->unlink($filename);
- }
-
- /**
- * @large
- */
- public function testTouchExistingFile() {
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- $view->touch($filename);
-
- // Get file decrypted contents
- $decrypt = $view->file_get_contents($filename);
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- // tear down
- $view->unlink($filename);
- }
-
- /**
- * @medium
- */
- public function testTouchFile() {
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- $view->touch($filename);
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // Get file decrypted contents
- $decrypt = $view->file_get_contents($filename);
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- // tear down
- $view->unlink($filename);
- }
-
- /**
- * @medium
- */
- public function testFopenFile() {
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- $handle = $view->fopen($filename, 'r');
-
- // Get file decrypted contents
- $decrypt = fgets($handle);
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- // tear down
- fclose($handle);
- $view->unlink($filename);
- }
-
-}
diff --git a/apps/files_encryption/tests/encryption.key b/apps/files_encryption/tests/encryption.key
deleted file mode 100644
index 4ee962145c2..00000000000
--- a/apps/files_encryption/tests/encryption.key
+++ /dev/null
Binary files differ
diff --git a/apps/files_encryption/tests/encryption_table.xml b/apps/files_encryption/tests/encryption_table.xml
deleted file mode 100644
index c0f63dc0efa..00000000000
--- a/apps/files_encryption/tests/encryption_table.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<database>
- <name>*dbname*</name>
- <create>true</create>
- <overwrite>false</overwrite>
- <charset>utf8</charset>
- <table>
- <name>*dbprefix*encryption_test</name>
- <declaration>
- <field>
- <name>uid</name>
- <type>text</type>
- <notnull>true</notnull>
- <length>64</length>
- </field>
- <field>
- <name>mode</name>
- <type>text</type>
- <notnull>true</notnull>
- <length>64</length>
- <comments>What client-side / server-side configuration is used</comments>
- </field>
- <field>
- <name>recovery_enabled</name>
- <type>integer</type>
- <notnull>true</notnull>
- <default>0</default>
- <comments>Whether encryption key recovery is enabled</comments>
- </field>
- <field>
- <name>migration_status</name>
- <type>integer</type>
- <notnull>true</notnull>
- <default>0</default>
- <comments>Whether encryption migration has been performed</comments>
- </field>
- </declaration>
- </table>
-</database>
diff --git a/apps/files_encryption/tests/helper.php b/apps/files_encryption/tests/helper.php
deleted file mode 100644
index 8fbd4f419a9..00000000000
--- a/apps/files_encryption/tests/helper.php
+++ /dev/null
@@ -1,339 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @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\Files_Encryption\Tests;
-
-use OCA\Files_Encryption;
-use OCA\Files_Encryption\Helper;
-
-/**
- * Class Helper
- */
-class TestHelper extends TestCase {
-
- const TEST_ENCRYPTION_HELPER_USER1 = "test-helper-user1";
- const TEST_ENCRYPTION_HELPER_USER2 = "test-helper-user2";
-
- protected function setUpUsers() {
- // create test user
- self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER2, true);
- self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1, true);
- }
-
- protected function cleanUpUsers() {
- // cleanup test user
- \OC_User::deleteUser(self::TEST_ENCRYPTION_HELPER_USER1);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_HELPER_USER2);
- }
-
- public static function setupHooks() {
- // Filesystem related hooks
- Helper::registerFilesystemHooks();
-
- // clear and register hooks
- \OC_FileProxy::clearProxies();
- \OC_FileProxy::register(new Files_Encryption\Proxy());
- }
-
- public static function tearDownAfterClass() {
- parent::tearDownAfterClass();
- }
-
- /**
- * @medium
- */
- function testStripPartialFileExtension() {
-
- $partFilename = 'testfile.txt.part';
- $filename = 'testfile.txt';
-
- $this->assertTrue(Helper::isPartialFilePath($partFilename));
-
- $this->assertEquals('testfile.txt', Helper::stripPartialFileExtension($partFilename));
-
- $this->assertFalse(Helper::isPartialFilePath($filename));
-
- $this->assertEquals('testfile.txt', Helper::stripPartialFileExtension($filename));
- }
-
-
- /**
- * @medium
- */
- function testStripPartialFileExtensionWithTransferIdPath() {
-
- $partFilename = 'testfile.txt.ocTransferId643653835.part';
- $filename = 'testfile.txt';
-
- $this->assertTrue(Helper::isPartialFilePath($partFilename));
-
- $this->assertEquals('testfile.txt', Helper::stripPartialFileExtension($partFilename));
-
- $this->assertFalse(Helper::isPartialFilePath($filename));
-
- $this->assertEquals('testfile.txt', Helper::stripPartialFileExtension($filename));
- }
-
- /**
- * @dataProvider dataVersionsPathPositive
- */
- function testGetPathFromVersionPositive($path, $expected) {
- $result = Helper::getPathFromVersion($path);
- $this->assertSame($expected, $result);
- }
-
- function dataVersionsPathPositive() {
- return array(
- array('/user/files_versions/foo/bar/test.txt.v456756835', 'foo/bar/test.txt'),
- array('user/files_versions/foo/bar/test.txt.v456756835', 'foo/bar/test.txt'),
- array('user/files_versions//foo/bar/test.txt.v456756835', 'foo/bar/test.txt'),
- array('user/files_versions/test.txt.v456756835', 'test.txt'),
- );
- }
-
- /**
- * @dataProvider dataVersionsPathNegative
- * @expectedException \OCA\Files_Encryption\Exception\EncryptionException
- */
- function testGetPathFromVersionNegative($path) {
- Helper::getPathFromVersion($path);
- }
-
- function dataVersionsPathNegative() {
- return array(
- array('/user/files_versions/'),
- array('/user/files_versions'),
- );
- }
-
- /**
- * @dataProvider dataPathsCachedFilePositive
- */
- function testGetPathFromCachedFilePositive($path, $expected) {
- $result = Helper::getPathFromCachedFile($path);
- $this->assertEquals($expected, $result);
- }
-
- function dataPathsCachedFilePositive() {
- return array(
- array('/user/cache/transferid636483/foo/bar/test.txt', 'foo/bar/test.txt'),
- array('/user/cache/transferid636483//test.txt', 'test.txt'),
- array('user/cache/transferid636483//test.txt', 'test.txt'),
- );
- }
-
-
- /**
- * @dataProvider dataPathsCachedFileNegative
- * @expectedException \OCA\Files_Encryption\Exception\EncryptionException
- */
- function testGetPathFromCachedFileNegative($path) {
- Helper::getPathFromCachedFile($path);
- }
-
- function dataPathsCachedFileNegative() {
- return array(
- array('/user/cache/transferid636483/'),
- array('/user/cache/transferid636483'),
- array('/user/cache/transferid636483//'),
- array('/user/cache'),
- );
- }
-
- function testGetUser() {
- self::setUpUsers();
-
- $path1 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/files/foo/bar.txt";
- $path2 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/cache/foo/bar.txt";
- $path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER2 . "/thumbnails/foo";
- $path4 ="/" . "/" . self::TEST_ENCRYPTION_HELPER_USER1;
-
- self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1);
-
- // if we are logged-in every path should return the currently logged-in user
- $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path1));
- $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path2));
- $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path3));
- $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path4));
-
- // now log out
- self::logoutHelper();
-
- // now we should only get the user from /user/files and user/cache paths
- $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path1));
- $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Helper::getUser($path2));
-
- try {
- $this->assertFalse(Helper::getUser($path3));
- $this->assertFalse(true, '"OCA\Files_Encryption\Exception\EncryptionException: Could not determine user expected"');
- } catch (Files_Encryption\Exception\EncryptionException $e) {
- $this->assertSame('Could not determine user', $e->getMessage());
- }
- try {
- $this->assertFalse(Helper::getUser($path4));
- $this->assertFalse(true, '"OCA\Files_Encryption\Exception\EncryptionException: Could not determine user expected"');
- } catch (Files_Encryption\Exception\EncryptionException $e) {
- $this->assertSame('Could not determine user', $e->getMessage());
- }
-
- // Log-in again
- self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1);
- self::cleanUpUsers();
- }
-
- /**
- * @dataProvider dataStripUserFilesPath
- */
- function testStripUserFilesPath($path, $expected) {
- $result = Helper::stripUserFilesPath($path);
- $this->assertSame($expected, $result);
- }
-
- function dataStripUserFilesPath() {
- return array(
- array('/user/files/foo.txt', 'foo.txt'),
- array('//user/files/foo.txt', 'foo.txt'),
- array('user//files/foo/bar.txt', 'foo/bar.txt'),
- array('user//files/', false),
- array('/user', false),
- array('', false),
- );
- }
-
- /**
- * @dataProvider dataStripUserFilesPathPositive
- */
- function testGetUserFromPathPositive($path, $expected) {
- self::setUpUsers();
- $result = Helper::getUserFromPath($path);
- $this->assertSame($expected, $result);
- self::cleanUpUsers();
- }
-
- function dataStripUserFilesPathPositive() {
- return array(
- array('/' . self::TEST_ENCRYPTION_HELPER_USER1 . '/files/foo.txt', self::TEST_ENCRYPTION_HELPER_USER1),
- array('//' . self::TEST_ENCRYPTION_HELPER_USER2 . '/files_versions/foo.txt', self::TEST_ENCRYPTION_HELPER_USER2),
- array('/' . self::TEST_ENCRYPTION_HELPER_USER1 . '/files_trashbin/', self::TEST_ENCRYPTION_HELPER_USER1),
- array(self::TEST_ENCRYPTION_HELPER_USER1 . '//cache/foo/bar.txt', self::TEST_ENCRYPTION_HELPER_USER1),
- );
- }
-
- /**
- * @dataProvider dataStripUserFilesPathNegative
- * @expectedException \OCA\Files_Encryption\Exception\EncryptionException
- */
- function testGetUserFromPathNegative($path) {
- Helper::getUserFromPath($path);
- }
-
- function dataStripUserFilesPathNegative() {
- return array(
- array('/unknown_user/files/foo.txt'),
- array('/' . self::TEST_ENCRYPTION_HELPER_USER2 . '/unknown_folder/foo.txt'),
- array('/' . self::TEST_ENCRYPTION_HELPER_USER1),
- array(''),
- );
- }
-
- /**
- * @dataProvider dataPaths
- */
- function testMkdirr($path, $expected) {
- self::setUpUsers();
- Helper::mkdirr($path, new \OC\Files\View('/' . self::TEST_ENCRYPTION_HELPER_USER1 . '/files'));
- // ignore the filename because we only check for the directories
- $dirParts = array_slice($expected, 0, -1);
- $expectedPath = implode('/', $dirParts);
- $this->assertTrue(\OC\Files\Filesystem::is_dir($expectedPath));
-
- // cleanup
- \OC\Files\Filesystem::unlink('/' . $expected[0]);
- self::cleanUpUsers();
- }
-
- /**
- * @dataProvider dataDetectFileTypePositive
- */
- function testDetectFileTypePositive($path, $expected) {
- $result = Helper::detectFileType($path);
- $this->assertSame($expected, $result);
- }
-
- function dataDetectFileTypePositive() {
- return array(
- array(self::TEST_ENCRYPTION_HELPER_USER1 . '/files', Files_Encryption\Util::FILE_TYPE_FILE),
- array(self::TEST_ENCRYPTION_HELPER_USER1 . '/files/foo/bar', Files_Encryption\Util::FILE_TYPE_FILE),
- array('/' . self::TEST_ENCRYPTION_HELPER_USER1 . '/files/foo/bar', Files_Encryption\Util::FILE_TYPE_FILE),
- array(self::TEST_ENCRYPTION_HELPER_USER1 . '/files_versions', Files_Encryption\Util::FILE_TYPE_VERSION),
- array('/' . self::TEST_ENCRYPTION_HELPER_USER1 . '//files_versions/foo/bar', Files_Encryption\Util::FILE_TYPE_VERSION),
- array('/' . self::TEST_ENCRYPTION_HELPER_USER1 . '//cache/foo/bar', Files_Encryption\Util::FILE_TYPE_CACHE),
- );
- }
-
- /**
- * @dataProvider dataDetectFileTypeNegative
- * @expectedException \OCA\Files_Encryption\Exception\EncryptionException
- */
- function testDetectFileTypeNegative($path) {
- Helper::detectFileType($path);
- }
-
- function dataDetectFileTypeNegative() {
- return array(
- array('/files'),
- array('/' . self::TEST_ENCRYPTION_HELPER_USER1 . '/unsuported_dir/foo/bar'),
- );
- }
-
- /**
- * @dataProvider dataPaths
- */
- function testSplitPath($path, $expected) {
- $result = Helper::splitPath($path);
- $this->compareArray($result, $expected);
- }
-
- function dataPaths() {
- return array(
- array('foo/bar/test.txt', array('', 'foo', 'bar', 'test.txt')),
- array('/foo/bar/test.txt', array('', 'foo', 'bar', 'test.txt')),
- array('/foo/bar//test.txt', array('', 'foo', 'bar', 'test.txt')),
- array('//foo/bar/test.txt', array('', 'foo', 'bar', 'test.txt')),
- array('foo', array('', 'foo')),
- array('/foo', array('', 'foo')),
- array('//foo', array('', 'foo')),
- );
- }
-
- function compareArray($result, $expected) {
- $this->assertSame(count($expected), count($result));
-
- foreach ($expected as $key => $value) {
- $this->assertArrayHasKey($key, $result);
- $this->assertSame($value, $result[$key]);
- }
- }
-
-}
diff --git a/apps/files_encryption/tests/hooks.php b/apps/files_encryption/tests/hooks.php
deleted file mode 100644
index b63e0431187..00000000000
--- a/apps/files_encryption/tests/hooks.php
+++ /dev/null
@@ -1,447 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption\Tests;
-
-/**
- * Class Hooks
- * this class provide basic hook app tests
- */
-class Hooks extends TestCase {
-
- const TEST_ENCRYPTION_HOOKS_USER1 = "test-encryption-hooks-user1.dot";
- const TEST_ENCRYPTION_HOOKS_USER2 = "test-encryption-hooks-user2.dot";
-
- /** @var \OC\Files\View */
- public $user1View; // view on /data/user1/files
- /** @var \OC\Files\View */
- public $user2View; // view on /data/user2/files
- /** @var \OC\Files\View */
- public $rootView; // view on /data/user
- public $data;
- public $filename;
- public $folder;
-
- private static $testFiles;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // note: not using a data provider because these
- // files all need to coexist to make sure the
- // share keys are found properly (pattern matching)
- self::$testFiles = array(
- 't est.txt',
- 't est_.txt',
- 't est.doc.txt',
- 't est(.*).txt', // make sure the regexp is escaped
- 'multiple.dots.can.happen.too.txt',
- 't est.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.txt',
- 't est_.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey.txt',
- 'who would upload their.shareKey',
- 'user ones file.txt',
- 'user ones file.txt.backup',
- '.t est.txt'
- );
-
- // create test user
- self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1, true);
- self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER2, true);
- }
-
- protected function setUp() {
- parent::setUp();
-
- // set user id
- self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1);
- \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER1);
-
- // init filesystem view
- $this->user1View = new \OC\Files\View('/'. self::TEST_ENCRYPTION_HOOKS_USER1 . '/files');
- $this->user2View = new \OC\Files\View('/'. self::TEST_ENCRYPTION_HOOKS_USER2 . '/files');
- $this->rootView = new \OC\Files\View('/');
-
- // init short data
- $this->data = 'hats';
- $this->filename = 'enc_hooks_tests-' . $this->getUniqueID() . '.txt';
- $this->folder = 'enc_hooks_tests_folder-' . $this->getUniqueID();
-
- }
-
- public static function tearDownAfterClass() {
- // cleanup test user
- \OC_User::deleteUser(self::TEST_ENCRYPTION_HOOKS_USER1);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_HOOKS_USER2);
-
- parent::tearDownAfterClass();
- }
-
- function testDisableHook() {
- // encryption is enabled and running so we should have some user specific
- // settings in oc_preferences
- $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*preferences` WHERE `appid` = ?');
- $result = $query->execute(array('files_encryption'));
- $row = $result->fetchRow();
- $this->assertTrue(is_array($row));
-
- // disabling the app should delete all user specific settings
- \OCA\Files_Encryption\Hooks::preDisable(array('app' => 'files_encryption'));
-
- // check if user specific settings for the encryption app are really gone
- $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*preferences` WHERE `appid` = ?');
- $result = $query->execute(array('files_encryption'));
- $row = $result->fetchRow();
- $this->assertFalse($row);
-
- // relogin user to initialize the encryption again
- $user = \OCP\User::getUser();
- self::loginHelper($user);
-
- }
-
- function testDeleteHooks() {
-
- // remember files_trashbin state
- $stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we want to tests with app files_trashbin disabled
- \OC_App::disable('files_trashbin');
-
- // make sure that the trash bin is disabled
- $this->assertFalse(\OC_APP::isEnabled('files_trashbin'));
-
- $this->user1View->file_put_contents($this->filename, $this->data);
-
- // check if all keys are generated
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
-
- self::logoutHelper();
- self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER2);
- \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER2);
-
-
- $this->user2View->file_put_contents($this->filename, $this->data);
-
- // check if all keys are generated
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
-
- // create a dummy file that we can delete something outside of data/user/files
- // in this case no share or file keys should be deleted
- $this->rootView->file_put_contents(self::TEST_ENCRYPTION_HOOKS_USER2 . "/" . $this->filename, $this->data);
-
- // delete dummy file outside of data/user/files
- $this->rootView->unlink(self::TEST_ENCRYPTION_HOOKS_USER2 . "/" . $this->filename);
-
- // all keys should still exist
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
-
- // delete the file in data/user/files
- // now the correspondig share and file keys from user2 should be deleted
- $this->user2View->unlink($this->filename);
-
- // check if keys from user2 are really deleted
- $this->assertFalse($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
- $this->assertFalse($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
- // but user1 keys should still exist
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
- if ($stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- }
- else {
- \OC_App::disable('files_trashbin');
- }
- }
-
- function testDeleteHooksForSharedFiles() {
-
- self::logoutHelper();
- self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1);
- \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER1);
-
- // remember files_trashbin state
- $stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we want to tests with app files_trashbin disabled
- \OC_App::disable('files_trashbin');
-
- // make sure that the trash bin is disabled
- $this->assertFalse(\OC_APP::isEnabled('files_trashbin'));
-
- $this->user1View->file_put_contents($this->filename, $this->data);
-
- // check if all keys are generated
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
- // get the file info from previous created file
- $fileInfo = $this->user1View->getFileInfo($this->filename);
-
- // check if we have a valid file info
- $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
-
- // share the file with user2
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_HOOKS_USER2, \OCP\Constants::PERMISSION_ALL);
-
- // check if new share key exists
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
-
- self::logoutHelper();
- self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER2);
- \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER2);
-
- // user2 update the shared file
- $this->user2View->file_put_contents($this->filename, $this->data);
-
- // keys should be stored at user1s dir, not in user2s
- $this->assertFalse($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
- $this->assertFalse($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
- // delete the Shared file from user1 in data/user2/files/Shared
- $result = $this->user2View->unlink($this->filename);
-
- $this->assertTrue($result);
-
- // share key for user2 from user1s home should be gone, all other keys should still exists
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertFalse($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey'));
-
- // cleanup
-
- self::logoutHelper();
- self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1);
- \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER1);
-
- if ($stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- }
- else {
- \OC_App::disable('files_trashbin');
- }
- }
-
- function testRenameHook() {
- // create all files to make sure all keys can coexist properly
- foreach (self::$testFiles as $file) {
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $file, $this->data);
-
- // test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
- }
-
- foreach (self::$testFiles as $file) {
- $this->doTestRenameHook($file);
- }
- }
-
- /**
- * test rename operation
- */
- function doTestRenameHook($filename) {
- // check if keys exists
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
-
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/fileKey'));
-
- // make subfolder and sub-subfolder
- $this->rootView->mkdir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder);
- $this->rootView->mkdir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder . '/' . $this->folder);
-
- $this->assertTrue($this->rootView->is_dir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder . '/' . $this->folder));
-
- // move the file to the sub-subfolder
- $root = $this->rootView->getRoot();
- $this->rootView->chroot('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/');
- $this->rootView->rename($filename, '/' . $this->folder . '/' . $this->folder . '/' . $filename);
- $this->rootView->chroot($root);
-
- $this->assertFalse($this->rootView->file_exists('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $filename));
- $this->assertTrue($this->rootView->file_exists('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder . '/' . $this->folder . '/' . $filename));
-
- // keys should be renamed too
- $this->assertFalse($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertFalse($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/fileKey'));
-
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/'
- . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/'
- . $filename . '/fileKey'));
-
- // cleanup
- $this->rootView->unlink('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder);
- }
-
- function testCopyHook() {
- // create all files to make sure all keys can coexist properly
- foreach (self::$testFiles as $file) {
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $file, $this->data);
-
- // test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
- }
-
- foreach (self::$testFiles as $file) {
- $this->doTestCopyHook($file);
- }
- }
-
- /**
- * test rename operation
- */
- function doTestCopyHook($filename) {
- // check if keys exists
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
-
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/fileKey'));
-
- // make subfolder and sub-subfolder
- $this->rootView->mkdir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder);
- $this->rootView->mkdir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder . '/' . $this->folder);
-
- $this->assertTrue($this->rootView->is_dir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder . '/' . $this->folder));
-
- // copy the file to the sub-subfolder
- \OC\Files\Filesystem::copy($filename, '/' . $this->folder . '/' . $this->folder . '/' . $filename);
-
- $this->assertTrue($this->rootView->file_exists('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $filename));
- $this->assertTrue($this->rootView->file_exists('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder . '/' . $this->folder . '/' . $filename));
-
- // keys should be copied too
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/'
- . $filename . '/fileKey'));
-
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/'
- . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey'));
- $this->assertTrue($this->rootView->file_exists(
- '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/'
- . $filename . '/fileKey'));
-
- // cleanup
- $this->rootView->unlink('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder);
- $this->rootView->unlink('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $filename);
- }
-
- /**
- * @brief replacing encryption keys during password change should be allowed
- * until the user logged in for the first time
- */
- public function testSetPassphrase() {
-
- $view = new \OC\Files\View();
-
- // set user password for the first time
- \OCA\Files_Encryption\Hooks::postCreateUser(array('uid' => 'newUser', 'password' => 'newUserPassword'));
-
- $this->assertTrue($view->file_exists(\OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/newUser.publicKey'));
- $this->assertTrue($view->file_exists('newUser/files_encryption/newUser.privateKey'));
-
- // check if we are able to decrypt the private key
- $encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, 'newUser');
- $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'newUserPassword');
- $this->assertTrue(is_string($privateKey));
-
- // change the password before the user logged-in for the first time,
- // we can replace the encryption keys
- \OCA\Files_Encryption\Hooks::setPassphrase(array('uid' => 'newUser', 'password' => 'passwordChanged'));
-
- $encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, 'newUser');
- $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged');
- $this->assertTrue(is_string($privateKey));
-
- // now create a files folder to simulate a already used account
- $view->mkdir('/newUser/files');
-
- // change the password after the user logged in, now the password should not change
- \OCA\Files_Encryption\Hooks::setPassphrase(array('uid' => 'newUser', 'password' => 'passwordChanged2'));
-
- $encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, 'newUser');
- $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged2');
- $this->assertFalse($privateKey);
-
- $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged');
- $this->assertTrue(is_string($privateKey));
-
- }
-
-}
diff --git a/apps/files_encryption/tests/keymanager.php b/apps/files_encryption/tests/keymanager.php
deleted file mode 100644
index d1a3f1e140e..00000000000
--- a/apps/files_encryption/tests/keymanager.php
+++ /dev/null
@@ -1,411 +0,0 @@
-<?php
-/**
- * @author Andreas Fischer <bantu@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption\Tests;
-
-/**
- * Class Keymanager
- */
-class Keymanager extends TestCase {
-
- const TEST_USER = "test-keymanager-user.dot";
-
- public $userId;
- public $pass;
- public static $stateFilesTrashbin;
- /**
- * @var \OC\Files\View
- */
- public $view;
- public $randomKey;
- public $dataShort;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // disable file proxy by default
- \OC_FileProxy::$enabled = false;
-
- // remember files_trashbin state
- self::$stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we don't want to tests with app files_trashbin enabled
- \OC_App::disable('files_trashbin');
-
- // create test user
- \OC_User::deleteUser(self::TEST_USER);
- parent::loginHelper(self::TEST_USER, true);
- }
-
- protected function setUp() {
- parent::setUp();
- // set content for encrypting / decrypting in tests
- $this->dataLong = file_get_contents(__DIR__ . '/../lib/crypt.php');
- $this->dataShort = 'hats';
- $this->dataUrl = __DIR__ . '/../lib/crypt.php';
- $this->legacyData = __DIR__ . '/legacy-text.txt';
- $this->legacyEncryptedData = __DIR__ . '/legacy-encrypted-text.txt';
- $this->randomKey = \OCA\Files_Encryption\Crypt::generateKey();
-
- $keypair = \OCA\Files_Encryption\Crypt::createKeypair();
- $this->genPublicKey = $keypair['publicKey'];
- $this->genPrivateKey = $keypair['privateKey'];
-
- $this->view = new \OC\Files\View('/');
-
- self::loginHelper(self::TEST_USER);
- $this->userId = self::TEST_USER;
- $this->pass = self::TEST_USER;
-
- $userHome = \OC_User::getHome($this->userId);
- $this->dataDir = str_replace('/' . $this->userId, '', $userHome);
- }
-
- function tearDown() {
- $this->view->deleteAll('/' . self::TEST_USER . '/files_encryption/keys');
- parent::tearDown();
- }
-
- public static function tearDownAfterClass() {
- \OC_FileProxy::$enabled = true;
-
- // cleanup test user
- \OC_User::deleteUser(self::TEST_USER);
- // reset app files_trashbin
- if (self::$stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- }
-
- parent::tearDownAfterClass();
- }
-
- function testKeyCacheUpdate() {
- $testUser = 'testKeyCacheUpdate';
- \OCA\Files_Encryption\Keymanager::setPublicKey('oldKey', $testUser);
-
- $this->assertSame('oldKey',
- \OCA\Files_Encryption\Keymanager::getPublicKey($this->view, $testUser));
-
- // update key
- \OCA\Files_Encryption\Keymanager::setPublicKey('newKey', $testUser);
-
- $this->assertSame('newKey',
- \OCA\Files_Encryption\Keymanager::getPublicKey($this->view, $testUser));
-
- // cleanup
- \OCA\Files_Encryption\Keymanager::deletePublicKey($this->view, $testUser);
-
- }
-
- /**
- * @medium
- */
- function testGetPrivateKey() {
-
- $key = \OCA\Files_Encryption\Keymanager::getPrivateKey($this->view, $this->userId);
-
- $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($key, $this->pass);
-
- $res = openssl_pkey_get_private($privateKey);
-
- $this->assertTrue(is_resource($res));
-
- $sslInfo = openssl_pkey_get_details($res);
-
- $this->assertArrayHasKey('key', $sslInfo);
-
- }
-
- /**
- * @medium
- */
- function testGetPublicKey() {
-
- $publiceKey = \OCA\Files_Encryption\Keymanager::getPublicKey($this->view, $this->userId);
-
- $res = openssl_pkey_get_public($publiceKey);
-
- $this->assertTrue(is_resource($res));
-
- $sslInfo = openssl_pkey_get_details($res);
-
- $this->assertArrayHasKey('key', $sslInfo);
- }
-
- /**
- * @medium
- */
- function testSetFileKey() {
-
- $key = $this->randomKey;
-
- $file = 'unittest-' . $this->getUniqueID() . '.txt';
-
- $util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $this->view->file_put_contents($this->userId . '/files/' . $file, $this->dataShort);
-
- \OCA\Files_Encryption\Keymanager::setFileKey($this->view, $util, $file, $key);
-
- $this->assertTrue($this->view->file_exists('/' . $this->userId . '/files_encryption/keys/' . $file . '/fileKey'));
-
- // cleanup
- $this->view->unlink('/' . $this->userId . '/files/' . $file);
-
- // change encryption proxy to previous state
- \OC_FileProxy::$enabled = $proxyStatus;
- }
-
- /**
- * @medium
- */
- function testSetPrivateKey() {
-
- $key = "dummy key";
-
- \OCA\Files_Encryption\Keymanager::setPrivateKey($key, 'dummyUser');
-
- $this->assertTrue($this->view->file_exists('/dummyUser/files_encryption/dummyUser.privateKey'));
-
- //clean up
- $this->view->deleteAll('/dummyUser');
- }
-
- /**
- * @medium
- */
- function testSetPrivateSystemKey() {
-
- $key = "dummy key";
- $keyName = "myDummyKey";
- $encHeader = \OCA\Files_Encryption\Crypt::generateHeader();
-
- \OCA\Files_Encryption\Keymanager::setPrivateSystemKey($key, $keyName);
-
- $this->assertTrue($this->view->file_exists('/files_encryption/' . $keyName . '.privateKey'));
-
- $result = \OCA\Files_Encryption\Keymanager::getPrivateSystemKey($keyName);
-
- $this->assertSame($encHeader . $key, $result);
-
- // clean up
- $this->view->unlink('/files_encryption/' . $keyName.'.privateKey');
- }
-
-
- /**
- * @medium
- */
- function testGetUserKeys() {
-
- $keys = \OCA\Files_Encryption\Keymanager::getUserKeys($this->view, $this->userId);
-
- $resPublic = openssl_pkey_get_public($keys['publicKey']);
-
- $this->assertTrue(is_resource($resPublic));
-
- $sslInfoPublic = openssl_pkey_get_details($resPublic);
-
- $this->assertArrayHasKey('key', $sslInfoPublic);
-
- $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($keys['privateKey'], $this->pass);
-
- $resPrivate = openssl_pkey_get_private($privateKey);
-
- $this->assertTrue(is_resource($resPrivate));
-
- $sslInfoPrivate = openssl_pkey_get_details($resPrivate);
-
- $this->assertArrayHasKey('key', $sslInfoPrivate);
- }
-
- /**
- * @medium
- */
- function testRecursiveDelShareKeysFolder() {
-
- $this->view->mkdir('/' . self::TEST_USER . '/files/folder1');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files/folder1/existingFile.txt', 'data');
-
- // create folder structure for some dummy share key files
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/file2');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/file2');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file1');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2');
-
- // create some dummy share keys
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user1.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.test.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/test-keymanager-userxdot.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/userx.' . self::TEST_USER . '.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.userx.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.' . self::TEST_USER . '.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.user1.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file2/user2.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file2/user3.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/file2/user3.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file1/user1.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2/user2.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2/user3.shareKey', 'data');
-
- // recursive delete share keys from user1 and user2
- \OCA\Files_Encryption\Keymanager::delShareKey($this->view,
- array('user1', 'user2', self::TEST_USER),
- \OCA\Files_Encryption\Keymanager::getKeyPath($this->view, new \OCA\Files_Encryption\Util($this->view, self::TEST_USER), '/folder1'),
- self::TEST_USER,
- '/folder1');
-
- // check if share keys from user1 and user2 are deleted
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user1.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/file1/user1.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/file2/user2.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/subfolder/subsubfolder/file1/user1.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/subfolder/subsubfolder/file2/user2.shareKey'));
-
- // check if share keys from user3 still exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/file2/user3.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2/user3.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/file2/user3.shareKey'));
-
- // check if share keys for user or file with similar name
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.test.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/test-keymanager-userxdot.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.userx.shareKey'));
- // FIXME: this case currently cannot be distinguished, needs further fixing
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/userx.' . self::TEST_USER . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.' . self::TEST_USER . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.user1.shareKey'));
-
- // owner key from existing file should still exists because the file is still there
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey'));
-
- // cleanup
- $this->view->deleteAll('/' . self::TEST_USER . '/files/folder1');
-
- }
-
- /**
- * @medium
- */
- function testRecursiveDelShareKeysFile() {
-
- $this->view->mkdir('/' . self::TEST_USER . '/files/folder1');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files/folder1/existingFile.txt', 'data');
-
- // create folder structure for some dummy share key files
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1');
- $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt');
-
- // create some dummy share keys
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user1.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user2.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user3.shareKey', 'data');
- $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey', 'data');
-
- // recursive delete share keys from user1 and user2
- \OCA\Files_Encryption\Keymanager::delShareKey($this->view,
- array('user1', 'user2', self::TEST_USER),
- \OCA\Files_Encryption\Keymanager::getKeyPath($this->view, new \OCA\Files_Encryption\Util($this->view, self::TEST_USER), '/folder1/existingFile.txt'),
- self::TEST_USER,
- '/folder1/existingFile.txt');
-
-
- // check if share keys from user1 and user2 are deleted
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile/user1.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile/user2.shareKey'));
-
- // check if share keys for user3 and owner
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user3.shareKey'));
- // cleanup
- $this->view->deleteAll('/' . self::TEST_USER . '/files/folder1');
-
- }
-
- function testKeySetPreperation() {
- $basePath = '/' . self::TEST_USER . '/files';
- $path = '/folder1/subfolder/subsubfolder/file.txt';
-
- $this->assertFalse($this->view->is_dir($basePath . '/testKeySetPreperation'));
-
- TestProtectedKeymanagerMethods::testKeySetPreperation($this->view, $basePath . $path);
-
- // check if directory structure was created
- $this->assertTrue($this->view->is_dir($basePath . $path));
-
- // cleanup
- $this->view->deleteAll($basePath . '/folder1');
-
- }
-}
-
-/**
- * dummy class to access protected methods of \OCA\Files_Encryption\Keymanager for testing
- */
-class TestProtectedKeymanagerMethods extends \OCA\Files_Encryption\Keymanager {
-
- /**
- * @param \OC\Files\View $view relative to data/
- * @param string $path
- * @param string $basePath
- */
- public static function testKeySetPreperation($view, $path) {
- self::keySetPreparation($view, $path);
- }
-}
diff --git a/apps/files_encryption/tests/legacy-encrypted-text.txt b/apps/files_encryption/tests/legacy-encrypted-text.txt
deleted file mode 100644
index 1f5087178cd..00000000000
--- a/apps/files_encryption/tests/legacy-encrypted-text.txt
+++ /dev/null
@@ -1 +0,0 @@
-5ǡiZgESlF= \ No newline at end of file
diff --git a/apps/files_encryption/tests/migration.php b/apps/files_encryption/tests/migration.php
deleted file mode 100644
index 031c327d371..00000000000
--- a/apps/files_encryption/tests/migration.php
+++ /dev/null
@@ -1,266 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption\Tests;
-
-class Migration extends TestCase {
-
- const TEST_ENCRYPTION_MIGRATION_USER1='test_encryption_user1';
- const TEST_ENCRYPTION_MIGRATION_USER2='test_encryption_user2';
- const TEST_ENCRYPTION_MIGRATION_USER3='test_encryption_user3';
-
- /** @var \OC\Files\View */
- private $view;
- private $public_share_key_id;
- private $recovery_key_id;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
- self::loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER1, true);
- self::loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER2, true);
- self::loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER3, true);
- }
-
- public static function tearDownAfterClass() {
- \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER1);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER2);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER3);
- parent::tearDownAfterClass();
- }
-
- protected function tearDown() {
- if (\OC_DB::tableExists('encryption_test')) {
- \OC_DB::dropTable('encryption_test');
- }
- $this->assertTableNotExist('encryption_test');
-
- parent::tearDown();
- }
-
- public function setUp() {
- $this->loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER1);
- $this->view = new \OC\Files\View();
- $this->public_share_key_id = \OCA\Files_Encryption\Helper::getPublicShareKeyId();
- $this->recovery_key_id = \OCA\Files_Encryption\Helper::getRecoveryKeyId();
- if (\OC_DB::tableExists('encryption_test')) {
- \OC_DB::dropTable('encryption_test');
- }
- $this->assertTableNotExist('encryption_test');
- }
-
- public function checkLastIndexId() {
- $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` ('
- .' `item_type`, `item_source`, `item_target`, `share_type`,'
- .' `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`,'
- .' `file_target`, `token`, `parent`, `expiration`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)');
- $query->bindValue(1, 'file');
- $query->bindValue(2, 949);
- $query->bindValue(3, '/949');
- $query->bindValue(4, 0);
- $query->bindValue(5, 'migrate-test-user');
- $query->bindValue(6, 'migrate-test-owner');
- $query->bindValue(7, 23);
- $query->bindValue(8, 1402493312);
- $query->bindValue(9, 0);
- $query->bindValue(10, '/migration.txt');
- $query->bindValue(11, null);
- $query->bindValue(12, null);
- $query->bindValue(13, null);
- $this->assertEquals(1, $query->execute());
-
- $this->assertNotEquals('0', \OC_DB::insertid('*PREFIX*share'));
-
- // cleanup
- $query = \OC_DB::prepare('DELETE FROM `*PREFIX*share` WHERE `file_target` = ?');
- $query->bindValue(1, '/migration.txt');
- $this->assertEquals(1, $query->execute());
-
- }
-
- public function testBrokenLastIndexId() {
-
- // create test table
- $this->checkLastIndexId();
- \OC_DB::createDbFromStructure(__DIR__ . '/encryption_table.xml');
- $this->checkLastIndexId();
- }
-
- /**
- * @param string $table
- */
- public function assertTableNotExist($table) {
- $type = \OC_Config::getValue( "dbtype", "sqlite" );
- if( $type == 'sqlite' || $type == 'sqlite3' ) {
- // sqlite removes the tables after closing the DB
- $this->assertTrue(true);
- } else {
- $this->assertFalse(\OC_DB::tableExists($table), 'Table ' . $table . ' exists.');
- }
- }
-
- protected function createDummyShareKeys($uid) {
- $this->view->mkdir($uid . '/files_encryption/share-keys/folder1/folder2/folder3');
- $this->view->mkdir($uid . '/files_encryption/share-keys/folder2/');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/folder3/file3.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/folder3/file3.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/folder3/file3.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/file.1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/file.1.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/file.1.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data');
- if ($this->public_share_key_id) {
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . $this->public_share_key_id . '.shareKey' , 'data');
- }
- if ($this->recovery_key_id) {
- $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . $this->recovery_key_id . '.shareKey' , 'data');
- }
- }
-
- protected function createDummyFileKeys($uid) {
- $this->view->mkdir($uid . '/files_encryption/keyfiles/folder1/folder2/folder3');
- $this->view->mkdir($uid . '/files_encryption/keyfiles/folder2/');
- $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder1/folder2/folder3/file3.key' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder1/folder2/file2.key' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder1/file.1.key' , 'data');
- $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder2/file.2.1.key' , 'data');
- }
-
- protected function createDummyFilesInTrash($uid) {
- $this->view->mkdir($uid . '/files_trashbin/share-keys');
- $this->view->mkdir($uid . '/files_trashbin/share-keys/folder1.d7437648723');
- $this->view->file_put_contents($uid . '/files_trashbin/share-keys/file1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data');
- $this->view->file_put_contents($uid . '/files_trashbin/share-keys/file1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data');
- $this->view->file_put_contents($uid . '/files_trashbin/share-keys/folder1.d7437648723/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
-
- $this->view->mkdir($uid . '/files_trashbin/keyfiles');
- $this->view->mkdir($uid . '/files_trashbin/keyfiles/folder1.d7437648723');
- $this->view->file_put_contents($uid . '/files_trashbin/keyfiles/file1.key.d5457864' , 'data');
- $this->view->file_put_contents($uid . '/files_trashbin/keyfiles/folder1.d7437648723/file2.key' , 'data');
- }
-
- protected function createDummySystemWideKeys() {
- $this->view->mkdir('owncloud_private_key');
- $this->view->file_put_contents('owncloud_private_key/systemwide_1.private.key', 'data');
- $this->view->file_put_contents('owncloud_private_key/systemwide_2.private.key', 'data');
- }
-
- public function testMigrateToNewFolderStructure() {
-
- // go back to the state before migration
- $this->view->rename('/files_encryption/public_keys', '/public-keys');
- $this->view->rename('/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.publicKey', '/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.public.key');
- $this->view->rename('/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.publicKey', '/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.public.key');
- $this->view->rename('/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.publicKey', '/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.public.key');
- $this->view->deleteAll(self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/keys');
- $this->view->deleteAll(self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/keys');
- $this->view->deleteAll(self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/keys');
- $this->view->rename(self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.privateKey',
- self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.private.key');
- $this->view->rename(self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.privateKey',
- self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.private.key');
- $this->view->rename(self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.privateKey',
- self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.private.key');
-
- $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER1);
- $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER2);
- $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER3);
-
- $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER1);
- $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER2);
- $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER3);
-
- $this->createDummyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2);
-
- // no user for system wide mount points
- $this->createDummyFileKeys('');
- $this->createDummyShareKeys('');
-
- $this->createDummySystemWideKeys();
-
- $m = new \OCA\Files_Encryption\Migration();
- $m->reorganizeFolderStructure();
-
- // TODO Verify that all files at the right place
- $this->assertTrue($this->view->file_exists('/files_encryption/public_keys/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.publicKey'));
- $this->assertTrue($this->view->file_exists('/files_encryption/public_keys/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.publicKey'));
- $this->assertTrue($this->view->file_exists('/files_encryption/public_keys/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.publicKey'));
- $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER1);
- $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER2);
- $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER3);
- // system wide keys
- $this->verifyNewKeyPath('');
- // trash
- $this->verifyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2);
-
- }
-
- protected function verifyFilesInTrash($uid) {
- // share keys
- $this->view->file_exists($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data');
- $this->view->file_exists($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data');
- $this->view->file_exists($uid . '/files_trashbin/keys/folder1.d7437648723/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data');
-
- // file keys
- $this->view->file_exists($uid . '/files_trashbin/keys/file1.d5457864/fileKey.d5457864' , 'data');
- $this->view->file_exists($uid . '/files_trashbin/keyfiles/file1.d5457864/fileKey.d5457864' , 'data');
- $this->view->file_exists($uid . '/files_trashbin/keyfiles/folder1.d7437648723/file2/fileKey' , 'data');
- }
-
- protected function verifyNewKeyPath($uid) {
- // private key
- if ($uid !== '') {
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/' . $uid . '.privateKey'));
- }
- // file keys
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/fileKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/fileKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/fileKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/fileKey'));
- // share keys
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey'));
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey'));
- if ($this->public_share_key_id) {
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->public_share_key_id . '.shareKey'));
- }
- if ($this->recovery_key_id) {
- $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->recovery_key_id . '.shareKey'));
- }
- }
-}
diff --git a/apps/files_encryption/tests/proxy.php b/apps/files_encryption/tests/proxy.php
deleted file mode 100644
index 59fcb896a2b..00000000000
--- a/apps/files_encryption/tests/proxy.php
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption\Tests;
-
-/**
- * Class Proxy
- * this class provide basic proxy app tests
- */
-class Proxy extends TestCase {
-
- const TEST_ENCRYPTION_PROXY_USER1 = "test-proxy-user1";
-
- public $userId;
- public $pass;
- /**
- * @var \OC\Files\View
- */
- public $view; // view in /data/user/files
- public $rootView; // view on /data/user
- public $data;
- public $dataLong;
- public $filename;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // create test user
- self::loginHelper(self::TEST_ENCRYPTION_PROXY_USER1, true);
- }
-
- protected function setUp() {
- parent::setUp();
-
- // set user id
- \OC_User::setUserId(self::TEST_ENCRYPTION_PROXY_USER1);
- $this->userId = self::TEST_ENCRYPTION_PROXY_USER1;
- $this->pass = self::TEST_ENCRYPTION_PROXY_USER1;
-
- // init filesystem view
- $this->view = new \OC\Files\View('/'. self::TEST_ENCRYPTION_PROXY_USER1 . '/files');
- $this->rootView = new \OC\Files\View('/'. self::TEST_ENCRYPTION_PROXY_USER1 );
-
- // init short data
- $this->data = 'hats';
- $this->dataLong = file_get_contents(__DIR__ . '/../lib/crypt.php');
- $this->filename = 'enc_proxy_tests-' . $this->getUniqueID() . '.txt';
-
- }
-
- public static function tearDownAfterClass() {
- // cleanup test user
- \OC_User::deleteUser(self::TEST_ENCRYPTION_PROXY_USER1);
-
- parent::tearDownAfterClass();
- }
-
- /**
- * @medium
- * test if postFileSize returns the unencrypted file size
- */
- function testPostFileSize() {
-
- $this->view->file_put_contents($this->filename, $this->dataLong);
- $size = strlen($this->dataLong);
-
- \OC_FileProxy::$enabled = false;
-
- $encryptedSize = $this->view->filesize($this->filename);
-
- \OC_FileProxy::$enabled = true;
-
- $unencryptedSize = $this->view->filesize($this->filename);
-
- $this->assertTrue($encryptedSize > $unencryptedSize);
- $this->assertSame($size, $unencryptedSize);
-
- // cleanup
- $this->view->unlink($this->filename);
-
- }
-
- function testPostFileSizeWithDirectory() {
-
- $this->view->file_put_contents($this->filename, $this->data);
-
- \OC_FileProxy::$enabled = false;
-
- // get root size, must match the file's unencrypted size
- $unencryptedSize = $this->view->filesize('');
-
- \OC_FileProxy::$enabled = true;
-
- $encryptedSize = $this->view->filesize('');
-
- $this->assertTrue($encryptedSize !== $unencryptedSize);
-
- // cleanup
- $this->view->unlink($this->filename);
-
- }
-
- /**
- * @dataProvider isExcludedPathProvider
- */
- function testIsExcludedPath($path, $expected) {
- $this->view->mkdir(dirname($path));
- $this->view->file_put_contents($path, "test");
-
- $result = \Test_Helper::invokePrivate(new \OCA\Files_Encryption\Proxy(), 'isExcludedPath', array($path));
- $this->assertSame($expected, $result);
-
- $this->view->deleteAll(dirname($path));
-
- }
-
- public function isExcludedPathProvider() {
- return array(
- array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files/test.txt', false),
- array (self::TEST_ENCRYPTION_PROXY_USER1 . '/files/test.txt', false),
- array ('/files/test.txt', true),
- array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files/versions/test.txt', false),
- array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files_versions/test.txt', false),
- array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files_trashbin/test.txt', true),
- array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/file/test.txt', true),
- );
- }
-
-}
-
diff --git a/apps/files_encryption/tests/share.php b/apps/files_encryption/tests/share.php
deleted file mode 100755
index 2a9f0359c91..00000000000
--- a/apps/files_encryption/tests/share.php
+++ /dev/null
@@ -1,1392 +0,0 @@
-<?php
-/**
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption\Tests;
-
-/**
- * Class Share
- */
-class Share extends TestCase {
-
- const TEST_ENCRYPTION_SHARE_USER1 = "test-share-user1";
- const TEST_ENCRYPTION_SHARE_USER2 = "test-share-user2";
- const TEST_ENCRYPTION_SHARE_USER3 = "test-share-user3";
- const TEST_ENCRYPTION_SHARE_USER4 = "test-share-user4";
- const TEST_ENCRYPTION_SHARE_GROUP1 = "test-share-group1";
-
- public $stateFilesTrashbin;
- public $filename;
- public $dataShort;
- /**
- * @var \OC\Files\View
- */
- public $view;
- public $folder1;
- public $subfolder;
- public $subsubfolder;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // enable resharing
- \OC::$server->getAppConfig()->setValue('core', 'shareapi_allow_resharing', 'yes');
-
- // register share hooks
- \OC::registerShareHooks();
- \OCA\Files_Sharing\Helper::registerHooks();
-
- // create users
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1, true);
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2, true);
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3, true);
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER4, true);
-
- // create group and assign users
- \OC_Group::createGroup(self::TEST_ENCRYPTION_SHARE_GROUP1);
- \OC_Group::addToGroup(self::TEST_ENCRYPTION_SHARE_USER3, self::TEST_ENCRYPTION_SHARE_GROUP1);
- \OC_Group::addToGroup(self::TEST_ENCRYPTION_SHARE_USER4, self::TEST_ENCRYPTION_SHARE_GROUP1);
- }
-
- protected function setUp() {
- parent::setUp();
-
- $this->dataShort = 'hats';
- $this->view = new \OC\Files\View('/');
-
- $this->folder1 = '/folder1';
- $this->subfolder = '/subfolder1';
- $this->subsubfolder = '/subsubfolder1';
-
- $this->filename = 'share-tmp.test';
-
- // remember files_trashbin state
- $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we don't want to tests with app files_trashbin enabled
- \OC_App::disable('files_trashbin');
-
- // login as first user
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- $this->createMocks();
- }
-
- protected function tearDown() {
- // reset app files_trashbin
- if ($this->stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- } else {
- \OC_App::disable('files_trashbin');
- }
-
- $this->restoreHttpHelper();
-
- parent::tearDown();
- }
-
- public static function tearDownAfterClass() {
- // clean group
- \OC_Group::deleteGroup(self::TEST_ENCRYPTION_SHARE_GROUP1);
-
- // cleanup users
- \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER1);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER2);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER3);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER4);
-
- parent::tearDownAfterClass();
- }
-
- private function createMocks() {
- $config = $this->getMockBuilder('\OCP\IConfig')
- ->disableOriginalConstructor()->getMock();
- $clientService = $this->getMock('\OCP\Http\Client\IClientService');
- $httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper')
- ->setConstructorArgs([$config, $clientService])
- ->getMock();
- $httpHelperMock->expects($this->any())->method('post')->with($this->anything())->will($this->returnValue(array('success' => true, 'result' => "{'ocs' : { 'meta' : { 'statuscode' : 100 }}}")));
-
- $this->registerHttpHelper($httpHelperMock);
- }
-
- /**
- * Register an http helper mock for testing purposes.
- * @param $httpHelper http helper mock
- */
- private function registerHttpHelper($httpHelper) {
- $this->oldHttpHelper = \OC::$server->query('HTTPHelper');
- \OC::$server->registerService('HTTPHelper', function ($c) use ($httpHelper) {
- return $httpHelper;
- });
- }
-
- /**
- * Restore the original http helper
- */
- private function restoreHttpHelper() {
- $oldHttpHelper = $this->oldHttpHelper;
- \OC::$server->registerService('HTTPHelper', function ($c) use ($oldHttpHelper) {
- return $oldHttpHelper;
- });
- }
-
- /**
- * @medium
- */
- function testDeclineServer2ServerShare() {
-
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
-
- // share the file
- $token = \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, '', \OCP\Constants::PERMISSION_ALL);
- $this->assertTrue(is_string($token));
-
- $publicShareKeyId = \OC::$server->getConfig()->getAppValue('files_encryption', 'publicShareKeyId');
-
- // check if share key for public exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
-
- // manipulate share
- $query = \OC::$server->getDatabaseConnection()->prepare('UPDATE `*PREFIX*share` SET `share_type` = ?, `share_with` = ? WHERE `token`=?');
- $this->assertTrue($query->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, 'foo@bar', $token)));
-
- // check if share key not exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
-
-
- $query = \OC::$server->getDatabaseConnection()->prepare('SELECT * FROM `*PREFIX*share` WHERE `token`=?');
- $query->execute(array($token));
-
- $share = $query->fetch();
-
- $_POST['token'] = $token;
- $s2s = new \OCA\Files_Sharing\API\Server2Server();
- $s2s->declineShare(array('id' => $share['id']));
-
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
-
- }
-
- /**
- * @medium
- * @param bool $withTeardown
- */
- function testShareFile($withTeardown = true) {
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // check if the unencrypted file size is stored
- $this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // share the file
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key for user1 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // login as user1
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- // get file contents
- $retrievedCryptedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- // cleanup
- if ($withTeardown) {
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // unshare the file
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
- $this->view->unlink($this->filename);
- $this->view->chroot('/');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- }
- }
-
- function testDownloadVersions() {
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- $rootView = new \OC\Files\View();
-
- // save file twice to create a new version
- \OC\Files\Filesystem::file_put_contents($this->filename, "revision1");
- \OCA\Files_Versions\Storage::store($this->filename);
- \OC\Files\Filesystem::file_put_contents($this->filename, "revision2");
-
- // check if the owner can retrieve the correct version
- $versions = \OCA\Files_Versions\Storage::getVersions(self::TEST_ENCRYPTION_SHARE_USER1, $this->filename);
- $this->assertSame(1, count($versions));
- $version = reset($versions);
- $versionUser1 = $rootView->file_get_contents('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_versions/' . $this->filename . '.v' . $version['version']);
- $this->assertSame('revision1', $versionUser1);
-
- // share the file
- $fileInfo = \OC\Files\Filesystem::getFileInfo($this->filename);
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
- $this->assertTrue(\OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL));
-
- // try to download the version as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
- $versionUser2 = $rootView->file_get_contents('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_versions/' . $this->filename . '.v' . $version['version']);
- $this->assertSame('revision1', $versionUser2);
-
- //cleanup
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2);
- \OC\Files\Filesystem::unlink($this->filename);
- }
-
- /**
- * @medium
- * @param bool $withTeardown
- */
- function testReShareFile($withTeardown = true) {
- $this->testShareFile(false);
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- // get the file info
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
-
- // share the file with user3
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3, \OCP\Constants::PERMISSION_ALL);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key for user2 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3);
-
- // get file contents
- $retrievedCryptedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename);
-
- // check if data is the same as previously written
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- // cleanup
- if ($withTeardown) {
-
- // login as user1
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- // unshare the file with user2
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
-
- // unshare the file with user1
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
- $this->view->unlink($this->filename);
- $this->view->chroot('/');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- }
- }
-
- /**
- * @medium
- * @param bool $withTeardown
- * @return array
- */
- function testShareFolder($withTeardown = true) {
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // create folder structure
- $this->view->mkdir('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1);
- $this->view->mkdir(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder);
- $this->view->mkdir(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder
- . $this->subsubfolder);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get the file info from previous created folder
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // share the folder with user1
- \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key for user1 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // login as user1
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- // get file contents
- $retrievedCryptedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/' . $this->filename);
-
- // check if data is the same
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- // cleanup
- if ($withTeardown) {
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // unshare the folder with user1
- \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys'
- . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files');
- $this->view->unlink($this->folder1);
- $this->view->chroot('/');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys'
- . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- }
-
- return $fileInfo;
- }
-
- /**
- * @medium
- * @param bool $withTeardown
- */
- function testReShareFolder($withTeardown = true) {
- $fileInfoFolder1 = $this->testShareFolder(false);
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get the file info from previous created folder
- $fileInfoSubFolder = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1
- . $this->subfolder);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfoSubFolder);
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // share the file with user3
- \OCP\Share::shareItem('folder', $fileInfoSubFolder['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3, \OCP\Constants::PERMISSION_ALL);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key for user3 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
-
- // login as user3
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3);
-
- // get file contents
- $retrievedCryptedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder
- . $this->subsubfolder . '/' . $this->filename);
-
- // check if data is the same
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- // get the file info
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder
- . $this->subsubfolder . '/' . $this->filename);
-
- // check if we have fileInfos
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // share the file with user3
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER4, \OCP\Constants::PERMISSION_ALL);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key for user3 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey'));
-
- // login as user3
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER4);
-
- // get file contents
- $retrievedCryptedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '/files/' . $this->filename);
-
- // check if data is the same
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- // cleanup
- if ($withTeardown) {
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3);
-
- // unshare the file with user3
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER4);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys'
- . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey'));
-
- // login as user1
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- // unshare the folder with user2
- \OCP\Share::unshare('folder', $fileInfoSubFolder['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys'
- . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // unshare the folder1 with user1
- \OCP\Share::unshare('folder', $fileInfoFolder1['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys'
- . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files');
- $this->view->unlink($this->folder1 . $this->subfolder . $this->subsubfolder . '/' . $this->filename);
- $this->view->chroot('/');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys'
- . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- }
- }
-
-
- function testRemoteShareFile() {
- // login as admin
- //self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // check if the unencrypted file size is stored
- $this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // share the file
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_REMOTE, 'user1@server1', \OCP\Constants::PERMISSION_ALL);
-
- $publicShareKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'publicShareKeyId');
-
- // check if share key for public exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
-
- // unshare the file
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_REMOTE, 'user1@server1');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
- $this->view->unlink($this->filename);
- $this->view->chroot('/');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- }
-
- function testPublicShareFile() {
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // check if the unencrypted file size is stored
- $this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // share the file
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, false, \OCP\Constants::PERMISSION_ALL);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- $publicShareKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'publicShareKeyId');
-
- // check if share key for public exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
-
- // some hacking to simulate public link
- //$GLOBALS['app'] = 'files_sharing';
- //$GLOBALS['fileOwner'] = self::TEST_ENCRYPTION_SHARE_USER1;
- self::logoutHelper();
-
- // get file contents
- $retrievedCryptedFile = file_get_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- // tear down
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // unshare the file
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
- $this->view->unlink($this->filename);
- $this->view->chroot('/');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- }
-
- /**
- * @medium
- */
- function testShareFileWithGroup() {
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // check if the unencrypted file size is stored
- $this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // share the file
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1, \OCP\Constants::PERMISSION_ALL);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key for user2 and user3 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey'));
-
- // login as user1
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3);
-
- // get file contents
- $retrievedCryptedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // unshare the file
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
- $this->view->unlink($this->filename);
- $this->view->chroot('/');
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
-
- }
-
- /**
- * @large
- */
- function testRecoveryFile() {
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- \OCA\Files_Encryption\Helper::adminEnableRecovery(null, 'test123');
- $recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId');
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- $util = new \OCA\Files_Encryption\Util(new \OC\Files\View('/'), self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if recovery password match
- $this->assertTrue($util->checkRecoveryPassword('test123'));
-
- // enable recovery for admin
- $this->assertTrue($util->setRecoveryForUser(1));
- $util->addRecoveryKeys();
-
- // create folder structure
- $this->view->mkdir('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1);
- $this->view->mkdir(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder);
- $this->view->mkdir(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder
- . $this->subsubfolder);
-
- // save file with content
- $cryptedFile1 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
- $cryptedFile2 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile1);
- $this->assertInternalType('int', $cryptedFile2);
-
- // check if share key for admin and recovery exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
-
- // disable recovery for admin
- $this->assertTrue($util->setRecoveryForUser(0));
-
- // remove all recovery keys
- $util->removeRecoveryKeys('/');
-
- // check if share key for recovery not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
-
- // enable recovery for admin
- $this->assertTrue($util->setRecoveryForUser(1));
-
- // add recovery keys again
- $util->addRecoveryKeys('/');
-
- // check if share key for admin and recovery exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
- $this->view->unlink($this->filename);
- $this->view->unlink($this->folder1);
- $this->view->chroot('/');
-
- // check if share key for recovery not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
-
- $this->assertTrue(\OCA\Files_Encryption\Helper::adminEnableRecovery(null, 'test123'));
- $this->assertTrue(\OCA\Files_Encryption\Helper::adminDisableRecovery('test123'));
- $this->assertEquals(0, \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled'));
- }
-
- /**
- * @large
- */
- function testRecoveryForUser() {
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- $result = \OCA\Files_Encryption\Helper::adminEnableRecovery(null, 'test123');
- $this->assertTrue($result);
-
- $recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId');
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- $util = new \OCA\Files_Encryption\Util(new \OC\Files\View('/'), self::TEST_ENCRYPTION_SHARE_USER2);
-
- // enable recovery for admin
- $this->assertTrue($util->setRecoveryForUser(1));
-
- // add recovery keys for existing files (e.g. the auto-generated welcome.txt)
- $util->addRecoveryKeys();
-
- // create folder structure
- $this->view->mkdir('/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1);
- $this->view->mkdir(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder);
- $this->view->mkdir(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder
- . $this->subsubfolder);
-
- // save file with content
- $cryptedFile1 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2. '/files/' . $this->filename, $this->dataShort);
- $cryptedFile2 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile1);
- $this->assertInternalType('int', $cryptedFile2);
-
- // check if share key for user and recovery exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // change password
- \OC_User::setPassword(self::TEST_ENCRYPTION_SHARE_USER2, 'test', 'test123');
- $params = array('uid' => self::TEST_ENCRYPTION_SHARE_USER2,
- 'password' => 'test',
- 'recoveryPassword' => 'test123');
- \OCA\Files_Encryption\Hooks::setPassphrase($params);
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2, false, 'test');
-
- // get file contents
- $retrievedCryptedFile1 = file_get_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
- $retrievedCryptedFile2 = file_get_contents(
- 'crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' . $this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedCryptedFile1);
- $this->assertEquals($this->dataShort, $retrievedCryptedFile2);
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/');
- $this->view->unlink($this->folder1);
- $this->view->unlink($this->filename);
- $this->view->chroot('/');
-
- // check if share key for user and recovery exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1
- . $this->subfolder . $this->subsubfolder . '/'
- . $this->filename . '/' . $recoveryKeyId . '.shareKey'));
-
- // enable recovery for admin
- $this->assertTrue($util->setRecoveryForUser(0));
-
- \OCA\Files_Encryption\Helper::adminDisableRecovery('test123');
- $this->assertEquals(0, \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled'));
-
- //clean up, reset passwords
- \OC_User::setPassword(self::TEST_ENCRYPTION_SHARE_USER2, self::TEST_ENCRYPTION_SHARE_USER2, 'test123');
- $params = array('uid' => self::TEST_ENCRYPTION_SHARE_USER2,
- 'password' => self::TEST_ENCRYPTION_SHARE_USER2,
- 'recoveryPassword' => 'test123');
- \OCA\Files_Encryption\Hooks::setPassphrase($params);
- }
-
- /**
- * @medium
- */
- function testFailShareFile() {
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // check if the unencrypted file size is stored
- $this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
-
- // break users public key
- $this->view->rename(\OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey',
- \OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey_backup');
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // share the file
- try {
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1, \OCP\Constants::PERMISSION_ALL);
- } catch (\Exception $e) {
- $this->assertEquals(0, strpos($e->getMessage(), "Following users are not set up for encryption"));
- }
-
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // check if share key for user1 not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
-
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- // break user1 public key
- $this->view->rename(
- \OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey_backup',
- \OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey');
-
- // remove share file
- $this->view->unlink('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3
- . '.shareKey');
-
- // re-enable the file proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // unshare the file with user1
- \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1);
-
- // check if share key not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
-
- // cleanup
- $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
- $this->view->unlink($this->filename);
- $this->view->chroot('/');
- }
-
-
- /**
- * test rename a shared file mount point
- */
- function testRename() {
-
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // share the file
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL);
-
- // check if share key for user1 and user2 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2);
-
- $this->assertTrue($this->view->file_exists('/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename));
-
- // get file contents
- $retrievedCryptedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- \OC\Files\Filesystem::mkdir($this->folder1);
-
- // move the file to a subfolder
- \OC\Files\Filesystem::rename($this->filename, $this->folder1 . $this->filename);
-
- // check if we can read the moved file
- $retrievedRenamedFile = $this->view->file_get_contents(
- '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedRenamedFile);
-
- // check if share key for user2 and user1 still exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // cleanup
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
- $this->view->unlink('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
- }
-
- function testRenameGroupShare() {
- // login as admin
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // get the file info from previous created file
- $fileInfo = $this->view->getFileInfo(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
-
- // check if we have a valid file info
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // share the file
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1, \OCP\Constants::PERMISSION_ALL);
-
- // check if share key for user1, user3 and user4 exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey'));
-
-
- // login as user2
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3);
-
- $this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
-
- // get file contents
- $retrievedCryptedFile = \OC\Files\Filesystem::file_get_contents($this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedCryptedFile);
-
- \OC\Files\Filesystem::mkdir($this->folder1);
-
- // move the file to a subfolder
- \OC\Files\Filesystem::rename($this->filename, $this->folder1 . $this->filename);
-
- // check if we can read the moved file
- $retrievedRenamedFile = \OC\Files\Filesystem::file_get_contents($this->folder1 . $this->filename);
-
- // check if data is the same as we previously written
- $this->assertEquals($this->dataShort, $retrievedRenamedFile);
-
- // check if share key for user1, user3 and user4 still exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
- . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey'));
-
- // cleanup
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
- \OC\Files\Filesystem::unlink($this->filename);
- }
-
- /**
- * test if additional share keys are added if we move a folder to a shared parent
- * @medium
- */
- function testMoveFolder() {
-
- $view = new \OC\Files\View('/' . self::TEST_ENCRYPTION_SHARE_USER1);
-
- $filename = '/tmp-' . $this->getUniqueID();
- $folder = '/folder' . $this->getUniqueID();
-
- \OC\Files\Filesystem::mkdir($folder);
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = \OC\Files\Filesystem::file_put_contents($folder . $filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // Get file decrypted contents
- $decrypt = \OC\Files\Filesystem::file_get_contents($folder . $filename);
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- $newFolder = '/newfolder/subfolder' . $this->getUniqueID();
- \OC\Files\Filesystem::mkdir('/newfolder');
-
- // get the file info from previous created file
- $fileInfo = \OC\Files\Filesystem::getFileInfo('/newfolder');
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // share the folder
- \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL);
-
- \OC\Files\Filesystem::rename($folder, $newFolder);
-
- // Get file decrypted contents
- $newDecrypt = \OC\Files\Filesystem::file_get_contents($newFolder . $filename);
- $this->assertEquals($this->dataShort, $newDecrypt);
-
- // check if additional share key for user2 exists
- $this->assertTrue($view->file_exists('files_encryption/keys' . $newFolder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // check that old keys were removed/moved properly
- $this->assertFalse($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // tear down
- \OC\Files\Filesystem::unlink($newFolder);
- \OC\Files\Filesystem::unlink('/newfolder');
- }
-
- function usersProvider() {
- return array(
- // test as owner
- array(self::TEST_ENCRYPTION_SHARE_USER1),
- // test as share receiver
- array(self::TEST_ENCRYPTION_SHARE_USER2),
- );
- }
-
- /**
- * @dataProvider usersProvider
- */
- function testMoveFileToFolder($userId) {
- $view = new \OC\Files\View('/' . self::TEST_ENCRYPTION_SHARE_USER1);
-
- $filename = '/tmp-' . $this->getUniqueID();
- $folder = '/folder' . $this->getUniqueID();
-
- \OC\Files\Filesystem::mkdir($folder);
-
- // Save long data as encrypted file using stream wrapper
- $cryptedFile = \OC\Files\Filesystem::file_put_contents($folder . $filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertInternalType('int', $cryptedFile);
-
- // Get file decrypted contents
- $decrypt = \OC\Files\Filesystem::file_get_contents($folder . $filename);
-
- $this->assertEquals($this->dataShort, $decrypt);
-
- $subFolder = $folder . '/subfolder' . $this->getUniqueID();
- \OC\Files\Filesystem::mkdir($subFolder);
-
- // get the file info from previous created file
- $fileInfo = \OC\Files\Filesystem::getFileInfo($folder);
- $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
-
- // share the folder
- \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL);
-
- // check that the share keys exist
- $this->assertTrue($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // move the file into the subfolder as the test user
- self::loginHelper($userId);
- \OC\Files\Filesystem::rename($folder . $filename, $subFolder . $filename);
- self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
-
- // Get file decrypted contents
- $newDecrypt = \OC\Files\Filesystem::file_get_contents($subFolder . $filename);
- $this->assertEquals($this->dataShort, $newDecrypt);
-
- // check if additional share key for user2 exists
- $this->assertTrue($view->file_exists('files_encryption/keys' . $subFolder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertTrue($view->file_exists('files_encryption/keys' . $subFolder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // check that old keys were removed/moved properly
- $this->assertFalse($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
- $this->assertFalse($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey'));
-
- // tear down
- \OC\Files\Filesystem::unlink($subFolder);
- \OC\Files\Filesystem::unlink($folder);
- }
-
-}
diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php
deleted file mode 100644
index 34e4ee6a32a..00000000000
--- a/apps/files_encryption/tests/stream.php
+++ /dev/null
@@ -1,232 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @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\Files_Encryption\Tests;
-
-/**
- * Class Stream
- * this class provide basic stream tests
- */
-class Stream extends TestCase {
-
- const TEST_ENCRYPTION_STREAM_USER1 = "test-stream-user1";
-
- public $userId;
- public $pass;
- /**
- * @var \OC\Files\View
- */
- public $view;
- public $dataShort;
- public $stateFilesTrashbin;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // create test user
- self::loginHelper(self::TEST_ENCRYPTION_STREAM_USER1, true);
- }
-
- protected function setUp() {
- parent::setUp();
-
- // set user id
- \OC_User::setUserId(self::TEST_ENCRYPTION_STREAM_USER1);
- $this->userId = self::TEST_ENCRYPTION_STREAM_USER1;
- $this->pass = self::TEST_ENCRYPTION_STREAM_USER1;
-
- // init filesystem view
- $this->view = new \OC\Files\View('/');
-
- // init short data
- $this->dataShort = 'hats';
-
- // remember files_trashbin state
- $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we don't want to tests with app files_trashbin enabled
- \OC_App::disable('files_trashbin');
- }
-
- protected function tearDown() {
- // reset app files_trashbin
- if ($this->stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- }
- else {
- \OC_App::disable('files_trashbin');
- }
-
- parent::tearDown();
- }
-
- public static function tearDownAfterClass() {
- // cleanup test user
- \OC_User::deleteUser(self::TEST_ENCRYPTION_STREAM_USER1);
-
- parent::tearDownAfterClass();
- }
-
- function testStreamOptions() {
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- $handle = $view->fopen($filename, 'r');
-
- // check if stream is at position zero
- $this->assertEquals(0, ftell($handle));
-
- // set stream options
- $this->assertTrue(flock($handle, LOCK_SH));
- $this->assertTrue(flock($handle, LOCK_UN));
-
- fclose($handle);
-
- // tear down
- $view->unlink($filename);
- }
-
- function testStreamSetBlocking() {
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- $handle = $view->fopen($filename, 'r');
-
-
- if (\OC_Util::runningOnWindows()) {
- fclose($handle);
- $view->unlink($filename);
- $this->markTestSkipped('[Windows] stream_set_blocking() does not work as expected on Windows.');
- }
-
- // set stream options
- $this->assertTrue(stream_set_blocking($handle, 1));
-
- fclose($handle);
-
- // tear down
- $view->unlink($filename);
- }
-
- /**
- * @medium
- */
- function testStreamSetTimeout() {
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- $handle = $view->fopen($filename, 'r');
-
- // set stream options
- $this->assertFalse(stream_set_timeout($handle, 1));
-
- fclose($handle);
-
- // tear down
- $view->unlink($filename);
- }
-
- function testStreamSetWriteBuffer() {
- $filename = '/tmp-' . $this->getUniqueID();
- $view = new \OC\Files\View('/' . $this->userId . '/files');
-
- // Save short data as encrypted file using stream wrapper
- $cryptedFile = $view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- $handle = $view->fopen($filename, 'r');
-
- // set stream options
- $this->assertEquals(0, stream_set_write_buffer($handle, 1024));
-
- fclose($handle);
-
- // tear down
- $view->unlink($filename);
- }
-
- /**
- * @medium
- * test if stream wrapper can read files outside from the data folder
- */
- function testStreamFromLocalFile() {
-
- $filename = '/' . $this->userId . '/files/' . 'tmp-' . $this->getUniqueID().'.txt';
-
- $tmpFilename = "/tmp/" . $this->getUniqueID() . ".txt";
-
- // write an encrypted file
- $cryptedFile = $this->view->file_put_contents($filename, $this->dataShort);
-
- // Test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // create a copy outside of the data folder in /tmp
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
- $encryptedContent = $this->view->file_get_contents($filename);
- \OC_FileProxy::$enabled = $proxyStatus;
-
- file_put_contents($tmpFilename, $encryptedContent);
-
- \OCA\Files_Encryption\Helper::addTmpFileToMapper($tmpFilename, $filename);
-
- // try to read the file from /tmp
- $handle = fopen("crypt://".$tmpFilename, "r");
- $contentFromTmpFile = stream_get_contents($handle);
-
- // check if it was successful
- $this->assertEquals($this->dataShort, $contentFromTmpFile);
-
- fclose($handle);
-
- // clean up
- unlink($tmpFilename);
- $this->view->unlink($filename);
-
- }
-}
diff --git a/apps/files_encryption/tests/testcase.php b/apps/files_encryption/tests/testcase.php
deleted file mode 100644
index c03147fabcd..00000000000
--- a/apps/files_encryption/tests/testcase.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @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\Files_Encryption\Tests;
-
-/**
- * Class TestCase
- */
-abstract class TestCase extends \Test\TestCase {
-
- /**
- * @param string $user
- * @param bool $create
- * @param bool $password
- */
- public static function loginHelper($user, $create = false, $password = false, $loadEncryption = true) {
- if ($create) {
- try {
- \OC_User::createUser($user, $user);
- } catch (\Exception $e) {
- // catch username is already being used from previous aborted runs
- }
- }
-
- if ($password === false) {
- $password = $user;
- }
-
- \OC_Util::tearDownFS();
- \OC_User::setUserId('');
- \OC\Files\Filesystem::tearDown();
- \OC::$server->getUserSession()->setUser(new \OC\User\User($user, new \OC_User_Database()));
- \OC_Util::setupFS($user);
-
- if ($loadEncryption) {
- $params['uid'] = $user;
- $params['password'] = $password;
- \OCA\Files_Encryption\Hooks::login($params);
- }
- }
-
- public static function logoutHelper() {
- \OC_Util::tearDownFS();
- \OC_User::setUserId(false);
- \OC\Files\Filesystem::tearDown();
- }
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // reset backend
- \OC_User::clearBackends();
- \OC_User::useBackend('database');
-
- \OCA\Files_Encryption\Helper::registerFilesystemHooks();
- \OCA\Files_Encryption\Helper::registerUserHooks();
- \OCA\Files_Encryption\Helper::registerShareHooks();
-
- \OC::registerShareHooks();
- \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup');
-
- // clear and register hooks
- \OC_FileProxy::clearProxies();
- \OC_FileProxy::register(new \OCA\Files_Encryption\Proxy());
- }
-
- public static function tearDownAfterClass() {
- \OC_Hook::clear();
- \OC_FileProxy::clearProxies();
-
- // Delete keys in /data/
- $view = new \OC\Files\View('/');
- $view->deleteAll('files_encryption');
-
- parent::tearDownAfterClass();
- }
-
- protected function tearDown() {
- parent::tearDown();
- $this->resetKeyCache();
- }
-
- protected function resetKeyCache() {
- // reset key cache for every testrun
- $keyCache = new \ReflectionProperty('\OCA\Files_Encryption\Keymanager', 'key_cache');
- $keyCache->setAccessible(true);
- $keyCache->setValue(array());
- $keyCache->setAccessible(false);
- }
-
-}
diff --git a/apps/files_encryption/tests/trashbin.php b/apps/files_encryption/tests/trashbin.php
deleted file mode 100755
index 84785738bfc..00000000000
--- a/apps/files_encryption/tests/trashbin.php
+++ /dev/null
@@ -1,346 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption\Tests;
-
-/**
- * Class Trashbin
- * this class provide basic trashbin app tests
- */
-class Trashbin extends TestCase {
-
- const TEST_ENCRYPTION_TRASHBIN_USER1 = "test-trashbin-user1";
-
- public $userId;
- public $pass;
- /**
- * @var \OC\Files\View
- */
- public $view;
- public $dataShort;
- public $stateFilesTrashbin;
- public $folder1;
- public $subfolder;
- public $subsubfolder;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // trashbin hooks
- \OCA\Files_Trashbin\Trashbin::registerHooks();
-
- // create test user
- self::loginHelper(self::TEST_ENCRYPTION_TRASHBIN_USER1, true);
- }
-
- protected function setUp() {
- parent::setUp();
-
- // set user id
- \OC_User::setUserId(self::TEST_ENCRYPTION_TRASHBIN_USER1);
- $this->userId = self::TEST_ENCRYPTION_TRASHBIN_USER1;
- $this->pass = self::TEST_ENCRYPTION_TRASHBIN_USER1;
-
- // init filesystem view
- $this->view = new \OC\Files\View('/');
-
- // init short data
- $this->dataShort = 'hats';
-
- $this->folder1 = '/folder1';
- $this->subfolder = '/subfolder1';
- $this->subsubfolder = '/subsubfolder1';
-
- // remember files_trashbin state
- $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we want to tests with app files_trashbin enabled
- \OC_App::enable('files_trashbin');
- }
-
- protected function tearDown() {
- // reset app files_trashbin
- if ($this->stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- }
- else {
- \OC_App::disable('files_trashbin');
- }
-
- parent::tearDown();
- }
-
- public static function tearDownAfterClass() {
- // cleanup test user
- \OC_User::deleteUser(self::TEST_ENCRYPTION_TRASHBIN_USER1);
-
- \OC\Files\Filesystem::getLoader()->removeStorageWrapper('oc_trashbin');
-
- parent::tearDownAfterClass();
- }
-
- /**
- * @medium
- * test delete file
- */
- function testDeleteFile() {
-
- // generate filename
- $filename = 'tmp-' . $this->getUniqueID() . '.txt';
- $filename2 = $filename . '.backup'; // a second file with similar name
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' .self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename, $this->dataShort);
- $cryptedFile2 = file_put_contents('crypt:///' .self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename2, $this->dataShort);
-
- // test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
- $this->assertTrue(is_int($cryptedFile2));
-
- // check if key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename2 . '/fileKey'));
-
- // check if share key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename2 . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // delete first file
- \OC\Files\Filesystem::unlink($filename);
-
- // check if file not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename));
-
- // check if key for admin not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey'));
-
- // check if share key for admin not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // check that second file still exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename2));
-
- // check that key for second file still exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename2 . '/fileKey'));
-
- // check that share key for second file still exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename2 . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // get files
- $trashFiles = \OCA\Files_Trashbin\Helper::getTrashFiles('/', self::TEST_ENCRYPTION_TRASHBIN_USER1);
-
- // find created file with timestamp
- $timestamp = null;
- foreach ($trashFiles as $file) {
- if ($file['name'] === $filename) {
- $timestamp = $file['mtime'];
- break;
- }
- }
-
- // check if we found the file we created
- $this->assertNotNull($timestamp);
-
- $this->assertTrue($this->view->is_dir('/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename . '.d' . $timestamp));
-
- // check if key for admin not exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename . '.d' . $timestamp . '/fileKey'));
-
- // check if share key for admin not exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename
- . '.d' . $timestamp . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
- }
-
- /**
- * @medium
- * test restore file
- */
- function testRestoreFile() {
- // generate filename
- $filename = 'tmp-' . $this->getUniqueID() . '.txt';
- $filename2 = $filename . '.backup'; // a second file with similar name
-
- // save file with content
- file_put_contents('crypt:///' . self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename, $this->dataShort);
- file_put_contents('crypt:///' . self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename2, $this->dataShort);
-
- // delete both files
- \OC\Files\Filesystem::unlink($filename);
- \OC\Files\Filesystem::unlink($filename2);
-
- $trashFiles = \OCA\Files_Trashbin\Helper::getTrashFiles('/', self::TEST_ENCRYPTION_TRASHBIN_USER1);
-
- // find created file with timestamp
- $timestamp = null;
- foreach ($trashFiles as $file) {
- if ($file['name'] === $filename) {
- $timestamp = $file['mtime'];
- break;
- }
- }
-
- // make sure that we have a timestamp
- $this->assertNotNull($timestamp);
-
- // before calling the restore operation the keys shouldn't be there
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey'));
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // restore first file
- $this->assertTrue(\OCA\Files_Trashbin\Trashbin::restore($filename . '.d' . $timestamp, $filename, $timestamp));
-
- // check if file exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename));
-
- // check if key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey'));
-
- // check if share key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // check that second file was NOT restored
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename2));
-
- // check if key for admin exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename2 . '/fileKey'));
-
- // check if share key for admin exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename2 . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
- }
-
- /**
- * @medium
- * test delete file forever
- */
- function testPermanentDeleteFile() {
-
- // generate filename
- $filename = 'tmp-' . $this->getUniqueID() . '.txt';
-
- // save file with content
- $cryptedFile = file_put_contents('crypt:///' .$this->userId. '/files/' . $filename, $this->dataShort);
-
- // test that data was successfully written
- $this->assertTrue(is_int($cryptedFile));
-
- // check if key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey'));
-
- // check if share key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // delete file
- \OC\Files\Filesystem::unlink($filename);
-
- // check if file not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename));
-
- // check if key for admin not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/'
- . $filename . '.key'));
-
- // check if share key for admin not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/'
- . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // find created file with timestamp
- $query = \OC_DB::prepare('SELECT `timestamp`,`type` FROM `*PREFIX*files_trash`'
- . ' WHERE `id`=?');
- $result = $query->execute(array($filename))->fetchRow();
-
- $this->assertTrue(is_array($result));
-
- // build suffix
- $trashFileSuffix = 'd' . $result['timestamp'];
-
- // check if key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename
- . '.' . $trashFileSuffix . '/fileKey'));
-
- // check if share key for admin exists
- $this->assertTrue($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/'
- . $filename . '.' . $trashFileSuffix . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
-
- // get timestamp from file
- $timestamp = str_replace('d', '', $trashFileSuffix);
-
- // delete file forever
- $this->assertGreaterThan(0, \OCA\Files_Trashbin\Trashbin::delete($filename, $this->userId, $timestamp));
-
- // check if key for admin not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/files/' . $filename . '.'
- . $trashFileSuffix));
-
- // check if key for admin not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename
- . '.' . $trashFileSuffix . '/fileKey'));
-
- // check if share key for admin not exists
- $this->assertFalse($this->view->file_exists(
- '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename
- . '.' . $trashFileSuffix . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey'));
- }
-
-}
diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php
deleted file mode 100755
index 4174a0da0da..00000000000
--- a/apps/files_encryption/tests/util.php
+++ /dev/null
@@ -1,693 +0,0 @@
-<?php
-/**
- * @author Andreas Fischer <bantu@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Florin Peter <github@florin-peter.de>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Markus Goetz <markus@woboq.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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\Files_Encryption\Tests;
-
-/**
- * Class Util
- */
-class Util extends TestCase {
-
- const TEST_ENCRYPTION_UTIL_USER1 = "test-util-user1";
- const TEST_ENCRYPTION_UTIL_USER2 = "test-util-user2";
- const TEST_ENCRYPTION_UTIL_GROUP1 = "test-util-group1";
- const TEST_ENCRYPTION_UTIL_GROUP2 = "test-util-group2";
- const TEST_ENCRYPTION_UTIL_LEGACY_USER = "test-legacy-user";
-
- public $userId;
- public $encryptionDir;
- public $publicKeyDir;
- public $pass;
- /**
- * @var \OC\Files\View
- */
- public $view;
- public $keysPath;
- public $publicKeyPath;
- public $privateKeyPath;
- /**
- * @var \OCA\Files_Encryption\Util
- */
- public $util;
- public $dataShort;
- public $legacyEncryptedData;
- public $legacyEncryptedDataKey;
- public $legacyKey;
- public $stateFilesTrashbin;
-
- public static function setUpBeforeClass() {
- parent::setUpBeforeClass();
-
- // create test user
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1, true);
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER2, true);
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_LEGACY_USER, true);
-
- // create groups
- \OC_Group::createGroup(self::TEST_ENCRYPTION_UTIL_GROUP1);
- \OC_Group::createGroup(self::TEST_ENCRYPTION_UTIL_GROUP2);
-
- // add user 1 to group1
- \OC_Group::addToGroup(self::TEST_ENCRYPTION_UTIL_USER1, self::TEST_ENCRYPTION_UTIL_GROUP1);
- }
-
- protected function setUp() {
- parent::setUp();
-
- // login user
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1);
- \OC_User::setUserId(self::TEST_ENCRYPTION_UTIL_USER1);
- $this->userId = self::TEST_ENCRYPTION_UTIL_USER1;
- $this->pass = self::TEST_ENCRYPTION_UTIL_USER1;
-
- // set content for encrypting / decrypting in tests
- $this->dataUrl = __DIR__ . '/../lib/crypt.php';
- $this->dataShort = 'hats';
- $this->dataLong = file_get_contents(__DIR__ . '/../lib/crypt.php');
- $this->legacyData = __DIR__ . '/legacy-text.txt';
- $this->legacyEncryptedData = __DIR__ . '/legacy-encrypted-text.txt';
- $this->legacyEncryptedDataKey = __DIR__ . '/encryption.key';
- $this->legacyKey = "30943623843030686906\0\0\0\0";
-
- $keypair = \OCA\Files_Encryption\Crypt::createKeypair();
-
- $this->genPublicKey = $keypair['publicKey'];
- $this->genPrivateKey = $keypair['privateKey'];
-
- $this->publicKeyDir = \OCA\Files_Encryption\Keymanager::getPublicKeyPath();
- $this->encryptionDir = '/' . $this->userId . '/' . 'files_encryption';
- $this->keysPath = $this->encryptionDir . '/' . 'keys';
- $this->publicKeyPath =
- $this->publicKeyDir . '/' . $this->userId . '.publicKey'; // e.g. data/public-keys/admin.publicKey
- $this->privateKeyPath =
- $this->encryptionDir . '/' . $this->userId . '.privateKey'; // e.g. data/admin/admin.privateKey
-
- $this->view = new \OC\Files\View('/');
-
- $this->util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- // remember files_trashbin state
- $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin');
-
- // we don't want to tests with app files_trashbin enabled
- \OC_App::disable('files_trashbin');
- }
-
- protected function tearDown() {
- // reset app files_trashbin
- if ($this->stateFilesTrashbin) {
- \OC_App::enable('files_trashbin');
- }
- else {
- \OC_App::disable('files_trashbin');
- }
-
- parent::tearDown();
- }
-
- public static function tearDownAfterClass() {
- // cleanup test user
- \OC_User::deleteUser(self::TEST_ENCRYPTION_UTIL_USER1);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_UTIL_USER2);
- \OC_User::deleteUser(self::TEST_ENCRYPTION_UTIL_LEGACY_USER);
-
- //cleanup groups
- \OC_Group::deleteGroup(self::TEST_ENCRYPTION_UTIL_GROUP1);
- \OC_Group::deleteGroup(self::TEST_ENCRYPTION_UTIL_GROUP2);
-
- parent::tearDownAfterClass();
- }
-
- /**
- * @medium
- * test that paths set during User construction are correct
- */
- function testKeyPaths() {
- $util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- $this->assertEquals($this->publicKeyDir, $util->getPath('publicKeyDir'));
- $this->assertEquals($this->encryptionDir, $util->getPath('encryptionDir'));
- $this->assertEquals($this->keysPath, $util->getPath('keysPath'));
- $this->assertEquals($this->publicKeyPath, $util->getPath('publicKeyPath'));
- $this->assertEquals($this->privateKeyPath, $util->getPath('privateKeyPath'));
-
- }
-
- /**
- * @medium
- * test detection of encrypted files
- */
- function testIsEncryptedPath() {
-
- $util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- self::loginHelper($this->userId);
-
- $unencryptedFile = '/tmpUnencrypted-' . $this->getUniqueID() . '.txt';
- $encryptedFile = '/tmpEncrypted-' . $this->getUniqueID() . '.txt';
-
- // Disable encryption proxy to write a unencrypted file
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $this->view->file_put_contents($this->userId . '/files/' . $unencryptedFile, $this->dataShort);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
-
- // write a encrypted file
- $this->view->file_put_contents($this->userId . '/files/' . $encryptedFile, $this->dataShort);
-
- // test if both files are detected correctly
- $this->assertFalse($util->isEncryptedPath($this->userId . '/files/' . $unencryptedFile));
- $this->assertTrue($util->isEncryptedPath($this->userId . '/files/' . $encryptedFile));
-
- // cleanup
- $this->view->unlink($this->userId . '/files/' . $unencryptedFile);
- $this->view->unlink($this->userId . '/files/' . $encryptedFile);
-
- }
-
- /**
- * @medium
- * test setup of encryption directories
- */
- function testSetupServerSide() {
- $this->assertEquals(true, $this->util->setupServerSide($this->pass));
- }
-
- /**
- * @medium
- * test checking whether account is ready for encryption,
- */
- function testUserIsReady() {
- $this->assertEquals(true, $this->util->ready());
- }
-
- /**
- * test checking whether account is not ready for encryption,
- */
-// function testUserIsNotReady() {
-// $this->view->unlink($this->publicKeyDir);
-//
-// $params['uid'] = $this->userId;
-// $params['password'] = $this->pass;
-// $this->assertFalse(OCA\Files_Encryption\Hooks::login($params));
-//
-// $this->view->unlink($this->privateKeyPath);
-// }
-
- /**
- * @medium
- */
- function testRecoveryEnabledForUser() {
-
- $util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- // Record the value so we can return it to it's original state later
- $enabled = $util->recoveryEnabledForUser();
-
- $this->assertTrue($util->setRecoveryForUser(!$enabled));
-
- $this->assertEquals(!$enabled, $util->recoveryEnabledForUser());
-
- $this->assertTrue($util->setRecoveryForUser($enabled));
-
- $this->assertEquals($enabled, $util->recoveryEnabledForUser());
-
-
- }
-
- /**
- * @medium
- */
- function testGetUidAndFilename() {
-
- \OC_User::setUserId(self::TEST_ENCRYPTION_UTIL_USER1);
-
- $filename = '/tmp-' . $this->getUniqueID() . '.test';
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $this->view->file_put_contents($this->userId . '/files/' . $filename, $this->dataShort);
-
- // Re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
-
- $util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- list($fileOwnerUid, $file) = $util->getUidAndFilename($filename);
-
- $this->assertEquals(self::TEST_ENCRYPTION_UTIL_USER1, $fileOwnerUid);
-
- $this->assertEquals($file, $filename);
-
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- /**
- * Test that data that is read by the crypto stream wrapper
- */
- function testGetFileSize() {
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1);
-
- $filename = 'tmp-' . $this->getUniqueID();
- $externalFilename = '/' . $this->userId . '/files/' . $filename;
-
- // Test for 0 byte files
- $problematicFileSizeData = "";
- $cryptedFile = $this->view->file_put_contents($externalFilename, $problematicFileSizeData);
- $this->assertTrue(is_int($cryptedFile));
- $this->assertEquals($this->util->getFileSize($externalFilename), 0);
- $decrypt = $this->view->file_get_contents($externalFilename);
- $this->assertEquals($problematicFileSizeData, $decrypt);
- $this->view->unlink($this->userId . '/files/' . $filename);
-
- // Test a file with 18377 bytes as in https://github.com/owncloud/mirall/issues/1009
- $problematicFileSizeData = str_pad("", 18377, "abc");
- $cryptedFile = $this->view->file_put_contents($externalFilename, $problematicFileSizeData);
- $this->assertTrue(is_int($cryptedFile));
- $this->assertEquals($this->util->getFileSize($externalFilename), 18377);
- $decrypt = $this->view->file_get_contents($externalFilename);
- $this->assertEquals($problematicFileSizeData, $decrypt);
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- function testEncryptAll() {
-
- $filename = "/encryptAll" . $this->getUniqueID() . ".txt";
- $util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- // disable encryption to upload a unencrypted file
- \OC_App::disable('files_encryption');
-
- $this->view->file_put_contents($this->userId . '/files/' . $filename, $this->dataShort);
-
- $fileInfoUnencrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
-
- $this->assertTrue($fileInfoUnencrypted instanceof \OC\Files\FileInfo);
-
- // enable file encryption again
- \OC_App::enable('files_encryption');
-
- // encrypt all unencrypted files
- $util->encryptAll('/' . $this->userId . '/' . 'files');
-
- $fileInfoEncrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
-
- $this->assertTrue($fileInfoEncrypted instanceof \OC\Files\FileInfo);
-
- // check if mtime and etags unchanged
- $this->assertEquals($fileInfoEncrypted['mtime'], $fileInfoUnencrypted['mtime']);
- $this->assertSame($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']);
-
- $this->view->unlink($this->userId . '/files/' . $filename);
- }
-
- function testDecryptAll() {
-
- $filename = "/decryptAll" . $this->getUniqueID() . ".txt";
- $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/');
- $userdir = $datadir . '/' . $this->userId . '/files/';
-
- $this->view->file_put_contents($this->userId . '/files/' . $filename, $this->dataShort);
-
- $fileInfoEncrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
-
- $this->assertTrue($fileInfoEncrypted instanceof \OC\Files\FileInfo);
- $this->assertEquals($fileInfoEncrypted['encrypted'], 1);
-
- $encContent = file_get_contents($userdir . $filename);
-
- \OC_App::disable('files_encryption');
-
- $user = \OCP\User::getUser();
- $this->logoutHelper();
- $this->loginHelper($user, false, false, false);
-
- $content = file_get_contents($userdir . $filename);
-
- //content should be encrypted
- $this->assertSame($encContent, $content);
-
- // now we load the encryption app again
- \OC_App::loadApp('files_encryption');
-
- // init encryption app
- $params = array('uid' => \OCP\User::getUser(),
- 'password' => \OCP\User::getUser());
-
- $view = new \OC\Files\View('/');
- $util = new \OCA\Files_Encryption\Util($view, \OCP\User::getUser());
-
- $result = $util->initEncryption($params);
-
- $this->assertTrue($result instanceof \OCA\Files_Encryption\Session);
-
- $successful = $util->decryptAll();
-
- $this->assertTrue($successful);
-
- $this->logoutHelper();
- $this->loginHelper($user, false, false, false);
-
- // file should be unencrypted and fileInfo should contain the correct values
- $content = file_get_contents($userdir . $filename);
-
- // now we should get the plain data
- $this->assertSame($this->dataShort, $content);
-
- $fileInfoUnencrypted = $this->view->getFileInfo($this->userId . '/files/' . $filename);
- $this->assertTrue($fileInfoUnencrypted instanceof \OC\Files\FileInfo);
-
- // check if mtime and etags unchanged
- $this->assertEquals($fileInfoEncrypted['mtime'], $fileInfoUnencrypted['mtime']);
- $this->assertSame($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']);
- // file should no longer be encrypted
- $this->assertEquals(0, $fileInfoUnencrypted['encrypted']);
-
- $backupPath = $this->getBackupPath('decryptAll');
-
- // check if the keys where moved to the backup location
- $this->assertTrue($this->view->is_dir($backupPath . '/keys'));
- $this->assertTrue($this->view->file_exists($backupPath . '/keys/' . $filename . '/fileKey'));
- $this->assertTrue($this->view->file_exists($backupPath . '/keys/' . $filename . '/' . $user . '.shareKey'));
-
- // cleanup
- $this->view->unlink($this->userId . '/files/' . $filename);
- $this->view->deleteAll($backupPath);
- \OC_App::enable('files_encryption');
-
- }
-
- private function createDummyKeysForBackupTest() {
- // create some dummy key files
- $encPath = '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '/files_encryption';
- $this->view->mkdir($encPath . '/keys/foo');
- $this->view->file_put_contents($encPath . '/keys/foo/fileKey', 'key');
- $this->view->file_put_contents($encPath . '/keys/foo/user1.shareKey', 'share key');
- }
-
- /**
- * test if all keys get moved to the backup folder correctly
- *
- * @dataProvider dataBackupAllKeys
- */
- function testBackupAllKeys($addTimestamp, $includeUserKeys) {
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1);
-
- $this->createDummyKeysForBackupTest();
-
- $util = new \OCA\Files_Encryption\Util($this->view, self::TEST_ENCRYPTION_UTIL_USER1);
-
- $util->backupAllKeys('testBackupAllKeys', $addTimestamp, $includeUserKeys);
-
- $backupPath = $this->getBackupPath('testBackupAllKeys');
-
- // check backupDir Content
- $this->assertTrue($this->view->is_dir($backupPath . '/keys'));
- $this->assertTrue($this->view->is_dir($backupPath . '/keys/foo'));
- $this->assertTrue($this->view->file_exists($backupPath . '/keys/foo/fileKey'));
- $this->assertTrue($this->view->file_exists($backupPath . '/keys/foo/user1.shareKey'));
-
- if ($includeUserKeys) {
- $this->assertTrue($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.privateKey'));
- $this->assertTrue($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.publicKey'));
- } else {
- $this->assertFalse($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.privateKey'));
- $this->assertFalse($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.publicKey'));
- }
-
- //cleanup
- $this->view->deleteAll($backupPath);
- $this->view->unlink($this->encryptionDir . '/keys/foo/fileKey');
- $this->view->unlink($this->encryptionDir . '/keys/foo/user1.shareKey');
- }
-
- function dataBackupAllKeys() {
- return array(
- array(true, true),
- array(false, true),
- array(true, false),
- array(false, false),
- );
- }
-
-
- /**
- * @dataProvider dataBackupAllKeys
- */
- function testRestoreBackup($addTimestamp, $includeUserKeys) {
-
- $util = new \OCA\Files_Encryption\Util($this->view, self::TEST_ENCRYPTION_UTIL_USER1);
- $this->createDummyKeysForBackupTest();
-
- $util->backupAllKeys('restoreKeysBackupTest', $addTimestamp, $includeUserKeys);
- $this->view->deleteAll($this->keysPath);
- if ($includeUserKeys) {
- $this->view->unlink($this->privateKeyPath);
- $this->view->unlink($this->publicKeyPath);
- }
-
- // key should be removed after backup was created
- $this->assertFalse($this->view->is_dir($this->keysPath));
- if ($includeUserKeys) {
- $this->assertFalse($this->view->file_exists($this->privateKeyPath));
- $this->assertFalse($this->view->file_exists($this->publicKeyPath));
- }
-
- $backupPath = $this->getBackupPath('restoreKeysBackupTest');
- $backupName = substr(basename($backupPath), strlen('backup.'));
-
- $this->assertTrue($util->restoreBackup($backupName));
-
- // check if all keys are restored
- $this->assertFalse($this->view->is_dir($backupPath));
- $this->assertTrue($this->view->is_dir($this->keysPath));
- $this->assertTrue($this->view->is_dir($this->keysPath . '/foo'));
- $this->assertTrue($this->view->file_exists($this->keysPath . '/foo/fileKey'));
- $this->assertTrue($this->view->file_exists($this->keysPath . '/foo/user1.shareKey'));
- $this->assertTrue($this->view->file_exists($this->privateKeyPath));
- $this->assertTrue($this->view->file_exists($this->publicKeyPath));
- }
-
- function testDeleteBackup() {
- $util = new \OCA\Files_Encryption\Util($this->view, self::TEST_ENCRYPTION_UTIL_USER1);
- $this->createDummyKeysForBackupTest();
-
- $util->backupAllKeys('testDeleteBackup', false, false);
-
- $this->assertTrue($this->view->is_dir($this->encryptionDir . '/backup.testDeleteBackup'));
-
- $util->deleteBackup('testDeleteBackup');
-
- $this->assertFalse($this->view->is_dir($this->encryptionDir . '/backup.testDeleteBackup'));
- }
-
- function testDescryptAllWithBrokenFiles() {
-
- $file1 = "/decryptAll1" . $this->getUniqueID() . ".txt";
- $file2 = "/decryptAll2" . $this->getUniqueID() . ".txt";
-
- $util = new \OCA\Files_Encryption\Util($this->view, $this->userId);
-
- $this->view->file_put_contents($this->userId . '/files/' . $file1, $this->dataShort);
- $this->view->file_put_contents($this->userId . '/files/' . $file2, $this->dataShort);
-
- $fileInfoEncrypted1 = $this->view->getFileInfo($this->userId . '/files/' . $file1);
- $fileInfoEncrypted2 = $this->view->getFileInfo($this->userId . '/files/' . $file2);
-
- $this->assertTrue($fileInfoEncrypted1 instanceof \OC\Files\FileInfo);
- $this->assertTrue($fileInfoEncrypted2 instanceof \OC\Files\FileInfo);
- $this->assertEquals($fileInfoEncrypted1['encrypted'], 1);
- $this->assertEquals($fileInfoEncrypted2['encrypted'], 1);
-
- // rename keyfile for file1 so that the decryption for file1 fails
- // Expected behaviour: decryptAll() returns false, file2 gets decrypted anyway
- $this->view->rename($this->userId . '/files_encryption/keys/' . $file1 . '/fileKey',
- $this->userId . '/files_encryption/keys/' . $file1 . '/fileKey.moved');
-
- // need to reset key cache that we don't use the cached key
- $this->resetKeyCache();
-
- // decrypt all encrypted files
- $result = $util->decryptAll();
-
- $this->assertFalse($result);
-
- $fileInfoUnencrypted1 = $this->view->getFileInfo($this->userId . '/files/' . $file1);
- $fileInfoUnencrypted2 = $this->view->getFileInfo($this->userId . '/files/' . $file2);
-
- $this->assertTrue($fileInfoUnencrypted1 instanceof \OC\Files\FileInfo);
- $this->assertTrue($fileInfoUnencrypted2 instanceof \OC\Files\FileInfo);
-
- // file1 should be still encrypted; file2 should be decrypted
- $this->assertEquals(1, $fileInfoUnencrypted1['encrypted']);
- $this->assertEquals(0, $fileInfoUnencrypted2['encrypted']);
-
- // keyfiles and share keys should still exist
- $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/keys/'));
- $this->assertTrue($this->view->file_exists($this->userId . '/files_encryption/keys/' . $file1 . '/fileKey.moved'));
- $this->assertTrue($this->view->file_exists($this->userId . '/files_encryption/keys/' . $file1 . '/' . $this->userId . '.shareKey'));
-
- // rename the keyfile for file1 back
- $this->view->rename($this->userId . '/files_encryption/keys/' . $file1 . '/fileKey.moved',
- $this->userId . '/files_encryption/keys/' . $file1 . '/fileKey');
-
- // try again to decrypt all encrypted files
- $result = $util->decryptAll();
-
- $this->assertTrue($result);
-
- $fileInfoUnencrypted1 = $this->view->getFileInfo($this->userId . '/files/' . $file1);
- $fileInfoUnencrypted2 = $this->view->getFileInfo($this->userId . '/files/' . $file2);
-
- $this->assertTrue($fileInfoUnencrypted1 instanceof \OC\Files\FileInfo);
- $this->assertTrue($fileInfoUnencrypted2 instanceof \OC\Files\FileInfo);
-
- // now both files should be decrypted
- $this->assertEquals(0, $fileInfoUnencrypted1['encrypted']);
- $this->assertEquals(0, $fileInfoUnencrypted2['encrypted']);
-
- // keyfiles and share keys should be deleted
- $this->assertFalse($this->view->is_dir($this->userId . '/files_encryption/keys/'));
-
- //cleanup
- $backupPath = $this->getBackupPath('decryptAll');
- $this->view->unlink($this->userId . '/files/' . $file1);
- $this->view->unlink($this->userId . '/files/' . $file2);
- $this->view->deleteAll($backupPath);
-
- }
-
- function getBackupPath($extension) {
- $encPath = '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '/files_encryption';
- $encFolderContent = $this->view->getDirectoryContent($encPath);
-
- $backupPath = '';
- foreach ($encFolderContent as $c) {
- $name = $c['name'];
- if (substr($name, 0, strlen('backup.' . $extension)) === 'backup.' . $extension) {
- $backupPath = $encPath . '/'. $c['name'];
- break;
- }
- }
-
- return $backupPath;
- }
-
- /**
- * @dataProvider dataProviderFortestIsMountPointApplicableToUser
- */
- function testIsMountPointApplicableToUser($mount, $expectedResult) {
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1);
- $dummyClass = new DummyUtilClass($this->view, self::TEST_ENCRYPTION_UTIL_USER1);
- $result = $dummyClass->testIsMountPointApplicableToUser($mount);
-
- $this->assertSame($expectedResult, $result);
- }
-
- function dataProviderFortestIsMountPointApplicableToUser() {
- return array(
- array(array('applicable' => array('groups' => array(), 'users' => array(self::TEST_ENCRYPTION_UTIL_USER1))), true),
- array(array('applicable' => array('groups' => array(), 'users' => array(self::TEST_ENCRYPTION_UTIL_USER2))), false),
- array(array('applicable' => array('groups' => array(self::TEST_ENCRYPTION_UTIL_GROUP1), 'users' => array())), true),
- array(array('applicable' => array('groups' => array(self::TEST_ENCRYPTION_UTIL_GROUP1), 'users' => array(self::TEST_ENCRYPTION_UTIL_USER2))), true),
- array(array('applicable' => array('groups' => array(self::TEST_ENCRYPTION_UTIL_GROUP2), 'users' => array(self::TEST_ENCRYPTION_UTIL_USER2))), false),
- array(array('applicable' => array('groups' => array(self::TEST_ENCRYPTION_UTIL_GROUP2), 'users' => array(self::TEST_ENCRYPTION_UTIL_USER2, 'all'))), true),
- array(array('applicable' => array('groups' => array(self::TEST_ENCRYPTION_UTIL_GROUP2), 'users' => array('all'))), true),
- );
- }
-
- /**
- * Tests that filterShareReadyUsers() returns the correct list of
- * users that are ready or not ready for encryption
- */
- public function testFilterShareReadyUsers() {
- $appConfig = \OC::$server->getAppConfig();
-
- $publicShareKeyId = $appConfig->getValue('files_encryption', 'publicShareKeyId');
- $recoveryKeyId = $appConfig->getValue('files_encryption', 'recoveryKeyId');
-
- $usersToTest = array(
- 'readyUser',
- 'notReadyUser',
- 'nonExistingUser',
- $publicShareKeyId,
- $recoveryKeyId,
- );
- self::loginHelper('readyUser', true);
- self::loginHelper('notReadyUser', true);
- // delete encryption dir to make it not ready
- $this->view->unlink('notReadyUser/files_encryption/');
-
- // login as user1
- self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1);
-
- $result = $this->util->filterShareReadyUsers($usersToTest);
- $this->assertEquals(
- array('readyUser', $publicShareKeyId, $recoveryKeyId),
- $result['ready']
- );
- $this->assertEquals(
- array('notReadyUser', 'nonExistingUser'),
- $result['unready']
- );
- \OC_User::deleteUser('readyUser');
- }
-
- /**
- * helper function to set migration status to the right value
- * to be able to test the migration path
- *
- * @param integer $status needed migration status for test
- * @param string $user for which user the status should be set
- * @return boolean
- */
- private function setMigrationStatus($status, $user) {
- \OC::$server->getConfig()->setUserValue($user, 'files_encryption', 'migration_status', (string)$status);
- // the update will definitely be executed -> return value is always true
- return true;
- }
-
-}
-
-/**
- * dummy class extends \OCA\Files_Encryption\Util to access protected methods for testing
- */
-class DummyUtilClass extends \OCA\Files_Encryption\Util {
- public function testIsMountPointApplicableToUser($mount) {
- return $this->isMountPointApplicableToUser($mount);
- }
-}
diff --git a/apps/files_encryption/tests/zeros b/apps/files_encryption/tests/zeros
deleted file mode 100644
index ff982acf423..00000000000
--- a/apps/files_encryption/tests/zeros
+++ /dev/null
Binary files differ
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index ae3aef4ef35..1dae64216e1 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -15,6 +15,10 @@ var MOUNT_OPTIONS_DROPDOWN_TEMPLATE =
'<div class="drop dropdown mountOptionsDropdown">' +
// FIXME: options are hard-coded for now
' <div class="optionRow">' +
+ ' <label for="mountOptionsEncrypt">{{t "files_external" "Enable encryption"}}</label>' +
+ ' <input id="mountOptionsEncrypt" name="encrypt" type="checkbox" value="true" checked="checked"/>' +
+ ' </div>' +
+ ' <div class="optionRow">' +
' <label for="mountOptionsPreviews">{{t "files_external" "Enable previews"}}</label>' +
' <input id="mountOptionsPreviews" name="previews" type="checkbox" value="true" checked="checked"/>' +
' </div>' +
@@ -422,8 +426,9 @@ MountOptionsDropdown.prototype = {
*
* @param {Object} $container container
* @param {Object} mountOptions mount options
+ * @param {Array} enabledOptions enabled mount options
*/
- show: function($container, mountOptions) {
+ show: function($container, mountOptions, enabledOptions) {
if (MountOptionsDropdown._last) {
MountOptionsDropdown._last.hide();
}
@@ -438,7 +443,7 @@ MountOptionsDropdown.prototype = {
this.$el = $el;
$el.addClass('hidden');
- this.setOptions(mountOptions);
+ this.setOptions(mountOptions, enabledOptions);
this.$el.appendTo($container);
MountOptionsDropdown._last = this;
@@ -484,8 +489,9 @@ MountOptionsDropdown.prototype = {
* Sets the mount options to the dropdown controls
*
* @param {Object} options mount options
+ * @param {Array} enabledOptions enabled mount options
*/
- setOptions: function(options) {
+ setOptions: function(options, enabledOptions) {
var $el = this.$el;
_.each(options, function(value, key) {
var $optionEl = $el.find('input, select').filterAttr('name', key);
@@ -498,6 +504,15 @@ MountOptionsDropdown.prototype = {
$optionEl.val(value);
}
});
+ $el.find('.optionRow').each(function(i, row){
+ var $row = $(row);
+ var optionId = $row.find('input, select').attr('name');
+ if (enabledOptions.indexOf(optionId) === -1) {
+ $row.hide();
+ } else {
+ $row.show();
+ }
+ });
}
};
@@ -554,6 +569,8 @@ MountConfigListView.prototype = {
*/
_allBackends: null,
+ _encryptionEnabled: false,
+
/**
* @param {Object} $el DOM object containing the list
* @param {Object} [options]
@@ -573,6 +590,8 @@ MountConfigListView.prototype = {
this._userListLimit = options.userListLimit;
}
+ this._encryptionEnabled = options.encryptionEnabled;
+
// read the backend config that was carefully crammed
// into the data-configurations attribute of the select
this._allBackends = this.$el.find('.selectBackend').data('configurations');
@@ -935,8 +954,11 @@ MountConfigListView.prototype = {
var storage = this.getStorageConfig($tr);
var $toggle = $tr.find('.mountOptionsToggle');
var dropDown = new MountOptionsDropdown();
- dropDown.show($toggle, storage.mountOptions || []);
-
+ var enabledOptions = ['previews', 'filesystem_check_changes'];
+ if (this._encryptionEnabled) {
+ enabledOptions.push('encrypt');
+ }
+ dropDown.show($toggle, storage.mountOptions || [], enabledOptions);
$('body').on('mouseup.mountOptionsDropdown', function(event) {
var $target = $(event.target);
if ($toggle.has($target).length) {
@@ -963,7 +985,11 @@ MountConfigListView.prototype = {
};
$(document).ready(function() {
- var mountConfigListView = new MountConfigListView($('#externalStorage'));
+ var enabled = $('#files_external').attr('data-encryption-enabled');
+ var encryptionEnabled = (enabled ==='true')? true: false;
+ var mountConfigListView = new MountConfigListView($('#externalStorage'), {
+ encryptionEnabled: encryptionEnabled
+ });
$('#sslCertificate').on('click', 'td.remove>img', function() {
var $tr = $(this).closest('tr');
diff --git a/apps/files_external/l10n/az.js b/apps/files_external/l10n/az.js
index bf7338695e6..6e28fa378df 100644
--- a/apps/files_external/l10n/az.js
+++ b/apps/files_external/l10n/az.js
@@ -64,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Qeyd:</b> PHP-də FTP dəstəyi aktiv deyil və ya yüklənməyib. %s -in birləşdirilməsi mümkün deyil. Xahiş edilir onun yüklənilməsi barəsində inzibatşınıza məlumat verəsiniz.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Qeyd:</b> \"%s\" yüklənməyib. %s -in birləşdirilməsi mümkün deyil. Xahiş edilir onun yüklənilməsi barəsində inzibatşınıza məlumat verəsiniz.",
"No external storage configured" : "Kənar depo konfiq edilməyib",
+ "You can add external storages in the personal settings" : "Siz şəxsi quraşdırmalarınızda kənar depo əlavə edə bilərsiniz",
"Name" : "Ad",
"Storage type" : "Depo tipi",
"Scope" : "Həcm",
@@ -72,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Konfiqurasiya",
"Available for" : "Üçün mövcuddur",
"Add storage" : "Deponu əlavə et",
+ "Advanced settings" : "İrəliləmiş quraşdırmalar",
"Delete" : "Sil",
"Enable User External Storage" : "İstifadəçi kənar deponu aktivləşdir",
"Allow users to mount the following external storage" : "Göstərilən kənar deponun bərkidilməsi üçün istifadəçilərə izin ver"
diff --git a/apps/files_external/l10n/az.json b/apps/files_external/l10n/az.json
index d9e1a5f54fc..e0d8727cb20 100644
--- a/apps/files_external/l10n/az.json
+++ b/apps/files_external/l10n/az.json
@@ -62,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Qeyd:</b> PHP-də FTP dəstəyi aktiv deyil və ya yüklənməyib. %s -in birləşdirilməsi mümkün deyil. Xahiş edilir onun yüklənilməsi barəsində inzibatşınıza məlumat verəsiniz.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Qeyd:</b> \"%s\" yüklənməyib. %s -in birləşdirilməsi mümkün deyil. Xahiş edilir onun yüklənilməsi barəsində inzibatşınıza məlumat verəsiniz.",
"No external storage configured" : "Kənar depo konfiq edilməyib",
+ "You can add external storages in the personal settings" : "Siz şəxsi quraşdırmalarınızda kənar depo əlavə edə bilərsiniz",
"Name" : "Ad",
"Storage type" : "Depo tipi",
"Scope" : "Həcm",
@@ -70,6 +71,7 @@
"Configuration" : "Konfiqurasiya",
"Available for" : "Üçün mövcuddur",
"Add storage" : "Deponu əlavə et",
+ "Advanced settings" : "İrəliləmiş quraşdırmalar",
"Delete" : "Sil",
"Enable User External Storage" : "İstifadəçi kənar deponu aktivləşdir",
"Allow users to mount the following external storage" : "Göstərilən kənar deponun bərkidilməsi üçün istifadəçilərə izin ver"
diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js
index 00b81fb0eec..54bf95a774a 100644
--- a/apps/files_external/l10n/da.js
+++ b/apps/files_external/l10n/da.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Sikker https://",
"Public key" : "Offentlig nøgle",
+ "Storage with id \"%i\" not found" : "Lager med ID'et \"%i% er ikke fundet",
+ "Invalid mount point" : "Fokert monteringspunkt",
+ "Invalid storage backend \"%s\"" : "Forkert lager til backend \"%s\"en",
"Access granted" : "Adgang godkendt",
"Error configuring Dropbox storage" : "Fejl ved konfiguration af Dropbox plads",
"Grant access" : "Godkend adgang",
@@ -61,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> FTP understøttelsen i PHP er enten ikke aktiveret eller installeret. Montering af %s er ikke muligt. Anmod din systemadministrator om at installere det.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> \"%s\" er ikke installeret. Monteringen af %s er ikke mulig. Anmod din systemadministrator om at installere det.",
"No external storage configured" : "Der er ingen konfigurerede eksterne lagre",
+ "You can add external storages in the personal settings" : "Du kan tilføje eksterne lagerenheder i de personlige indstillinger",
"Name" : "Navn",
"Storage type" : "Lagertype",
"Scope" : "Anvendelsesområde",
@@ -69,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Opsætning",
"Available for" : "Tilgængelig for",
"Add storage" : "Tilføj lager",
+ "Advanced settings" : "Avancerede indstillinger",
"Delete" : "Slet",
"Enable User External Storage" : "Aktivér ekstern opbevaring for brugere",
"Allow users to mount the following external storage" : "Tillad brugere at montere følgende som eksternt lager"
diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json
index 6ad06336ef7..885d9d63925 100644
--- a/apps/files_external/l10n/da.json
+++ b/apps/files_external/l10n/da.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Sikker https://",
"Public key" : "Offentlig nøgle",
+ "Storage with id \"%i\" not found" : "Lager med ID'et \"%i% er ikke fundet",
+ "Invalid mount point" : "Fokert monteringspunkt",
+ "Invalid storage backend \"%s\"" : "Forkert lager til backend \"%s\"en",
"Access granted" : "Adgang godkendt",
"Error configuring Dropbox storage" : "Fejl ved konfiguration af Dropbox plads",
"Grant access" : "Godkend adgang",
@@ -59,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> FTP understøttelsen i PHP er enten ikke aktiveret eller installeret. Montering af %s er ikke muligt. Anmod din systemadministrator om at installere det.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> \"%s\" er ikke installeret. Monteringen af %s er ikke mulig. Anmod din systemadministrator om at installere det.",
"No external storage configured" : "Der er ingen konfigurerede eksterne lagre",
+ "You can add external storages in the personal settings" : "Du kan tilføje eksterne lagerenheder i de personlige indstillinger",
"Name" : "Navn",
"Storage type" : "Lagertype",
"Scope" : "Anvendelsesområde",
@@ -67,6 +71,7 @@
"Configuration" : "Opsætning",
"Available for" : "Tilgængelig for",
"Add storage" : "Tilføj lager",
+ "Advanced settings" : "Avancerede indstillinger",
"Delete" : "Slet",
"Enable User External Storage" : "Aktivér ekstern opbevaring for brugere",
"Allow users to mount the following external storage" : "Tillad brugere at montere følgende som eksternt lager"
diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js
index e54036d4f61..6f9ee1cbe45 100644
--- a/apps/files_external/l10n/es.js
+++ b/apps/files_external/l10n/es.js
@@ -15,7 +15,7 @@ OC.L10N.register(
"Bucket" : "Depósito",
"Amazon S3 and compliant" : "Amazon S3 y compatibilidad",
"Access Key" : "Clave de Acceso",
- "Secret Key" : "Clave Secreta",
+ "Secret Key" : "Clave secreta",
"Hostname" : "Nombre de equipo",
"Port" : "Puerto",
"Region" : "Región",
@@ -64,7 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" no está instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
"No external storage configured" : "No hay ningún almacenamiento externo configurado",
- "You can add external storages in the personal settings" : "Puedes agregar almacenamientos externos en la configuración personal",
+ "You can add external storages in the personal settings" : "Puede agregar almacenamientos externos en la configuración personal",
"Name" : "Nombre",
"Storage type" : "Tipo de almacenamiento",
"Scope" : "Ámbito",
diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json
index abf7cc689c5..857c26ae344 100644
--- a/apps/files_external/l10n/es.json
+++ b/apps/files_external/l10n/es.json
@@ -13,7 +13,7 @@
"Bucket" : "Depósito",
"Amazon S3 and compliant" : "Amazon S3 y compatibilidad",
"Access Key" : "Clave de Acceso",
- "Secret Key" : "Clave Secreta",
+ "Secret Key" : "Clave secreta",
"Hostname" : "Nombre de equipo",
"Port" : "Puerto",
"Region" : "Región",
@@ -62,7 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" no está instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.",
"No external storage configured" : "No hay ningún almacenamiento externo configurado",
- "You can add external storages in the personal settings" : "Puedes agregar almacenamientos externos en la configuración personal",
+ "You can add external storages in the personal settings" : "Puede agregar almacenamientos externos en la configuración personal",
"Name" : "Nombre",
"Storage type" : "Tipo de almacenamiento",
"Scope" : "Ámbito",
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index b8f9b3502db..b5804618a9a 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -48,9 +48,9 @@ OC.L10N.register(
"Invalid mount point" : "Point de montage non valide",
"Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"",
"Access granted" : "Accès autorisé",
- "Error configuring Dropbox storage" : "Erreur lors de la configuration du support de stockage Dropbox",
+ "Error configuring Dropbox storage" : "Erreur lors de la configuration du stockage Dropbox",
"Grant access" : "Autoriser l'accès",
- "Error configuring Google Drive storage" : "Erreur lors de la configuration du support de stockage Google Drive",
+ "Error configuring Google Drive storage" : "Erreur lors de la configuration du stockage Google Drive",
"Personal" : "Personnel",
"System" : "Système",
"All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.",
@@ -64,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> \"%s\" n'est pas installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
"No external storage configured" : "Aucun stockage externe configuré",
+ "You can add external storages in the personal settings" : "Vous pouvez ajouter des stockages externes dans les paramètres personnels",
"Name" : "Nom",
"Storage type" : "Type de support de stockage",
"Scope" : "Portée",
@@ -72,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Configuration",
"Available for" : "Disponible pour",
"Add storage" : "Ajouter un support de stockage",
+ "Advanced settings" : "Paramètres avancés",
"Delete" : "Supprimer",
"Enable User External Storage" : "Autoriser les utilisateurs à ajouter des stockages externes",
"Allow users to mount the following external storage" : "Autoriser les utilisateurs à monter les stockages externes suivants"
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index 710d77385d7..e72a6d1bf7f 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -46,9 +46,9 @@
"Invalid mount point" : "Point de montage non valide",
"Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"",
"Access granted" : "Accès autorisé",
- "Error configuring Dropbox storage" : "Erreur lors de la configuration du support de stockage Dropbox",
+ "Error configuring Dropbox storage" : "Erreur lors de la configuration du stockage Dropbox",
"Grant access" : "Autoriser l'accès",
- "Error configuring Google Drive storage" : "Erreur lors de la configuration du support de stockage Google Drive",
+ "Error configuring Google Drive storage" : "Erreur lors de la configuration du stockage Google Drive",
"Personal" : "Personnel",
"System" : "Système",
"All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.",
@@ -62,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> \"%s\" n'est pas installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.",
"No external storage configured" : "Aucun stockage externe configuré",
+ "You can add external storages in the personal settings" : "Vous pouvez ajouter des stockages externes dans les paramètres personnels",
"Name" : "Nom",
"Storage type" : "Type de support de stockage",
"Scope" : "Portée",
@@ -70,6 +71,7 @@
"Configuration" : "Configuration",
"Available for" : "Disponible pour",
"Add storage" : "Ajouter un support de stockage",
+ "Advanced settings" : "Paramètres avancés",
"Delete" : "Supprimer",
"Enable User External Storage" : "Autoriser les utilisateurs à ajouter des stockages externes",
"Allow users to mount the following external storage" : "Autoriser les utilisateurs à monter les stockages externes suivants"
diff --git a/apps/files_external/l10n/nb_NO.js b/apps/files_external/l10n/nb_NO.js
index 334cc554901..1a4fa8f90d8 100644
--- a/apps/files_external/l10n/nb_NO.js
+++ b/apps/files_external/l10n/nb_NO.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "Sikker https://",
"Public key" : "Offentlig nøkkel",
+ "Storage with id \"%i\" not found" : "Lager med id \"%i\" ikke funnet",
+ "Invalid mount point" : "Ugyldig oppkoblingspunkt",
+ "Invalid storage backend \"%s\"" : "Ugyldig lagringsserver \"%s\"",
"Access granted" : "Tilgang innvilget",
"Error configuring Dropbox storage" : "Feil ved konfigurering av Dropbox-lagring",
"Grant access" : "Gi tilgang",
@@ -61,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> FTP-støtte i PHP er ikke slått på eller installert. Kan ikke koble opp %s. Ta kontakt med systemadministratoren for å installere det.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> \"%s\" er ikke installert. Oppkobling av %s er ikke mulig. Spør systemadministratoren om å installere det.",
"No external storage configured" : "Eksternt lager er ikke konfigurert",
+ "You can add external storages in the personal settings" : "Du kan legge til eksterne lagre i personlige innstillinger",
"Name" : "Navn",
"Storage type" : "Lagringstype",
"Scope" : "Omfang",
@@ -69,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Konfigurasjon",
"Available for" : "Tilgjengelig for",
"Add storage" : "Legg til lagringsplass",
+ "Advanced settings" : "Avanserte innstillinger",
"Delete" : "Slett",
"Enable User External Storage" : "Aktiver ekstern lagring for bruker",
"Allow users to mount the following external storage" : "Tillat brukere å koble opp følgende eksterne lagring"
diff --git a/apps/files_external/l10n/nb_NO.json b/apps/files_external/l10n/nb_NO.json
index 321470d2e8f..c946e044fe8 100644
--- a/apps/files_external/l10n/nb_NO.json
+++ b/apps/files_external/l10n/nb_NO.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "Sikker https://",
"Public key" : "Offentlig nøkkel",
+ "Storage with id \"%i\" not found" : "Lager med id \"%i\" ikke funnet",
+ "Invalid mount point" : "Ugyldig oppkoblingspunkt",
+ "Invalid storage backend \"%s\"" : "Ugyldig lagringsserver \"%s\"",
"Access granted" : "Tilgang innvilget",
"Error configuring Dropbox storage" : "Feil ved konfigurering av Dropbox-lagring",
"Grant access" : "Gi tilgang",
@@ -59,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> FTP-støtte i PHP er ikke slått på eller installert. Kan ikke koble opp %s. Ta kontakt med systemadministratoren for å installere det.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> \"%s\" er ikke installert. Oppkobling av %s er ikke mulig. Spør systemadministratoren om å installere det.",
"No external storage configured" : "Eksternt lager er ikke konfigurert",
+ "You can add external storages in the personal settings" : "Du kan legge til eksterne lagre i personlige innstillinger",
"Name" : "Navn",
"Storage type" : "Lagringstype",
"Scope" : "Omfang",
@@ -67,6 +71,7 @@
"Configuration" : "Konfigurasjon",
"Available for" : "Tilgjengelig for",
"Add storage" : "Legg til lagringsplass",
+ "Advanced settings" : "Avanserte innstillinger",
"Delete" : "Slett",
"Enable User External Storage" : "Aktiver ekstern lagring for bruker",
"Allow users to mount the following external storage" : "Tillat brukere å koble opp følgende eksterne lagring"
diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js
index 5b63c64641f..4abc66a1dcf 100644
--- a/apps/files_external/l10n/pt_BR.js
+++ b/apps/files_external/l10n/pt_BR.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "URL",
"Secure https://" : "https:// segura",
"Public key" : "Chave pública",
+ "Storage with id \"%i\" not found" : "Armazenamento com id \"%i\" não encontrado",
+ "Invalid mount point" : "Ponto de montagem inválido",
+ "Invalid storage backend \"%s\"" : "Armazenamento backend inválido \"%s\"",
"Access granted" : "Acesso concedido",
"Error configuring Dropbox storage" : "Erro ao configurar armazenamento do Dropbox",
"Grant access" : "Permitir acesso",
@@ -61,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> O suporte FTP no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.",
"No external storage configured" : "Nenhum armazendo externo foi configurado",
+ "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais",
"Name" : "Nome",
"Storage type" : "Tipo de armazenamento",
"Scope" : "Escopo",
@@ -69,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Configuração",
"Available for" : "Disponível para",
"Add storage" : "Adicionar Armazenamento",
+ "Advanced settings" : "Configurações avançadas",
"Delete" : "Excluir",
"Enable User External Storage" : "Habilitar Armazenamento Externo do Usuário",
"Allow users to mount the following external storage" : "Permitir que usuários montem o seguinte armazenamento externo"
diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json
index 6e7890fc86a..2fb9a422265 100644
--- a/apps/files_external/l10n/pt_BR.json
+++ b/apps/files_external/l10n/pt_BR.json
@@ -42,6 +42,9 @@
"URL" : "URL",
"Secure https://" : "https:// segura",
"Public key" : "Chave pública",
+ "Storage with id \"%i\" not found" : "Armazenamento com id \"%i\" não encontrado",
+ "Invalid mount point" : "Ponto de montagem inválido",
+ "Invalid storage backend \"%s\"" : "Armazenamento backend inválido \"%s\"",
"Access granted" : "Acesso concedido",
"Error configuring Dropbox storage" : "Erro ao configurar armazenamento do Dropbox",
"Grant access" : "Permitir acesso",
@@ -59,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> O suporte FTP no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.",
"No external storage configured" : "Nenhum armazendo externo foi configurado",
+ "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais",
"Name" : "Nome",
"Storage type" : "Tipo de armazenamento",
"Scope" : "Escopo",
@@ -67,6 +71,7 @@
"Configuration" : "Configuração",
"Available for" : "Disponível para",
"Add storage" : "Adicionar Armazenamento",
+ "Advanced settings" : "Configurações avançadas",
"Delete" : "Excluir",
"Enable User External Storage" : "Habilitar Armazenamento Externo do Usuário",
"Allow users to mount the following external storage" : "Permitir que usuários montem o seguinte armazenamento externo"
diff --git a/apps/files_external/l10n/sl.js b/apps/files_external/l10n/sl.js
index c10b6e64141..2938f681116 100644
--- a/apps/files_external/l10n/sl.js
+++ b/apps/files_external/l10n/sl.js
@@ -44,6 +44,9 @@ OC.L10N.register(
"URL" : "Naslov URL",
"Secure https://" : "Varni način https://",
"Public key" : "Javni ključ",
+ "Storage with id \"%i\" not found" : "Shrambe z ID \"%i\" ni mogoče najti.",
+ "Invalid mount point" : "Neveljavna priklopna točka",
+ "Invalid storage backend \"%s\"" : "Neveljaven ozadnji program shrambe \"%s\"",
"Access granted" : "Dostop je odobren",
"Error configuring Dropbox storage" : "Napaka nastavljanja shrambe Dropbox",
"Grant access" : "Odobri dostop",
@@ -61,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Podpora za protokol FTP v PHP ni omogočena, ali pa ni ustrezno nameščenih programov. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Program \"%s\" ni nameščen. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.",
"No external storage configured" : "Ni določene zunanje shrambe",
+ "You can add external storages in the personal settings" : "Med nastavitvami je mogoče dodati tudi zunanjo shrambo.",
"Name" : "Ime",
"Storage type" : "Vrsta shrambe",
"Scope" : "Obseg",
@@ -69,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Nastavitve",
"Available for" : "Na voljo za",
"Add storage" : "Dodaj shrambo",
+ "Advanced settings" : "Napredne nastavitve",
"Delete" : "Izbriši",
"Enable User External Storage" : "Omogoči zunanjo uporabniško podatkovno shrambo",
"Allow users to mount the following external storage" : "Dovoli uporabnikom priklapljanje navedenih zunanjih shramb."
diff --git a/apps/files_external/l10n/sl.json b/apps/files_external/l10n/sl.json
index 44b3f3eae6f..c3282e859dd 100644
--- a/apps/files_external/l10n/sl.json
+++ b/apps/files_external/l10n/sl.json
@@ -42,6 +42,9 @@
"URL" : "Naslov URL",
"Secure https://" : "Varni način https://",
"Public key" : "Javni ključ",
+ "Storage with id \"%i\" not found" : "Shrambe z ID \"%i\" ni mogoče najti.",
+ "Invalid mount point" : "Neveljavna priklopna točka",
+ "Invalid storage backend \"%s\"" : "Neveljaven ozadnji program shrambe \"%s\"",
"Access granted" : "Dostop je odobren",
"Error configuring Dropbox storage" : "Napaka nastavljanja shrambe Dropbox",
"Grant access" : "Odobri dostop",
@@ -59,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Podpora za protokol FTP v PHP ni omogočena, ali pa ni ustrezno nameščenih programov. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Program \"%s\" ni nameščen. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.",
"No external storage configured" : "Ni določene zunanje shrambe",
+ "You can add external storages in the personal settings" : "Med nastavitvami je mogoče dodati tudi zunanjo shrambo.",
"Name" : "Ime",
"Storage type" : "Vrsta shrambe",
"Scope" : "Obseg",
@@ -67,6 +71,7 @@
"Configuration" : "Nastavitve",
"Available for" : "Na voljo za",
"Add storage" : "Dodaj shrambo",
+ "Advanced settings" : "Napredne nastavitve",
"Delete" : "Izbriši",
"Enable User External Storage" : "Omogoči zunanjo uporabniško podatkovno shrambo",
"Allow users to mount the following external storage" : "Dovoli uporabnikom priklapljanje navedenih zunanjih shramb."
diff --git a/apps/files_external/l10n/sr.js b/apps/files_external/l10n/sr.js
index 2f6eadea721..0187a2526eb 100644
--- a/apps/files_external/l10n/sr.js
+++ b/apps/files_external/l10n/sr.js
@@ -1,12 +1,18 @@
OC.L10N.register(
"files_external",
{
+ "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Преузимање тражених токена није успело. Проверите да ли су Dropbox апликациони кључ и тајна тачни.",
+ "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Преузимање приступних токена није успело. Проверите да ли су Dropbox апликациони кључ и тајна тачни.",
+ "Please provide a valid Dropbox app key and secret." : "Омогућите важећи Dropbox апликациони кључ и тајну.",
+ "Step 1 failed. Exception: %s" : "Корак 1 није успео. Изузетак: %s",
+ "Step 2 failed. Exception: %s" : "Корак 2 није успео. Изузетак: %s",
"External storage" : "Спољашње складиште",
"Local" : "локална",
"Location" : "Локација",
"Amazon S3" : "Амазон С3",
"Key" : "Кључ",
"Secret" : "Тајна",
+ "Bucket" : "Канта",
"Amazon S3 and compliant" : "Амазон С3 и одговарајући",
"Access Key" : "Приступни кључ",
"Secret Key" : "Тајни кључ",
@@ -14,6 +20,7 @@ OC.L10N.register(
"Port" : "Порт",
"Region" : "Регија",
"Enable SSL" : "Омогући ССЛ",
+ "Enable Path Style" : "Омогући стил путање",
"App key" : "Кључ апликације",
"App secret" : "Тајна апликације",
"Host" : "Домаћин",
@@ -23,12 +30,23 @@ OC.L10N.register(
"Secure ftps://" : "Сигурни ftps://",
"Client ID" : "ИД клијента",
"Client secret" : "Тајна клијента",
+ "OpenStack Object Storage" : "OpenStack Object Storage",
+ "Region (optional for OpenStack Object Storage)" : "Регион (није обавезно за OpenStack Object Storage)",
+ "API Key (required for Rackspace Cloud Files)" : "API Key (потребан за Rackspace Cloud Files)",
+ "Tenantname (required for OpenStack Object Storage)" : "Tenantname (потребно за OpenStack Object Storage)",
+ "Password (required for OpenStack Object Storage)" : "Лозинка (потребна за OpenStack Object Storage)",
+ "Service Name (required for OpenStack Object Storage)" : "Име сервиса (потребно за OpenStack Object Storage)",
+ "URL of identity endpoint (required for OpenStack Object Storage)" : "Адреса идентитета крајње тачке (потребно за OpenStack Object Storage)",
"Timeout of HTTP requests in seconds" : "Време истека ХТТП захтева у секундама",
"Share" : "Дели",
"SMB / CIFS using OC login" : "СМБ/ЦИФС користећи Оунклауд пријаву",
+ "Username as share" : "Корисничко име као дељење",
"URL" : "УРЛ",
"Secure https://" : "Сигурни https://",
"Public key" : "Јавни кључ",
+ "Storage with id \"%i\" not found" : "Складиште са идентификацијом \"%i\" није пронађено",
+ "Invalid mount point" : "Неважећа тачка постављања",
+ "Invalid storage backend \"%s\"" : "Неважећа позадина складишта \"%s\"",
"Access granted" : "Приступ одобрен",
"Error configuring Dropbox storage" : "Грешка при подешавању Дропбокс складишта",
"Grant access" : "Одобри приступ",
@@ -46,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Напомена:</b> ФТП подршка за ПХП није омогућена или инсталирана. Монтирање %s није могуће. Затражите од вашег администратора система да је инсталира.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Напомена:</b> „%s“ није инсталирана. Монтирање %s није могуће. Затражите од вашег администратора система да је инсталира.",
"No external storage configured" : "Нема подешеног спољашњег складишта",
+ "You can add external storages in the personal settings" : "Можете додати спољна складишта у вашим личним подешавањима",
"Name" : "Назив",
"Storage type" : "Тип складишта",
"Scope" : "Распон",
@@ -54,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Подешавање",
"Available for" : "Доступно за",
"Add storage" : "Додај складиште",
+ "Advanced settings" : "Напредне подешавања",
"Delete" : "Обриши",
"Enable User External Storage" : "Укључи корисничко спољашње складиште",
"Allow users to mount the following external storage" : "Дозволи корисницима да монтирају следећа спољашња складишта"
diff --git a/apps/files_external/l10n/sr.json b/apps/files_external/l10n/sr.json
index c8f02c77d70..76d12974695 100644
--- a/apps/files_external/l10n/sr.json
+++ b/apps/files_external/l10n/sr.json
@@ -1,10 +1,16 @@
{ "translations": {
+ "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Преузимање тражених токена није успело. Проверите да ли су Dropbox апликациони кључ и тајна тачни.",
+ "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Преузимање приступних токена није успело. Проверите да ли су Dropbox апликациони кључ и тајна тачни.",
+ "Please provide a valid Dropbox app key and secret." : "Омогућите важећи Dropbox апликациони кључ и тајну.",
+ "Step 1 failed. Exception: %s" : "Корак 1 није успео. Изузетак: %s",
+ "Step 2 failed. Exception: %s" : "Корак 2 није успео. Изузетак: %s",
"External storage" : "Спољашње складиште",
"Local" : "локална",
"Location" : "Локација",
"Amazon S3" : "Амазон С3",
"Key" : "Кључ",
"Secret" : "Тајна",
+ "Bucket" : "Канта",
"Amazon S3 and compliant" : "Амазон С3 и одговарајући",
"Access Key" : "Приступни кључ",
"Secret Key" : "Тајни кључ",
@@ -12,6 +18,7 @@
"Port" : "Порт",
"Region" : "Регија",
"Enable SSL" : "Омогући ССЛ",
+ "Enable Path Style" : "Омогући стил путање",
"App key" : "Кључ апликације",
"App secret" : "Тајна апликације",
"Host" : "Домаћин",
@@ -21,12 +28,23 @@
"Secure ftps://" : "Сигурни ftps://",
"Client ID" : "ИД клијента",
"Client secret" : "Тајна клијента",
+ "OpenStack Object Storage" : "OpenStack Object Storage",
+ "Region (optional for OpenStack Object Storage)" : "Регион (није обавезно за OpenStack Object Storage)",
+ "API Key (required for Rackspace Cloud Files)" : "API Key (потребан за Rackspace Cloud Files)",
+ "Tenantname (required for OpenStack Object Storage)" : "Tenantname (потребно за OpenStack Object Storage)",
+ "Password (required for OpenStack Object Storage)" : "Лозинка (потребна за OpenStack Object Storage)",
+ "Service Name (required for OpenStack Object Storage)" : "Име сервиса (потребно за OpenStack Object Storage)",
+ "URL of identity endpoint (required for OpenStack Object Storage)" : "Адреса идентитета крајње тачке (потребно за OpenStack Object Storage)",
"Timeout of HTTP requests in seconds" : "Време истека ХТТП захтева у секундама",
"Share" : "Дели",
"SMB / CIFS using OC login" : "СМБ/ЦИФС користећи Оунклауд пријаву",
+ "Username as share" : "Корисничко име као дељење",
"URL" : "УРЛ",
"Secure https://" : "Сигурни https://",
"Public key" : "Јавни кључ",
+ "Storage with id \"%i\" not found" : "Складиште са идентификацијом \"%i\" није пронађено",
+ "Invalid mount point" : "Неважећа тачка постављања",
+ "Invalid storage backend \"%s\"" : "Неважећа позадина складишта \"%s\"",
"Access granted" : "Приступ одобрен",
"Error configuring Dropbox storage" : "Грешка при подешавању Дропбокс складишта",
"Grant access" : "Одобри приступ",
@@ -44,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Напомена:</b> ФТП подршка за ПХП није омогућена или инсталирана. Монтирање %s није могуће. Затражите од вашег администратора система да је инсталира.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Напомена:</b> „%s“ није инсталирана. Монтирање %s није могуће. Затражите од вашег администратора система да је инсталира.",
"No external storage configured" : "Нема подешеног спољашњег складишта",
+ "You can add external storages in the personal settings" : "Можете додати спољна складишта у вашим личним подешавањима",
"Name" : "Назив",
"Storage type" : "Тип складишта",
"Scope" : "Распон",
@@ -52,6 +71,7 @@
"Configuration" : "Подешавање",
"Available for" : "Доступно за",
"Add storage" : "Додај складиште",
+ "Advanced settings" : "Напредне подешавања",
"Delete" : "Обриши",
"Enable User External Storage" : "Укључи корисничко спољашње складиште",
"Allow users to mount the following external storage" : "Дозволи корисницима да монтирају следећа спољашња складишта"
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index 8159c0beb2a..3845e0fd97b 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -64,6 +64,7 @@ OC.L10N.register(
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de FTP desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> \"%s\" kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.",
"No external storage configured" : "Yapılandırılmış harici depolama yok",
+ "You can add external storages in the personal settings" : "Harici depolamaları kişisel ayarlar içerisinden ekleyebilirsiniz",
"Name" : "Ad",
"Storage type" : "Depolama türü",
"Scope" : "Kapsam",
@@ -72,6 +73,7 @@ OC.L10N.register(
"Configuration" : "Yapılandırma",
"Available for" : "Kullanabilenler",
"Add storage" : "Depo ekle",
+ "Advanced settings" : "Gelişmiş ayarlar",
"Delete" : "Sil",
"Enable User External Storage" : "Kullanıcılar için Harici Depolamayı Etkinleştir",
"Allow users to mount the following external storage" : "Kullanıcıların aşağıdaki harici depolamayı bağlamalarına izin ver"
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index 74c29ba6bab..67af4f8d67d 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -62,6 +62,7 @@
"<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de FTP desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.",
"<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> \"%s\" kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.",
"No external storage configured" : "Yapılandırılmış harici depolama yok",
+ "You can add external storages in the personal settings" : "Harici depolamaları kişisel ayarlar içerisinden ekleyebilirsiniz",
"Name" : "Ad",
"Storage type" : "Depolama türü",
"Scope" : "Kapsam",
@@ -70,6 +71,7 @@
"Configuration" : "Yapılandırma",
"Available for" : "Kullanabilenler",
"Add storage" : "Depo ekle",
+ "Advanced settings" : "Gelişmiş ayarlar",
"Delete" : "Sil",
"Enable User External Storage" : "Kullanıcılar için Harici Depolamayı Etkinleştir",
"Allow users to mount the following external storage" : "Kullanıcıların aşağıdaki harici depolamayı bağlamalarına izin ver"
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
index 291f9364ddd..541113fb530 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/google.php
@@ -113,7 +113,7 @@ class Google extends \OC\Files\Storage\Common {
if (isset($this->driveFiles[$path])) {
$parentId = $this->driveFiles[$path]->getId();
} else {
- $q = "title='".$name."' and '".$parentId."' in parents and trashed = false";
+ $q = "title='" . str_replace("'","\\'", $name) . "' and '" . str_replace("'","\\'", $parentId) . "' in parents and trashed = false";
$result = $this->service->files->listFiles(array('q' => $q))->getItems();
if (!empty($result)) {
// Google Drive allows files with the same name, ownCloud doesn't
@@ -257,7 +257,7 @@ class Google extends \OC\Files\Storage\Common {
if ($pageToken !== true) {
$params['pageToken'] = $pageToken;
}
- $params['q'] = "'".$folder->getId()."' in parents and trashed = false";
+ $params['q'] = "'" . str_replace("'","\\'", $folder->getId()) . "' in parents and trashed = false";
$children = $this->service->files->listFiles($params);
foreach ($children->getItems() as $child) {
$name = $child->getTitle();
diff --git a/apps/files_external/lib/sftp_key.php b/apps/files_external/lib/sftp_key.php
index c460d81b8f0..d9bcadb9eb7 100644
--- a/apps/files_external/lib/sftp_key.php
+++ b/apps/files_external/lib/sftp_key.php
@@ -135,11 +135,16 @@ class SFTP_Key extends \OC\Files\Storage\SFTP {
}
public function test() {
- if (empty($this->getHost())) {
+
+ // FIXME: Use as expression in empty once PHP 5.4 support is dropped
+ $host = $this->getHost();
+ if (empty($host)) {
\OC::$server->getLogger()->warning('Hostname has not been specified');
return false;
}
- if (empty($this->getUser())) {
+ // FIXME: Use as expression in empty once PHP 5.4 support is dropped
+ $user = $this->getUser();
+ if (empty($user)) {
\OC::$server->getLogger()->warning('Username has not been specified');
return false;
}
diff --git a/apps/files_external/lib/smb_oc.php b/apps/files_external/lib/smb_oc.php
index 8e34854afac..9fd3aa3721f 100644
--- a/apps/files_external/lib/smb_oc.php
+++ b/apps/files_external/lib/smb_oc.php
@@ -38,13 +38,20 @@ class SMB_OC extends SMB {
* @throws \Exception
*/
public function __construct($params) {
- if (isset($params['host']) && \OC::$server->getSession()->exists('smb-credentials')) {
+ if (isset($params['host'])) {
$host = $params['host'];
$this->username_as_share = ($params['username_as_share'] === 'true');
- $params_auth = json_decode(\OC::$server->getCrypto()->decrypt(\OC::$server->getSession()->get('smb-credentials')), true);
- $user = \OC::$server->getSession()->get('loginname');
- $password = $params_auth['password'];
+ // dummy credentials, unused, to satisfy constructor
+ $user = 'foo';
+ $password = 'bar';
+ if (\OC::$server->getSession()->exists('smb-credentials')) {
+ $params_auth = json_decode(\OC::$server->getCrypto()->decrypt(\OC::$server->getSession()->get('smb-credentials')), true);
+ $user = \OC::$server->getSession()->get('loginname');
+ $password = $params_auth['password'];
+ } else {
+ // assume we are testing from the admin section
+ }
$root = isset($params['root']) ? $params['root'] : '/';
$share = '';
diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php
index e09f0f803ac..b2ab32411f9 100644
--- a/apps/files_external/personal.php
+++ b/apps/files_external/personal.php
@@ -48,6 +48,7 @@ if (!$hasId) {
}
$tmpl = new OCP\Template('files_external', 'settings');
+$tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
$tmpl->assign('isAdminPage', false);
$tmpl->assign('mounts', $mounts);
$tmpl->assign('dependencies', OC_Mount_Config::checkDependencies());
diff --git a/apps/files_external/service/globalstoragesservice.php b/apps/files_external/service/globalstoragesservice.php
index 011730390b0..7df0f73f652 100644
--- a/apps/files_external/service/globalstoragesservice.php
+++ b/apps/files_external/service/globalstoragesservice.php
@@ -101,6 +101,7 @@ class GlobalStoragesService extends StoragesService {
* @param string $signal signal to trigger
*/
protected function triggerHooks(StorageConfig $storage, $signal) {
+ // FIXME: Use as expression in empty once PHP 5.4 support is dropped
$applicableUsers = $storage->getApplicableUsers();
$applicableGroups = $storage->getApplicableGroups();
if (empty($applicableUsers) && empty($applicableGroups)) {
@@ -149,8 +150,11 @@ class GlobalStoragesService extends StoragesService {
$groupAdditions = array_diff($newStorage->getApplicableGroups(), $oldStorage->getApplicableGroups());
$groupDeletions = array_diff($oldStorage->getApplicableGroups(), $newStorage->getApplicableGroups());
+ // FIXME: Use as expression in empty once PHP 5.4 support is dropped
// if no applicable were set, raise a signal for "all"
- if (empty($oldStorage->getApplicableUsers()) && empty($oldStorage->getApplicableGroups())) {
+ $oldApplicableUsers = $oldStorage->getApplicableUsers();
+ $oldApplicableGroups = $oldStorage->getApplicableGroups();
+ if (empty($oldApplicableUsers) && empty($oldApplicableGroups)) {
$this->triggerApplicableHooks(
Filesystem::signal_delete_mount,
$oldStorage->getMountPoint(),
@@ -191,8 +195,11 @@ class GlobalStoragesService extends StoragesService {
$groupAdditions
);
+ // FIXME: Use as expression in empty once PHP 5.4 support is dropped
// if no applicable, raise a signal for "all"
- if (empty($newStorage->getApplicableUsers()) && empty($newStorage->getApplicableGroups())) {
+ $newApplicableUsers = $newStorage->getApplicableUsers();
+ $newApplicableGroups = $newStorage->getApplicableGroups();
+ if (empty($newApplicableUsers) && empty($newApplicableGroups)) {
$this->triggerApplicableHooks(
Filesystem::signal_create_mount,
$newStorage->getMountPoint(),
diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php
index 399a56677bf..51eb4abcc00 100644
--- a/apps/files_external/service/storagesservice.php
+++ b/apps/files_external/service/storagesservice.php
@@ -227,8 +227,10 @@ abstract class StoragesService {
if (!is_null($storageConfig->getPriority())) {
$options['priority'] = $storageConfig->getPriority();
}
- if (!empty($storageConfig->getMountOptions())) {
- $options['mountOptions'] = $storageConfig->getMountOptions();
+
+ $mountOptions = $storageConfig->getMountOptions();
+ if (!empty($mountOptions)) {
+ $options['mountOptions'] = $mountOptions;
}
$mountPoints[$mountType][$applicable][$rootMountPoint] = $options;
diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php
index ee4982a9ad4..daf205d3d57 100644
--- a/apps/files_external/settings.php
+++ b/apps/files_external/settings.php
@@ -68,6 +68,7 @@ if (!$hasId) {
}
$tmpl = new OCP\Template('files_external', 'settings');
+$tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
$tmpl->assign('isAdminPage', true);
$tmpl->assign('mounts', $mounts);
$tmpl->assign('backends', $backends);
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index 967c59debe6..b886c2e1b1b 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -1,4 +1,4 @@
-<form id="files_external" class="section">
+<form id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
<h2><?php p($l->t('External Storage')); ?></h2>
<?php if (isset($_['dependencies']) and ($_['dependencies']<>'')) print_unescaped(''.$_['dependencies'].''); ?>
<table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['isAdminPage'])); ?>'>
diff --git a/apps/files_external/tests/js/settingsSpec.js b/apps/files_external/tests/js/settingsSpec.js
index f030965835a..7cb86d7270b 100644
--- a/apps/files_external/tests/js/settingsSpec.js
+++ b/apps/files_external/tests/js/settingsSpec.js
@@ -85,7 +85,7 @@ describe('OCA.External.Settings tests', function() {
beforeEach(function() {
var $el = $('#externalStorage');
- view = new OCA.External.Settings.MountConfigListView($el);
+ view = new OCA.External.Settings.MountConfigListView($el, {encryptionEnabled: false});
});
afterEach(function() {
view = null;
@@ -205,6 +205,17 @@ describe('OCA.External.Settings tests', function() {
expect($td.find('.dropdown').length).toEqual(0);
});
+ it('doesnt show the encryption option when encryption is disabled', function () {
+ view._encryptionEnabled = false;
+ $td.find('img').click();
+
+ expect($td.find('.dropdown [name=encrypt]:visible').length).toEqual(0);
+
+ $('body').mouseup();
+
+ expect($td.find('.dropdown').length).toEqual(0);
+ });
+
it('reads config from mountOptions field', function() {
$tr.find('input.mountOptions').val(JSON.stringify({previews:false}));
@@ -226,6 +237,7 @@ describe('OCA.External.Settings tests', function() {
$('body').mouseup();
expect(JSON.parse($tr.find('input.mountOptions').val())).toEqual({
+ encrypt: true,
previews: true,
filesystem_check_changes: 2
});
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 3e2df122fde..16f8727a510 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -79,3 +79,9 @@ $this->create('sharing_external_test_remote', '/testremote')
'/apps/files_sharing/api/v1/shares/{id}',
array('\OCA\Files_Sharing\API\Local', 'deleteShare'),
'files_sharing');
+
+// Register with the capabilities API
+\OC_API::register('get',
+ '/cloud/capabilities',
+ array('OCA\Files_Sharing\Capabilities', 'getCapabilities'),
+ 'files_sharing', \OC_API::USER_AUTH);
diff --git a/apps/files_sharing/lib/activity.php b/apps/files_sharing/lib/activity.php
index 68953f950c8..a21f57235c9 100644
--- a/apps/files_sharing/lib/activity.php
+++ b/apps/files_sharing/lib/activity.php
@@ -28,6 +28,7 @@ use OCP\Activity\IExtension;
use OCP\IURLGenerator;
class Activity implements IExtension {
+ const FILES_SHARING_APP = 'files_sharing';
/**
* Filter with all sharing related activities
*/
@@ -72,7 +73,7 @@ class Activity implements IExtension {
}
protected function getL10N($languageCode = null) {
- return $this->languageFactory->get('files_sharing', $languageCode);
+ return $this->languageFactory->get(self::FILES_SHARING_APP, $languageCode);
}
/**
@@ -146,7 +147,7 @@ class Activity implements IExtension {
public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) {
$l = $this->getL10N($languageCode);
- if ($app === 'files_sharing') {
+ if ($app === self::FILES_SHARING_APP) {
switch ($text) {
case self::SUBJECT_REMOTE_SHARE_RECEIVED:
return (string) $l->t('You received a new remote share from %s', $params);
@@ -160,9 +161,6 @@ class Activity implements IExtension {
return (string) $l->t('Public shared folder %1$s was downloaded', $params);
case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED:
return (string) $l->t('Public shared file %1$s was downloaded', $params);
- }
- } else if ($app === 'files') {
- switch ($text) {
case self::SUBJECT_SHARED_USER_SELF:
return (string) $l->t('You shared %1$s with %2$s', $params);
case self::SUBJECT_SHARED_GROUP_SELF:
@@ -189,7 +187,7 @@ class Activity implements IExtension {
* @return array|false
*/
public function getSpecialParameterList($app, $text) {
- if ($app === 'files_sharing') {
+ if ($app === self::FILES_SHARING_APP) {
switch ($text) {
case self::SUBJECT_REMOTE_SHARE_RECEIVED:
return array(
@@ -207,9 +205,6 @@ class Activity implements IExtension {
return array(
0 => 'file',
);
- }
- } else if ($app === 'files') {
- switch ($text) {
case self::SUBJECT_SHARED_LINK_SELF:
return [0 => 'file'];
case self::SUBJECT_SHARED_USER_SELF:
@@ -273,7 +268,7 @@ class Activity implements IExtension {
}
/**
- * The extension can check if a customer filter (given by a query string like filter=abc) is valid or not.
+ * The extension can check if a custom filter (given by a query string like filter=abc) is valid or not.
*
* @param string $filterValue
* @return boolean
@@ -310,8 +305,8 @@ class Activity implements IExtension {
public function getQueryForFilter($filter) {
if ($filter === self::FILTER_SHARES) {
return [
- '(`app` = ? or `app` = ?)',
- ['files_sharing', 'files'],
+ '`app` = ?',
+ [self::FILES_SHARING_APP,],
];
}
return false;
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index 69b8f629393..e9b2addea38 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -122,7 +122,7 @@ class Shared_Cache extends Cache {
}
$query = \OC_DB::prepare(
'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`,'
- . ' `size`, `mtime`, `encrypted`, `unencrypted_size`, `storage_mtime`, `etag`, `permissions`'
+ . ' `size`, `mtime`, `encrypted`, `storage_mtime`, `etag`, `permissions`'
. ' FROM `*PREFIX*filecache` WHERE `fileid` = ?');
$result = $query->execute(array($sourceId));
$data = $result->fetchRow();
@@ -135,12 +135,7 @@ class Shared_Cache extends Cache {
if ($data['storage_mtime'] === 0) {
$data['storage_mtime'] = $data['mtime'];
}
- if ($data['encrypted'] or ($data['unencrypted_size'] > 0 and $data['mimetype'] === 'httpd/unix-directory')) {
- $data['encrypted_size'] = (int)$data['size'];
- $data['size'] = (int)$data['unencrypted_size'];
- } else {
- $data['size'] = (int)$data['size'];
- }
+ $data['size'] = (int)$data['size'];
$data['permissions'] = (int)$data['permissions'];
if (!is_int($file) || $file === 0) {
$data['path'] = '';
diff --git a/apps/files_sharing/lib/capabilities.php b/apps/files_sharing/lib/capabilities.php
new file mode 100644
index 00000000000..ac6454c3433
--- /dev/null
+++ b/apps/files_sharing/lib/capabilities.php
@@ -0,0 +1,87 @@
+<?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 OCA\Files_Sharing;
+
+use \OCP\IConfig;
+
+/**
+ * Class Capabilities
+ *
+ * @package OCA\Files_Sharing
+ */
+class Capabilities {
+
+ /** @var IConfig */
+ private $config;
+
+ /**
+ * @param IConfig $config
+ */
+ public function __construct(IConfig $config) {
+ $this->config = $config;
+ }
+
+ /**
+ * @return \OC_OCS_Result
+ */
+ public static function getCapabilities() {
+ $config = \OC::$server->getConfig();
+ $cap = new Capabilities($config);
+ return $cap->getCaps();
+ }
+
+
+ /**
+ * @return \OC_OCS_Result
+ */
+ public function getCaps() {
+ $res = [];
+
+ $public = [];
+ $public['enabled'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes';
+ if ($public['enabled']) {
+ $public['password'] = [];
+ $public['password']['enforced'] = ($this->config->getAppValue('core', 'shareapi_enforce_links_password', 'yes') === 'yes');
+
+ $public['expire_date'] = [];
+ $public['expire_date']['enabled'] = $this->config->getAppValue('core', 'shareapi_default_expire_date', 'yes') === 'yes';
+ if ($public['expire_date']['enabled']) {
+ $public['expire_date']['days'] = $this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7');
+ $public['expire_date']['enforced'] = $this->config->getAppValue('core', 'shareapi_enforce_expire_date', 'yes') === 'yes';
+ }
+
+ $public['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'yes') === 'yes';
+ }
+ $res["public"] = $public;
+
+ $res['user']['send_mail'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'yes') === 'yes';
+
+ $res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes';
+
+
+ return new \OC_OCS_Result([
+ 'capabilities' => [
+ 'files_sharing' => $res
+ ],
+ ]);
+ }
+
+}
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index 22d6f29ff94..1822c2468f1 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -128,12 +128,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
$storage = \OC\Files\Filesystem::getStorage('/');
$cache = $storage->getCache();
- if ($item['encrypted'] or ($item['unencrypted_size'] > 0 and $cache->getMimetype($item['mimetype']) === 'httpd/unix-directory')) {
- $file['size'] = $item['unencrypted_size'];
- $file['encrypted_size'] = $item['size'];
- } else {
- $file['size'] = $item['size'];
- }
+ $file['size'] = $item['size'];
$files[] = $file;
}
return $files;
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index c7285b1d5c6..6e3abb1f56c 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -39,6 +39,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
private $share; // the shared resource
private $files = array();
+ private static $isInitialized = array();
public function __construct($arguments) {
$this->share = $arguments['share'];
@@ -118,7 +119,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
$permissions |= \OCP\Constants::PERMISSION_DELETE;
}
- if (\OC_Util::isSharingDisabledForUser()) {
+ if (\OCP\Util::isSharingDisabledForUser()) {
$permissions &= ~\OCP\Constants::PERMISSION_SHARE;
}
@@ -423,11 +424,16 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
}
public static function setup($options) {
- $shares = \OCP\Share::getItemsSharedWithUser('file', $options['user']);
+ $user = $options['user'];
+ $shares = \OCP\Share::getItemsSharedWithUser('file', $user);
$manager = Filesystem::getMountManager();
$loader = Filesystem::getLoader();
- if (!\OCP\User::isLoggedIn() || \OCP\User::getUser() != $options['user']
- || $shares
+ if (
+ !isset(self::$isInitialized[$user]) && (
+ !\OCP\User::isLoggedIn()
+ || \OCP\User::getUser() != $options['user']
+ || $shares
+ )
) {
foreach ($shares as $share) {
// don't mount shares where we have no permissions
@@ -437,7 +443,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
$options['user_dir'] . '/' . $share['file_target'],
array(
'share' => $share,
- 'user' => $options['user']
+ 'user' => $user
),
$loader
);
@@ -445,6 +451,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
}
}
}
+ self::$isInitialized[$user] = true;
}
/**
diff --git a/apps/files_sharing/tests/capabilities.php b/apps/files_sharing/tests/capabilities.php
new file mode 100644
index 00000000000..a7c487bf589
--- /dev/null
+++ b/apps/files_sharing/tests/capabilities.php
@@ -0,0 +1,187 @@
+<?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 OCA\Files_Sharing\Tests;
+
+use OCA\Files_Sharing\Capabilities;
+use OCA\Files_Sharing\Tests\TestCase;
+
+/**
+ * Class FilesSharingCapabilitiesTest
+ */
+class FilesSharingCapabilitiesTest extends \Test\TestCase {
+
+ /**
+ * Test for the general part in each return statement and assert.
+ * Strip of the general part on the way.
+ *
+ * @param string[] $data Capabilities
+ * @return string[]
+ */
+ private function getFilesSharingPart(array $data) {
+ $this->assertArrayHasKey('capabilities', $data);
+ $this->assertArrayHasKey('files_sharing', $data['capabilities']);
+ return $data['capabilities']['files_sharing'];
+ }
+
+ /**
+ * Create a mock config object and insert the values in $map tot the getAppValue
+ * function. Then obtain the capabilities and extract the first few
+ * levels in the array
+ *
+ * @param (string[])[] $map Map of arguments to return types for the getAppValue function in the mock
+ * @return string[]
+ */
+ private function getResults(array $map) {
+ $stub = $this->getMockBuilder('\OCP\IConfig')->disableOriginalConstructor()->getMock();
+ $stub->method('getAppValue')->will($this->returnValueMap($map));
+ $cap = new Capabilities($stub);
+ $result = $this->getFilesSharingPart($cap->getCaps()->getData());
+ return $result;
+ }
+
+ public function testNoLinkSharing() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertInternalType('array', $result['public']);
+ $this->assertFalse($result['public']['enabled']);
+ }
+
+ public function testOnlyLinkSharing() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertInternalType('array', $result['public']);
+ $this->assertTrue($result['public']['enabled']);
+ }
+
+ public function testLinkPassword() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ['core', 'shareapi_enforce_links_password', 'yes', 'yes'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertArrayHasKey('password', $result['public']);
+ $this->assertArrayHasKey('enforced', $result['public']['password']);
+ $this->assertTrue($result['public']['password']['enforced']);
+ }
+
+ public function testLinkNoPassword() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ['core', 'shareapi_enforce_links_password', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertArrayHasKey('password', $result['public']);
+ $this->assertArrayHasKey('enforced', $result['public']['password']);
+ $this->assertFalse($result['public']['password']['enforced']);
+ }
+
+ public function testLinkNoExpireDate() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ['core', 'shareapi_default_expire_date', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertArrayHasKey('expire_date', $result['public']);
+ $this->assertInternalType('array', $result['public']['expire_date']);
+ $this->assertFalse($result['public']['expire_date']['enabled']);
+ }
+
+ public function testLinkExpireDate() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ['core', 'shareapi_default_expire_date', 'yes', 'yes'],
+ ['core', 'shareapi_expire_after_n_days', '7', '7'],
+ ['core', 'shareapi_enforce_expire_date', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertArrayHasKey('expire_date', $result['public']);
+ $this->assertInternalType('array', $result['public']['expire_date']);
+ $this->assertTrue($result['public']['expire_date']['enabled']);
+ $this->assertArrayHasKey('days', $result['public']['expire_date']);
+ $this->assertFalse($result['public']['expire_date']['enforced']);
+ }
+
+ public function testLinkExpireDateEnforced() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ['core', 'shareapi_default_expire_date', 'yes', 'yes'],
+ ['core', 'shareapi_enforce_expire_date', 'yes', 'yes'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertArrayHasKey('expire_date', $result['public']);
+ $this->assertInternalType('array', $result['public']['expire_date']);
+ $this->assertTrue($result['public']['expire_date']['enforced']);
+ }
+
+ public function testLinkSendMail() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ['core', 'shareapi_allow_public_notification', 'yes', 'yes'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertTrue($result['public']['send_mail']);
+ }
+
+ public function testLinkNoSendMail() {
+ $map = [
+ ['core', 'shareapi_allow_links', 'yes', 'yes'],
+ ['core', 'shareapi_allow_public_notification', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertFalse($result['public']['send_mail']);
+ }
+
+ public function testUserSendMail() {
+ $map = [
+ ['core', 'shareapi_allow_mail_notification', 'yes', 'yes'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertTrue($result['user']['send_mail']);
+ }
+
+ public function testUserNoSendMail() {
+ $map = [
+ ['core', 'shareapi_allow_mail_notification', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertFalse($result['user']['send_mail']);
+ }
+
+ public function testResharing() {
+ $map = [
+ ['core', 'shareapi_allow_resharing', 'yes', 'yes'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertTrue($result['resharing']);
+ }
+
+ public function testNoResharing() {
+ $map = [
+ ['core', 'shareapi_allow_resharing', 'yes', 'no'],
+ ];
+ $result = $this->getResults($map);
+ $this->assertFalse($result['resharing']);
+ }
+}
diff --git a/apps/files_sharing/tests/propagation.php b/apps/files_sharing/tests/propagation.php
index 25bf0864b6b..546f67556f2 100644
--- a/apps/files_sharing/tests/propagation.php
+++ b/apps/files_sharing/tests/propagation.php
@@ -19,17 +19,17 @@
*
*/
-namespace OCA\Files_sharing\Tests;
+namespace OCA\Files_Sharing\Tests;
use OC\Files\View;
class Propagation extends TestCase {
public function testSizePropagationWhenOwnerChangesFile() {
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
$recipientView = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
$ownerView = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
$ownerView->mkdir('/sharedfolder/subfolder');
$ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'bar');
@@ -38,30 +38,30 @@ class Propagation extends TestCase {
\OCP\Share::shareItem('folder', $sharedFolderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER1, 31);
$ownerRootInfo = $ownerView->getFileInfo('', false);
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
$this->assertTrue($recipientView->file_exists('/sharedfolder/subfolder/foo.txt'));
$recipientRootInfo = $recipientView->getFileInfo('', false);
// when file changed as owner
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
$ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'foobar');
// size of recipient's root stays the same
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
$newRecipientRootInfo = $recipientView->getFileInfo('', false);
$this->assertEquals($recipientRootInfo->getSize(), $newRecipientRootInfo->getSize());
// size of owner's root increases
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
$newOwnerRootInfo = $ownerView->getFileInfo('', false);
$this->assertEquals($ownerRootInfo->getSize() + 3, $newOwnerRootInfo->getSize());
}
public function testSizePropagationWhenRecipientChangesFile() {
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
$recipientView = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
$ownerView = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
$ownerView->mkdir('/sharedfolder/subfolder');
$ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'bar');
@@ -70,7 +70,7 @@ class Propagation extends TestCase {
\OCP\Share::shareItem('folder', $sharedFolderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER1, 31);
$ownerRootInfo = $ownerView->getFileInfo('', false);
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
$this->assertTrue($recipientView->file_exists('/sharedfolder/subfolder/foo.txt'));
$recipientRootInfo = $recipientView->getFileInfo('', false);
@@ -82,7 +82,7 @@ class Propagation extends TestCase {
$this->assertEquals($recipientRootInfo->getSize(), $newRecipientRootInfo->getSize());
// size of owner's root increases
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
$newOwnerRootInfo = $ownerView->getFileInfo('', false);
$this->assertEquals($ownerRootInfo->getSize() + 3, $newOwnerRootInfo->getSize());
}
diff --git a/apps/files_sharing/tests/testcase.php b/apps/files_sharing/tests/testcase.php
index 6a831bf5f62..b9f8658a69e 100644
--- a/apps/files_sharing/tests/testcase.php
+++ b/apps/files_sharing/tests/testcase.php
@@ -45,7 +45,6 @@ abstract class TestCase extends \Test\TestCase {
const TEST_FILES_SHARING_API_GROUP1 = "test-share-group1";
- public static $stateFilesEncryption;
public $filename;
public $data;
/**
@@ -58,12 +57,6 @@ abstract class TestCase extends \Test\TestCase {
public static function setUpBeforeClass() {
parent::setUpBeforeClass();
- // remember files_encryption state
- self::$stateFilesEncryption = \OC_App::isEnabled('files_encryption');
-
- //we don't want to tests with app files_encryption enabled
- \OC_App::disable('files_encryption');
-
// reset backend
\OC_User::clearBackends();
\OC_Group::clearBackends();
@@ -100,8 +93,6 @@ abstract class TestCase extends \Test\TestCase {
$this->data = 'foobar';
$this->view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
-
- $this->assertFalse(\OC_App::isEnabled('files_encryption'));
}
protected function tearDown() {
@@ -120,13 +111,6 @@ abstract class TestCase extends \Test\TestCase {
// delete group
\OC_Group::deleteGroup(self::TEST_FILES_SHARING_API_GROUP1);
- // reset app files_encryption
- if (self::$stateFilesEncryption) {
- \OC_App::enable('files_encryption');
- } else {
- \OC_App::disable('files_encryption');
- }
-
\OC_Util::tearDownFS();
\OC_User::setUserId('');
Filesystem::tearDown();
@@ -157,6 +141,8 @@ abstract class TestCase extends \Test\TestCase {
\OC_Group::addToGroup($user, 'group');
}
+ self::resetStorage();
+
\OC_Util::tearDownFS();
\OC::$server->getUserSession()->setUser(null);
\OC\Files\Filesystem::tearDown();
@@ -165,6 +151,17 @@ abstract class TestCase extends \Test\TestCase {
}
/**
+ * reset init status for the share storage
+ */
+ protected static function resetStorage() {
+ $storage = new \ReflectionClass('\OC\Files\Storage\Shared');
+ $isInitialized = $storage->getProperty('isInitialized');
+ $isInitialized->setAccessible(true);
+ $isInitialized->setValue(array());
+ $isInitialized->setAccessible(false);
+ }
+
+ /**
* get some information from a given share
* @param int $shareID
* @return array with: item_source, share_type, share_with, item_type, permissions
diff --git a/apps/files_sharing/tests/updater.php b/apps/files_sharing/tests/updater.php
index df1bbe1cc66..67c76c28ed2 100644
--- a/apps/files_sharing/tests/updater.php
+++ b/apps/files_sharing/tests/updater.php
@@ -27,7 +27,7 @@
/**
* Class Test_Files_Sharing_Updater
*/
-class Test_Files_Sharing_Updater extends OCA\Files_sharing\Tests\TestCase {
+class Test_Files_Sharing_Updater extends OCA\Files_Sharing\Tests\TestCase {
const TEST_FOLDER_NAME = '/folder_share_updater_test';
diff --git a/apps/files_trashbin/lib/storage.php b/apps/files_trashbin/lib/storage.php
index 3f474d71da5..61e0816fd24 100644
--- a/apps/files_trashbin/lib/storage.php
+++ b/apps/files_trashbin/lib/storage.php
@@ -84,7 +84,7 @@ class Storage extends Wrapper {
* @param string $path
*/
public function unlink($path) {
- if (self::$disableTrash) {
+ if (self::$disableTrash || !\OC_App::isEnabled('files_trashbin')) {
return $this->storage->unlink($path);
}
$normalized = Filesystem::normalizePath($this->mountPoint . '/' . $path);
@@ -117,7 +117,7 @@ class Storage extends Wrapper {
public static function setupStorage() {
\OC\Files\Filesystem::addStorageWrapper('oc_trashbin', function ($mountPoint, $storage) {
return new \OCA\Files_Trashbin\Storage(array('storage' => $storage, 'mountPoint' => $mountPoint));
- });
+ }, 1);
}
}
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index 8bc2ed8bc7a..1c880735b5a 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -183,8 +183,6 @@ class Trashbin {
$userTrashSize = self::getTrashbinSize($user);
// disable proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
$trashPath = '/files_trashbin/files/' . $filename . '.d' . $timestamp;
try {
$sizeOfAddedFiles = $view->filesize('/files/' . $file_path);
@@ -199,7 +197,6 @@ class Trashbin {
}
\OC_Log::write('files_trashbin', 'Couldn\'t move ' . $file_path . ' to the trash bin', \OC_log::ERROR);
}
- \OC_FileProxy::$enabled = $proxyStatus;
if ($view->file_exists('/files/' . $file_path)) { // failed to delete the original file, abort
$view->unlink($trashPath);
@@ -217,7 +214,6 @@ class Trashbin {
'trashPath' => \OC\Files\Filesystem::normalizePath($filename . '.d' . $timestamp)));
$size += self::retainVersions($file_path, $filename, $timestamp);
- $size += self::retainEncryptionKeys($file_path, $filename, $timestamp);
// if owner !== user we need to also add a copy to the owners trash
if ($user !== $owner) {
@@ -251,10 +247,6 @@ class Trashbin {
$size = 0;
if (\OCP\App::isEnabled('files_versions')) {
- // disable proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
$user = \OCP\User::getUser();
$rootView = new \OC\Files\View('/');
@@ -279,60 +271,12 @@ class Trashbin {
$rootView->rename($owner . '/files_versions' . $v['path'] . '.v' . $v['version'], $user . '/files_trashbin/versions/' . $filename . '.v' . $v['version'] . '.d' . $timestamp);
}
}
-
- // enable proxy
- \OC_FileProxy::$enabled = $proxyStatus;
}
return $size;
}
/**
- * Move encryption keys to trash so that they can be restored later
- *
- * @param string $file_path path to original file
- * @param string $filename of deleted file
- * @param integer $timestamp when the file was deleted
- *
- * @return int size of encryption keys
- */
- private static function retainEncryptionKeys($file_path, $filename, $timestamp) {
- $size = 0;
-
- if (\OCP\App::isEnabled('files_encryption')) {
-
- $user = \OCP\User::getUser();
- $rootView = new \OC\Files\View('/');
-
- list($owner, $ownerPath) = self::getUidAndFilename($file_path);
-
- // file has been deleted in between
- if (empty($ownerPath)) {
- return 0;
- }
-
- $util = new \OCA\Files_Encryption\Util($rootView, $user);
-
- $baseDir = '/files_encryption/';
- if (!$util->isSystemWideMountPoint($ownerPath)) {
- $baseDir = $owner . $baseDir;
- }
-
- $keyfiles = \OC\Files\Filesystem::normalizePath($baseDir . '/keys/' . $ownerPath);
-
- if ($rootView->is_dir($keyfiles)) {
- $size += self::calculateSize(new \OC\Files\View($keyfiles));
- if ($owner !== $user) {
- self::copy_recursive($keyfiles, $owner . '/files_trashbin/keys/' . basename($ownerPath) . '.d' . $timestamp, $rootView);
- }
- $rootView->rename($keyfiles, $user . '/files_trashbin/keys/' . $filename . '.d' . $timestamp);
- }
-
- }
- return $size;
- }
-
- /**
* restore files from trash bin
*
* @param string $file path to the deleted file
@@ -369,10 +313,6 @@ class Trashbin {
$target = \OC\Files\Filesystem::normalizePath('files/' . $location . '/' . $uniqueFilename);
$mtime = $view->filemtime($source);
- // disable proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
// restore file
$restoreResult = $view->rename($source, $target);
@@ -386,22 +326,15 @@ class Trashbin {
'trashPath' => \OC\Files\Filesystem::normalizePath($file)));
self::restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp);
- self::restoreEncryptionKeys($view, $file, $filename, $uniqueFilename, $location, $timestamp);
if ($timestamp) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?');
$query->execute(array($user, $filename, $timestamp));
}
- // enable proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
return true;
}
- // enable proxy
- \OC_FileProxy::$enabled = $proxyStatus;
-
return false;
}
@@ -419,9 +352,6 @@ class Trashbin {
private static function restoreVersions(\OC\Files\View $view, $file, $filename, $uniqueFilename, $location, $timestamp) {
if (\OCP\App::isEnabled('files_versions')) {
- // disable proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
$user = \OCP\User::getUser();
$rootView = new \OC\Files\View('/');
@@ -432,7 +362,6 @@ class Trashbin {
// file has been deleted in between
if (empty($ownerPath)) {
- \OC_FileProxy::$enabled = $proxyStatus;
return false;
}
@@ -453,63 +382,6 @@ class Trashbin {
}
}
}
-
- // enable proxy
- \OC_FileProxy::$enabled = $proxyStatus;
- }
- }
-
- /**
- * restore encryption keys from trash bin
- *
- * @param \OC\Files\View $view
- * @param string $file complete path to file
- * @param string $filename name of file
- * @param string $uniqueFilename new file name to restore the file without overwriting existing files
- * @param string $location location of file
- * @param int $timestamp deletion time
- * @return bool
- */
- private static function restoreEncryptionKeys(\OC\Files\View $view, $file, $filename, $uniqueFilename, $location, $timestamp) {
-
- if (\OCP\App::isEnabled('files_encryption')) {
- $user = \OCP\User::getUser();
- $rootView = new \OC\Files\View('/');
-
- $target = \OC\Files\Filesystem::normalizePath('/' . $location . '/' . $uniqueFilename);
-
- list($owner, $ownerPath) = self::getUidAndFilename($target);
-
- // file has been deleted in between
- if (empty($ownerPath)) {
- return false;
- }
-
- $util = new \OCA\Files_Encryption\Util($rootView, $user);
-
- $baseDir = '/files_encryption/';
- if (!$util->isSystemWideMountPoint($ownerPath)) {
- $baseDir = $owner . $baseDir;
- }
-
- $source_location = dirname($file);
-
- if ($view->is_dir('/files_trashbin/keys/' . $file)) {
- if ($source_location != '.') {
- $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keys/' . $source_location . '/' . $filename);
- } else {
- $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keys/' . $filename);
- }
- }
-
- if ($timestamp) {
- $keyfile .= '.d' . $timestamp;
- }
-
- if ($rootView->is_dir($keyfile)) {
- $rootView->rename($keyfile, $baseDir . '/keys/' . $ownerPath);
- }
-
}
}
@@ -528,7 +400,6 @@ class Trashbin {
return true;
}
-
/**
* delete file from trash bin permanently
*
@@ -957,7 +828,7 @@ class Trashbin {
*/
public static function registerHooks() {
// create storage wrapper on setup
- \OCP\Util::connectHook('OC_Filesystem', 'setup', 'OCA\Files_Trashbin\Storage', 'setupStorage');
+ \OCP\Util::connectHook('OC_Filesystem', 'preSetup', 'OCA\Files_Trashbin\Storage', 'setupStorage');
//Listen to delete user signal
\OCP\Util::connectHook('OC_User', 'pre_deleteUser', 'OCA\Files_Trashbin\Hooks', 'deleteUser_hook');
//Listen to post write hook
@@ -990,6 +861,6 @@ class Trashbin {
* @return string
*/
public static function preview_icon($path) {
- return \OC_Helper::linkToRoute('core_ajax_trashbin_preview', array('x' => 36, 'y' => 36, 'file' => $path));
+ return \OCP\Util::linkToRoute('core_ajax_trashbin_preview', array('x' => 36, 'y' => 36, 'file' => $path));
}
}
diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php
index f1ac055d335..d5bd7c318d3 100644
--- a/apps/files_trashbin/tests/storage.php
+++ b/apps/files_trashbin/tests/storage.php
@@ -35,11 +35,6 @@ class Storage extends \Test\TestCase {
private $user;
/**
- * @var \OC\Files\Storage\Storage
- **/
- private $originalStorage;
-
- /**
* @var \OC\Files\View
*/
private $rootView;
@@ -61,8 +56,6 @@ class Storage extends \Test\TestCase {
// this will setup the FS
$this->loginAsUser($this->user);
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
-
\OCA\Files_Trashbin\Storage::setupStorage();
$this->rootView = new \OC\Files\View('/');
@@ -73,7 +66,6 @@ class Storage extends \Test\TestCase {
protected function tearDown() {
\OC\Files\Filesystem::getLoader()->removeStorageWrapper('oc_trashbin');
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
$this->logout();
\OC_User::deleteUser($this->user);
\OC_Hook::clear();
diff --git a/apps/files_trashbin/tests/trashbin.php b/apps/files_trashbin/tests/trashbin.php
index b3176ebbe92..bf6446389f1 100644
--- a/apps/files_trashbin/tests/trashbin.php
+++ b/apps/files_trashbin/tests/trashbin.php
@@ -26,7 +26,7 @@
use OCA\Files_Trashbin;
/**
- * Class Test_Encryption_Crypt
+ * Class Test_Encryption
*/
class Test_Trashbin extends \Test\TestCase {
@@ -36,7 +36,6 @@ class Test_Trashbin extends \Test\TestCase {
private $trashRoot1;
private $trashRoot2;
- private static $encryptionStatus;
private static $rememberRetentionObligation;
private static $rememberAutoExpire;
@@ -58,7 +57,6 @@ class Test_Trashbin extends \Test\TestCase {
\OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup');
//disable encryption
- self::$encryptionStatus = \OC_App::isEnabled('files_encryption');
\OC_App::disable('files_encryption');
//configure trashbin
@@ -82,10 +80,6 @@ class Test_Trashbin extends \Test\TestCase {
// cleanup test user
\OC_User::deleteUser(self::TEST_TRASHBIN_USER1);
- if (self::$encryptionStatus === true) {
- \OC_App::enable('files_encryption');
- }
-
\OC_Config::setValue('trashbin_retention_obligation', self::$rememberRetentionObligation);
\OC_Config::setValue('trashbin_auto_expire', self::$rememberAutoExpire);
@@ -312,6 +306,12 @@ class Test_Trashbin extends \Test\TestCase {
}
}
+ $storage = new \ReflectionClass('\OC\Files\Storage\Shared');
+ $isInitialized = $storage->getProperty('isInitialized');
+ $isInitialized->setAccessible(true);
+ $isInitialized->setValue(array());
+ $isInitialized->setAccessible(false);
+
\OC_Util::tearDownFS();
\OC_User::setUserId('');
\OC\Files\Filesystem::tearDown();
diff --git a/apps/files_versions/download.php b/apps/files_versions/download.php
index 799d75b5b4a..72018ca68b9 100644
--- a/apps/files_versions/download.php
+++ b/apps/files_versions/download.php
@@ -39,7 +39,7 @@ $ftype = $view->getMimeType('/'.$uid.'/files/'.$filename);
header('Content-Type:'.$ftype);
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
OCP\Response::disableCaching();
-header('Content-Length: '.$view->filesize($versionName));
+OCP\Response::setContentLengthHeader($view->filesize($versionName));
OC_Util::obEnd();
diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php
index 01a7935c0c5..125fb5d983c 100644
--- a/apps/files_versions/lib/storage.php
+++ b/apps/files_versions/lib/storage.php
@@ -160,18 +160,11 @@ class Storage {
self::scheduleExpire($filename, $versionsSize, $neededSpace);
- // disable proxy to prevent multiple fopen calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
// store a new version of a file
$mtime = $users_view->filemtime('files/' . $filename);
$users_view->copy('files/' . $filename, 'files_versions/' . $filename . '.v' . $mtime);
// call getFileInfo to enforce a file cache entry for the new version
$users_view->getFileInfo('files_versions/' . $filename . '.v' . $mtime);
-
- // reset proxy state
- \OC_FileProxy::$enabled = $proxyStatus;
}
}
@@ -283,15 +276,8 @@ class Storage {
$version = 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename);
if ( !$users_view->file_exists($version)) {
- // disable proxy to prevent multiple fopen calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename));
- // reset proxy state
- \OC_FileProxy::$enabled = $proxyStatus;
-
$versionCreated = true;
}
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index 6852f769a3d..f8bfe38df4d 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -431,6 +431,12 @@ class Test_Files_Versioning extends \Test\TestCase {
\OC::$server->getUserManager()->registerBackend($backend);
}
+ $storage = new \ReflectionClass('\OC\Files\Storage\Shared');
+ $isInitialized = $storage->getProperty('isInitialized');
+ $isInitialized->setAccessible(true);
+ $isInitialized->setValue(array());
+ $isInitialized->setAccessible(false);
+
\OC_Util::tearDownFS();
\OC_User::setUserId('');
\OC\Files\Filesystem::tearDown();
diff --git a/apps/user_ldap/l10n/da.js b/apps/user_ldap/l10n/da.js
index 7d74051a2a9..aecaa21a614 100644
--- a/apps/user_ldap/l10n/da.js
+++ b/apps/user_ldap/l10n/da.js
@@ -1,10 +1,10 @@
OC.L10N.register(
"user_ldap",
{
- "Failed to clear the mappings." : "Mislykkedes med at rydde afbildningerne.",
+ "Failed to clear the mappings." : "Mislykkedes med at rydde delingerne.",
"Failed to delete the server configuration" : "Kunne ikke slette server konfigurationen",
"The configuration is valid and the connection could be established!" : "Konfigurationen er korrekt og forbindelsen kunne etableres!",
- "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurationen er gyldig, men Bind'en mislykkedes. Tjek venligst serverindstillingerne og akkreditiverne.",
+ "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurationen er gyldig, men forbindelsen mislykkedes. Tjek venligst serverindstillingerne og akkreditiverne.",
"The configuration is invalid. Please have a look at the logs for further details." : "Konfigurationen er ugyldig. Se venligst i loggen for yderligere detaljer.",
"No action specified" : "Der er ikke angivet en handling",
"No configuration specified" : "Der er ikke angivet en konfiguration",
@@ -15,7 +15,7 @@ OC.L10N.register(
"Keep settings?" : "Behold indstillinger?",
"{nthServer}. Server" : "{nthServer}. server",
"Cannot add server configuration" : "Kan ikke tilføje serverkonfiguration",
- "mappings cleared" : "afbildninger blev ryddet",
+ "mappings cleared" : "forbindelser blev ryddet",
"Success" : "Succes",
"Error" : "Fejl",
"Please specify a Base DN" : "Angiv venligst en Base DN",
@@ -27,8 +27,8 @@ OC.L10N.register(
"Select groups" : "Vælg grupper",
"Select object classes" : "Vælg objektklasser",
"Select attributes" : "Vælg attributter",
- "Connection test succeeded" : "Forbindelsestest lykkedes",
- "Connection test failed" : "Forbindelsestest mislykkedes",
+ "Connection test succeeded" : "Forbindelsestesten lykkedes",
+ "Connection test failed" : "Forbindelsestesten mislykkedes",
"Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?",
"Confirm Deletion" : "Bekræft Sletning",
"_%s group found_::_%s groups found_" : ["Der blev fundet %s gruppe","Der blev fundet %s grupper"],
@@ -43,32 +43,32 @@ OC.L10N.register(
"Save" : "Gem",
"Test Configuration" : "Test Konfiguration",
"Help" : "Hjælp",
- "Groups meeting these criteria are available in %s:" : "Grupper som modsvarer disse kriterier er tilgængelige i %s:",
+ "Groups meeting these criteria are available in %s:" : "Grupper som opfylder disse kriterier er tilgængelige i %s:",
"only those object classes:" : "kun disse objektklasser:",
"only from those groups:" : "kun fra disse grupper:",
- "Edit raw filter instead" : "Redigér det rå filter i stedet",
+ "Edit raw filter instead" : "Redigér rå filter i stedet",
"Raw LDAP filter" : "Råt LDAP-filter",
"The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret angiver hvilke LDAP-grupper, der skal have adgang til instansen %s.",
- "Test Filter" : "Testfilter",
+ "Test Filter" : "Test filter",
"groups found" : "grupper blev fundet",
"Users login with this attribute:" : "Brugeres login med dette attribut:",
"LDAP Username:" : "LDAP-brugernavn:",
- "LDAP Email Address:" : "LDAP-e-mailadresse:",
+ "LDAP Email Address:" : "LDAP e-mailadresse:",
"Other Attributes:" : "Andre attributter:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer dét filter der anvendes, når der er forsøg på at logge ind. %%uuid erstattter brugernavnet i login-handlingen. Eksempel: \"uid=%%uuid\"",
"1. Server" : "1. server",
"%s. Server:" : "%s. server:",
"Add Server Configuration" : "Tilføj Server Konfiguration",
"Delete Configuration" : "Slet konfiguration",
- "Host" : "Host",
+ "Host" : "Vært",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Du kan udelade protokollen, medmindre du skal bruge SSL. Start i så fald med ldaps://",
"Port" : "Port",
"User DN" : "Bruger DN",
- "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN'et for klientbrugeren, for hvilken bindingen skal foretages, eks. uid=agent,dc=eksempel,dc=com. For anonym adgang lades DN og Password stå tomme.",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN'et for klientbrugeren, for hvilken forbindelsen skal foretages, eks. uid=agent,dc=eksempel,dc=com. For anonym adgang lades DN og Password stå tomme.",
"Password" : "Kodeord",
"For anonymous access, leave DN and Password empty." : "For anonym adgang, skal du lade DN og Adgangskode tomme.",
"One Base DN per line" : "Ét Base DN per linje",
- "You can specify Base DN for users and groups in the Advanced tab" : "You can specify Base DN for users and groups in the Advanced tab",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Du kan specificere base DN for brugere og grupper i fanen Advanceret",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undgår automatiske LDAP-forespørgsler. Bedre på større opsætninger, men kræver en del LDAP-kendskab.",
"Manually enter LDAP filters (recommended for large directories)" : "Angiv LDAP-filtre manuelt (anbefales til større kataloger)",
"Limit %s access to users meeting these criteria:" : "Begræns %s-adgangen til brugere som imødekommer disse kriterier:",
@@ -90,13 +90,13 @@ OC.L10N.register(
"Backup (Replica) Port" : "Port for sikkerhedskopi (replika)",
"Disable Main Server" : "Deaktiver Hovedserver",
"Only connect to the replica server." : "Forbind kun til replika serveren.",
- "Case insensitive LDAP server (Windows)" : "LDAP-server som ikke er versalfølsom (Windows)",
+ "Case insensitive LDAP server (Windows)" : "LDAP-server som ikke er følsom over for store/små bogstaver (Windows)",
"Turn off SSL certificate validation." : "Deaktiver SSL certifikat validering",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Anbefales ikke - bruges kun til testformål! Hvis forbindelse udelukkende fungerer med dette tilvalg, så importér LDAP-serverens SSL-certifikat i din %s-server.",
- "Cache Time-To-Live" : "Cache Time-To-Live",
+ "Cache Time-To-Live" : "Cache levetid",
"in seconds. A change empties the cache." : "i sekunder. En ændring vil tømme cachen.",
"Directory Settings" : "Mappeindstillinger",
- "User Display Name Field" : "User Display Name Field",
+ "User Display Name Field" : "Vist brugernavn felt",
"The LDAP attribute to use to generate the user's display name." : "LDAP-attributten som skal bruges til at oprette brugerens viste navn.",
"Base User Tree" : "Base Bruger Træ",
"One User Base DN per line" : "Én bruger-Base DN per linje",
@@ -107,7 +107,7 @@ OC.L10N.register(
"Base Group Tree" : "Base Group Tree",
"One Group Base DN per line" : "Ét gruppe-Base DN per linje",
"Group Search Attributes" : "Attributter for gruppesøgning",
- "Group-Member association" : "Group-Member association",
+ "Group-Member association" : "Guppemedlem forening",
"Nested Groups" : "Indlejrede grupper",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Når slået til, så vil grupper som rummer grupper blive understøttet. (Dette fungerer kun, hvis attributten for gruppemedlem indeholder DN'er.)",
"Paging chunksize" : "Fragmentstørrelse for sideinddeling",
diff --git a/apps/user_ldap/l10n/da.json b/apps/user_ldap/l10n/da.json
index 6a9a7e64410..817af6fa381 100644
--- a/apps/user_ldap/l10n/da.json
+++ b/apps/user_ldap/l10n/da.json
@@ -1,8 +1,8 @@
{ "translations": {
- "Failed to clear the mappings." : "Mislykkedes med at rydde afbildningerne.",
+ "Failed to clear the mappings." : "Mislykkedes med at rydde delingerne.",
"Failed to delete the server configuration" : "Kunne ikke slette server konfigurationen",
"The configuration is valid and the connection could be established!" : "Konfigurationen er korrekt og forbindelsen kunne etableres!",
- "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurationen er gyldig, men Bind'en mislykkedes. Tjek venligst serverindstillingerne og akkreditiverne.",
+ "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurationen er gyldig, men forbindelsen mislykkedes. Tjek venligst serverindstillingerne og akkreditiverne.",
"The configuration is invalid. Please have a look at the logs for further details." : "Konfigurationen er ugyldig. Se venligst i loggen for yderligere detaljer.",
"No action specified" : "Der er ikke angivet en handling",
"No configuration specified" : "Der er ikke angivet en konfiguration",
@@ -13,7 +13,7 @@
"Keep settings?" : "Behold indstillinger?",
"{nthServer}. Server" : "{nthServer}. server",
"Cannot add server configuration" : "Kan ikke tilføje serverkonfiguration",
- "mappings cleared" : "afbildninger blev ryddet",
+ "mappings cleared" : "forbindelser blev ryddet",
"Success" : "Succes",
"Error" : "Fejl",
"Please specify a Base DN" : "Angiv venligst en Base DN",
@@ -25,8 +25,8 @@
"Select groups" : "Vælg grupper",
"Select object classes" : "Vælg objektklasser",
"Select attributes" : "Vælg attributter",
- "Connection test succeeded" : "Forbindelsestest lykkedes",
- "Connection test failed" : "Forbindelsestest mislykkedes",
+ "Connection test succeeded" : "Forbindelsestesten lykkedes",
+ "Connection test failed" : "Forbindelsestesten mislykkedes",
"Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?",
"Confirm Deletion" : "Bekræft Sletning",
"_%s group found_::_%s groups found_" : ["Der blev fundet %s gruppe","Der blev fundet %s grupper"],
@@ -41,32 +41,32 @@
"Save" : "Gem",
"Test Configuration" : "Test Konfiguration",
"Help" : "Hjælp",
- "Groups meeting these criteria are available in %s:" : "Grupper som modsvarer disse kriterier er tilgængelige i %s:",
+ "Groups meeting these criteria are available in %s:" : "Grupper som opfylder disse kriterier er tilgængelige i %s:",
"only those object classes:" : "kun disse objektklasser:",
"only from those groups:" : "kun fra disse grupper:",
- "Edit raw filter instead" : "Redigér det rå filter i stedet",
+ "Edit raw filter instead" : "Redigér rå filter i stedet",
"Raw LDAP filter" : "Råt LDAP-filter",
"The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret angiver hvilke LDAP-grupper, der skal have adgang til instansen %s.",
- "Test Filter" : "Testfilter",
+ "Test Filter" : "Test filter",
"groups found" : "grupper blev fundet",
"Users login with this attribute:" : "Brugeres login med dette attribut:",
"LDAP Username:" : "LDAP-brugernavn:",
- "LDAP Email Address:" : "LDAP-e-mailadresse:",
+ "LDAP Email Address:" : "LDAP e-mailadresse:",
"Other Attributes:" : "Andre attributter:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer dét filter der anvendes, når der er forsøg på at logge ind. %%uuid erstattter brugernavnet i login-handlingen. Eksempel: \"uid=%%uuid\"",
"1. Server" : "1. server",
"%s. Server:" : "%s. server:",
"Add Server Configuration" : "Tilføj Server Konfiguration",
"Delete Configuration" : "Slet konfiguration",
- "Host" : "Host",
+ "Host" : "Vært",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Du kan udelade protokollen, medmindre du skal bruge SSL. Start i så fald med ldaps://",
"Port" : "Port",
"User DN" : "Bruger DN",
- "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN'et for klientbrugeren, for hvilken bindingen skal foretages, eks. uid=agent,dc=eksempel,dc=com. For anonym adgang lades DN og Password stå tomme.",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN'et for klientbrugeren, for hvilken forbindelsen skal foretages, eks. uid=agent,dc=eksempel,dc=com. For anonym adgang lades DN og Password stå tomme.",
"Password" : "Kodeord",
"For anonymous access, leave DN and Password empty." : "For anonym adgang, skal du lade DN og Adgangskode tomme.",
"One Base DN per line" : "Ét Base DN per linje",
- "You can specify Base DN for users and groups in the Advanced tab" : "You can specify Base DN for users and groups in the Advanced tab",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Du kan specificere base DN for brugere og grupper i fanen Advanceret",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undgår automatiske LDAP-forespørgsler. Bedre på større opsætninger, men kræver en del LDAP-kendskab.",
"Manually enter LDAP filters (recommended for large directories)" : "Angiv LDAP-filtre manuelt (anbefales til større kataloger)",
"Limit %s access to users meeting these criteria:" : "Begræns %s-adgangen til brugere som imødekommer disse kriterier:",
@@ -88,13 +88,13 @@
"Backup (Replica) Port" : "Port for sikkerhedskopi (replika)",
"Disable Main Server" : "Deaktiver Hovedserver",
"Only connect to the replica server." : "Forbind kun til replika serveren.",
- "Case insensitive LDAP server (Windows)" : "LDAP-server som ikke er versalfølsom (Windows)",
+ "Case insensitive LDAP server (Windows)" : "LDAP-server som ikke er følsom over for store/små bogstaver (Windows)",
"Turn off SSL certificate validation." : "Deaktiver SSL certifikat validering",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Anbefales ikke - bruges kun til testformål! Hvis forbindelse udelukkende fungerer med dette tilvalg, så importér LDAP-serverens SSL-certifikat i din %s-server.",
- "Cache Time-To-Live" : "Cache Time-To-Live",
+ "Cache Time-To-Live" : "Cache levetid",
"in seconds. A change empties the cache." : "i sekunder. En ændring vil tømme cachen.",
"Directory Settings" : "Mappeindstillinger",
- "User Display Name Field" : "User Display Name Field",
+ "User Display Name Field" : "Vist brugernavn felt",
"The LDAP attribute to use to generate the user's display name." : "LDAP-attributten som skal bruges til at oprette brugerens viste navn.",
"Base User Tree" : "Base Bruger Træ",
"One User Base DN per line" : "Én bruger-Base DN per linje",
@@ -105,7 +105,7 @@
"Base Group Tree" : "Base Group Tree",
"One Group Base DN per line" : "Ét gruppe-Base DN per linje",
"Group Search Attributes" : "Attributter for gruppesøgning",
- "Group-Member association" : "Group-Member association",
+ "Group-Member association" : "Guppemedlem forening",
"Nested Groups" : "Indlejrede grupper",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Når slået til, så vil grupper som rummer grupper blive understøttet. (Dette fungerer kun, hvis attributten for gruppemedlem indeholder DN'er.)",
"Paging chunksize" : "Fragmentstørrelse for sideinddeling",
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index 8cc22a71a91..75b8cd4d78e 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -18,8 +18,8 @@ OC.L10N.register(
"mappings cleared" : "associations supprimées",
"Success" : "Succès",
"Error" : "Erreur",
- "Please specify a Base DN" : "Veuillez spécifier un Base DN",
- "Could not determine Base DN" : "Impossible de déterminer le Base DN",
+ "Please specify a Base DN" : "Veuillez spécifier un DN de base",
+ "Could not determine Base DN" : "Impossible de déterminer le DN de base",
"Please specify the port" : "Veuillez indiquer le port",
"Configuration OK" : "Configuration OK",
"Configuration incorrect" : "Configuration incorrecte",
@@ -58,7 +58,7 @@ OC.L10N.register(
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit le filtre à appliquer lors d'une tentative de connexion. %%uid remplace le nom d'utilisateur. Exemple : \"uid=%%uid\"",
"1. Server" : "1. Serveur",
"%s. Server:" : "%s. Serveur :",
- "Add Server Configuration" : "Ajouter une configuration du serveur",
+ "Add Server Configuration" : "Ajouter une configuration de serveur",
"Delete Configuration" : "Suppression de la configuration",
"Host" : "Hôte",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Vous pouvez omettre le protocole, sauf si vous avez besoin de SSL. Dans ce cas préfixez avec ldaps://",
@@ -67,8 +67,8 @@ OC.L10N.register(
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilisateur client pour lequel la liaison doit se faire, par exemple uid=agent,dc=example,dc=com. Pour un accès anonyme, laisser le DN et le mot de passe vides.",
"Password" : "Mot de passe",
"For anonymous access, leave DN and Password empty." : "Pour un accès anonyme, laisser le DN utilisateur et le mot de passe vides.",
- "One Base DN per line" : "Un DN racine par ligne",
- "You can specify Base DN for users and groups in the Advanced tab" : "Vous pouvez spécifier les DN Racines de vos utilisateurs et groupes via l'onglet Avancé",
+ "One Base DN per line" : "Un DN de base par ligne",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Vous pouvez spécifier les DN de base de vos utilisateurs et groupes via l'onglet Avancé",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Évite les requêtes LDAP automatiques. Mieux pour les installations de grande ampleur, mais demande des connaissances en LDAP.",
"Manually enter LDAP filters (recommended for large directories)" : "Entrée manuelle des filtres LDAP (recommandé pour les annuaires de grande ampleur)",
"Limit %s access to users meeting these criteria:" : "Limiter l'accès à %s aux utilisateurs respectant ces critères :",
@@ -99,13 +99,13 @@ OC.L10N.register(
"User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur",
"The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.",
"Base User Tree" : "DN racine de l'arbre utilisateurs",
- "One User Base DN per line" : "Un DN racine utilisateur par ligne",
+ "One User Base DN per line" : "Un DN de base utilisateur par ligne",
"User Search Attributes" : "Attributs de recherche utilisateurs",
"Optional; one attribute per line" : "Optionnel, un attribut par ligne",
"Group Display Name Field" : "Champ \"nom d'affichage\" du groupe",
"The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage du groupe.",
"Base Group Tree" : "Base Group Tree",
- "One Group Base DN per line" : "Un DN racine groupe par ligne",
+ "One Group Base DN per line" : "Un DN de base groupe par ligne",
"Group Search Attributes" : "Attributs de recherche des groupes",
"Group-Member association" : "Association groupe-membre",
"Nested Groups" : "Groupes imbriqués",
@@ -124,8 +124,8 @@ OC.L10N.register(
"Internal Username Attribute:" : "Nom d'utilisateur interne :",
"Override UUID detection" : "Surcharger la détection d'UUID",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l'attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d'utilisateur interne basé sur l'UUID sera automatiquement créé, sauf s'il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l'attribut de votre choix. Vous devez alors vous assurer que l'attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu'il soit unique. Laisser à blanc pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.",
- "UUID Attribute for Users:" : "Attribut UUID pour les utilisateurs :",
- "UUID Attribute for Groups:" : "Attribut UUID pour les groupes :",
+ "UUID Attribute for Users:" : "Attribut UUID pour les Utilisateurs :",
+ "UUID Attribute for Groups:" : "Attribut UUID pour les Groupes :",
"Username-LDAP User Mapping" : "Association Nom d'utilisateur-Utilisateur LDAP",
"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Les noms d'utilisateurs sont utilisés pour le stockage et l'assignation de (meta) données. Pour identifier et reconnaître précisément les utilisateurs, chaque utilisateur LDAP aura un nom interne spécifique. Cela requiert l'association d'un nom d'utilisateur ownCloud à un nom d'utilisateur LDAP. Le nom d'utilisateur créé est associé à l'attribut UUID de l'utilisateur LDAP. Par ailleurs, le DN est mémorisé en cache pour limiter les interactions LDAP mais il n'est pas utilisé pour l'identification. Si le DN est modifié, ces modifications seront retrouvées. Seul le nom interne à ownCloud est utilisé au sein du produit. Supprimer les associations créera des orphelins et l'action affectera toutes les configurations LDAP. NE JAMAIS SUPPRIMER LES ASSOCIATIONS EN ENVIRONNEMENT DE PRODUCTION, mais uniquement sur des environnements de tests et d'expérimentations.",
"Clear Username-LDAP User Mapping" : "Supprimer l'association utilisateur interne-utilisateur LDAP",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index 523a503467c..40469d3fc9a 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -16,8 +16,8 @@
"mappings cleared" : "associations supprimées",
"Success" : "Succès",
"Error" : "Erreur",
- "Please specify a Base DN" : "Veuillez spécifier un Base DN",
- "Could not determine Base DN" : "Impossible de déterminer le Base DN",
+ "Please specify a Base DN" : "Veuillez spécifier un DN de base",
+ "Could not determine Base DN" : "Impossible de déterminer le DN de base",
"Please specify the port" : "Veuillez indiquer le port",
"Configuration OK" : "Configuration OK",
"Configuration incorrect" : "Configuration incorrecte",
@@ -56,7 +56,7 @@
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit le filtre à appliquer lors d'une tentative de connexion. %%uid remplace le nom d'utilisateur. Exemple : \"uid=%%uid\"",
"1. Server" : "1. Serveur",
"%s. Server:" : "%s. Serveur :",
- "Add Server Configuration" : "Ajouter une configuration du serveur",
+ "Add Server Configuration" : "Ajouter une configuration de serveur",
"Delete Configuration" : "Suppression de la configuration",
"Host" : "Hôte",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Vous pouvez omettre le protocole, sauf si vous avez besoin de SSL. Dans ce cas préfixez avec ldaps://",
@@ -65,8 +65,8 @@
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilisateur client pour lequel la liaison doit se faire, par exemple uid=agent,dc=example,dc=com. Pour un accès anonyme, laisser le DN et le mot de passe vides.",
"Password" : "Mot de passe",
"For anonymous access, leave DN and Password empty." : "Pour un accès anonyme, laisser le DN utilisateur et le mot de passe vides.",
- "One Base DN per line" : "Un DN racine par ligne",
- "You can specify Base DN for users and groups in the Advanced tab" : "Vous pouvez spécifier les DN Racines de vos utilisateurs et groupes via l'onglet Avancé",
+ "One Base DN per line" : "Un DN de base par ligne",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Vous pouvez spécifier les DN de base de vos utilisateurs et groupes via l'onglet Avancé",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Évite les requêtes LDAP automatiques. Mieux pour les installations de grande ampleur, mais demande des connaissances en LDAP.",
"Manually enter LDAP filters (recommended for large directories)" : "Entrée manuelle des filtres LDAP (recommandé pour les annuaires de grande ampleur)",
"Limit %s access to users meeting these criteria:" : "Limiter l'accès à %s aux utilisateurs respectant ces critères :",
@@ -97,13 +97,13 @@
"User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur",
"The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.",
"Base User Tree" : "DN racine de l'arbre utilisateurs",
- "One User Base DN per line" : "Un DN racine utilisateur par ligne",
+ "One User Base DN per line" : "Un DN de base utilisateur par ligne",
"User Search Attributes" : "Attributs de recherche utilisateurs",
"Optional; one attribute per line" : "Optionnel, un attribut par ligne",
"Group Display Name Field" : "Champ \"nom d'affichage\" du groupe",
"The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage du groupe.",
"Base Group Tree" : "Base Group Tree",
- "One Group Base DN per line" : "Un DN racine groupe par ligne",
+ "One Group Base DN per line" : "Un DN de base groupe par ligne",
"Group Search Attributes" : "Attributs de recherche des groupes",
"Group-Member association" : "Association groupe-membre",
"Nested Groups" : "Groupes imbriqués",
@@ -122,8 +122,8 @@
"Internal Username Attribute:" : "Nom d'utilisateur interne :",
"Override UUID detection" : "Surcharger la détection d'UUID",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l'attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d'utilisateur interne basé sur l'UUID sera automatiquement créé, sauf s'il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l'attribut de votre choix. Vous devez alors vous assurer que l'attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu'il soit unique. Laisser à blanc pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.",
- "UUID Attribute for Users:" : "Attribut UUID pour les utilisateurs :",
- "UUID Attribute for Groups:" : "Attribut UUID pour les groupes :",
+ "UUID Attribute for Users:" : "Attribut UUID pour les Utilisateurs :",
+ "UUID Attribute for Groups:" : "Attribut UUID pour les Groupes :",
"Username-LDAP User Mapping" : "Association Nom d'utilisateur-Utilisateur LDAP",
"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Les noms d'utilisateurs sont utilisés pour le stockage et l'assignation de (meta) données. Pour identifier et reconnaître précisément les utilisateurs, chaque utilisateur LDAP aura un nom interne spécifique. Cela requiert l'association d'un nom d'utilisateur ownCloud à un nom d'utilisateur LDAP. Le nom d'utilisateur créé est associé à l'attribut UUID de l'utilisateur LDAP. Par ailleurs, le DN est mémorisé en cache pour limiter les interactions LDAP mais il n'est pas utilisé pour l'identification. Si le DN est modifié, ces modifications seront retrouvées. Seul le nom interne à ownCloud est utilisé au sein du produit. Supprimer les associations créera des orphelins et l'action affectera toutes les configurations LDAP. NE JAMAIS SUPPRIMER LES ASSOCIATIONS EN ENVIRONNEMENT DE PRODUCTION, mais uniquement sur des environnements de tests et d'expérimentations.",
"Clear Username-LDAP User Mapping" : "Supprimer l'association utilisateur interne-utilisateur LDAP",
diff --git a/apps/user_ldap/l10n/nb_NO.js b/apps/user_ldap/l10n/nb_NO.js
index 07bd76811f3..bede99104f8 100644
--- a/apps/user_ldap/l10n/nb_NO.js
+++ b/apps/user_ldap/l10n/nb_NO.js
@@ -81,7 +81,7 @@ OC.L10N.register(
"Expert" : "Ekspert",
"Advanced" : "Avansert",
"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Advarsel:</b> Appene user_ldap og user_webdavauth er ikke kompatible med hverandre. Uventet oppførsel kan forekomme. Be systemadministratoren om å deaktivere en av dem.",
- "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> PHP LDAP modulen er ikke installert, hjelperen vil ikke virke. Vennligst be din system-administrator om å installere den.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP LDAP-modulen er ikke installert og serveren vil ikke virke. Vennligst be systemadministratoren installere den.",
"Connection Settings" : "Innstillinger for tilkobling",
"Configuration Active" : "Konfigurasjon aktiv",
"When unchecked, this configuration will be skipped." : "Når ikke huket av så vil denne konfigurasjonen bli hoppet over.",
@@ -127,6 +127,7 @@ OC.L10N.register(
"UUID Attribute for Users:" : "UUID-attributt for brukere:",
"UUID Attribute for Groups:" : "UUID-attributt for grupper:",
"Username-LDAP User Mapping" : "Tilknytning av brukernavn til LDAP-bruker",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brukernavn brukes til å lagre og tilordne (meta)data. For at brukere skal identifiseres og gjenkjennes presist, vil hver LDAP-bruker ha et internt brukernavn. Dette krever en tilknytning fra brukernavn til LDAP-bruker. Brukernavn som opprettes blir knyttet til LDAP-brukerens UUID. I tillegg mellomlagres DN for å redusere LDAP-kommunikasjon, men det brukes ikke til identifisering. Hvis DN endres vil endringene bli oppdaget. Det interne brukernavnet brukes alle steder. Nullstilling av tilknytningene vil etterlate seg rester overalt. Nullstilling av tilknytningene skjer ikke pr. konfigurasjon, det påvirker alle LDAP-konfigurasjoner! Nullstill aldri tilknytningene i et produksjonsmiljø, kun ved testing eller eksperimentering.",
"Clear Username-LDAP User Mapping" : "Nullstill tilknytning av brukernavn til LDAP-bruker",
"Clear Groupname-LDAP Group Mapping" : "Nullstill tilknytning av gruppenavn til LDAP-gruppe"
},
diff --git a/apps/user_ldap/l10n/nb_NO.json b/apps/user_ldap/l10n/nb_NO.json
index d96af5cde99..366c8cd9cae 100644
--- a/apps/user_ldap/l10n/nb_NO.json
+++ b/apps/user_ldap/l10n/nb_NO.json
@@ -79,7 +79,7 @@
"Expert" : "Ekspert",
"Advanced" : "Avansert",
"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Advarsel:</b> Appene user_ldap og user_webdavauth er ikke kompatible med hverandre. Uventet oppførsel kan forekomme. Be systemadministratoren om å deaktivere en av dem.",
- "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> PHP LDAP modulen er ikke installert, hjelperen vil ikke virke. Vennligst be din system-administrator om å installere den.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP LDAP-modulen er ikke installert og serveren vil ikke virke. Vennligst be systemadministratoren installere den.",
"Connection Settings" : "Innstillinger for tilkobling",
"Configuration Active" : "Konfigurasjon aktiv",
"When unchecked, this configuration will be skipped." : "Når ikke huket av så vil denne konfigurasjonen bli hoppet over.",
@@ -125,6 +125,7 @@
"UUID Attribute for Users:" : "UUID-attributt for brukere:",
"UUID Attribute for Groups:" : "UUID-attributt for grupper:",
"Username-LDAP User Mapping" : "Tilknytning av brukernavn til LDAP-bruker",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brukernavn brukes til å lagre og tilordne (meta)data. For at brukere skal identifiseres og gjenkjennes presist, vil hver LDAP-bruker ha et internt brukernavn. Dette krever en tilknytning fra brukernavn til LDAP-bruker. Brukernavn som opprettes blir knyttet til LDAP-brukerens UUID. I tillegg mellomlagres DN for å redusere LDAP-kommunikasjon, men det brukes ikke til identifisering. Hvis DN endres vil endringene bli oppdaget. Det interne brukernavnet brukes alle steder. Nullstilling av tilknytningene vil etterlate seg rester overalt. Nullstilling av tilknytningene skjer ikke pr. konfigurasjon, det påvirker alle LDAP-konfigurasjoner! Nullstill aldri tilknytningene i et produksjonsmiljø, kun ved testing eller eksperimentering.",
"Clear Username-LDAP User Mapping" : "Nullstill tilknytning av brukernavn til LDAP-bruker",
"Clear Groupname-LDAP Group Mapping" : "Nullstill tilknytning av gruppenavn til LDAP-gruppe"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js
index dfc1af76823..02b992361ab 100644
--- a/apps/user_ldap/l10n/sr.js
+++ b/apps/user_ldap/l10n/sr.js
@@ -1,33 +1,132 @@
OC.L10N.register(
"user_ldap",
{
+ "Failed to clear the mappings." : "Неуспело чишћење мапирања.",
+ "Failed to delete the server configuration" : "Неуспело брисање серверске конфугирације",
+ "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." : "Конфигурација је важећа, али Bind није успео. Проверите подешавања сервера и акредитиве.",
+ "The configuration is invalid. Please have a look at the logs for further details." : "Конфигурација није важећа. Погледајте у дневнику записа за додатне детаље.",
+ "No action specified" : "Није наведена акција",
+ "No configuration specified" : "Није наведена конфигурација",
+ "No data specified" : "Нису наведени подаци",
+ " Could not set configuration %s" : "Нисам могао да подесим конфигурацију %s",
"Deletion failed" : "Брисање није успело",
+ "Take over settings from recent server configuration?" : "Преузми подешавања са недавних конфигурација сервера?",
"Keep settings?" : "Задржати поставке?",
+ "{nthServer}. Server" : "{nthServer}. Сервер",
+ "Cannot add server configuration" : "Не могу да додам конфигурацију сервера",
+ "mappings cleared" : "мапирања су очишћена",
+ "Success" : "Успешно",
"Error" : "Грешка",
+ "Please specify a Base DN" : "Наведите Base DN",
+ "Could not determine Base DN" : "Не могу да одредим Base DN",
+ "Please specify the port" : "Наведите порт",
+ "Configuration OK" : "Конфигурација је у реду",
+ "Configuration incorrect" : "Конфигурација је неисправна",
+ "Configuration incomplete" : "Конфигурација није комплетна",
+ "Select groups" : "Изаберите групе",
+ "Select object classes" : "Изаберите класе објеката",
+ "Select attributes" : "Изаберите атрибуте",
+ "Connection test succeeded" : "Тест повезивања је успешан",
+ "Connection test failed" : "Тест повезивања није успешан",
+ "Do you really want to delete the current Server Configuration?" : "Да ли стварно желите да обришете тренутну конфигурацију сервера?",
"Confirm Deletion" : "Потврдa брисањa",
+ "_%s group found_::_%s groups found_" : ["нађена %s група","нађене %s групе","нађено %s група"],
+ "_%s user found_::_%s users found_" : ["нађен %s корисник","нађена %s корисника","нађено %s корисника"],
+ "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Немогу да откријем особину приказивања корисниковог имена. Наведите је у напредним поставкама LDAP-a",
+ "Could not find the desired feature" : "Не могу да пронађем жељену особину",
+ "Invalid Host" : "Неважећи домаћин",
"Server" : "Сервер",
+ "User Filter" : "Филтер корисника",
+ "Login Filter" : "Филтер пријављивања",
"Group Filter" : "Филтер групе",
"Save" : "Сачувај",
+ "Test Configuration" : "Тестирај конфигурацију",
"Help" : "Помоћ",
+ "Groups meeting these criteria are available in %s:" : "Групе које испуњавају ове критеријуме су доступне у %s:",
+ "only those object classes:" : "само ове класе објеката:",
+ "only from those groups:" : "само из ових група:",
+ "Edit raw filter instead" : "Уреди сирови филтер",
+ "Raw LDAP filter" : "Сирови LDAP филтер",
+ "The filter specifies which LDAP groups shall have access to the %s instance." : "Филтер прецизира које ће LDAP групе требају имати приступ %s случају.",
+ "Test Filter" : "Тестни филтер",
+ "groups found" : "пронађене групе",
+ "Users login with this attribute:" : "Корисници се логују са овим параметром:",
+ "LDAP Username:" : "LDAP корисничко име:",
+ "LDAP Email Address:" : "LDAP адреса е-поште",
+ "Other Attributes:" : "Остали параметри:",
+ "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Одређује филтер који ће се применити при покушају пријављивања. %%uid замењује корисничко име при пријављивању. Пример: \"uid=%%uid\"",
+ "1. Server" : "1. сервер",
+ "%s. Server:" : "%s. Сервер:",
+ "Add Server Configuration" : "Додај конфигурацију сервера",
+ "Delete Configuration" : "Обриши конфигурацију",
"Host" : "Домаћин",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Можете да изоставите протокол, осим ако захтевате ССЛ. У том случају почните са ldaps://",
"Port" : "Порт",
- "User DN" : "Корисник DN",
+ "User DN" : "Корисников DN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN корисника клијента са којим треба да се успостави веза, нпр. uid=agent,dc=example,dc=com. За анониман приступ, оставите поља DN и лозинка празним.",
"Password" : "Лозинка",
"For anonymous access, leave DN and Password empty." : "За анониман приступ, оставите поља DN и лозинка празним.",
+ "One Base DN per line" : "Једна Base DN по линији",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Можете навести Base DN за кориснике и групе у картици Напредно",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Избегава аутоматске LDAP захтеве. Боље за веће поставке, али тражи мало више познавања LDAP-а.",
+ "Manually enter LDAP filters (recommended for large directories)" : "Унесите ручно LDAP филтере (препоручено за велике директоријуме)",
+ "Limit %s access to users meeting these criteria:" : "Ограничи %s приступа за кориснике који испуњавају ове критеријуме:",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "Филтер одређује који ЛДАП корисници ће имати приступ на %s.",
+ "users found" : "пронађених корисника",
+ "Saving" : "Чувам",
"Back" : "Назад",
"Continue" : "Настави",
+ "LDAP" : "LDAP",
+ "Expert" : "Стручњак",
"Advanced" : "Напредно",
+ "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Упозорење:</b> Апликације user_ldap и user_webdavauth нису компатибилне. Можете имати проблема. Питајте систем администратора да искључи једну од њих.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Упозорење:</b> ПХП ЛДАП модул није инсталиран и зачеље неће радити. Питајте систем администратора да га инсталира.",
+ "Connection Settings" : "Подешавања везе",
+ "Configuration Active" : "Конфигурација активна",
+ "When unchecked, this configuration will be skipped." : "Када није штриклирано, ова конфигурација ће бити прескочена.",
+ "Backup (Replica) Host" : "Домаћин Резервне копије (Реплике)",
+ "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Наведите опционог домаћина за резервне копије. Он мора бити реплика главног ЛДАП/АД сервера.",
+ "Backup (Replica) Port" : "Порт Резервне копије (Реплике)",
+ "Disable Main Server" : "Онемогући главни сервер",
+ "Only connect to the replica server." : "Повезано само на сервер за копирање.",
+ "Case insensitive LDAP server (Windows)" : "LDAP сервер неосетљив на велика и мала слова (Windows)",
"Turn off SSL certificate validation." : "Искључите потврду ССЛ сертификата.",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Није препоручено, користите само за тестирање! Ако веза ради само са овом опцијом, увезите SSL сертификате LDAP сервера на ваш %s сервер.",
+ "Cache Time-To-Live" : "Трајност кеша",
"in seconds. A change empties the cache." : "у секундама. Промена празни кеш меморију.",
+ "Directory Settings" : "Подешавања директоријума",
"User Display Name Field" : "Име приказа корисника",
+ "The LDAP attribute to use to generate the user's display name." : "LDAP особина за стварање имена за приказ корисника.",
"Base User Tree" : "Основно стабло корисника",
+ "One User Base DN per line" : "Један Корисников јединствени назив DN по линији",
+ "User Search Attributes" : "Параметри претраге корисника",
+ "Optional; one attribute per line" : "Опционо; један параметар по линији",
"Group Display Name Field" : "Име приказа групе",
+ "The LDAP attribute to use to generate the groups's display name." : "LDAP параметар за формирање имена за приказ група.",
"Base Group Tree" : "Стабло основне групе",
+ "One Group Base DN per line" : "Један Групни јединствени назив DN по линији",
+ "Group Search Attributes" : "Параметри претраге група",
"Group-Member association" : "Придруживање чланова у групу",
+ "Nested Groups" : "Угнеждене групе",
+ "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Када је укључено, подржане су групе унутар групе. (Ради само ако особина члана групе садржи DN-ове.)",
+ "Special Attributes" : "Посебни параметри",
"Quota Field" : "Поље квоте",
"Quota Default" : "Подразумевана квота",
- "in bytes" : "у бајтовима"
+ "in bytes" : "у бајтовима",
+ "Email Field" : "Поље е-поште",
+ "User Home Folder Naming Rule" : "Правило именовања корисничке фасцикле",
+ "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставите празно за корисничко име (подразумевано). У супротном, наведите особину LDAP/AD.",
+ "Internal Username" : "Интерно корисничко име:",
+ "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Интерно корисничко име ће бити креирано од UUID атрибута. То осигурава да је корисничко име јединствено и да карактери не треба да се конвертују. Интерно корисничко име има ограничење да се само ови карактери дозвољени: [ a-zA-Z0-9_.@- ]. Остали карактери се мењају са њиховим ASCII кореспондентима или се једноставно изостављају. У случају сударања биће додат / повећан број. Интерно корисничко име се користи за интерну идентификацију корисника. Такође је подразумевано име за главну корисничку фасциклу. Такође је део удаљених адреса, на пример за све *DAV сервисе. Са овом поставком, подразумевано понашање се може заобићи. Да би се постигло слично понашање као пре ownCloud 5 унесите атрибут за приказ имена корисника у следеће поље. Оставите празно за подразумевано понашање. Промене ће имати дејство само на новомапираним (доданим) LDAP корисницима и групама.",
+ "Internal Username Attribute:" : "Интерни параметри корисничког имена:",
+ "Override UUID detection" : "Прескочи UUID откривање",
+ "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Подразумевано, атрибут UUID се аутоматски детектује. Атрибут UUID се користи за сигурну идентификацију LDAP корисника и група. Такође, локално корисничко име ће бити креирано на основу UUID-a, ако није другачије назначено. Можете заобићи поставке и проследити други атрибут по вашем избору. Морате бити сигурни да је изабрани атрибут јединствен и да га корисници и групе могу преносити. Оставите празно за подразумевано понашање. Промене ће имати дејство само на новомапираним (доданим) LDAP корисницима и групама.",
+ "UUID Attribute for Users:" : "UUID параметри за кориснике:",
+ "UUID Attribute for Groups:" : "UUID параметри за групе:",
+ "Username-LDAP User Mapping" : "Username-LDAP мапирање корисника",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Корисничка имена се користи за чување и додељивање (мета) података. Да би се прецизно идентификовали и препознавали кориснике, сваки LDAP корисник ће имати локално корисничко име. Ово захтева мапирање од корисничког имена до LDAP корисника. Креирано корисничко име се мапира у UUID LDAP корисника. Поред тога, DN се кешира да смањи LDAP интеракцију, али се не користи за идентификацију. Ако се DN мења, промене се могу наћи. Локално корисничко име се користи свуда. Чишћење мапирања оставља свуда остатке. Чишћење мапирања није осетљиво на конфигурацију, оно утиче на све LDAP конфигурације! Никада не користит чишћење мапирања у радном окружењу, већ само у тестирању или експерименталној фази.",
+ "Clear Username-LDAP User Mapping" : "Очисти Username-LDAP мапирање корисника",
+ "Clear Groupname-LDAP Group Mapping" : "Очисти Groupname-LDAP мапирање група"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json
index 593cbda435e..4c5d20c72bb 100644
--- a/apps/user_ldap/l10n/sr.json
+++ b/apps/user_ldap/l10n/sr.json
@@ -1,31 +1,130 @@
{ "translations": {
+ "Failed to clear the mappings." : "Неуспело чишћење мапирања.",
+ "Failed to delete the server configuration" : "Неуспело брисање серверске конфугирације",
+ "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." : "Конфигурација је важећа, али Bind није успео. Проверите подешавања сервера и акредитиве.",
+ "The configuration is invalid. Please have a look at the logs for further details." : "Конфигурација није важећа. Погледајте у дневнику записа за додатне детаље.",
+ "No action specified" : "Није наведена акција",
+ "No configuration specified" : "Није наведена конфигурација",
+ "No data specified" : "Нису наведени подаци",
+ " Could not set configuration %s" : "Нисам могао да подесим конфигурацију %s",
"Deletion failed" : "Брисање није успело",
+ "Take over settings from recent server configuration?" : "Преузми подешавања са недавних конфигурација сервера?",
"Keep settings?" : "Задржати поставке?",
+ "{nthServer}. Server" : "{nthServer}. Сервер",
+ "Cannot add server configuration" : "Не могу да додам конфигурацију сервера",
+ "mappings cleared" : "мапирања су очишћена",
+ "Success" : "Успешно",
"Error" : "Грешка",
+ "Please specify a Base DN" : "Наведите Base DN",
+ "Could not determine Base DN" : "Не могу да одредим Base DN",
+ "Please specify the port" : "Наведите порт",
+ "Configuration OK" : "Конфигурација је у реду",
+ "Configuration incorrect" : "Конфигурација је неисправна",
+ "Configuration incomplete" : "Конфигурација није комплетна",
+ "Select groups" : "Изаберите групе",
+ "Select object classes" : "Изаберите класе објеката",
+ "Select attributes" : "Изаберите атрибуте",
+ "Connection test succeeded" : "Тест повезивања је успешан",
+ "Connection test failed" : "Тест повезивања није успешан",
+ "Do you really want to delete the current Server Configuration?" : "Да ли стварно желите да обришете тренутну конфигурацију сервера?",
"Confirm Deletion" : "Потврдa брисањa",
+ "_%s group found_::_%s groups found_" : ["нађена %s група","нађене %s групе","нађено %s група"],
+ "_%s user found_::_%s users found_" : ["нађен %s корисник","нађена %s корисника","нађено %s корисника"],
+ "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Немогу да откријем особину приказивања корисниковог имена. Наведите је у напредним поставкама LDAP-a",
+ "Could not find the desired feature" : "Не могу да пронађем жељену особину",
+ "Invalid Host" : "Неважећи домаћин",
"Server" : "Сервер",
+ "User Filter" : "Филтер корисника",
+ "Login Filter" : "Филтер пријављивања",
"Group Filter" : "Филтер групе",
"Save" : "Сачувај",
+ "Test Configuration" : "Тестирај конфигурацију",
"Help" : "Помоћ",
+ "Groups meeting these criteria are available in %s:" : "Групе које испуњавају ове критеријуме су доступне у %s:",
+ "only those object classes:" : "само ове класе објеката:",
+ "only from those groups:" : "само из ових група:",
+ "Edit raw filter instead" : "Уреди сирови филтер",
+ "Raw LDAP filter" : "Сирови LDAP филтер",
+ "The filter specifies which LDAP groups shall have access to the %s instance." : "Филтер прецизира које ће LDAP групе требају имати приступ %s случају.",
+ "Test Filter" : "Тестни филтер",
+ "groups found" : "пронађене групе",
+ "Users login with this attribute:" : "Корисници се логују са овим параметром:",
+ "LDAP Username:" : "LDAP корисничко име:",
+ "LDAP Email Address:" : "LDAP адреса е-поште",
+ "Other Attributes:" : "Остали параметри:",
+ "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Одређује филтер који ће се применити при покушају пријављивања. %%uid замењује корисничко име при пријављивању. Пример: \"uid=%%uid\"",
+ "1. Server" : "1. сервер",
+ "%s. Server:" : "%s. Сервер:",
+ "Add Server Configuration" : "Додај конфигурацију сервера",
+ "Delete Configuration" : "Обриши конфигурацију",
"Host" : "Домаћин",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Можете да изоставите протокол, осим ако захтевате ССЛ. У том случају почните са ldaps://",
"Port" : "Порт",
- "User DN" : "Корисник DN",
+ "User DN" : "Корисников DN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN корисника клијента са којим треба да се успостави веза, нпр. uid=agent,dc=example,dc=com. За анониман приступ, оставите поља DN и лозинка празним.",
"Password" : "Лозинка",
"For anonymous access, leave DN and Password empty." : "За анониман приступ, оставите поља DN и лозинка празним.",
+ "One Base DN per line" : "Једна Base DN по линији",
+ "You can specify Base DN for users and groups in the Advanced tab" : "Можете навести Base DN за кориснике и групе у картици Напредно",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Избегава аутоматске LDAP захтеве. Боље за веће поставке, али тражи мало више познавања LDAP-а.",
+ "Manually enter LDAP filters (recommended for large directories)" : "Унесите ручно LDAP филтере (препоручено за велике директоријуме)",
+ "Limit %s access to users meeting these criteria:" : "Ограничи %s приступа за кориснике који испуњавају ове критеријуме:",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "Филтер одређује који ЛДАП корисници ће имати приступ на %s.",
+ "users found" : "пронађених корисника",
+ "Saving" : "Чувам",
"Back" : "Назад",
"Continue" : "Настави",
+ "LDAP" : "LDAP",
+ "Expert" : "Стручњак",
"Advanced" : "Напредно",
+ "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Упозорење:</b> Апликације user_ldap и user_webdavauth нису компатибилне. Можете имати проблема. Питајте систем администратора да искључи једну од њих.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Упозорење:</b> ПХП ЛДАП модул није инсталиран и зачеље неће радити. Питајте систем администратора да га инсталира.",
+ "Connection Settings" : "Подешавања везе",
+ "Configuration Active" : "Конфигурација активна",
+ "When unchecked, this configuration will be skipped." : "Када није штриклирано, ова конфигурација ће бити прескочена.",
+ "Backup (Replica) Host" : "Домаћин Резервне копије (Реплике)",
+ "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Наведите опционог домаћина за резервне копије. Он мора бити реплика главног ЛДАП/АД сервера.",
+ "Backup (Replica) Port" : "Порт Резервне копије (Реплике)",
+ "Disable Main Server" : "Онемогући главни сервер",
+ "Only connect to the replica server." : "Повезано само на сервер за копирање.",
+ "Case insensitive LDAP server (Windows)" : "LDAP сервер неосетљив на велика и мала слова (Windows)",
"Turn off SSL certificate validation." : "Искључите потврду ССЛ сертификата.",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Није препоручено, користите само за тестирање! Ако веза ради само са овом опцијом, увезите SSL сертификате LDAP сервера на ваш %s сервер.",
+ "Cache Time-To-Live" : "Трајност кеша",
"in seconds. A change empties the cache." : "у секундама. Промена празни кеш меморију.",
+ "Directory Settings" : "Подешавања директоријума",
"User Display Name Field" : "Име приказа корисника",
+ "The LDAP attribute to use to generate the user's display name." : "LDAP особина за стварање имена за приказ корисника.",
"Base User Tree" : "Основно стабло корисника",
+ "One User Base DN per line" : "Један Корисников јединствени назив DN по линији",
+ "User Search Attributes" : "Параметри претраге корисника",
+ "Optional; one attribute per line" : "Опционо; један параметар по линији",
"Group Display Name Field" : "Име приказа групе",
+ "The LDAP attribute to use to generate the groups's display name." : "LDAP параметар за формирање имена за приказ група.",
"Base Group Tree" : "Стабло основне групе",
+ "One Group Base DN per line" : "Један Групни јединствени назив DN по линији",
+ "Group Search Attributes" : "Параметри претраге група",
"Group-Member association" : "Придруживање чланова у групу",
+ "Nested Groups" : "Угнеждене групе",
+ "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Када је укључено, подржане су групе унутар групе. (Ради само ако особина члана групе садржи DN-ове.)",
+ "Special Attributes" : "Посебни параметри",
"Quota Field" : "Поље квоте",
"Quota Default" : "Подразумевана квота",
- "in bytes" : "у бајтовима"
+ "in bytes" : "у бајтовима",
+ "Email Field" : "Поље е-поште",
+ "User Home Folder Naming Rule" : "Правило именовања корисничке фасцикле",
+ "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставите празно за корисничко име (подразумевано). У супротном, наведите особину LDAP/AD.",
+ "Internal Username" : "Интерно корисничко име:",
+ "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Интерно корисничко име ће бити креирано од UUID атрибута. То осигурава да је корисничко име јединствено и да карактери не треба да се конвертују. Интерно корисничко име има ограничење да се само ови карактери дозвољени: [ a-zA-Z0-9_.@- ]. Остали карактери се мењају са њиховим ASCII кореспондентима или се једноставно изостављају. У случају сударања биће додат / повећан број. Интерно корисничко име се користи за интерну идентификацију корисника. Такође је подразумевано име за главну корисничку фасциклу. Такође је део удаљених адреса, на пример за све *DAV сервисе. Са овом поставком, подразумевано понашање се може заобићи. Да би се постигло слично понашање као пре ownCloud 5 унесите атрибут за приказ имена корисника у следеће поље. Оставите празно за подразумевано понашање. Промене ће имати дејство само на новомапираним (доданим) LDAP корисницима и групама.",
+ "Internal Username Attribute:" : "Интерни параметри корисничког имена:",
+ "Override UUID detection" : "Прескочи UUID откривање",
+ "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Подразумевано, атрибут UUID се аутоматски детектује. Атрибут UUID се користи за сигурну идентификацију LDAP корисника и група. Такође, локално корисничко име ће бити креирано на основу UUID-a, ако није другачије назначено. Можете заобићи поставке и проследити други атрибут по вашем избору. Морате бити сигурни да је изабрани атрибут јединствен и да га корисници и групе могу преносити. Оставите празно за подразумевано понашање. Промене ће имати дејство само на новомапираним (доданим) LDAP корисницима и групама.",
+ "UUID Attribute for Users:" : "UUID параметри за кориснике:",
+ "UUID Attribute for Groups:" : "UUID параметри за групе:",
+ "Username-LDAP User Mapping" : "Username-LDAP мапирање корисника",
+ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Корисничка имена се користи за чување и додељивање (мета) података. Да би се прецизно идентификовали и препознавали кориснике, сваки LDAP корисник ће имати локално корисничко име. Ово захтева мапирање од корисничког имена до LDAP корисника. Креирано корисничко име се мапира у UUID LDAP корисника. Поред тога, DN се кешира да смањи LDAP интеракцију, али се не користи за идентификацију. Ако се DN мења, промене се могу наћи. Локално корисничко име се користи свуда. Чишћење мапирања оставља свуда остатке. Чишћење мапирања није осетљиво на конфигурацију, оно утиче на све LDAP конфигурације! Никада не користит чишћење мапирања у радном окружењу, већ само у тестирању или експерименталној фази.",
+ "Clear Username-LDAP User Mapping" : "Очисти Username-LDAP мапирање корисника",
+ "Clear Groupname-LDAP Group Mapping" : "Очисти Groupname-LDAP мапирање група"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/user_ldap/templates/part.settingcontrols.php b/apps/user_ldap/templates/part.settingcontrols.php
index bcccb59a7dd..e67cea41d9c 100644
--- a/apps/user_ldap/templates/part.settingcontrols.php
+++ b/apps/user_ldap/templates/part.settingcontrols.php
@@ -3,7 +3,7 @@
<button type="button" class="ldap_action_test_connection" name="ldap_action_test_connection">
<?php p($l->t('Test Configuration'));?>
</button>
- <a href="<?php p(\OC_Helper::linkToDocs('admin-ldap')); ?>"
+ <a href="<?php p(\OC::$server->getURLGenerator()->linkToDocs('admin-ldap')); ?>"
target="_blank">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php
index 90d558e72d1..cda4e1fd906 100644
--- a/apps/user_ldap/templates/part.wizardcontrols.php
+++ b/apps/user_ldap/templates/part.wizardcontrols.php
@@ -8,7 +8,7 @@
<button class="ldap_action_continue" name="ldap_action_continue" type="button">
<?php p($l->t('Continue'));?>
</button>
- <a href="<?php p(\OC_Helper::linkToDocs('admin-ldap')); ?>"
+ <a href="<?php p(\OC::$server->getURLGenerator()->linkToDocs('admin-ldap')); ?>"
target="_blank">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
diff --git a/apps/user_webdavauth/appinfo/app.php b/apps/user_webdavauth/appinfo/app.php
index 573700c5607..d27e804d8ba 100644
--- a/apps/user_webdavauth/appinfo/app.php
+++ b/apps/user_webdavauth/appinfo/app.php
@@ -33,6 +33,6 @@ OC_User::useBackend( "WEBDAVAUTH" );
$entry = array(
'id' => "user_webdavauth_settings",
'order'=>1,
- 'href' => OC_Helper::linkTo( "user_webdavauth", "settings.php" ),
+ 'href' => \OCP\Util::linkTo( "user_webdavauth", "settings.php" ),
'name' => 'WEBDAVAUTH'
);
diff --git a/build/license.php b/build/license.php
index a8d82b084e6..6e3806e1464 100644
--- a/build/license.php
+++ b/build/license.php
@@ -166,7 +166,7 @@ if (isset($argv[1])) {
} else {
$licenses->exec([
'../apps/files',
- '../apps/files_encryption',
+ '../apps/encryption',
'../apps/files_external',
'../apps/files_sharing',
'../apps/files_trashbin',
diff --git a/config/config.sample.php b/config/config.sample.php
index 672203153c6..29f7c2ad55a 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -620,12 +620,12 @@ $CONFIG = array(
* The maximum width, in pixels, of a preview. A value of ``null`` means there
* is no limit.
*/
-'preview_max_x' => null,
+'preview_max_x' => 2048,
/**
* The maximum height, in pixels, of a preview. A value of ``null`` means there
* is no limit.
*/
-'preview_max_y' => null,
+'preview_max_y' => 2048,
/**
* If a lot of small pictures are stored on the ownCloud instance and the
* preview system generates blurry previews, you might want to consider setting
@@ -661,7 +661,11 @@ $CONFIG = array(
*
* The following providers are enabled by default:
*
- * - OC\Preview\Image
+ * - OC\Preview\PNG
+ * - OC\Preview\JPEG
+ * - OC\Preview\GIF
+ * - OC\Preview\BMP
+ * - OC\Preview\XBitmap
* - OC\Preview\MarkDown
* - OC\Preview\MP3
* - OC\Preview\TXT
@@ -697,7 +701,11 @@ $CONFIG = array(
* - OC\Preview\StarOffice
*/
'enabledPreviewProviders' => array(
- 'OC\Preview\Image',
+ 'OC\Preview\PNG',
+ 'OC\Preview\JPEG',
+ 'OC\Preview\GIF',
+ 'OC\Preview\BMP',
+ 'OC\Preview\XBitmap',
'OC\Preview\MP3',
'OC\Preview\TXT',
'OC\Preview\MarkDown'
diff --git a/core/ajax/share.php b/core/ajax/share.php
index 7bc01133a6d..05756fc1c8b 100644
--- a/core/ajax/share.php
+++ b/core/ajax/share.php
@@ -262,7 +262,7 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
while ($count < 15 && count($users) == $limit) {
$limit = 15 - $count;
if ($shareWithinGroupOnly) {
- $users = OC_Group::DisplayNamesInGroups($usergroups, (string)$_GET['search'], $limit, $offset);
+ $users = OC_Group::displayNamesInGroups($usergroups, (string)$_GET['search'], $limit, $offset);
} else {
$users = OC_User::getDisplayNames((string)$_GET['search'], $limit, $offset);
}
diff --git a/core/application.php b/core/application.php
index 5d12ea0280e..cca2c600118 100644
--- a/core/application.php
+++ b/core/application.php
@@ -88,8 +88,8 @@ class Application extends App {
/**
* Core class wrappers
*/
- $container->registerService('IsEncryptionEnabled', function() {
- return \OC_App::isEnabled('files_encryption');
+ $container->registerService('IsEncryptionEnabled', function(SimpleContainer $c) {
+ return $c->query('ServerContainer')->getEncryptionManager()->isEnabled();
});
$container->registerService('URLGenerator', function(SimpleContainer $c) {
return $c->query('ServerContainer')->getURLGenerator();
diff --git a/core/command/user/add.php b/core/command/user/add.php
index 93257ea2e5a..1ae0ffbe2ad 100644
--- a/core/command/user/add.php
+++ b/core/command/user/add.php
@@ -81,7 +81,7 @@ class Add extends Command {
$uid = $input->getArgument('uid');
if ($this->userManager->userExists($uid)) {
$output->writeln('<error>The user "' . $uid . '" already exists.</error>');
- return;
+ return 1;
}
$password = $input->getOption('password');
@@ -103,6 +103,7 @@ class Add extends Command {
$output->writeln('The user "' . $user->getUID() . '" was created successfully');
} else {
$output->writeln('<error>An error occurred while creating the user</error>');
+ return 1;
}
if ($input->getOption('display-name')) {
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
index 67925d75d34..9bb3face751 100644
--- a/core/js/setupchecks.js
+++ b/core/js/setupchecks.js
@@ -59,6 +59,11 @@
t('core', '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.')
);
}
+ if(!data.isMemcacheConfigured) {
+ messages.push(
+ t('core', '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>.', {docLink: data.memcacheDocs})
+ );
+ }
} else {
messages.push(t('core', 'Error occurred while checking server setup'));
}
diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js
index 70f64432e9e..3e6382603f5 100644
--- a/core/js/tests/specs/setupchecksSpec.js
+++ b/core/js/tests/specs/setupchecksSpec.js
@@ -66,11 +66,11 @@ describe('OC.SetupChecks tests', function() {
{
'Content-Type': 'application/json'
},
- JSON.stringify({data: {serverHasInternetConnection: false}})
+ JSON.stringify({serverHasInternetConnection: false, memcacheDocs: 'https://doc.owncloud.org/server/go.php?to=admin-performance'})
);
async.done(function( data, s, x ){
- expect(data).toEqual(['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.', '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.']);
+ expect(data).toEqual(['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.', '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.', '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="https://doc.owncloud.org/server/go.php?to=admin-performance">documentation</a>.']);
done();
});
});
@@ -83,7 +83,24 @@ describe('OC.SetupChecks tests', function() {
{
'Content-Type': 'application/json'
},
- JSON.stringify({data: {serverHasInternetConnection: false, dataDirectoryProtected: false}})
+ JSON.stringify({serverHasInternetConnection: false, dataDirectoryProtected: false, memcacheDocs: 'https://doc.owncloud.org/server/go.php?to=admin-performance'})
+ );
+
+ async.done(function( data, s, x ){
+ expect(data).toEqual(['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.', '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.', '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="https://doc.owncloud.org/server/go.php?to=admin-performance">documentation</a>.']);
+ done();
+ });
+ });
+
+ it('should return an error if server has no internet connection and data directory is not protected and memcache is available', function(done) {
+ var async = OC.SetupChecks.checkSetup();
+
+ suite.server.requests[0].respond(
+ 200,
+ {
+ 'Content-Type': 'application/json',
+ },
+ JSON.stringify({serverHasInternetConnection: false, dataDirectoryProtected: false, isMemcacheConfigured: true})
);
async.done(function( data, s, x ){
@@ -92,6 +109,7 @@ describe('OC.SetupChecks tests', function() {
});
});
+
it('should return an error if the response has no statuscode 200', function(done) {
var async = OC.SetupChecks.checkSetup();
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index 3da744ebba3..8f066359488 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server ještě není správně nastaven pro umožnění synchronizace souborů, protože rozhraní WebDAV je pravděpodobně rozbité.",
"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." : "Tento server nemá funkční připojení k Internetu. Některé moduly jako např. externí úložiště, oznámení o dostupných aktualizacích nebo instalace aplikací třetích stran nebudou fungovat. Přístup k souborům z jiných míst a odesílání oznamovacích emailů také nemusí fungovat. Pokud chcete využívat všechny možnosti ownCloud, doporučujeme povolit pro tento server připojení k Internetu.",
"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." : "Váš datový adresář i vaše soubory jsou pravděpodobně přístupné z Internetu. Soubor .htaccess nefunguje. Důrazně doporučujeme nakonfigurovat webový server tak, aby datový adresář nebyl nadále přístupný, nebo přesunout datový adresář mimo prostor zpřístupňovaný webovým serverem.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Nebyla nakonfigurována paměťová cache. Pro zlepšení výkonu a dostupnosti ji prosím nakonfigurujte. Další informace lze nalézt v naší <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">dokumentaci</a>.",
"Error occurred while checking server setup" : "Při ověřování nastavení serveru došlo k chybě",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP hlavička \"{header}\" není nakonfigurována ve shodě s \"{expected}\". To značí možné ohrožení bezpečnosti a soukromí a je doporučeno toto nastavení upravit.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP hlavička \"Strict-Transport-Security\" není nakonfigurována na minimálně \"2,678,400\" sekund. To značí možné ohrožení bezpečnosti a je doporučeno upravit toto nastavení.",
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index 285fef17895..b4708f25f90 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server ještě není správně nastaven pro umožnění synchronizace souborů, protože rozhraní WebDAV je pravděpodobně rozbité.",
"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." : "Tento server nemá funkční připojení k Internetu. Některé moduly jako např. externí úložiště, oznámení o dostupných aktualizacích nebo instalace aplikací třetích stran nebudou fungovat. Přístup k souborům z jiných míst a odesílání oznamovacích emailů také nemusí fungovat. Pokud chcete využívat všechny možnosti ownCloud, doporučujeme povolit pro tento server připojení k Internetu.",
"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." : "Váš datový adresář i vaše soubory jsou pravděpodobně přístupné z Internetu. Soubor .htaccess nefunguje. Důrazně doporučujeme nakonfigurovat webový server tak, aby datový adresář nebyl nadále přístupný, nebo přesunout datový adresář mimo prostor zpřístupňovaný webovým serverem.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Nebyla nakonfigurována paměťová cache. Pro zlepšení výkonu a dostupnosti ji prosím nakonfigurujte. Další informace lze nalézt v naší <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">dokumentaci</a>.",
"Error occurred while checking server setup" : "Při ověřování nastavení serveru došlo k chybě",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP hlavička \"{header}\" není nakonfigurována ve shodě s \"{expected}\". To značí možné ohrožení bezpečnosti a soukromí a je doporučeno toto nastavení upravit.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP hlavička \"Strict-Transport-Security\" není nakonfigurována na minimálně \"2,678,400\" sekund. To značí možné ohrožení bezpečnosti a je doporučeno upravit toto nastavení.",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index 951bad7b872..f8ecc65c2bc 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -72,7 +72,9 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Din webserver er endnu ikke sat korrekt op til at tillade filsynkronisering, fordi WebDAV-grænsefladen ser ud til at være i stykker.",
"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." : "Denne ownCloud-server har ikke en fungerende forbindelse til internettet. Det betyder, at visse funktioner som montering af eksterne drev, oplysninger om opdatering eller installation af applikationer fra tredjepart ikke fungerer. Det vil sandsynligvis heller ikke være muligt at tilgå filer fra eksterne drev eller afsendelse af e-mail med notifikationer virker sandsynligvis heller ikke. Vi opfordrer til at etablere forbindelse til internettet for denne server, såfremt du ønsker samtlige funktioner.",
"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." : "Din data mappe og dine filer er muligvis tilgængelige fra internettet. Filen .htaccess fungerer ikke. Vi anbefaler på det kraftigste, at du konfigurerer din webserver således at datamappen ikke længere er tilgængelig, eller at du flytter datamappen uden for webserverens dokumentrod. ",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Ingen hukommelseslager er konfigureret. For at forbedre din ydelse, venligst konfigurér et hukommelseslager hvis dette er muligt. Mere information kan findes i vores <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">dokumentation</a>.",
"Error occurred while checking server setup" : "Der opstod fejl under tjek af serveropsætningen",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-hovedet \"{header}\" er ikke konfigureret til at være lig med \"{expected}\". Dette er en potentiel sikkerhedsrisiko, og vi anbefaler at du justerer denne indstilling.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP-hovedet \"Strict-Transport-Security\" er ikke konfigureret til mindst \"2.678.400\" sekunder. Dette er en potentiel sikkerhedsrisiko, og vi anbefaler at du justerer denne indstilling.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Du tilgår dette sted gennem HTTP. Vi anbefaler kraftigt at du konfigurerer din server, så der i stedet kræves HTTPS.",
"Shared" : "Delt",
@@ -170,6 +172,7 @@ OC.L10N.register(
"Technical details" : "Tekniske detaljer",
"Remote Address: %s" : "Fjernadresse: %s",
"Request ID: %s" : "Forespørgsels-ID: %s",
+ "Type: %s" : "Indtast: %s",
"Code: %s" : "Kode: %s",
"Message: %s" : "Besked: %s",
"File: %s" : "Fil: %s",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index 39d1b2e8818..7d10f656362 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -70,7 +70,9 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Din webserver er endnu ikke sat korrekt op til at tillade filsynkronisering, fordi WebDAV-grænsefladen ser ud til at være i stykker.",
"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." : "Denne ownCloud-server har ikke en fungerende forbindelse til internettet. Det betyder, at visse funktioner som montering af eksterne drev, oplysninger om opdatering eller installation af applikationer fra tredjepart ikke fungerer. Det vil sandsynligvis heller ikke være muligt at tilgå filer fra eksterne drev eller afsendelse af e-mail med notifikationer virker sandsynligvis heller ikke. Vi opfordrer til at etablere forbindelse til internettet for denne server, såfremt du ønsker samtlige funktioner.",
"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." : "Din data mappe og dine filer er muligvis tilgængelige fra internettet. Filen .htaccess fungerer ikke. Vi anbefaler på det kraftigste, at du konfigurerer din webserver således at datamappen ikke længere er tilgængelig, eller at du flytter datamappen uden for webserverens dokumentrod. ",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Ingen hukommelseslager er konfigureret. For at forbedre din ydelse, venligst konfigurér et hukommelseslager hvis dette er muligt. Mere information kan findes i vores <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">dokumentation</a>.",
"Error occurred while checking server setup" : "Der opstod fejl under tjek af serveropsætningen",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-hovedet \"{header}\" er ikke konfigureret til at være lig med \"{expected}\". Dette er en potentiel sikkerhedsrisiko, og vi anbefaler at du justerer denne indstilling.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP-hovedet \"Strict-Transport-Security\" er ikke konfigureret til mindst \"2.678.400\" sekunder. Dette er en potentiel sikkerhedsrisiko, og vi anbefaler at du justerer denne indstilling.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Du tilgår dette sted gennem HTTP. Vi anbefaler kraftigt at du konfigurerer din server, så der i stedet kræves HTTPS.",
"Shared" : "Delt",
@@ -168,6 +170,7 @@
"Technical details" : "Tekniske detaljer",
"Remote Address: %s" : "Fjernadresse: %s",
"Request ID: %s" : "Forespørgsels-ID: %s",
+ "Type: %s" : "Indtast: %s",
"Code: %s" : "Kode: %s",
"Message: %s" : "Besked: %s",
"File: %s" : "Fil: %s",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index f4b402242d0..495f233416b 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Dein Webserver ist noch nicht hinreichend für Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Du alle Funktionen nutzen möchtest.",
"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." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Deinen Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Du es aus dem Document-Root-Verzeichnis des Webservers herausverschiebst.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Es wurde kein Pufferspeicher konfiguriert. Zur Erhöhung der Leistungsfähigkeit konfiguriere, soweit verfügbar, den Pufferspeicher. Weitere Informationen finden Sie in unserer <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">Dokumentation</a>.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
"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." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „2.678.400 Sekunden“ eingestellt. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index 4ad4f9bc484..0a5ff2816ba 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Dein Webserver ist noch nicht hinreichend für Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Du alle Funktionen nutzen möchtest.",
"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." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Deinen Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Du es aus dem Document-Root-Verzeichnis des Webservers herausverschiebst.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Es wurde kein Pufferspeicher konfiguriert. Zur Erhöhung der Leistungsfähigkeit konfiguriere, soweit verfügbar, den Pufferspeicher. Weitere Informationen finden Sie in unserer <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">Dokumentation</a>.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
"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." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „2.678.400 Sekunden“ eingestellt. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index 395935baf23..58b301f999b 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ihr Webserver ist noch nicht hinreichend für Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Sie alle Funktionen nutzen möchten.",
"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." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Ihren Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Sie es aus dem Document-Root-Verzeichnis des Webservers herausverschieben.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Es wurde kein Pufferspeicher konfiguriert. Zur Erhöhung der Leistungsfähigkeit konfigurieren Sie, soweit verfügbar, den Pufferspeicher. Weitere Informationen finden Sie in unserer <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">Dokumentation</a>.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
"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." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „2.678.400 Sekunden“ eingestellt. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index e576d819071..4567222cf3d 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ihr Webserver ist noch nicht hinreichend für Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
"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." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Sie alle Funktionen nutzen möchten.",
"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." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Ihren Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Sie es aus dem Document-Root-Verzeichnis des Webservers herausverschieben.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Es wurde kein Pufferspeicher konfiguriert. Zur Erhöhung der Leistungsfähigkeit konfigurieren Sie, soweit verfügbar, den Pufferspeicher. Weitere Informationen finden Sie in unserer <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">Dokumentation</a>.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
"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." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „2.678.400 Sekunden“ eingestellt. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
diff --git a/core/l10n/el.js b/core/l10n/el.js
index 9053e8067cd..59c62886499 100644
--- a/core/l10n/el.js
+++ b/core/l10n/el.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ο διακομιστής σας δεν έχει ρυθμιστεί κατάλληλα ώστε να επιτρέπει τον συγχρονισμό αρχείων γιατί η διεπαφή WebDAV πιθανόν είναι κατεστραμμένη.",
"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 δεν λειτουργεί. Σας προτείνουμε ανεπιφύλακτα να ρυθμίσετε το διακομιστή σας με τέτοιο τρόπο ώστε ο κατάλογος δεδομένων να μην είναι πλέον προσβάσιμος ή να μετακινήσετε τον κατάλογο δεδομένων εκτός του καταλόγου της ρίζας εγγράφων-document root του διακομιστή.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Δεν έχει οριστει προσωρινή μνημη. Για να βελτιώσετε την απόδοσή σας παρακαλούμε να διαμορφώσετε ένα χώρο προσωρινής αποθήκευσης εάν υπάρχει διαθέσιμος. Περαιτέρω πληροφορίες μπορείτε να βρείτε στο <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</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." : "H \"{header}\" κεφαλίδα HTTP δεν έχει ρυθμιστεί ώστε να ισούται με \"{expected}\". Αυτό αποτελεί ενδεχόμενο κίνδυνο ασφάλειας ή ιδιωτικότητας και συστήνουμε τη διόρθωση αυτής της ρύθμισης.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "Η «Strict-Transport-Security\" κεφαλίδα HTTP δεν έχει ρυθμιστεί για τουλάχιστον \"2678400\" δευτερόλεπτα. Αυτό αποτελεί ενδεχόμενο κίνδυνο ασφάλειας και συστήνουμε τη διόρθωση αυτής της ρύθμισης.",
diff --git a/core/l10n/el.json b/core/l10n/el.json
index bbffe9a0a99..8b53f635aa6 100644
--- a/core/l10n/el.json
+++ b/core/l10n/el.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ο διακομιστής σας δεν έχει ρυθμιστεί κατάλληλα ώστε να επιτρέπει τον συγχρονισμό αρχείων γιατί η διεπαφή WebDAV πιθανόν είναι κατεστραμμένη.",
"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 δεν λειτουργεί. Σας προτείνουμε ανεπιφύλακτα να ρυθμίσετε το διακομιστή σας με τέτοιο τρόπο ώστε ο κατάλογος δεδομένων να μην είναι πλέον προσβάσιμος ή να μετακινήσετε τον κατάλογο δεδομένων εκτός του καταλόγου της ρίζας εγγράφων-document root του διακομιστή.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Δεν έχει οριστει προσωρινή μνημη. Για να βελτιώσετε την απόδοσή σας παρακαλούμε να διαμορφώσετε ένα χώρο προσωρινής αποθήκευσης εάν υπάρχει διαθέσιμος. Περαιτέρω πληροφορίες μπορείτε να βρείτε στο <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</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." : "H \"{header}\" κεφαλίδα HTTP δεν έχει ρυθμιστεί ώστε να ισούται με \"{expected}\". Αυτό αποτελεί ενδεχόμενο κίνδυνο ασφάλειας ή ιδιωτικότητας και συστήνουμε τη διόρθωση αυτής της ρύθμισης.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "Η «Strict-Transport-Security\" κεφαλίδα HTTP δεν έχει ρυθμιστεί για τουλάχιστον \"2678400\" δευτερόλεπτα. Αυτό αποτελεί ενδεχόμενο κίνδυνο ασφάλειας και συστήνουμε τη διόρθωση αυτής της ρύθμισης.",
diff --git a/core/l10n/es.js b/core/l10n/es.js
index 4e6cd98c085..5d11b85b70b 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -9,8 +9,8 @@ OC.L10N.register(
"Checked database schema update for apps" : "Comprobada la actualización del esquema de la base de datos para aplicaciones",
"Updated \"%s\" to %s" : "Se ha actualizado \"%s\" a %s",
"Repair warning: " : "Advertencia de reparación:",
- "Repair error: " : "Error a reparar",
- "Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles, han sido deshabilitadas: %s",
+ "Repair error: " : "Error que reparar:",
+ "Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles se han deshabilitado: %s",
"Following 3rd party apps have been disabled: %s" : "Las siguientes aplicaciones de terceros han sido deshabilitadas: %s",
"Invalid file provided" : "Archivo inválido",
"No image or file provided" : "No se especificó ningún archivo o imagen",
@@ -72,8 +72,9 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Su servidor web aún no está configurado adecuadamente para permitir sincronización de archivos ya que la interfaz WebDAV parece no estar funcionando.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionan. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.",
"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." : "Su directorio de datos y sus archivos probablemente sean accesibles desde Internet. El archivo .htaccess no está funcionando. Le sugerimos encarecidamente que configure su servidor web de modo que el directorio de datos ya no sea accesible o que mueva el directorio de datos fuera de la raíz de documentos del servidor web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "La memoria de caché no ha sido configurada. Para aumentar la performance por favor configure el módulo \"memcache\" si está disponible. Encontrará más información en <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\"> nuestra documentación</a>.",
"Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor",
- "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." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad por lo que se recomienda ajustar esta opción.",
+ "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." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad, por lo que se recomienda ajustar esta opción.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "La \"Strict-Transport-Security\" Cabecera HTTP no está configurada a al menos \"2,678,400\" segundos. Esto es un riesgo potencial de seguridad y debe ajustar esta opción.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Está ingresando a esta web vía HTTP. Le recomendamos encarecidamente que configure su servidor para que use HTTPS en su lugar..",
"Shared" : "Compartido",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index a236a8b25d6..478621bfed6 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -7,8 +7,8 @@
"Checked database schema update for apps" : "Comprobada la actualización del esquema de la base de datos para aplicaciones",
"Updated \"%s\" to %s" : "Se ha actualizado \"%s\" a %s",
"Repair warning: " : "Advertencia de reparación:",
- "Repair error: " : "Error a reparar",
- "Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles, han sido deshabilitadas: %s",
+ "Repair error: " : "Error que reparar:",
+ "Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles se han deshabilitado: %s",
"Following 3rd party apps have been disabled: %s" : "Las siguientes aplicaciones de terceros han sido deshabilitadas: %s",
"Invalid file provided" : "Archivo inválido",
"No image or file provided" : "No se especificó ningún archivo o imagen",
@@ -70,8 +70,9 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Su servidor web aún no está configurado adecuadamente para permitir sincronización de archivos ya que la interfaz WebDAV parece no estar funcionando.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionan. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.",
"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." : "Su directorio de datos y sus archivos probablemente sean accesibles desde Internet. El archivo .htaccess no está funcionando. Le sugerimos encarecidamente que configure su servidor web de modo que el directorio de datos ya no sea accesible o que mueva el directorio de datos fuera de la raíz de documentos del servidor web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "La memoria de caché no ha sido configurada. Para aumentar la performance por favor configure el módulo \"memcache\" si está disponible. Encontrará más información en <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\"> nuestra documentación</a>.",
"Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor",
- "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." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad por lo que se recomienda ajustar esta opción.",
+ "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." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad, por lo que se recomienda ajustar esta opción.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "La \"Strict-Transport-Security\" Cabecera HTTP no está configurada a al menos \"2,678,400\" segundos. Esto es un riesgo potencial de seguridad y debe ajustar esta opción.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Está ingresando a esta web vía HTTP. Le recomendamos encarecidamente que configure su servidor para que use HTTPS en su lugar..",
"Shared" : "Compartido",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index af0f8e92e1a..2676f4a8c62 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "HTTP-palvelinta ei ole määritetty oikein tiedostojen synkronointia varten, koska WebDAV-liittymä vaikuttaa olevan rikki.",
"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." : "Tällä palvelimella ei ole toimivaa internetyhteyttä. Sen seurauksena jotkin ominaisuudet, kuten erillinen tallennustila, ilmoitukset päivityksistä ja kolmansien osapuolten sovellusten asennus eivät toimi. Tiedostojen käyttö etänä tai ilmoitusten lähetys sähköpostitse eivät välttämättä toimi myöskään. Suosittelemme kytkemään palvelimen internetyhteyteen, jos haluat käyttää kaikkia ownCloudin ominaisuuksia.",
"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." : "Datahakemistosi ja tiedostosi ovat luultavasti käytettävissä suoraan internetistä. .htaccess-tiedosto ei toimi oikein. Suosittelemme määrittämään http-palvelimen asetukset siten, ettei datahakemisto ole suoraan käytettävissä internetistä, tai siirtämään datahakemiston http-palvelimen juurihakemiston ulkopuolelle.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Muisti-cachea ei ole määritetty. Paranna suorituskykyä ottamalla memcache käyttöön. Lisätietoja on tarjolla <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">ownCloud-dokumentaatiossa</a>.",
"Error occurred while checking server setup" : "Virhe palvelimen määrityksiä tarkistaessa",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-otsaketta \"{header}\" ei ole määritetty vastaamaan arvoa \"{expected}\". Kyseessä on mahdollinen tietoturvaan tai -suojaan liittyvä riski, joten suosittelemme muuttamaan asetuksen arvoa.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP-otsaketta \"Strict-Transport-Security\" ei ole määritetty vähintään \"2,678,400\" sekuntiin. Tämä on mahdollinen tietoturvariski, joten suosittelemme kyseisen asetuksen muuttamista.",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index 33ca3b039e2..6e3737c8904 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "HTTP-palvelinta ei ole määritetty oikein tiedostojen synkronointia varten, koska WebDAV-liittymä vaikuttaa olevan rikki.",
"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." : "Tällä palvelimella ei ole toimivaa internetyhteyttä. Sen seurauksena jotkin ominaisuudet, kuten erillinen tallennustila, ilmoitukset päivityksistä ja kolmansien osapuolten sovellusten asennus eivät toimi. Tiedostojen käyttö etänä tai ilmoitusten lähetys sähköpostitse eivät välttämättä toimi myöskään. Suosittelemme kytkemään palvelimen internetyhteyteen, jos haluat käyttää kaikkia ownCloudin ominaisuuksia.",
"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." : "Datahakemistosi ja tiedostosi ovat luultavasti käytettävissä suoraan internetistä. .htaccess-tiedosto ei toimi oikein. Suosittelemme määrittämään http-palvelimen asetukset siten, ettei datahakemisto ole suoraan käytettävissä internetistä, tai siirtämään datahakemiston http-palvelimen juurihakemiston ulkopuolelle.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Muisti-cachea ei ole määritetty. Paranna suorituskykyä ottamalla memcache käyttöön. Lisätietoja on tarjolla <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">ownCloud-dokumentaatiossa</a>.",
"Error occurred while checking server setup" : "Virhe palvelimen määrityksiä tarkistaessa",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-otsaketta \"{header}\" ei ole määritetty vastaamaan arvoa \"{expected}\". Kyseessä on mahdollinen tietoturvaan tai -suojaan liittyvä riski, joten suosittelemme muuttamaan asetuksen arvoa.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP-otsaketta \"Strict-Transport-Security\" ei ole määritetty vähintään \"2,678,400\" sekuntiin. Tämä on mahdollinen tietoturvariski, joten suosittelemme kyseisen asetuksen muuttamista.",
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index c0fcbacb2d1..878a795b00a 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -72,7 +72,9 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Votre serveur web n'est pas correctement configuré pour permettre la synchronisation de fichiers : l'interface WebDAV semble ne pas fonctionner.",
"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." : "Ce serveur ne peut se connecter à internet. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que les notifications par mails ne seront pas fonctionnels également. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.",
"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." : "Votre dossier de données et vos fichiers sont probablement accessibles depuis internet. Le fichier .htaccess ne fonctionne pas. Nous vous recommandons vivement de configurer votre serveur web de façon à ce que ce dossier de données ne soit plus accessible, ou bien de le déplacer à l'extérieur de la racine du serveur web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Aucun cache de la mémoire n'est configuré. Si possible, configurez un \"memcache\" pour augmenter les performances. Pour plus d'information consultez la <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>.",
"Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur",
+ "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." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\" créant potentiellement un risque relié à la sécurité et à la vie privée. Il est donc recommandé d'ajuster ce paramètre.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configurée pour durer \"2,678,400\" secondes. C'est un risque de sécurité potentiel et il est donc recommandé d'ajuster ce paramètre.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Vous accédez à ce site via HTTP. Nous vous recommandons fortement de configurer votre serveur pour forcer l'utilisation de HTTPS à la place.",
"Shared" : "Partagé",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index 0626e572355..ce7d7eaf35f 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -70,7 +70,9 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Votre serveur web n'est pas correctement configuré pour permettre la synchronisation de fichiers : l'interface WebDAV semble ne pas fonctionner.",
"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." : "Ce serveur ne peut se connecter à internet. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que les notifications par mails ne seront pas fonctionnels également. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.",
"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." : "Votre dossier de données et vos fichiers sont probablement accessibles depuis internet. Le fichier .htaccess ne fonctionne pas. Nous vous recommandons vivement de configurer votre serveur web de façon à ce que ce dossier de données ne soit plus accessible, ou bien de le déplacer à l'extérieur de la racine du serveur web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Aucun cache de la mémoire n'est configuré. Si possible, configurez un \"memcache\" pour augmenter les performances. Pour plus d'information consultez la <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>.",
"Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur",
+ "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." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\" créant potentiellement un risque relié à la sécurité et à la vie privée. Il est donc recommandé d'ajuster ce paramètre.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configurée pour durer \"2,678,400\" secondes. C'est un risque de sécurité potentiel et il est donc recommandé d'ajuster ce paramètre.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Vous accédez à ce site via HTTP. Nous vous recommandons fortement de configurer votre serveur pour forcer l'utilisation de HTTPS à la place.",
"Shared" : "Partagé",
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index acb5e21365b..8c4f4b82b5c 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O servidor aínda non está configurado correctamente para permitir a sincronización de ficheiros, semella que a interface WebDAV non está a funcionar.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor non ten conexión activa a Internet. Isto significa que algunhas características como a montaxe do almacenamento externo, as notificacións sobre actualizacións ou a instalación de engadidos de terceiros non funcionarán. Así mesmo, o acceso remoto a ficheiros e enviar correos de notificación poderían non funcionar. Suxerímoslle que active a conexión a Internet para este servidor se quere ter todos estes servizos.",
"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." : "O directorio de datos e os seus ficheiros probabelmente son accesíbeis desde a Internet. O ficheiro .htaccess non funciona. Recomendámoslle que configure o seu servidor web de xeito que o directorio de datos non sexa accesíbel ou que mova o directorio de datos fora do directorio root do servidor web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Non foi configurada a memoria cache. Se é posíbel configure un «memcache», se está dispoñíbel, para mellorar o rendemento. Pode atopar máis información na nosa <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentación</a>.",
"Error occurred while checking server setup" : "Aconteceu un erro mentras se comprobaba a configuración do servidor",
"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 cabeceira HTTP «{header}» non está configurada como igual a «{expected}». Isto é un posíbel risco para a seguridade ou a intimidade, recomendámoslle que axuste esta opción.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "A cabeceira HTTP «Strict-Transport-Security» non está configurado para menos de «2,678,400» segundos . Isto é un posíbel risco para a seguridade, recomendámoslle que axuste esta opción.",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index 5e69efe5d1e..5a9e5260a6a 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O servidor aínda non está configurado correctamente para permitir a sincronización de ficheiros, semella que a interface WebDAV non está a funcionar.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor non ten conexión activa a Internet. Isto significa que algunhas características como a montaxe do almacenamento externo, as notificacións sobre actualizacións ou a instalación de engadidos de terceiros non funcionarán. Así mesmo, o acceso remoto a ficheiros e enviar correos de notificación poderían non funcionar. Suxerímoslle que active a conexión a Internet para este servidor se quere ter todos estes servizos.",
"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." : "O directorio de datos e os seus ficheiros probabelmente son accesíbeis desde a Internet. O ficheiro .htaccess non funciona. Recomendámoslle que configure o seu servidor web de xeito que o directorio de datos non sexa accesíbel ou que mova o directorio de datos fora do directorio root do servidor web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Non foi configurada a memoria cache. Se é posíbel configure un «memcache», se está dispoñíbel, para mellorar o rendemento. Pode atopar máis información na nosa <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentación</a>.",
"Error occurred while checking server setup" : "Aconteceu un erro mentras se comprobaba a configuración do servidor",
"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 cabeceira HTTP «{header}» non está configurada como igual a «{expected}». Isto é un posíbel risco para a seguridade ou a intimidade, recomendámoslle que axuste esta opción.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "A cabeceira HTTP «Strict-Transport-Security» non está configurado para menos de «2,678,400» segundos . Isto é un posíbel risco para a seguridade, recomendámoslle que axuste esta opción.",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 4fa4cbf03bb..808eec95eee 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Il tuo server web non è configurato correttamente per consentire la sincronizzazione dei file poiché l'interfaccia WebDAV sembra essere danneggiata.",
"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." : "Questo server non ha una connessione a Internet funzionante. Ciò significa che alcune delle funzionalità come il montaggio di archivi esterni, le notifiche degli aggiornamenti o l'installazione di applicazioni di terze parti non funzioneranno. L'accesso remoto ai file e l'invio di email di notifica potrebbero non funzionare. Ti suggeriamo di abilitare la connessione a Internet del server se desideri disporre di tutte le funzionalità.",
"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." : "La cartella dei dati e i tuoi file sono probabilmente accessibili da Internet.\nIl file .htaccess non funziona. Ti consigliamo vivamente di configurare il server web in modo che la cartella dei dati non sia più accessibile o di spostare la cartella fuori dalla radice del server web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Non è stata configurata alcuna cache di memoria. Per migliorare le prestazioni configura memcache, se disponibile. Ulteriori informazioni sono disponibili nella nostra <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentazione</a>.",
"Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server",
"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." : "L'intestazione HTTP \"{header}\" non è configurata come \"{expected}\". \nQuesto è un potenziale rischio di sicurezza o di riservatezza dei dati e noi consigliamo di modificare questa impostazione.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore almeno di \"2,678,400\" secondi. Questo è un potenziale rischio di sicurezza e noi consigliamo di modificare questa impostazione.",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index a1957841e14..666f703e850 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Il tuo server web non è configurato correttamente per consentire la sincronizzazione dei file poiché l'interfaccia WebDAV sembra essere danneggiata.",
"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." : "Questo server non ha una connessione a Internet funzionante. Ciò significa che alcune delle funzionalità come il montaggio di archivi esterni, le notifiche degli aggiornamenti o l'installazione di applicazioni di terze parti non funzioneranno. L'accesso remoto ai file e l'invio di email di notifica potrebbero non funzionare. Ti suggeriamo di abilitare la connessione a Internet del server se desideri disporre di tutte le funzionalità.",
"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." : "La cartella dei dati e i tuoi file sono probabilmente accessibili da Internet.\nIl file .htaccess non funziona. Ti consigliamo vivamente di configurare il server web in modo che la cartella dei dati non sia più accessibile o di spostare la cartella fuori dalla radice del server web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Non è stata configurata alcuna cache di memoria. Per migliorare le prestazioni configura memcache, se disponibile. Ulteriori informazioni sono disponibili nella nostra <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentazione</a>.",
"Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server",
"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." : "L'intestazione HTTP \"{header}\" non è configurata come \"{expected}\". \nQuesto è un potenziale rischio di sicurezza o di riservatezza dei dati e noi consigliamo di modificare questa impostazione.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore almeno di \"2,678,400\" secondi. Questo è un potenziale rischio di sicurezza e noi consigliamo di modificare questa impostazione.",
diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js
index 68ae6325007..3b85a3298c1 100644
--- a/core/l10n/nb_NO.js
+++ b/core/l10n/nb_NO.js
@@ -8,11 +8,18 @@ OC.L10N.register(
"Checked database schema update" : "Sjekket oppdatering av databaseskjema",
"Checked database schema update for apps" : "Sjekket databaseskjema-oppdatering for apper",
"Updated \"%s\" to %s" : "Oppdaterte \"%s\" til %s",
+ "Repair warning: " : "Advarsel fra reparering: ",
+ "Repair error: " : "Feil ved reparering: ",
+ "Following incompatible apps have been disabled: %s" : "Følgende inkompatible apper har blitt deaktivert: %s",
+ "Following 3rd party apps have been disabled: %s" : "Følgende tredjeparts apper har blitt deaktivert: %s",
+ "Invalid file provided" : "Ugyldig fil oppgitt",
"No image or file provided" : "Bilde eller fil ikke angitt",
"Unknown filetype" : "Ukjent filtype",
"Invalid image" : "Ugyldig bilde",
"No temporary profile picture available, try again" : "Foreløpig profilbilde ikke tilgjengelig. Prøv igjen",
"No crop data provided" : "Ingen beskjæringsinformasjon angitt",
+ "No valid crop data provided" : "Ingen gyldige beskjæringsdata oppgitt",
+ "Crop is not square" : "Beskjæringen er ikke kvadratisk",
"Sunday" : "Søndag",
"Monday" : "Mandag",
"Tuesday" : "Tirsdag",
@@ -62,7 +69,14 @@ OC.L10N.register(
"So-so password" : "So-so-passord",
"Good password" : "Bra passord",
"Strong password" : "Sterkt passord",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Web-serveren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.",
+ "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." : "Denne serveren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne serveren hvis du vil ha full funksjonalitet.",
+ "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." : "Datamappen og filene dine er sannsynligvis tilgjengelige fra Internett. .htaccess-filen fungerer ikke. Vi anbefaler sterkt at du konfigurerer web-serveren slik at datamappen ikke kan aksesseres eller at du flytter datamappen ut av web-serverens dokumentrot.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Minne-cache er ikke konfigurert. Hvis mulig, konfigurer en minne-cache for å få bedre ytelse. Mer informasjon finnes <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">dokumentasjonen</a> vår.",
"Error occurred while checking server setup" : "Feil oppstod ved sjekking av server-oppsett",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-header \"{header}\" er ikke konfigurert lik \"{expected}\". Dette kan være en sikkerhetsrisiko og vi anbefaler at denne innstillingen endres.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP-header \"Strict-Transport-Security\" er ikke konfigurert til minst \"2,678,400\" sekunder. Dette kan være en sikkerhetsrisiko og vi anbefaler at denne innstillingen endres.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Du aksesserer denne nettsiden via HTTP. Vi anbefaler på det sterkeste at du konfigurerer serveren til å kreve HTTPS i stedet.",
"Shared" : "Delt",
"Shared with {recipients}" : "Delt med {recipients}",
"Share" : "Del",
@@ -158,6 +172,7 @@ OC.L10N.register(
"Technical details" : "Tekniske detaljer",
"Remote Address: %s" : "Ekstern adresse: %s",
"Request ID: %s" : "Forespørsels-ID: %s",
+ "Type: %s" : "Type: %s",
"Code: %s" : "Kode: %s",
"Message: %s" : "Melding: %s",
"File: %s" : "Fil: %s",
@@ -183,6 +198,7 @@ OC.L10N.register(
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
"Finish setup" : "Fullfør oppsetting",
"Finishing …" : "Ferdigstiller ...",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Denne applikasjonen krever JavaScript for å fungere korrekt. Vennligst {linkstart}aktiver JavaScript{linkend} og last siden på nytt.",
"%s is available. Get more information on how to update." : "%s er tilgjengelig. Få mer informasjon om hvordan du kan oppdatere.",
"Log out" : "Logg ut",
"Search" : "Søk",
@@ -207,6 +223,7 @@ OC.L10N.register(
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Forsikre deg om at databasen, config-mappen og datamappen er blitt sikkerhetskopiert før du fortsetter.",
"Start update" : "Start oppdatering",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "For å unngå tidsavbrudd ved store installasjoner, kan du i stedet kjøre følgende kommando fra installasjonsmappen:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Denne %s-instansen er for øyeblikket i vedlikeholdsmodus, noe som kan vare en stund.",
"This page will refresh itself when the %s instance is available again." : "Denne siden vil bli lastet på nytt når %s-instansen er tilgjengelig igjen."
},
"nplurals=2; plural=(n != 1);");
diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json
index 8d4bb6dba4a..62942ba9cff 100644
--- a/core/l10n/nb_NO.json
+++ b/core/l10n/nb_NO.json
@@ -6,11 +6,18 @@
"Checked database schema update" : "Sjekket oppdatering av databaseskjema",
"Checked database schema update for apps" : "Sjekket databaseskjema-oppdatering for apper",
"Updated \"%s\" to %s" : "Oppdaterte \"%s\" til %s",
+ "Repair warning: " : "Advarsel fra reparering: ",
+ "Repair error: " : "Feil ved reparering: ",
+ "Following incompatible apps have been disabled: %s" : "Følgende inkompatible apper har blitt deaktivert: %s",
+ "Following 3rd party apps have been disabled: %s" : "Følgende tredjeparts apper har blitt deaktivert: %s",
+ "Invalid file provided" : "Ugyldig fil oppgitt",
"No image or file provided" : "Bilde eller fil ikke angitt",
"Unknown filetype" : "Ukjent filtype",
"Invalid image" : "Ugyldig bilde",
"No temporary profile picture available, try again" : "Foreløpig profilbilde ikke tilgjengelig. Prøv igjen",
"No crop data provided" : "Ingen beskjæringsinformasjon angitt",
+ "No valid crop data provided" : "Ingen gyldige beskjæringsdata oppgitt",
+ "Crop is not square" : "Beskjæringen er ikke kvadratisk",
"Sunday" : "Søndag",
"Monday" : "Mandag",
"Tuesday" : "Tirsdag",
@@ -60,7 +67,14 @@
"So-so password" : "So-so-passord",
"Good password" : "Bra passord",
"Strong password" : "Sterkt passord",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Web-serveren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.",
+ "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." : "Denne serveren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne serveren hvis du vil ha full funksjonalitet.",
+ "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." : "Datamappen og filene dine er sannsynligvis tilgjengelige fra Internett. .htaccess-filen fungerer ikke. Vi anbefaler sterkt at du konfigurerer web-serveren slik at datamappen ikke kan aksesseres eller at du flytter datamappen ut av web-serverens dokumentrot.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Minne-cache er ikke konfigurert. Hvis mulig, konfigurer en minne-cache for å få bedre ytelse. Mer informasjon finnes <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">dokumentasjonen</a> vår.",
"Error occurred while checking server setup" : "Feil oppstod ved sjekking av server-oppsett",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-header \"{header}\" er ikke konfigurert lik \"{expected}\". Dette kan være en sikkerhetsrisiko og vi anbefaler at denne innstillingen endres.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "HTTP-header \"Strict-Transport-Security\" er ikke konfigurert til minst \"2,678,400\" sekunder. Dette kan være en sikkerhetsrisiko og vi anbefaler at denne innstillingen endres.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Du aksesserer denne nettsiden via HTTP. Vi anbefaler på det sterkeste at du konfigurerer serveren til å kreve HTTPS i stedet.",
"Shared" : "Delt",
"Shared with {recipients}" : "Delt med {recipients}",
"Share" : "Del",
@@ -156,6 +170,7 @@
"Technical details" : "Tekniske detaljer",
"Remote Address: %s" : "Ekstern adresse: %s",
"Request ID: %s" : "Forespørsels-ID: %s",
+ "Type: %s" : "Type: %s",
"Code: %s" : "Kode: %s",
"Message: %s" : "Melding: %s",
"File: %s" : "Fil: %s",
@@ -181,6 +196,7 @@
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
"Finish setup" : "Fullfør oppsetting",
"Finishing …" : "Ferdigstiller ...",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Denne applikasjonen krever JavaScript for å fungere korrekt. Vennligst {linkstart}aktiver JavaScript{linkend} og last siden på nytt.",
"%s is available. Get more information on how to update." : "%s er tilgjengelig. Få mer informasjon om hvordan du kan oppdatere.",
"Log out" : "Logg ut",
"Search" : "Søk",
@@ -205,6 +221,7 @@
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Forsikre deg om at databasen, config-mappen og datamappen er blitt sikkerhetskopiert før du fortsetter.",
"Start update" : "Start oppdatering",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "For å unngå tidsavbrudd ved store installasjoner, kan du i stedet kjøre følgende kommando fra installasjonsmappen:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Denne %s-instansen er for øyeblikket i vedlikeholdsmodus, noe som kan vare en stund.",
"This page will refresh itself when the %s instance is available again." : "Denne siden vil bli lastet på nytt når %s-instansen er tilgjengelig igjen."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index f5ee9019cee..2738ffc6785 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Uw webserver is nog niet goed ingesteld voor bestandssynchronisatie omdat de WebDAV interface verstoord lijkt.",
"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." : "Deze server heeft geen actieve internetverbinding. Dat betekent dat sommige functies, zoals aankoppelen van externe opslag, notificaties over updates of installatie van apps van 3e partijen niet werken. Ook het benaderen van bestanden vanaf een remote locatie en het versturen van notificatie emails kan mislukken. We adviseren om de internetverbinding voor deze server in te schakelen als u alle functies wilt gebruiken.",
"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." : "Uw data folder en uw bestanden zijn waarschijnlijk vanaf het internet bereikbaar. Het .htaccess-bestand werkt niet. We raden ten zeerste aan aan om uw webserver zodanig te configureren, dat de datadirectory niet bereikbaar is vanaf het internet of om uw datadirectory te verplaatsen naar een locatie buiten de document root van de webserver.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Er is geen geheugencache geconfigureerd. Om de prestaties te verhogen kunt u de memcache configureren als die beschikbaar is. Meer informatie vind u in onze <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentatie</a>.",
"Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie",
"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." : "De \"{header}\" HTTP header is niet overeenkomstig met \"{expected}\" geconfigureerd. Dit is een potentieel security of privacy risico en we adviseren om deze instelling te wijzigen.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"2,678,400\" seconden. Dit is een mogelijk beveiligingsrisico en we adviseren deze instelling aan te passen.",
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index efa2951fff8..6fd11c98302 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Uw webserver is nog niet goed ingesteld voor bestandssynchronisatie omdat de WebDAV interface verstoord lijkt.",
"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." : "Deze server heeft geen actieve internetverbinding. Dat betekent dat sommige functies, zoals aankoppelen van externe opslag, notificaties over updates of installatie van apps van 3e partijen niet werken. Ook het benaderen van bestanden vanaf een remote locatie en het versturen van notificatie emails kan mislukken. We adviseren om de internetverbinding voor deze server in te schakelen als u alle functies wilt gebruiken.",
"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." : "Uw data folder en uw bestanden zijn waarschijnlijk vanaf het internet bereikbaar. Het .htaccess-bestand werkt niet. We raden ten zeerste aan aan om uw webserver zodanig te configureren, dat de datadirectory niet bereikbaar is vanaf het internet of om uw datadirectory te verplaatsen naar een locatie buiten de document root van de webserver.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Er is geen geheugencache geconfigureerd. Om de prestaties te verhogen kunt u de memcache configureren als die beschikbaar is. Meer informatie vind u in onze <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentatie</a>.",
"Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie",
"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." : "De \"{header}\" HTTP header is niet overeenkomstig met \"{expected}\" geconfigureerd. Dit is een potentieel security of privacy risico en we adviseren om deze instelling te wijzigen.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"2,678,400\" seconden. Dit is een mogelijk beveiligingsrisico en we adviseren deze instelling aan te passen.",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index e79f9cf6dbd..5c7ef0363d5 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -73,6 +73,7 @@ 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." : "Este servidor não tem nenhuma conexão com a Internet. Isto significa que algumas das características como a montagem de armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.",
"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." : "O seu diretório de dados e os arquivos estão, provavelmente, acessíveis a partir da Internet. O arquivo .htaccess não está funcionando. Nós sugerimos que você configure o servidor web de uma forma que o diretório de dados não seja acessível ou mova o diretório de dados para fora do diretório raiz de documentos do servidor web.",
"Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor",
+ "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." : "O \"{header}\" cabeçalho HTTP não está configurado igual ao \"{expected}\". Este é um risco potencial para a segurança e recomendamos ajustar essa configuração.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "O \"Strict-Transport-Security\" cabeçalho HTTP não está configurado para pelo menos \"2.678.400\" segundos. Este é um risco potencial para a segurança e recomendamos ajustar essa configuração.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Você está acessando este site via HTTP. Sugerimos que você, em vez disso, configure o servidor para exigir o uso de HTTPS.",
"Shared" : "Compartilhados",
@@ -169,6 +170,7 @@ OC.L10N.register(
"Technical details" : "Detalhes técnicos",
"Remote Address: %s" : "Endereço Remoto: %s",
"Request ID: %s" : "ID do Pedido: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensagem: %s",
"File: %s" : "Arquivo: %s",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index f5a95a7c740..9f74215f3ff 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -71,6 +71,7 @@
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet. Isto significa que algumas das características como a montagem de armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.",
"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." : "O seu diretório de dados e os arquivos estão, provavelmente, acessíveis a partir da Internet. O arquivo .htaccess não está funcionando. Nós sugerimos que você configure o servidor web de uma forma que o diretório de dados não seja acessível ou mova o diretório de dados para fora do diretório raiz de documentos do servidor web.",
"Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor",
+ "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." : "O \"{header}\" cabeçalho HTTP não está configurado igual ao \"{expected}\". Este é um risco potencial para a segurança e recomendamos ajustar essa configuração.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "O \"Strict-Transport-Security\" cabeçalho HTTP não está configurado para pelo menos \"2.678.400\" segundos. Este é um risco potencial para a segurança e recomendamos ajustar essa configuração.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Você está acessando este site via HTTP. Sugerimos que você, em vez disso, configure o servidor para exigir o uso de HTTPS.",
"Shared" : "Compartilhados",
@@ -167,6 +168,7 @@
"Technical details" : "Detalhes técnicos",
"Remote Address: %s" : "Endereço Remoto: %s",
"Request ID: %s" : "ID do Pedido: %s",
+ "Type: %s" : "Tipo: %s",
"Code: %s" : "Código: %s",
"Message: %s" : "Mensagem: %s",
"File: %s" : "Arquivo: %s",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 2373f0505d4..e213d23a929 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O seu servidor web não está configurado correctamente para autorizar sincronização de ficheiros, pois o interface WebDAV parece estar com problemas.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor ownCloud não tem uma ligação de Internet a funcionar. Isto significa que algumas funcionalidades como o acesso a locais externos, notificações sobre actualizações, ou a instalação de aplicações de terceiros não irá funcionar. Aceder aos ficheiros remotamente e enviar notificações de email poderão não funcionar também. Sugerimos que active uma ligação à Internet se pretende obter todas as funcionalidades do ownCloud.",
"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." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir das internet. O seu ficheiro .htaccess não está a funcionar corretamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Nenhuma cache de memória foi configurada. Para melhorar o seu desempenho, por favor configure a memcache se possível. Pode encontrar mais informação na nossa <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentação</a>.",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
"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." : "O cabeçalho HTTP \"{header}\" não está configurado para igualar \"{expected}\". Isto é um potencial risco de segurança ou privacidade e recomendamos que o corrija.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"2,678,400\" segundos. Isto é um potencial risco de segurança e recomendamos que o corrija.",
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index b9d51e5be77..16670eaaf84 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O seu servidor web não está configurado correctamente para autorizar sincronização de ficheiros, pois o interface WebDAV parece estar com problemas.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor ownCloud não tem uma ligação de Internet a funcionar. Isto significa que algumas funcionalidades como o acesso a locais externos, notificações sobre actualizações, ou a instalação de aplicações de terceiros não irá funcionar. Aceder aos ficheiros remotamente e enviar notificações de email poderão não funcionar também. Sugerimos que active uma ligação à Internet se pretende obter todas as funcionalidades do ownCloud.",
"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." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir das internet. O seu ficheiro .htaccess não está a funcionar corretamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Nenhuma cache de memória foi configurada. Para melhorar o seu desempenho, por favor configure a memcache se possível. Pode encontrar mais informação na nossa <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentação</a>.",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
"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." : "O cabeçalho HTTP \"{header}\" não está configurado para igualar \"{expected}\". Isto é um potencial risco de segurança ou privacidade e recomendamos que o corrija.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"2,678,400\" segundos. Isto é um potencial risco de segurança e recomendamos que o corrija.",
diff --git a/core/l10n/sl.js b/core/l10n/sl.js
index e0482ec7723..0b10e4bab83 100644
--- a/core/l10n/sl.js
+++ b/core/l10n/sl.js
@@ -8,6 +8,7 @@ OC.L10N.register(
"Checked database schema update" : "Izbrana posodobitev sheme podatkovne zbirke",
"Checked database schema update for apps" : "Izbrana posodobitev sheme podatkovne zbirke za programe",
"Updated \"%s\" to %s" : "Datoteka \"%s\" je posodobljena na %s",
+ "Following incompatible apps have been disabled: %s" : "Navedeni neskladni programi so onemogočeni: %s",
"No image or file provided" : "Ni podane datoteke ali slike",
"Unknown filetype" : "Neznana vrsta datoteke",
"Invalid image" : "Neveljavna slika",
diff --git a/core/l10n/sl.json b/core/l10n/sl.json
index e8fe3499e1d..56ef29e6110 100644
--- a/core/l10n/sl.json
+++ b/core/l10n/sl.json
@@ -6,6 +6,7 @@
"Checked database schema update" : "Izbrana posodobitev sheme podatkovne zbirke",
"Checked database schema update for apps" : "Izbrana posodobitev sheme podatkovne zbirke za programe",
"Updated \"%s\" to %s" : "Datoteka \"%s\" je posodobljena na %s",
+ "Following incompatible apps have been disabled: %s" : "Navedeni neskladni programi so onemogočeni: %s",
"No image or file provided" : "Ni podane datoteke ali slike",
"Unknown filetype" : "Neznana vrsta datoteke",
"Invalid image" : "Neveljavna slika",
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index 2b6a7cee7f9..bb34c1f8c09 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ваш сервер није правилно подешен да омогући синхронизацију фајлова. Изгледа да је ВебДАВ сучеље покварено.",
"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." : "Овај сервер нема везу са интернетом. То значи да неке могућности, попут монтирања спољашњег складишта, обавештења о ажурирању или инсталација апликација треће стране, неће радити. Даљински приступ и слање е-поште, такође неће радити. Предлажемо да омогућите интернет везу за овај сервер ако желите да имате све могућности.",
"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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Кеширање меморије није подешено. За унапређивање перформанси подесите memcache ако је доступан. Више информација можете наћи у <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">документацији</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}“ није подешено као „{expected}“. Ово је потенцијални безбедносни или ризик за приватност и препоручујемо да подесите ову поставку.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "ХТТП захлавље „Strict-Transport-Security“ није постављено на најмање \"2,678,400\" секунди. Ово је потенцијални безбедносни ризик и препоручујемо да подесите ову поставку.",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index 2d9728307ba..f4ce5f91cbe 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -70,6 +70,7 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ваш сервер није правилно подешен да омогући синхронизацију фајлова. Изгледа да је ВебДАВ сучеље покварено.",
"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." : "Овај сервер нема везу са интернетом. То значи да неке могућности, попут монтирања спољашњег складишта, обавештења о ажурирању или инсталација апликација треће стране, неће радити. Даљински приступ и слање е-поште, такође неће радити. Предлажемо да омогућите интернет везу за овај сервер ако желите да имате све могућности.",
"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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "Кеширање меморије није подешено. За унапређивање перформанси подесите memcache ако је доступан. Више информација можете наћи у <a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">документацији</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}“ није подешено као „{expected}“. Ово је потенцијални безбедносни или ризик за приватност и препоручујемо да подесите ову поставку.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "ХТТП захлавље „Strict-Transport-Security“ није постављено на најмање \"2,678,400\" секунди. Ово је потенцијални безбедносни ризик и препоручујемо да подесите ову поставку.",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index caa489608db..46fd77ba9cf 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -73,6 +73,7 @@ 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." : "Bu sunucunun çalışan bir İnternet bağlantısı yok. Bu, harici depolama alanı bağlama, güncelleştirme bildirimleri veya üçüncü parti uygulama kurma gibi bazı özellikler çalışmayacak demektir. Uzak dosyalara erişim ve e-posta ile bildirim gönderme de çalışmayacaktır. Eğer bu özelliklerin tamamını kullanmak istiyorsanız, sunucu için İnternet bağlantısını etkinleştirmenizi öneriyoruz.",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "data dizininiz ve dosyalarınız büyük ihtimalle İnternet üzerinden erişilebilir. .htaccess dosyası çalışmıyor. Web sunucunuzu yapılandırarak data dizinine erişimi kapatmanızı veya data dizinini web sunucu belge dizini dışına almanızı şiddetle tavsiye ederiz.",
"Error occurred while checking server setup" : "Sunucu yapılandırması denetlenirken hata oluştu",
+ "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 başlığı \"{expected}\" ile eşleşmek üzere yapılandırılmamış. Bu muhtemel bir güvenlik veya gizlilik riski olduğundan bu ayarı düzeltmenizi öneririz.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "\"Strict-Transport-Security\" HTTP başlığı \"2,678,400\" ile eşleşmek üzere yapılandırılmamış. Bu muhtemel bir risk ve bu ayarı düzeltmenizi öneririz.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Bu siteye HTTP aracılığıyla erişiyorsunuz. Sunucunuzu HTTPS kullanımını zorlamak üzere yapılandırmanızı şiddetle öneririz.",
"Shared" : "Paylaşılan",
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index a45590852c7..c65f6f90ada 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -71,6 +71,7 @@
"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." : "Bu sunucunun çalışan bir İnternet bağlantısı yok. Bu, harici depolama alanı bağlama, güncelleştirme bildirimleri veya üçüncü parti uygulama kurma gibi bazı özellikler çalışmayacak demektir. Uzak dosyalara erişim ve e-posta ile bildirim gönderme de çalışmayacaktır. Eğer bu özelliklerin tamamını kullanmak istiyorsanız, sunucu için İnternet bağlantısını etkinleştirmenizi öneriyoruz.",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "data dizininiz ve dosyalarınız büyük ihtimalle İnternet üzerinden erişilebilir. .htaccess dosyası çalışmıyor. Web sunucunuzu yapılandırarak data dizinine erişimi kapatmanızı veya data dizinini web sunucu belge dizini dışına almanızı şiddetle tavsiye ederiz.",
"Error occurred while checking server setup" : "Sunucu yapılandırması denetlenirken hata oluştu",
+ "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 başlığı \"{expected}\" ile eşleşmek üzere yapılandırılmamış. Bu muhtemel bir güvenlik veya gizlilik riski olduğundan bu ayarı düzeltmenizi öneririz.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "\"Strict-Transport-Security\" HTTP başlığı \"2,678,400\" ile eşleşmek üzere yapılandırılmamış. Bu muhtemel bir risk ve bu ayarı düzeltmenizi öneririz.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "Bu siteye HTTP aracılığıyla erişiyorsunuz. Sunucunuzu HTTPS kullanımını zorlamak üzere yapılandırmanızı şiddetle öneririz.",
"Shared" : "Paylaşılan",
diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js
index ea2239eed97..0ab9ef3d276 100644
--- a/core/l10n/zh_CN.js
+++ b/core/l10n/zh_CN.js
@@ -8,11 +8,18 @@ OC.L10N.register(
"Checked database schema update" : "已经检查数据库架构更新",
"Checked database schema update for apps" : "已经检查应用的数据库架构更新",
"Updated \"%s\" to %s" : "更新 \"%s\" 为 %s",
+ "Repair warning: " : "修复警告:",
+ "Repair error: " : "修复错误:",
+ "Following incompatible apps have been disabled: %s" : "下列不兼容应用已经被禁用:%s",
+ "Following 3rd party apps have been disabled: %s" : " 下列第三方应用已经被禁用:%s",
+ "Invalid file provided" : "提供了无效文件",
"No image or file provided" : "没有提供图片或文件",
"Unknown filetype" : "未知的文件类型",
"Invalid image" : "无效的图像",
"No temporary profile picture available, try again" : "没有临时概览页图片可用,请重试",
"No crop data provided" : "没有提供相应数据",
+ "No valid crop data provided" : "没有提供有效的裁剪数据",
+ "Crop is not square" : "裁剪的不是正方形",
"Sunday" : "星期日",
"Monday" : "星期一",
"Tuesday" : "星期二",
@@ -62,7 +69,14 @@ OC.L10N.register(
"So-so password" : "一般强度的密码",
"Good password" : "较强的密码",
"Strong password" : "强密码",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
+ "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." : "该服务器没有工作在互联网连接,这意味着像挂载外部存储,第三方应用的更新或者安装的通知将不会工作。远程文件访问和邮件通知的发送也可能不会工作。如果你想拥有所有功能,我们建议你为服务器打开互联网连接。",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "没有配置内存缓存。为了提高性能,如果 memcache 可用,请配置它。更多信息可以在我们的<a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">文档</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 \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "\"Strict-Transport-Security\" HTTP 头部未配置到至少“2678400”秒。这是一个潜在的安全风险,我们建议调整该项设置。",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "你正在通过 HTTP 访问该站点。我们强烈建议你配置你的服务器要求使用 HTTPS 来代替。",
"Shared" : "已共享",
"Shared with {recipients}" : "由{recipients}分享",
"Share" : "分享",
@@ -96,6 +110,7 @@ OC.L10N.register(
"can edit" : "可以修改",
"access control" : "访问控制",
"create" : "创建",
+ "change" : "更改",
"delete" : "删除",
"Password protected" : "密码已受保护",
"Error unsetting expiration date" : "取消设置过期日期时出错",
@@ -114,6 +129,7 @@ OC.L10N.register(
"Hello world!" : "Hello world!",
"sunny" : "晴",
"Hello {name}, the weather is {weather}" : "您好 {name},今天天气是{weather}",
+ "Hello {name}" : "你好 {name}",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
"Updating {productName} to version {version}, this may take a while." : "更新 {productName} 到版本 {version},这可能需要一些时间。",
"Please reload the page." : "请重新加载页面。",
@@ -127,6 +143,9 @@ OC.L10N.register(
"New password" : "新密码",
"New Password" : "新密码",
"Reset password" : "重置密码",
+ "Searching other places" : "搜索其他地方",
+ "No search result in other places" : "在其他地方没有搜索结果",
+ "_{count} search result in other places_::_{count} search results in other places_" : ["在其他地方有 {count} 个搜索结果"],
"Personal" : "个人",
"Users" : "用户",
"Apps" : "应用",
@@ -153,6 +172,7 @@ OC.L10N.register(
"Technical details" : "技术细节",
"Remote Address: %s" : "远程地址: %s",
"Request ID: %s" : "请求 ID: %s",
+ "Type: %s" : "类型:%s",
"Code: %s" : "代码: %s",
"Message: %s" : "消息: %s",
"File: %s" : "文件: %s",
@@ -172,8 +192,13 @@ OC.L10N.register(
"Database name" : "数据库名",
"Database tablespace" : "数据库表空间",
"Database host" : "数据库主机",
+ "Performance Warning" : "性能警告",
+ "SQLite will be used as database." : "SQLite 将被作为数据库使用。",
+ "For larger installations we recommend to choose a different database backend." : "对于更大的安装,我们建议选择一个不同的数据库后端。",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。",
"Finish setup" : "安装完成",
"Finishing …" : "正在结束 ...",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作,该应用要求 JavaScript 。请 {linkstart} 打开 JavaScript {linkend} ,然后重新载入页面。",
"%s is available. Get more information on how to update." : "%s 可用。获取更多关于如何升级的信息。",
"Log out" : "注销",
"Search" : "搜索",
@@ -198,6 +223,7 @@ OC.L10N.register(
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
"Start update" : "开始更新",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为避免更大的安装演示,你能在你的安装目录下面运行这些命令:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "该 %s 实例当前处于维护模式,这将进行一些时间。",
"This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时这个页面将刷新。"
},
"nplurals=1; plural=0;");
diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json
index 7d11e502de5..14fd8153b7c 100644
--- a/core/l10n/zh_CN.json
+++ b/core/l10n/zh_CN.json
@@ -6,11 +6,18 @@
"Checked database schema update" : "已经检查数据库架构更新",
"Checked database schema update for apps" : "已经检查应用的数据库架构更新",
"Updated \"%s\" to %s" : "更新 \"%s\" 为 %s",
+ "Repair warning: " : "修复警告:",
+ "Repair error: " : "修复错误:",
+ "Following incompatible apps have been disabled: %s" : "下列不兼容应用已经被禁用:%s",
+ "Following 3rd party apps have been disabled: %s" : " 下列第三方应用已经被禁用:%s",
+ "Invalid file provided" : "提供了无效文件",
"No image or file provided" : "没有提供图片或文件",
"Unknown filetype" : "未知的文件类型",
"Invalid image" : "无效的图像",
"No temporary profile picture available, try again" : "没有临时概览页图片可用,请重试",
"No crop data provided" : "没有提供相应数据",
+ "No valid crop data provided" : "没有提供有效的裁剪数据",
+ "Crop is not square" : "裁剪的不是正方形",
"Sunday" : "星期日",
"Monday" : "星期一",
"Tuesday" : "星期二",
@@ -60,7 +67,14 @@
"So-so password" : "一般强度的密码",
"Good password" : "较强的密码",
"Strong password" : "强密码",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
+ "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." : "该服务器没有工作在互联网连接,这意味着像挂载外部存储,第三方应用的更新或者安装的通知将不会工作。远程文件访问和邮件通知的发送也可能不会工作。如果你想拥有所有功能,我们建议你为服务器打开互联网连接。",
+ "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=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">documentation</a>." : "没有配置内存缓存。为了提高性能,如果 memcache 可用,请配置它。更多信息可以在我们的<a href=\"https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/performance_tuning.html\">文档</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 \"2,678,400\" seconds. This is a potential security risk and we recommend adjusting this setting." : "\"Strict-Transport-Security\" HTTP 头部未配置到至少“2678400”秒。这是一个潜在的安全风险,我们建议调整该项设置。",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead." : "你正在通过 HTTP 访问该站点。我们强烈建议你配置你的服务器要求使用 HTTPS 来代替。",
"Shared" : "已共享",
"Shared with {recipients}" : "由{recipients}分享",
"Share" : "分享",
@@ -94,6 +108,7 @@
"can edit" : "可以修改",
"access control" : "访问控制",
"create" : "创建",
+ "change" : "更改",
"delete" : "删除",
"Password protected" : "密码已受保护",
"Error unsetting expiration date" : "取消设置过期日期时出错",
@@ -112,6 +127,7 @@
"Hello world!" : "Hello world!",
"sunny" : "晴",
"Hello {name}, the weather is {weather}" : "您好 {name},今天天气是{weather}",
+ "Hello {name}" : "你好 {name}",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
"Updating {productName} to version {version}, this may take a while." : "更新 {productName} 到版本 {version},这可能需要一些时间。",
"Please reload the page." : "请重新加载页面。",
@@ -125,6 +141,9 @@
"New password" : "新密码",
"New Password" : "新密码",
"Reset password" : "重置密码",
+ "Searching other places" : "搜索其他地方",
+ "No search result in other places" : "在其他地方没有搜索结果",
+ "_{count} search result in other places_::_{count} search results in other places_" : ["在其他地方有 {count} 个搜索结果"],
"Personal" : "个人",
"Users" : "用户",
"Apps" : "应用",
@@ -151,6 +170,7 @@
"Technical details" : "技术细节",
"Remote Address: %s" : "远程地址: %s",
"Request ID: %s" : "请求 ID: %s",
+ "Type: %s" : "类型:%s",
"Code: %s" : "代码: %s",
"Message: %s" : "消息: %s",
"File: %s" : "文件: %s",
@@ -170,8 +190,13 @@
"Database name" : "数据库名",
"Database tablespace" : "数据库表空间",
"Database host" : "数据库主机",
+ "Performance Warning" : "性能警告",
+ "SQLite will be used as database." : "SQLite 将被作为数据库使用。",
+ "For larger installations we recommend to choose a different database backend." : "对于更大的安装,我们建议选择一个不同的数据库后端。",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。",
"Finish setup" : "安装完成",
"Finishing …" : "正在结束 ...",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "对于正确的操作,该应用要求 JavaScript 。请 {linkstart} 打开 JavaScript {linkend} ,然后重新载入页面。",
"%s is available. Get more information on how to update." : "%s 可用。获取更多关于如何升级的信息。",
"Log out" : "注销",
"Search" : "搜索",
@@ -196,6 +221,7 @@
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
"Start update" : "开始更新",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为避免更大的安装演示,你能在你的安装目录下面运行这些命令:",
+ "This %s instance is currently in maintenance mode, which may take a while." : "该 %s 实例当前处于维护模式,这将进行一些时间。",
"This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时这个页面将刷新。"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/core/register_command.php b/core/register_command.php
index aa509de1899..67fdb6f808e 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -26,6 +26,8 @@
/** @var $application Symfony\Component\Console\Application */
$application->add(new OC\Core\Command\Status);
+$application->add(new OC\Core\Command\App\CheckCode());
+$application->add(new OC\Core\Command\L10n\CreateJs());
if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
$repair = new \OC\Repair(\OC\Repair::getRepairSteps());
@@ -35,7 +37,6 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
$application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Maintenance\SingleUser());
$application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig()));
- $application->add(new OC\Core\Command\App\CheckCode());
$application->add(new OC\Core\Command\App\Disable());
$application->add(new OC\Core\Command\App\Enable());
$application->add(new OC\Core\Command\App\ListApps());
@@ -45,7 +46,6 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
$application->add(new OC\Core\Command\User\LastSeen());
$application->add(new OC\Core\Command\User\Delete(\OC::$server->getUserManager()));
$application->add(new OC\Core\Command\User\Add(\OC::$server->getUserManager(), \OC::$server->getGroupManager()));
- $application->add(new OC\Core\Command\L10n\CreateJs());
$application->add(new OC\Core\Command\Background\Cron(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Background\WebCron(\OC::$server->getConfig()));
$application->add(new OC\Core\Command\Background\Ajax(\OC::$server->getConfig()));
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index 87342aca570..880a276c725 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -37,7 +37,7 @@
</div>
<header role="banner"><div id="header">
<a href="<?php print_unescaped(link_to('', 'index.php')); ?>"
- title="" id="owncloud" tabindex="1">
+ id="owncloud" tabindex="1">
<div class="logo-icon svg">
<h1 class="hidden-visually">
<?php p($theme->getName()); ?>
@@ -76,7 +76,7 @@
<ul>
<?php foreach($_['settingsnavigation'] as $entry):?>
<li>
- <a href="<?php print_unescaped($entry['href']); ?>" title=""
+ <a href="<?php print_unescaped($entry['href']); ?>"
<?php if( $entry["active"] ): ?> class="active"<?php endif; ?>>
<img class="svg" alt="" src="<?php print_unescaped($entry['icon']); ?>">
<?php p($entry['name']) ?>
@@ -108,7 +108,7 @@
<ul>
<?php foreach($_['navigation'] as $entry): ?>
<li data-id="<?php p($entry['id']); ?>">
- <a href="<?php print_unescaped($entry['href']); ?>" title="" tabindex="3"
+ <a href="<?php print_unescaped($entry['href']); ?>" tabindex="3"
<?php if( $entry['active'] ): ?> class="active"<?php endif; ?>>
<img class="app-icon svg" alt="" src="<?php print_unescaped($entry['icon']); ?>">
<div class="icon-loading-dark" style="display:none;"></div>
@@ -123,7 +123,7 @@
if(OC_User::isAdminUser(OC_User::getUser())):
?>
<li id="apps-management">
- <a href="<?php print_unescaped(OC_Helper::linkToRoute('settings_apps')); ?>" title="" tabindex="4"
+ <a href="<?php print_unescaped(OC_Helper::linkToRoute('settings_apps')); ?>" tabindex="4"
<?php if( $_['appsmanagement_active'] ): ?> class="active"<?php endif; ?>>
<img class="app-icon svg" alt="" src="<?php print_unescaped(OC_Helper::imagePath('settings', 'apps.svg')); ?>">
<div class="icon-loading-dark" style="display:none;"></div>
diff --git a/cron.php b/cron.php
index 676cb62bb56..c6236897227 100644
--- a/cron.php
+++ b/cron.php
@@ -73,6 +73,22 @@ try {
// set to run indefinitely if needed
set_time_limit(0);
+ // the cron job must be executed with the right user
+ if (!OC_Util::runningOnWindows()) {
+ if (!function_exists('posix_getuid')) {
+ echo "The posix extensions are required - see http://php.net/manual/en/book.posix.php" . PHP_EOL;
+ exit(0);
+ }
+ $user = posix_getpwuid(posix_getuid());
+ $configUser = posix_getpwuid(fileowner(OC::$SERVERROOT . '/config/config.php'));
+ if ($user['name'] !== $configUser['name']) {
+ echo "Console has to be executed with the same user as the web server is operated" . PHP_EOL;
+ echo "Current user: " . $user['name'] . PHP_EOL;
+ echo "Web server user: " . $configUser['name'] . PHP_EOL;
+ exit(0);
+ }
+ }
+
$config = OC::$server->getConfig();
$instanceId = $config->getSystemValue('instanceid');
$lockFileName = 'owncloud-server-' . $instanceId . '-cron.lock';
diff --git a/lib/base.php b/lib/base.php
index b441d5f1927..be397e52449 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -701,19 +701,7 @@ class OC {
}
private static function registerEncryptionWrapper() {
- $enabled = self::$server->getEncryptionManager()->isEnabled();
- if ($enabled) {
- \OC\Files\Filesystem::addStorageWrapper('oc_encryption', function ($mountPoint, $storage) {
- $parameters = array('storage' => $storage, 'mountPoint' => $mountPoint);
- $manager = \OC::$server->getEncryptionManager();
- $util = new \OC\Encryption\Util(new \OC\Files\View(), \OC::$server->getUserManager());
- $user = \OC::$server->getUserSession()->getUser();
- $logger = \OC::$server->getLogger();
- $uid = $user ? $user->getUID() : null;
- return new \OC\Files\Storage\Wrapper\Encryption($parameters, $manager,$util, $logger, $uid);
- });
- }
-
+ \OCP\Util::connectHook('OC_Filesystem', 'setup', 'OC\Encryption\Manager', 'setupStorage');
}
private static function registerEncryptionHooks() {
@@ -726,16 +714,17 @@ class OC {
}
$updater = new \OC\Encryption\Update(
new \OC\Files\View(),
- new \OC\Encryption\Util(new \OC\Files\View(), \OC::$server->getUserManager()),
+ new \OC\Encryption\Util(
+ new \OC\Files\View(),
+ \OC::$server->getUserManager(),
+ \OC::$server->getConfig()),
\OC\Files\Filesystem::getMountManager(),
\OC::$server->getEncryptionManager(),
+ \OC::$server->getEncryptionFilesHelper(),
$uid
);
\OCP\Util::connectHook('OCP\Share', 'post_shared', $updater, 'postShared');
\OCP\Util::connectHook('OCP\Share', 'post_unshare', $updater, 'postUnshared');
-
- //\OCP\Util::connectHook('OC_Filesystem', 'post_umount', 'OCA\Files_Encryption\Hooks', 'postUnmount');
- //\OCP\Util::connectHook('OC_Filesystem', 'umount', 'OCA\Files_Encryption\Hooks', 'preUnmount');
}
}
diff --git a/lib/l10n/da.js b/lib/l10n/da.js
index 17e67fdeb76..0414d02ea3a 100644
--- a/lib/l10n/da.js
+++ b/lib/l10n/da.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"lib",
{
"Cannot write into \"config\" directory!" : "Kan ikke skrive til mappen \"config\"!",
- "This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan normalvis ordnes ved at give webserveren skrive adgang til config mappen",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan som regel ordnes ved at give webserveren skrive adgang til config mappen",
"See %s" : "Se %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan som regel rettes ved at %sgive webserveren skriveadgang til config-mappen%s.",
"Sample configuration detected" : "Eksempel for konfiguration registreret",
@@ -133,7 +133,7 @@ OC.L10N.register(
"To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "For at rette dette problem, så angiv <code>always_populate_raw_post_data</code> til <code>-1</code> i din php.ini",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP opsætning blokere \"inline doc blocks\". dette gør at flere grundlæggende apps utilgængelige",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dette er sansynligvis forårsaget af et accelerator eller cache som Zend OPcache eller eAccelerator",
- "PHP modules have been installed, but they are still listed as missing?" : "Der er installeret PHP-moduler, men de fremgår stadig som fraværende?",
+ "PHP modules have been installed, but they are still listed as missing?" : "Der er installeret PHP-moduler, men de fremstår stadig som fraværende?",
"Please ask your server administrator to restart the web server." : "Du bedes anmode din serveradministrator om at genstarte webserveren.",
"PostgreSQL >= 9 required" : "PostgreSQL >= 9 kræves",
"Please upgrade your database version" : "Opgradér venligst din databaseversion",
@@ -141,6 +141,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Sørg venligst for at du har PostgreSQL >= 9 eller tjek loggen for flere informationer om fejlen",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Tilpas venligst rettigheder til 0770, så mappen ikke fremvises for andre brugere.",
"Data directory (%s) is readable by other users" : "Datamappen (%s) kan læses af andre brugere",
+ "Data directory (%s) must be an absolute path" : "Datamappen (%s) skal have en absolut sti",
+ "Check the value of \"datadirectory\" in your configuration" : "Tjek værdien for \"databibliotek\" i din konfiguration",
"Data directory (%s) is invalid" : "Datamappen (%s) er ugyldig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Tjek venligst at datamappen indeholder en fil, \".ocdata\" i dens rod.",
"Could not obtain lock type %d on \"%s\"." : "Kunne ikke opnå en låsetype %d på \"%s\"."
diff --git a/lib/l10n/da.json b/lib/l10n/da.json
index c7b0bb9296d..b4a922109a5 100644
--- a/lib/l10n/da.json
+++ b/lib/l10n/da.json
@@ -1,6 +1,6 @@
{ "translations": {
"Cannot write into \"config\" directory!" : "Kan ikke skrive til mappen \"config\"!",
- "This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan normalvis ordnes ved at give webserveren skrive adgang til config mappen",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan som regel ordnes ved at give webserveren skrive adgang til config mappen",
"See %s" : "Se %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan som regel rettes ved at %sgive webserveren skriveadgang til config-mappen%s.",
"Sample configuration detected" : "Eksempel for konfiguration registreret",
@@ -131,7 +131,7 @@
"To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "For at rette dette problem, så angiv <code>always_populate_raw_post_data</code> til <code>-1</code> i din php.ini",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP opsætning blokere \"inline doc blocks\". dette gør at flere grundlæggende apps utilgængelige",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dette er sansynligvis forårsaget af et accelerator eller cache som Zend OPcache eller eAccelerator",
- "PHP modules have been installed, but they are still listed as missing?" : "Der er installeret PHP-moduler, men de fremgår stadig som fraværende?",
+ "PHP modules have been installed, but they are still listed as missing?" : "Der er installeret PHP-moduler, men de fremstår stadig som fraværende?",
"Please ask your server administrator to restart the web server." : "Du bedes anmode din serveradministrator om at genstarte webserveren.",
"PostgreSQL >= 9 required" : "PostgreSQL >= 9 kræves",
"Please upgrade your database version" : "Opgradér venligst din databaseversion",
@@ -139,6 +139,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Sørg venligst for at du har PostgreSQL >= 9 eller tjek loggen for flere informationer om fejlen",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Tilpas venligst rettigheder til 0770, så mappen ikke fremvises for andre brugere.",
"Data directory (%s) is readable by other users" : "Datamappen (%s) kan læses af andre brugere",
+ "Data directory (%s) must be an absolute path" : "Datamappen (%s) skal have en absolut sti",
+ "Check the value of \"datadirectory\" in your configuration" : "Tjek værdien for \"databibliotek\" i din konfiguration",
"Data directory (%s) is invalid" : "Datamappen (%s) er ugyldig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Tjek venligst at datamappen indeholder en fil, \".ocdata\" i dens rod.",
"Could not obtain lock type %d on \"%s\"." : "Kunne ikke opnå en låsetype %d på \"%s\"."
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index deabbb16c44..308bd5b2b19 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -141,8 +141,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Stelle bitte sicher, dass Du PostgreSQL >= 9 verwendest oder prüfe die Logs für weitere Informationen über den Fehler",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Bitte ändere die Berechtigungen auf 0770 sodass das Verzeichnis nicht von anderen Nutzer angezeigt werden kann.",
"Data directory (%s) is readable by other users" : "Daten-Verzeichnis (%s) ist von anderen Nutzern lesbar",
- "Data directory (%s) must be an absolute path" : "Das Daten-Verzeichnis (%s) muss ein absoluter Pfad sein",
- "Check the value of \"datadirectory\" in your configuration" : "Prüfe bitte die Angabe unter \"datadirectory\" in Deiner Konfiguration",
+ "Data directory (%s) must be an absolute path" : "Das Datenverzeichnis (%s) muss ein absoluter Pfad sein",
+ "Check the value of \"datadirectory\" in your configuration" : "Überprüfe bitte die Angabe unter „datadirectory“ in Deiner Konfiguration",
"Data directory (%s) is invalid" : "Daten-Verzeichnis (%s) ist ungültig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Bitte stelle sicher, dass das Datenverzeichnis auf seiner ersten Ebene eine Datei namens „.ocdata“ enthält.",
"Could not obtain lock type %d on \"%s\"." : "Sperrtyp %d auf „%s“ konnte nicht ermittelt werden."
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 38bd43de24a..43591c4987e 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -139,8 +139,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Stelle bitte sicher, dass Du PostgreSQL >= 9 verwendest oder prüfe die Logs für weitere Informationen über den Fehler",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Bitte ändere die Berechtigungen auf 0770 sodass das Verzeichnis nicht von anderen Nutzer angezeigt werden kann.",
"Data directory (%s) is readable by other users" : "Daten-Verzeichnis (%s) ist von anderen Nutzern lesbar",
- "Data directory (%s) must be an absolute path" : "Das Daten-Verzeichnis (%s) muss ein absoluter Pfad sein",
- "Check the value of \"datadirectory\" in your configuration" : "Prüfe bitte die Angabe unter \"datadirectory\" in Deiner Konfiguration",
+ "Data directory (%s) must be an absolute path" : "Das Datenverzeichnis (%s) muss ein absoluter Pfad sein",
+ "Check the value of \"datadirectory\" in your configuration" : "Überprüfe bitte die Angabe unter „datadirectory“ in Deiner Konfiguration",
"Data directory (%s) is invalid" : "Daten-Verzeichnis (%s) ist ungültig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Bitte stelle sicher, dass das Datenverzeichnis auf seiner ersten Ebene eine Datei namens „.ocdata“ enthält.",
"Could not obtain lock type %d on \"%s\"." : "Sperrtyp %d auf „%s“ konnte nicht ermittelt werden."
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index a3d25f444d7..b5acd79cf70 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -141,8 +141,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Stellen Sie sicher, dass Sie PostgreSQL >= 9 verwenden oder prüfen Sie die Logs für weitere Informationen über den Fehler",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Bitte ändern Sie die Berechtigungen auf 0770, so dass das Verzeichnis nicht von anderen Benutzern angezeigt werden kann.",
"Data directory (%s) is readable by other users" : "Daten-Verzeichnis (%s) ist von anderen Benutzern lesbar",
- "Data directory (%s) must be an absolute path" : "Das Daten-Verzeichnis (%s) muss ein absoluter Pfad sein",
- "Check the value of \"datadirectory\" in your configuration" : "Prüfen Sie bitte die Angabe unter \"datadirectory\" in Ihrer Konfiguration",
+ "Data directory (%s) must be an absolute path" : "Das Datenverzeichnis (%s) muss ein absoluter Pfad sein",
+ "Check the value of \"datadirectory\" in your configuration" : "Überprüfen Sie bitte die Angabe unter „datadirectory“ in Ihrer Konfiguration",
"Data directory (%s) is invalid" : "Daten-Verzeichnis (%s) ist ungültig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Bitte stellen Sie sicher, dass das Datenverzeichnis auf seiner ersten Ebene eine Datei namens „.ocdata“ enthält.",
"Could not obtain lock type %d on \"%s\"." : "Sperrtyp %d auf „%s“ konnte nicht ermittelt werden."
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 0201a5494db..46ce25414cd 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -139,8 +139,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Stellen Sie sicher, dass Sie PostgreSQL >= 9 verwenden oder prüfen Sie die Logs für weitere Informationen über den Fehler",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Bitte ändern Sie die Berechtigungen auf 0770, so dass das Verzeichnis nicht von anderen Benutzern angezeigt werden kann.",
"Data directory (%s) is readable by other users" : "Daten-Verzeichnis (%s) ist von anderen Benutzern lesbar",
- "Data directory (%s) must be an absolute path" : "Das Daten-Verzeichnis (%s) muss ein absoluter Pfad sein",
- "Check the value of \"datadirectory\" in your configuration" : "Prüfen Sie bitte die Angabe unter \"datadirectory\" in Ihrer Konfiguration",
+ "Data directory (%s) must be an absolute path" : "Das Datenverzeichnis (%s) muss ein absoluter Pfad sein",
+ "Check the value of \"datadirectory\" in your configuration" : "Überprüfen Sie bitte die Angabe unter „datadirectory“ in Ihrer Konfiguration",
"Data directory (%s) is invalid" : "Daten-Verzeichnis (%s) ist ungültig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Bitte stellen Sie sicher, dass das Datenverzeichnis auf seiner ersten Ebene eine Datei namens „.ocdata“ enthält.",
"Could not obtain lock type %d on \"%s\"." : "Sperrtyp %d auf „%s“ konnte nicht ermittelt werden."
diff --git a/lib/l10n/el.js b/lib/l10n/el.js
index 202f4e8deaa..572bed27dcb 100644
--- a/lib/l10n/el.js
+++ b/lib/l10n/el.js
@@ -137,6 +137,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Παρακαλώ ελέγξτε ότι έχετε PostgreSQL >= 9 ή ελέγξτε στα ιστορικό σφαλμάτων για περισσότερες πληροφορίες για το σφάλμα",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Παρακαλώ αλλάξτε τις ρυθμίσεις σε 0770 έτσι ώστε ο κατάλογος να μην μπορεί να προβάλλεται από άλλους χρήστες.",
"Data directory (%s) is readable by other users" : "Ο κατάλογος δεδομένων (%s) είναι διαθέσιμος προς ανάγνωση για άλλους χρήστες",
+ "Data directory (%s) must be an absolute path" : "Κατάλογος δεδομένων (%s) πρεπει να είναι απόλυτη η διαδρομή",
+ "Check the value of \"datadirectory\" in your configuration" : "Ελέγξτε την τιμή του \"Φάκελος Δεδομένων\" στις ρυθμίσεις σας",
"Data directory (%s) is invalid" : "Ο κατάλογος δεδομένων (%s) είναι άκυρος",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Παρακαλώ ελέγξτε ότι ο κατάλογος δεδομένων περιέχει ένα αρχείο \".ocdata\" στη βάση του.",
"Could not obtain lock type %d on \"%s\"." : "Αδυναμία ανάκτησης τύπου κλειδιού %d στο \"%s\"."
diff --git a/lib/l10n/el.json b/lib/l10n/el.json
index 5dff6422d5b..722fa824b1f 100644
--- a/lib/l10n/el.json
+++ b/lib/l10n/el.json
@@ -135,6 +135,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Παρακαλώ ελέγξτε ότι έχετε PostgreSQL >= 9 ή ελέγξτε στα ιστορικό σφαλμάτων για περισσότερες πληροφορίες για το σφάλμα",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Παρακαλώ αλλάξτε τις ρυθμίσεις σε 0770 έτσι ώστε ο κατάλογος να μην μπορεί να προβάλλεται από άλλους χρήστες.",
"Data directory (%s) is readable by other users" : "Ο κατάλογος δεδομένων (%s) είναι διαθέσιμος προς ανάγνωση για άλλους χρήστες",
+ "Data directory (%s) must be an absolute path" : "Κατάλογος δεδομένων (%s) πρεπει να είναι απόλυτη η διαδρομή",
+ "Check the value of \"datadirectory\" in your configuration" : "Ελέγξτε την τιμή του \"Φάκελος Δεδομένων\" στις ρυθμίσεις σας",
"Data directory (%s) is invalid" : "Ο κατάλογος δεδομένων (%s) είναι άκυρος",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Παρακαλώ ελέγξτε ότι ο κατάλογος δεδομένων περιέχει ένα αρχείο \".ocdata\" στη βάση του.",
"Could not obtain lock type %d on \"%s\"." : "Αδυναμία ανάκτησης τύπου κλειδιού %d στο \"%s\"."
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 783cd8d6e3b..e7761bf5bc4 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -141,6 +141,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Por favor, asegúrese de que tiene PostgreSQL 9 o superior, o revise los registros para obtener más información acerca del error.",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor cambie los permisos a 0770 para que el directorio no se pueda mostrar para otros usuarios.",
"Data directory (%s) is readable by other users" : "El directorio de datos (%s) se puede leer por otros usuarios.",
+ "Data directory (%s) must be an absolute path" : "El directorio de datos (%s) debe ser una ruta absoluta",
+ "Check the value of \"datadirectory\" in your configuration" : "Compruebe el valor de \"datadirectory\" en su configuración.",
"Data directory (%s) is invalid" : "El directorio de datos (%s) no es válido",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Verifique que el directorio de datos contiene un archivo \".ocdata\" en su directorio raíz.",
"Could not obtain lock type %d on \"%s\"." : "No se pudo realizar el bloqueo %d en \"%s\"."
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 3b5f6ea2f39..75a07ddf0ca 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -139,6 +139,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Por favor, asegúrese de que tiene PostgreSQL 9 o superior, o revise los registros para obtener más información acerca del error.",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor cambie los permisos a 0770 para que el directorio no se pueda mostrar para otros usuarios.",
"Data directory (%s) is readable by other users" : "El directorio de datos (%s) se puede leer por otros usuarios.",
+ "Data directory (%s) must be an absolute path" : "El directorio de datos (%s) debe ser una ruta absoluta",
+ "Check the value of \"datadirectory\" in your configuration" : "Compruebe el valor de \"datadirectory\" en su configuración.",
"Data directory (%s) is invalid" : "El directorio de datos (%s) no es válido",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Verifique que el directorio de datos contiene un archivo \".ocdata\" en su directorio raíz.",
"Could not obtain lock type %d on \"%s\"." : "No se pudo realizar el bloqueo %d en \"%s\"."
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index 660d4679d65..5823559e4be 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -59,9 +59,9 @@ OC.L10N.register(
"Unknown user" : "Utilisateur inconnu",
"%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
"%s enter the database name." : "%s entrez le nom de la base de données.",
- "%s you may not use dots in the database name" : "%s vous nez pouvez pas utiliser de points dans le nom de la base de données",
+ "%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
"MS SQL username and/or password not valid: %s" : "Le nom d'utilisateur et/ou le mot de passe de la base MS SQL est invalide : %s",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier soit le nom d'un compte existant, soit celui de l'administrateur.",
+ "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
"MySQL/MariaDB username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe MySQL/MariaDB invalide",
"DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
"Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
@@ -70,15 +70,15 @@ OC.L10N.register(
"MySQL/MariaDB user '%s'@'%%' already exists" : "L'utilisateur MySQL/MariaDB '%s'@'%%' existe déjà",
"Drop this user from MySQL/MariaDB." : "Retirer cet utilisateur de la base MySQL/MariaDB.",
"Oracle connection could not be established" : "La connexion Oracle ne peut pas être établie",
- "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle invalide",
+ "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
"Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
- "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL invalide",
+ "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
"For the best results, please consider using a GNU/Linux server instead." : "Pour obtenir les meilleurs résultats, vous devriez utiliser un serveur GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Il semble que cette instance %s fonctionne sur un environnement PHP 32-bits et open_basedir a été configuré dans php.ini. Cela engendre des problèmes avec les fichiers supérieurs à 4Go et cela est donc fortement déconseillé.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Veuillez supprimer la configuration open_basedir de votre php.ini ou basculer sur une version PHP 64-bits.",
"Set an admin username." : "Spécifiez un nom d'utilisateur pour l'administrateur.",
- "Set an admin password." : "Spécifiez un mot de passe administrateur.",
+ "Set an admin password." : "Spécifiez un mot de passe pour l'administrateur.",
"Can't create or write into the data directory %s" : "Impossible de créer ou d'écrire dans le répertoire des données %s",
"%s shared »%s« with you" : "%s partagé »%s« avec vous",
"Sharing %s failed, because the backend does not allow shares from type %i" : "Le partage de %s a échoué car l’infrastructure n'autorise pas les partages de type %i",
@@ -118,7 +118,7 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Ce problème est généralement résolu %sen donnant au serveur web un accès en écriture au répertoire apps%s ou en désactivant l'appstore dans le fichier de configuration.",
"Cannot create \"data\" directory (%s)" : "Impossible de créer le répertoire \"data\" (%s)",
"This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ce problème est généralement résolu <a href=\"%s\" target=\"_blank\">en donnant au serveur web un accès en écriture au répertoire racine</a>.",
- "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Les permissions peuvent, généralement, être résolues %sen donnant au serveur web un accès en écriture au répertoire racine%s",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Le problème de permissions peut généralement être résolu %sen donnant au serveur web un accès en écriture au répertoire racine%s",
"Setting locale to %s failed" : "Le choix de la langue pour %s a échoué",
"Please install one of these locales on your system and restart your webserver." : "Veuillez installer l'un de ces paramètres régionaux sur votre système et redémarrer votre serveur web.",
"Please ask your server administrator to install the module." : "Veuillez demander à votre administrateur d’installer le module.",
@@ -133,11 +133,13 @@ OC.L10N.register(
"PHP modules have been installed, but they are still listed as missing?" : "Les modules PHP ont été installés mais sont toujours indiqués comme manquants ?",
"Please ask your server administrator to restart the web server." : "Veuillez demander à votre administrateur serveur de redémarrer le serveur web.",
"PostgreSQL >= 9 required" : "PostgreSQL >= 9 requis",
- "Please upgrade your database version" : "Veuillez mettre à jour votre base de données",
+ "Please upgrade your database version" : "Veuillez mettre à jour votre gestionnaire de base de données",
"Error occurred while checking PostgreSQL version" : "Une erreur s’est produite pendant la récupération du numéro de version de PostgreSQL",
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Veuillez vérifier que vous utilisez PostgreSQL >= 9 , ou regardez dans le journal d’erreur pour plus d’informations sur ce problème",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Veuillez changer les permissions du répertoire en mode 0770 afin que son contenu puisse être listé par les autres utilisateurs.",
- "Data directory (%s) is readable by other users" : "Le répertoire (%s) est lisible par les autres utilisateurs",
+ "Data directory (%s) is readable by other users" : "Le répertoire de données (%s) est lisible par les autres utilisateurs",
+ "Data directory (%s) must be an absolute path" : "Le chemin du dossier de données (%s) doit être absolu",
+ "Check the value of \"datadirectory\" in your configuration" : "Verifiez la valeur de \"datadirectory\" dans votre configuration",
"Data directory (%s) is invalid" : "Le répertoire (%s) est invalide",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Veuillez vérifier que le répertoire de données contient un fichier \".ocdata\" à sa racine.",
"Could not obtain lock type %d on \"%s\"." : "Impossible d'obtenir le verrouillage de type %d sur \"%s\"."
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index b64c3d48b0d..3e4b40c2083 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -57,9 +57,9 @@
"Unknown user" : "Utilisateur inconnu",
"%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
"%s enter the database name." : "%s entrez le nom de la base de données.",
- "%s you may not use dots in the database name" : "%s vous nez pouvez pas utiliser de points dans le nom de la base de données",
+ "%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
"MS SQL username and/or password not valid: %s" : "Le nom d'utilisateur et/ou le mot de passe de la base MS SQL est invalide : %s",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier soit le nom d'un compte existant, soit celui de l'administrateur.",
+ "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
"MySQL/MariaDB username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe MySQL/MariaDB invalide",
"DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
"Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
@@ -68,15 +68,15 @@
"MySQL/MariaDB user '%s'@'%%' already exists" : "L'utilisateur MySQL/MariaDB '%s'@'%%' existe déjà",
"Drop this user from MySQL/MariaDB." : "Retirer cet utilisateur de la base MySQL/MariaDB.",
"Oracle connection could not be established" : "La connexion Oracle ne peut pas être établie",
- "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle invalide",
+ "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
"Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
- "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL invalide",
+ "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
"For the best results, please consider using a GNU/Linux server instead." : "Pour obtenir les meilleurs résultats, vous devriez utiliser un serveur GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Il semble que cette instance %s fonctionne sur un environnement PHP 32-bits et open_basedir a été configuré dans php.ini. Cela engendre des problèmes avec les fichiers supérieurs à 4Go et cela est donc fortement déconseillé.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Veuillez supprimer la configuration open_basedir de votre php.ini ou basculer sur une version PHP 64-bits.",
"Set an admin username." : "Spécifiez un nom d'utilisateur pour l'administrateur.",
- "Set an admin password." : "Spécifiez un mot de passe administrateur.",
+ "Set an admin password." : "Spécifiez un mot de passe pour l'administrateur.",
"Can't create or write into the data directory %s" : "Impossible de créer ou d'écrire dans le répertoire des données %s",
"%s shared »%s« with you" : "%s partagé »%s« avec vous",
"Sharing %s failed, because the backend does not allow shares from type %i" : "Le partage de %s a échoué car l’infrastructure n'autorise pas les partages de type %i",
@@ -116,7 +116,7 @@
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Ce problème est généralement résolu %sen donnant au serveur web un accès en écriture au répertoire apps%s ou en désactivant l'appstore dans le fichier de configuration.",
"Cannot create \"data\" directory (%s)" : "Impossible de créer le répertoire \"data\" (%s)",
"This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ce problème est généralement résolu <a href=\"%s\" target=\"_blank\">en donnant au serveur web un accès en écriture au répertoire racine</a>.",
- "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Les permissions peuvent, généralement, être résolues %sen donnant au serveur web un accès en écriture au répertoire racine%s",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Le problème de permissions peut généralement être résolu %sen donnant au serveur web un accès en écriture au répertoire racine%s",
"Setting locale to %s failed" : "Le choix de la langue pour %s a échoué",
"Please install one of these locales on your system and restart your webserver." : "Veuillez installer l'un de ces paramètres régionaux sur votre système et redémarrer votre serveur web.",
"Please ask your server administrator to install the module." : "Veuillez demander à votre administrateur d’installer le module.",
@@ -131,11 +131,13 @@
"PHP modules have been installed, but they are still listed as missing?" : "Les modules PHP ont été installés mais sont toujours indiqués comme manquants ?",
"Please ask your server administrator to restart the web server." : "Veuillez demander à votre administrateur serveur de redémarrer le serveur web.",
"PostgreSQL >= 9 required" : "PostgreSQL >= 9 requis",
- "Please upgrade your database version" : "Veuillez mettre à jour votre base de données",
+ "Please upgrade your database version" : "Veuillez mettre à jour votre gestionnaire de base de données",
"Error occurred while checking PostgreSQL version" : "Une erreur s’est produite pendant la récupération du numéro de version de PostgreSQL",
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Veuillez vérifier que vous utilisez PostgreSQL >= 9 , ou regardez dans le journal d’erreur pour plus d’informations sur ce problème",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Veuillez changer les permissions du répertoire en mode 0770 afin que son contenu puisse être listé par les autres utilisateurs.",
- "Data directory (%s) is readable by other users" : "Le répertoire (%s) est lisible par les autres utilisateurs",
+ "Data directory (%s) is readable by other users" : "Le répertoire de données (%s) est lisible par les autres utilisateurs",
+ "Data directory (%s) must be an absolute path" : "Le chemin du dossier de données (%s) doit être absolu",
+ "Check the value of \"datadirectory\" in your configuration" : "Verifiez la valeur de \"datadirectory\" dans votre configuration",
"Data directory (%s) is invalid" : "Le répertoire (%s) est invalide",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Veuillez vérifier que le répertoire de données contient un fichier \".ocdata\" à sa racine.",
"Could not obtain lock type %d on \"%s\"." : "Impossible d'obtenir le verrouillage de type %d sur \"%s\"."
diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js
index 554045b2be9..6195837fa55 100644
--- a/lib/l10n/nb_NO.js
+++ b/lib/l10n/nb_NO.js
@@ -22,6 +22,8 @@ OC.L10N.register(
"Users" : "Brukere",
"Admin" : "Admin",
"Recommended" : "Anbefalt",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "App \"%s\" kan ikke installeres fordi den ikke er kompatibel med denne versjonen av ownCloud.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "App \"%s\" kan ikke installeres fordi følgende avhengigheter ikke er tilfredsstilt: %s",
"No app name specified" : "Intet app-navn spesifisert",
"Unknown filetype" : "Ukjent filtype",
"Invalid image" : "Ugyldig bilde",
@@ -36,6 +38,12 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["for %n minutt siden","for %n minutter siden"],
"seconds ago" : "for få sekunder siden",
"web services under your control" : "webtjenester som du kontrollerer",
+ "Empty filename is not allowed" : "Tomt filnavn er ikke tillatt",
+ "Dot files are not allowed" : "Punktum-filer er ikke tillatt",
+ "4-byte characters are not supported in file names" : "4-byte tegn er ikke tillatt i filnavn",
+ "File name is a reserved word" : "Filnavnet er et reservert ord",
+ "File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn",
+ "File name is too long" : "Filnavnet er for langt",
"App directory already exists" : "App-mappe finnes allerede",
"Can't create app folder. Please fix permissions. %s" : "Kan ikke opprette app-mappe. Vennligst ordne opp i tillatelser. %s",
"No source specified when installing app" : "Ingen kilde spesifisert ved installering av app",
@@ -70,6 +78,7 @@ OC.L10N.register(
"PostgreSQL username and/or password not valid" : "PostgreSQL-brukernavn og/eller passord er ikke gyldig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X støttes ikke og %s vil ikke fungere korrekt på denne plattformen. Bruk på egen risiko!",
"For the best results, please consider using a GNU/Linux server instead." : "For beste resultat, vurder å bruke en GNU/Linux-server i stedet.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Det ser ut for at %s-instansen kjører i et 32-bit PHP-miljø med open_basedir konfigurert i php.ini. Dette vil føre til problemer med filer over 4 GB og frarådes på det sterkeste.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Vennligst fjern innstillingen open_basedir i php.ini eller bytt til 64-bit PHP.",
"Set an admin username." : "Sett et admin-brukernavn.",
"Set an admin password." : "Sett et admin-passord.",
@@ -92,6 +101,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Setting av tillatelser for %s feilet, fordi elementet ikke ble funnet",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan ikke sette utøpsdato. Delinger kan ikke utløpe senere enn %s etter at de har blitt delt",
"Cannot set expiration date. Expiration date is in the past" : "Kan ikke sette utløpsdato. Utløpsdato er tilbake i tid",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ikke fjerne utløpsdato. Delinger må ha en utløpsdato.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-server %s må implementere grensesnittet OCP\\Share_Backend",
"Sharing backend %s not found" : "Delings-server %s ikke funnet",
"Sharing backend for %s not found" : "Delings-server for %s ikke funnet",
@@ -116,6 +126,8 @@ OC.L10N.register(
"Please install one of these locales on your system and restart your webserver." : "Vennligst installer en av disse nasjonale innstillingene på systemet ditt og start webserveren på nytt.",
"Please ask your server administrator to install the module." : "Be server-administratoren om å installere modulen.",
"PHP module %s not installed." : "PHP-modul %s er ikke installert.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP-innstilling \"%s\" er ikke satt til \"%s\".",
+ "Adjusting this setting in php.ini will make ownCloud run again" : "Endring av denne innstillingen i php.ini vil få ownCloud til å kjøre igjen.",
"Please ask your server administrator to update PHP to the latest version. Your PHP version is no longer supported by ownCloud and the PHP community." : "Be server-administratoren om å oppdatere PHP til nyeste versjon. PHP-versjonen du bruker støttes ikke lenger av ownCloud og PHP-fellesskapet.",
"PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code." : "PHP er konfigurert til å fylle \"raw post data\". Fra og med PHP 5.6 vil dette føre til at PHP utsteder notiser for fullstendig gyldig kode.",
"To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "For å fikse dette problemet, sett <code>always_populate_raw_post_data</code> til <code>-1</code> i php.ini",
@@ -129,6 +141,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Sjekk at du har PostgreSQL >= 9 eller sjekk loggene for mer informasjon om feilen",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Endre tillatelsene til 0770 slik at mappen ikke kan listes av andre brukere.",
"Data directory (%s) is readable by other users" : "Data-mappen (%s) kan leses av andre brukere",
+ "Data directory (%s) must be an absolute path" : "Datamappen (%s) må være en absolutt sti",
+ "Check the value of \"datadirectory\" in your configuration" : "Sjekk verdien for \"datadirectory\" i konfigurasjonen din",
"Data directory (%s) is invalid" : "Data-mappe (%s) er ugyldig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Sjekk at det ligger en fil \".ocdata\" i roten av data-mappen.",
"Could not obtain lock type %d on \"%s\"." : "Klarte ikke å låse med type %d på \"%s\"."
diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json
index 70e1d2e5b8e..fe189ee5903 100644
--- a/lib/l10n/nb_NO.json
+++ b/lib/l10n/nb_NO.json
@@ -20,6 +20,8 @@
"Users" : "Brukere",
"Admin" : "Admin",
"Recommended" : "Anbefalt",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "App \"%s\" kan ikke installeres fordi den ikke er kompatibel med denne versjonen av ownCloud.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "App \"%s\" kan ikke installeres fordi følgende avhengigheter ikke er tilfredsstilt: %s",
"No app name specified" : "Intet app-navn spesifisert",
"Unknown filetype" : "Ukjent filtype",
"Invalid image" : "Ugyldig bilde",
@@ -34,6 +36,12 @@
"_%n minute ago_::_%n minutes ago_" : ["for %n minutt siden","for %n minutter siden"],
"seconds ago" : "for få sekunder siden",
"web services under your control" : "webtjenester som du kontrollerer",
+ "Empty filename is not allowed" : "Tomt filnavn er ikke tillatt",
+ "Dot files are not allowed" : "Punktum-filer er ikke tillatt",
+ "4-byte characters are not supported in file names" : "4-byte tegn er ikke tillatt i filnavn",
+ "File name is a reserved word" : "Filnavnet er et reservert ord",
+ "File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn",
+ "File name is too long" : "Filnavnet er for langt",
"App directory already exists" : "App-mappe finnes allerede",
"Can't create app folder. Please fix permissions. %s" : "Kan ikke opprette app-mappe. Vennligst ordne opp i tillatelser. %s",
"No source specified when installing app" : "Ingen kilde spesifisert ved installering av app",
@@ -68,6 +76,7 @@
"PostgreSQL username and/or password not valid" : "PostgreSQL-brukernavn og/eller passord er ikke gyldig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X støttes ikke og %s vil ikke fungere korrekt på denne plattformen. Bruk på egen risiko!",
"For the best results, please consider using a GNU/Linux server instead." : "For beste resultat, vurder å bruke en GNU/Linux-server i stedet.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Det ser ut for at %s-instansen kjører i et 32-bit PHP-miljø med open_basedir konfigurert i php.ini. Dette vil føre til problemer med filer over 4 GB og frarådes på det sterkeste.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Vennligst fjern innstillingen open_basedir i php.ini eller bytt til 64-bit PHP.",
"Set an admin username." : "Sett et admin-brukernavn.",
"Set an admin password." : "Sett et admin-passord.",
@@ -90,6 +99,7 @@
"Setting permissions for %s failed, because the item was not found" : "Setting av tillatelser for %s feilet, fordi elementet ikke ble funnet",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan ikke sette utøpsdato. Delinger kan ikke utløpe senere enn %s etter at de har blitt delt",
"Cannot set expiration date. Expiration date is in the past" : "Kan ikke sette utløpsdato. Utløpsdato er tilbake i tid",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ikke fjerne utløpsdato. Delinger må ha en utløpsdato.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-server %s må implementere grensesnittet OCP\\Share_Backend",
"Sharing backend %s not found" : "Delings-server %s ikke funnet",
"Sharing backend for %s not found" : "Delings-server for %s ikke funnet",
@@ -114,6 +124,8 @@
"Please install one of these locales on your system and restart your webserver." : "Vennligst installer en av disse nasjonale innstillingene på systemet ditt og start webserveren på nytt.",
"Please ask your server administrator to install the module." : "Be server-administratoren om å installere modulen.",
"PHP module %s not installed." : "PHP-modul %s er ikke installert.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP-innstilling \"%s\" er ikke satt til \"%s\".",
+ "Adjusting this setting in php.ini will make ownCloud run again" : "Endring av denne innstillingen i php.ini vil få ownCloud til å kjøre igjen.",
"Please ask your server administrator to update PHP to the latest version. Your PHP version is no longer supported by ownCloud and the PHP community." : "Be server-administratoren om å oppdatere PHP til nyeste versjon. PHP-versjonen du bruker støttes ikke lenger av ownCloud og PHP-fellesskapet.",
"PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code." : "PHP er konfigurert til å fylle \"raw post data\". Fra og med PHP 5.6 vil dette føre til at PHP utsteder notiser for fullstendig gyldig kode.",
"To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "For å fikse dette problemet, sett <code>always_populate_raw_post_data</code> til <code>-1</code> i php.ini",
@@ -127,6 +139,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Sjekk at du har PostgreSQL >= 9 eller sjekk loggene for mer informasjon om feilen",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Endre tillatelsene til 0770 slik at mappen ikke kan listes av andre brukere.",
"Data directory (%s) is readable by other users" : "Data-mappen (%s) kan leses av andre brukere",
+ "Data directory (%s) must be an absolute path" : "Datamappen (%s) må være en absolutt sti",
+ "Check the value of \"datadirectory\" in your configuration" : "Sjekk verdien for \"datadirectory\" i konfigurasjonen din",
"Data directory (%s) is invalid" : "Data-mappe (%s) er ugyldig",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Sjekk at det ligger en fil \".ocdata\" i roten av data-mappen.",
"Could not obtain lock type %d on \"%s\"." : "Klarte ikke å låse med type %d på \"%s\"."
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index db1e4d369da..8eb83afc5ca 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -98,6 +98,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Definir permissões para %s falhou, porque o item não foi encontrado",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não é possível definir a data de expiração. Compartilhamentos não podem expirar mais tarde que %s depois de terem sido compartilhados",
"Cannot set expiration date. Expiration date is in the past" : "Não é possível definir a data de validade. Data de expiração está no passado",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível eliminar a data de expiração. Ações são obrigados a ter uma data de expiração.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Compartilhando backend %s deve implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Compartilhamento backend %s não encontrado",
"Sharing backend for %s not found" : "Compartilhamento backend para %s não encontrado",
@@ -137,6 +138,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Por favor, verifique se você tem PostgreSQL> = 9 ou verificar os logs para obter mais informações sobre o erro",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor, altere as permissões para 0770 para que o diretório não possa ser listado por outros usuários.",
"Data directory (%s) is readable by other users" : "Diretório de dados (%s) pode ser lido por outros usuários",
+ "Data directory (%s) must be an absolute path" : "Diretório de dados (%s) deve ser um caminho absoluto",
+ "Check the value of \"datadirectory\" in your configuration" : "Verifique o valor do \"diretóriodedados\" na sua configuração",
"Data directory (%s) is invalid" : "Diretório de dados (%s) é inválido",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Por favor, verifique se o diretório de dados contém um arquivo \".ocdata\" em sua raiz.",
"Could not obtain lock type %d on \"%s\"." : "Não foi possível obter tipo de bloqueio %d em \"%s\"."
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 3530a248549..85223bcd31b 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -96,6 +96,7 @@
"Setting permissions for %s failed, because the item was not found" : "Definir permissões para %s falhou, porque o item não foi encontrado",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não é possível definir a data de expiração. Compartilhamentos não podem expirar mais tarde que %s depois de terem sido compartilhados",
"Cannot set expiration date. Expiration date is in the past" : "Não é possível definir a data de validade. Data de expiração está no passado",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível eliminar a data de expiração. Ações são obrigados a ter uma data de expiração.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Compartilhando backend %s deve implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Compartilhamento backend %s não encontrado",
"Sharing backend for %s not found" : "Compartilhamento backend para %s não encontrado",
@@ -135,6 +136,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Por favor, verifique se você tem PostgreSQL> = 9 ou verificar os logs para obter mais informações sobre o erro",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor, altere as permissões para 0770 para que o diretório não possa ser listado por outros usuários.",
"Data directory (%s) is readable by other users" : "Diretório de dados (%s) pode ser lido por outros usuários",
+ "Data directory (%s) must be an absolute path" : "Diretório de dados (%s) deve ser um caminho absoluto",
+ "Check the value of \"datadirectory\" in your configuration" : "Verifique o valor do \"diretóriodedados\" na sua configuração",
"Data directory (%s) is invalid" : "Diretório de dados (%s) é inválido",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Por favor, verifique se o diretório de dados contém um arquivo \".ocdata\" em sua raiz.",
"Could not obtain lock type %d on \"%s\"." : "Não foi possível obter tipo de bloqueio %d em \"%s\"."
diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js
index 9746a47e004..cfa725d5666 100644
--- a/lib/l10n/sl.js
+++ b/lib/l10n/sl.js
@@ -38,6 +38,9 @@ OC.L10N.register(
"web services under your control" : "spletne storitve pod vašim nadzorom",
"Empty filename is not allowed" : "Prazno polje imena datoteke ni dovoljeno.",
"Dot files are not allowed" : "Skrite datoteke niso dovoljene",
+ "File name is a reserved word" : "Ime datoteke je zadržana beseda",
+ "File name contains at least one invalid character" : "Ime datoteke vsebuje vsaj en neveljaven znak.",
+ "File name is too long" : "Ime datoteke je predolgo",
"App directory already exists" : "Programska mapa že obstaja",
"Can't create app folder. Please fix permissions. %s" : "Programske mape ni mogoče ustvariti. Ni ustreznih dovoljenj. %s",
"No source specified when installing app" : "Ni podanega vira med nameščenjem programa",
@@ -70,7 +73,7 @@ OC.L10N.register(
"Oracle username and/or password not valid" : "Uporabniško ime ali geslo Oracle ni veljavno",
"Offending command was: \"%s\", name: %s, password: %s" : "Napačni ukaz je: \"%s\", ime: %s, geslo: %s",
"PostgreSQL username and/or password not valid" : "Uporabniško ime ali geslo PostgreSQL ni veljavno",
- "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s ne bo deloval zanesljivo v tem okolju. Program uporabljate na lastno odgovornost! ",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s v tem okolju ne bo deloval zanesljivo. Program uporabljate na lastno odgovornost! ",
"For the best results, please consider using a GNU/Linux server instead." : "Za najbolj še rezultate je priporočljivo uporabljati strežnik GNU/Linux.",
"Set an admin username." : "Nastavi uporabniško ime skrbnika.",
"Set an admin password." : "Nastavi geslo skrbnika.",
diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json
index 800c9e78a35..959d7c4915b 100644
--- a/lib/l10n/sl.json
+++ b/lib/l10n/sl.json
@@ -36,6 +36,9 @@
"web services under your control" : "spletne storitve pod vašim nadzorom",
"Empty filename is not allowed" : "Prazno polje imena datoteke ni dovoljeno.",
"Dot files are not allowed" : "Skrite datoteke niso dovoljene",
+ "File name is a reserved word" : "Ime datoteke je zadržana beseda",
+ "File name contains at least one invalid character" : "Ime datoteke vsebuje vsaj en neveljaven znak.",
+ "File name is too long" : "Ime datoteke je predolgo",
"App directory already exists" : "Programska mapa že obstaja",
"Can't create app folder. Please fix permissions. %s" : "Programske mape ni mogoče ustvariti. Ni ustreznih dovoljenj. %s",
"No source specified when installing app" : "Ni podanega vira med nameščenjem programa",
@@ -68,7 +71,7 @@
"Oracle username and/or password not valid" : "Uporabniško ime ali geslo Oracle ni veljavno",
"Offending command was: \"%s\", name: %s, password: %s" : "Napačni ukaz je: \"%s\", ime: %s, geslo: %s",
"PostgreSQL username and/or password not valid" : "Uporabniško ime ali geslo PostgreSQL ni veljavno",
- "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s ne bo deloval zanesljivo v tem okolju. Program uporabljate na lastno odgovornost! ",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s v tem okolju ne bo deloval zanesljivo. Program uporabljate na lastno odgovornost! ",
"For the best results, please consider using a GNU/Linux server instead." : "Za najbolj še rezultate je priporočljivo uporabljati strežnik GNU/Linux.",
"Set an admin username." : "Nastavi uporabniško ime skrbnika.",
"Set an admin password." : "Nastavi geslo skrbnika.",
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index b28071912f7..c0cd84987c2 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -1,17 +1,26 @@
OC.L10N.register(
"lib",
{
+ "Cannot write into \"config\" directory!" : "Не могу да уписујем у \"config\" директоријум!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Ово се обично може средити давањем права веб серверу да пише у директоријум са подешавањима",
"See %s" : "Погледајте %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ово се обично може средити %sдавањем права веб серверу да пише у директоријум са подешавањима%s.",
+ "Sample configuration detected" : "Откривен је узорак подешавања",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Откривено је да је узорак подешавања ископиран. Ово може покварити инсталацију и није подржано. Прочитајте документацију пре вршења промена у фајлу config.php",
"PHP %s or higher is required." : "Потребан је ПХП %s или новији.",
"PHP with a version lower than %s is required." : "Потребан је ПХП старији од %s.",
"Following databases are supported: %s" : "Следеће базе података су подржане: %s",
+ "The command line tool %s could not be found" : "Није могуће пронаћи командну линију %s",
"The library %s is not available." : "Библиотека %s није доступна.",
+ "Library %s with a version higher than %s is required - available version %s." : "Библиотека %s издања већег од %s је потребна - доступно издање %s.",
+ "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 with a version lower than %s is required." : "Потребно је издање програма ownCloud ниже од %s.",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
- "Admin" : "Администратор",
+ "Admin" : "Администрација",
"Recommended" : "Препоручено",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Апликација „%s“ не може бити инсталирана јер није компатибилна са овим издањем Оунклауда.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Апликација „%s“ не може бити инсталирана јер следеће зависности нису испуњене: %s",
@@ -36,32 +45,106 @@ OC.L10N.register(
"File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
"File name is too long" : "Назив фајла је предугачак",
"App directory already exists" : "Директоријум апликација већ постоји",
+ "Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s",
+ "No source specified when installing app" : "Није наведен извор за инсталирање апликације",
+ "No href specified when installing app from http" : "Није наведена адреса за инсталирање апликације преко http",
+ "No path specified when installing app from local file" : "Није наведена путања за инсталирање апликације преко локалне датотеке",
"Archives of type %s are not supported" : "%s архиве нису подржане",
+ "Failed to open archive when installing app" : "Неуспешно отварање архиве приликом инсталације апликације",
+ "App does not provide an info.xml file" : "Апликација не поседује info.xml датотеку",
+ "App can't be installed because of not allowed code in the App" : "Апликације не може бити инсталирана због недозвољеног кода у апликацији",
+ "App can't be installed because it is not compatible with this version of ownCloud" : "Апликације не може бити инсталирана зато што није компатибилна са овим издањем програма ownCloud",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Апликације не може бити инсталирана зато што садржи ознаку <shipped>тачно</shipped> која није дозвољена за неиспоручене апликације",
+ "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Апликације не може бити инсталирана зато што издање у info.xml/version није исто као издање које је пријављено у продавници апликација",
"Application is not enabled" : "Апликација није укључена",
"Authentication error" : "Грешка аутентификације",
"Token expired. Please reload page." : "Жетон је истекао. Поново учитајте страницу.",
"Unknown user" : "Непознат корисник",
+ "%s enter the database username." : "%s унеси корисничко име базе података.",
+ "%s enter the database name." : "%s унеси име базе података.",
+ "%s you may not use dots in the database name" : "%s не можете користити тачке у имену базе података",
+ "MS SQL username and/or password not valid: %s" : "MS SQL корисничко име и/или лозинка нису важећи: %s",
+ "You need to enter either an existing account or the administrator." : "Потребно је да унесете или постојећи налог или администраторски.",
+ "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB корисничко име и/или лозинка нису важећи",
+ "DB Error: \"%s\"" : "Грешка базе података: \"%s\"",
+ "Offending command was: \"%s\"" : "Неисправна команда је: „%s“",
+ "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB корисник '%s'@'localhost' већ постоји.",
+ "Drop this user from MySQL/MariaDB" : "Обришите овог корисника из MySQL/MariaDB",
+ "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB корисник '%s'@'%%' већ постоји",
+ "Drop this user from MySQL/MariaDB." : "Обришите овог корисника из MySQL/MariaDB.",
+ "Oracle connection could not be established" : "Веза са базом података Oracle не може бити успостављена",
+ "Oracle username and/or password not valid" : "Oracle корисничко име и/или лозинка нису важећи",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Неисправна команда је: „%s“, назив: %s, лозинка: %s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL корисничко име и/или лозинка нису важећи",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Мек ОС Икс није подржан и %s неће радити исправно на овој платформи. Користите га на сопствени ризик!",
"For the best results, please consider using a GNU/Linux server instead." : "За најбоље резултате, размотрите употребу ГНУ/Линукс сервера.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Изгледа да %s ради у 32-битном ПХП окружењу а open_basedir је подешен у php.ini фајлу. То може довести до проблема са фајловима већим од 4 GB те стога није препоручљиво.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Уклоните open_basedir поставку из php.ini фајла или пређите на 64-битни ПХП.",
"Set an admin username." : "Поставите име за администратора.",
"Set an admin password." : "Поставите лозинку за администратора.",
+ "Can't create or write into the data directory %s" : "Не могу креирати или уписивати у директоријум података %s",
"%s shared »%s« with you" : "%s подели „%s“ са вама",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i",
+ "Sharing %s failed, because the file does not exist" : "Дељење %s није успело зато што датотека не постоји",
"You are not allowed to share %s" : "Није вам дозвољено да делите %s",
+ "Sharing %s failed, because the user %s is the item owner" : "Дељење %s није успело зато што је корисник %s власник дељене ставке",
+ "Sharing %s failed, because the user %s does not exist" : "Дељење %s није успело зато што не постоји корисник %s",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Дељење %s није успело зато што корисник %s није члан групе која је %s члан ",
+ "Sharing %s failed, because this item is already shared with %s" : "Дељење %s није успело зато што се ова ставка већ дели са %s",
+ "Sharing %s failed, because the group %s does not exist" : "Дељење %s није успело зато што непостоји група %s",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Дељење %s није успело зато што %s није члан групе %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Морате да обезбедите лозинку за креирање јавне везе, дозвољене су само заштићене везе",
+ "Sharing %s failed, because sharing with links is not allowed" : "Дељење %s није успело зато што дељење са везама није дозвољено",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Дељење %s није успело, није могуће пронаћи %s, можда сервер тренутно није доступан.",
+ "Share type %s is not valid for %s" : "Тип датотека за дељење %s није валидан за %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Постављање дозвола за %s није успело зато што дозволе превазилазе дозволе гарантоване за %s",
+ "Setting permissions for %s failed, because the item was not found" : "Постављање дозвола за %s није успело зато што ставка није пронађена",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Не могу поставити датум трајања. Дељења не могу истицати касније од %s пошто су активирана",
+ "Cannot set expiration date. Expiration date is in the past" : "Не могу поставити датум трајања. Датум трајања употребе је у прошлости",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Не могу обрисати датум трајања. Дељења су у обавези да имају ограничен датум трајања.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Позадина дељења %s мора користити корисничко окружење OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Позадина за дељење %s није пронађена",
+ "Sharing backend for %s not found" : "Позадина за дељење за %s није пронађена",
+ "Sharing %s failed, because the user %s is the original sharer" : "Дељење %s није успело зато што је корисник %s изворни делилац",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Дељење %s није успело зато што дозволе превазилазе дозволе гарантоване за %s",
+ "Sharing %s failed, because resharing is not allowed" : "Дељење %s није успело зато што даље дељење није дозвољено",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Дељење %s није успело зато што позадина дељења за %s није могла да нађе извор",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Дељење %s није успело, зато што датотека не може бити пронађена у кешу датотека",
"Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“",
"A valid username must be provided" : "Морате унети исправно корисничко име",
"A valid password must be provided" : "Морате унети исправну лозинку",
"The username is already being used" : "Корисничко име се већ користи",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Нема драјвера базе података (скулајт, мајскул или постгрескул).",
+ "Cannot write into \"config\" directory" : "Не могу уписивати у директоријуму \"config\"",
+ "Cannot write into \"apps\" directory" : "Не могу уписивати у директоријуму \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Ово се обично може поправити %sgдавањем права уписа веб серверу директоријум%s апликација или искуључивањем продавнице апликација у датотеци config file.",
+ "Cannot create \"data\" directory (%s)" : "Не могу формирати \"data\" директоријуме (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ово се обично може поправити <a href=\"%s\" target=\"_blank\">давањем права уписивања веб серверу у основни директоријум</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Дозволе се обично могу поправити %sдавањем права уписивања веб серверу основни директоријум%s.",
"Setting locale to %s failed" : "Постављање локалитета на %s није успело",
"Please install one of these locales on your system and restart your webserver." : "Инсталирајте неки од ових локалитета на ваш систем и поново покрените веб сервер.",
"Please ask your server administrator to install the module." : "Замолите администратора вашег сервера да инсталира тај модул.",
"PHP module %s not installed." : "ПХП модул %s није инсталиран.",
"PHP setting \"%s\" is not set to \"%s\"." : "ПХП поставка „%s“ није постављена на „%s“.",
+ "Adjusting this setting in php.ini will make ownCloud run again" : "Подешавање ове поставке у php.ini датотеци ће омогућитит програму ownCloud да се поново покрене",
+ "Please ask your server administrator to update PHP to the latest version. Your PHP version is no longer supported by ownCloud and the PHP community." : "Замолите вашег администратора сервера да ажурира PHP на најновију верзију. PHP верзија вашег система више није подржана од страна програма ownCloud и PHP заједнице.",
+ "PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code." : "ПХП је подешен да попуњава сирове податке. Од верзије 5.6 то може довести да ПХП шаље упозорења и за потпуно исправан код.",
+ "To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "Да би решили овај проблем подесите <code>always_populate_raw_post_data</code> на <code>-1</code> у датотеци php.ini",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
- "PostgreSQL >= 9 required" : "Захтеван је ПостгреСкул >= 9"
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP модули су инсталирани али се и даље воде као недостајући?",
+ "Please ask your server administrator to restart the web server." : "Замолите вашег администратора сервера да поново покрене веб сервер.",
+ "PostgreSQL >= 9 required" : "Захтеван је ПостгреСкул >= 9",
+ "Please upgrade your database version" : "Молимо вас да надградите верзије ваше базе",
+ "Error occurred while checking PostgreSQL version" : "Дошло је до грешке приликом провере верзије програма PostgreSQL",
+ "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Проверите да ли имате PostgreSQL >= 9 или проверите дневнике записа за више информација о грешци",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Промените дозволе у 0770 како директоријуми не би могли бити излистани од стране других корисника.",
+ "Data directory (%s) is readable by other users" : "Директоријум података (%s) могу читати остали корисници",
+ "Data directory (%s) must be an absolute path" : "Директоријум података (%s) мора бити апсолутна путања",
+ "Check the value of \"datadirectory\" in your configuration" : "Проверите податак за \"datadirectory\" у вашој конфигурацији",
+ "Data directory (%s) is invalid" : "Директоријум података (%s) није валидан",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Проверите да ли директоријум података садржи датотеку \".ocdata\" у свом основном директоријуму.",
+ "Could not obtain lock type %d on \"%s\"." : "Не могу да остварим закључаност %d за „%s“."
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index e4cc7d27608..770a3982ceb 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -1,15 +1,24 @@
{ "translations": {
+ "Cannot write into \"config\" directory!" : "Не могу да уписујем у \"config\" директоријум!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Ово се обично може средити давањем права веб серверу да пише у директоријум са подешавањима",
"See %s" : "Погледајте %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ово се обично може средити %sдавањем права веб серверу да пише у директоријум са подешавањима%s.",
+ "Sample configuration detected" : "Откривен је узорак подешавања",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Откривено је да је узорак подешавања ископиран. Ово може покварити инсталацију и није подржано. Прочитајте документацију пре вршења промена у фајлу config.php",
"PHP %s or higher is required." : "Потребан је ПХП %s или новији.",
"PHP with a version lower than %s is required." : "Потребан је ПХП старији од %s.",
"Following databases are supported: %s" : "Следеће базе података су подржане: %s",
+ "The command line tool %s could not be found" : "Није могуће пронаћи командну линију %s",
"The library %s is not available." : "Библиотека %s није доступна.",
+ "Library %s with a version higher than %s is required - available version %s." : "Библиотека %s издања већег од %s је потребна - доступно издање %s.",
+ "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 with a version lower than %s is required." : "Потребно је издање програма ownCloud ниже од %s.",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
- "Admin" : "Администратор",
+ "Admin" : "Администрација",
"Recommended" : "Препоручено",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Апликација „%s“ не може бити инсталирана јер није компатибилна са овим издањем Оунклауда.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Апликација „%s“ не може бити инсталирана јер следеће зависности нису испуњене: %s",
@@ -34,32 +43,106 @@
"File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
"File name is too long" : "Назив фајла је предугачак",
"App directory already exists" : "Директоријум апликација већ постоји",
+ "Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s",
+ "No source specified when installing app" : "Није наведен извор за инсталирање апликације",
+ "No href specified when installing app from http" : "Није наведена адреса за инсталирање апликације преко http",
+ "No path specified when installing app from local file" : "Није наведена путања за инсталирање апликације преко локалне датотеке",
"Archives of type %s are not supported" : "%s архиве нису подржане",
+ "Failed to open archive when installing app" : "Неуспешно отварање архиве приликом инсталације апликације",
+ "App does not provide an info.xml file" : "Апликација не поседује info.xml датотеку",
+ "App can't be installed because of not allowed code in the App" : "Апликације не може бити инсталирана због недозвољеног кода у апликацији",
+ "App can't be installed because it is not compatible with this version of ownCloud" : "Апликације не може бити инсталирана зато што није компатибилна са овим издањем програма ownCloud",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Апликације не може бити инсталирана зато што садржи ознаку <shipped>тачно</shipped> која није дозвољена за неиспоручене апликације",
+ "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Апликације не може бити инсталирана зато што издање у info.xml/version није исто као издање које је пријављено у продавници апликација",
"Application is not enabled" : "Апликација није укључена",
"Authentication error" : "Грешка аутентификације",
"Token expired. Please reload page." : "Жетон је истекао. Поново учитајте страницу.",
"Unknown user" : "Непознат корисник",
+ "%s enter the database username." : "%s унеси корисничко име базе података.",
+ "%s enter the database name." : "%s унеси име базе података.",
+ "%s you may not use dots in the database name" : "%s не можете користити тачке у имену базе података",
+ "MS SQL username and/or password not valid: %s" : "MS SQL корисничко име и/или лозинка нису важећи: %s",
+ "You need to enter either an existing account or the administrator." : "Потребно је да унесете или постојећи налог или администраторски.",
+ "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB корисничко име и/или лозинка нису важећи",
+ "DB Error: \"%s\"" : "Грешка базе података: \"%s\"",
+ "Offending command was: \"%s\"" : "Неисправна команда је: „%s“",
+ "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB корисник '%s'@'localhost' већ постоји.",
+ "Drop this user from MySQL/MariaDB" : "Обришите овог корисника из MySQL/MariaDB",
+ "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB корисник '%s'@'%%' већ постоји",
+ "Drop this user from MySQL/MariaDB." : "Обришите овог корисника из MySQL/MariaDB.",
+ "Oracle connection could not be established" : "Веза са базом података Oracle не може бити успостављена",
+ "Oracle username and/or password not valid" : "Oracle корисничко име и/или лозинка нису важећи",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Неисправна команда је: „%s“, назив: %s, лозинка: %s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL корисничко име и/или лозинка нису важећи",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Мек ОС Икс није подржан и %s неће радити исправно на овој платформи. Користите га на сопствени ризик!",
"For the best results, please consider using a GNU/Linux server instead." : "За најбоље резултате, размотрите употребу ГНУ/Линукс сервера.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Изгледа да %s ради у 32-битном ПХП окружењу а open_basedir је подешен у php.ini фајлу. То може довести до проблема са фајловима већим од 4 GB те стога није препоручљиво.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Уклоните open_basedir поставку из php.ini фајла или пређите на 64-битни ПХП.",
"Set an admin username." : "Поставите име за администратора.",
"Set an admin password." : "Поставите лозинку за администратора.",
+ "Can't create or write into the data directory %s" : "Не могу креирати или уписивати у директоријум података %s",
"%s shared »%s« with you" : "%s подели „%s“ са вама",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i",
+ "Sharing %s failed, because the file does not exist" : "Дељење %s није успело зато што датотека не постоји",
"You are not allowed to share %s" : "Није вам дозвољено да делите %s",
+ "Sharing %s failed, because the user %s is the item owner" : "Дељење %s није успело зато што је корисник %s власник дељене ставке",
+ "Sharing %s failed, because the user %s does not exist" : "Дељење %s није успело зато што не постоји корисник %s",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Дељење %s није успело зато што корисник %s није члан групе која је %s члан ",
+ "Sharing %s failed, because this item is already shared with %s" : "Дељење %s није успело зато што се ова ставка већ дели са %s",
+ "Sharing %s failed, because the group %s does not exist" : "Дељење %s није успело зато што непостоји група %s",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Дељење %s није успело зато што %s није члан групе %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Морате да обезбедите лозинку за креирање јавне везе, дозвољене су само заштићене везе",
+ "Sharing %s failed, because sharing with links is not allowed" : "Дељење %s није успело зато што дељење са везама није дозвољено",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Дељење %s није успело, није могуће пронаћи %s, можда сервер тренутно није доступан.",
+ "Share type %s is not valid for %s" : "Тип датотека за дељење %s није валидан за %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Постављање дозвола за %s није успело зато што дозволе превазилазе дозволе гарантоване за %s",
+ "Setting permissions for %s failed, because the item was not found" : "Постављање дозвола за %s није успело зато што ставка није пронађена",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Не могу поставити датум трајања. Дељења не могу истицати касније од %s пошто су активирана",
+ "Cannot set expiration date. Expiration date is in the past" : "Не могу поставити датум трајања. Датум трајања употребе је у прошлости",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Не могу обрисати датум трајања. Дељења су у обавези да имају ограничен датум трајања.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Позадина дељења %s мора користити корисничко окружење OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Позадина за дељење %s није пронађена",
+ "Sharing backend for %s not found" : "Позадина за дељење за %s није пронађена",
+ "Sharing %s failed, because the user %s is the original sharer" : "Дељење %s није успело зато што је корисник %s изворни делилац",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Дељење %s није успело зато што дозволе превазилазе дозволе гарантоване за %s",
+ "Sharing %s failed, because resharing is not allowed" : "Дељење %s није успело зато што даље дељење није дозвољено",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Дељење %s није успело зато што позадина дељења за %s није могла да нађе извор",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Дељење %s није успело, зато што датотека не може бити пронађена у кешу датотека",
"Could not find category \"%s\"" : "Не могу да пронађем категорију „%s“.",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Само су следећи знакови дозвољени за корисничко име: „a-z“, „A-Z“, „0-9“ и „_.@-“",
"A valid username must be provided" : "Морате унети исправно корисничко име",
"A valid password must be provided" : "Морате унети исправну лозинку",
"The username is already being used" : "Корисничко име се већ користи",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Нема драјвера базе података (скулајт, мајскул или постгрескул).",
+ "Cannot write into \"config\" directory" : "Не могу уписивати у директоријуму \"config\"",
+ "Cannot write into \"apps\" directory" : "Не могу уписивати у директоријуму \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Ово се обично може поправити %sgдавањем права уписа веб серверу директоријум%s апликација или искуључивањем продавнице апликација у датотеци config file.",
+ "Cannot create \"data\" directory (%s)" : "Не могу формирати \"data\" директоријуме (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ово се обично може поправити <a href=\"%s\" target=\"_blank\">давањем права уписивања веб серверу у основни директоријум</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Дозволе се обично могу поправити %sдавањем права уписивања веб серверу основни директоријум%s.",
"Setting locale to %s failed" : "Постављање локалитета на %s није успело",
"Please install one of these locales on your system and restart your webserver." : "Инсталирајте неки од ових локалитета на ваш систем и поново покрените веб сервер.",
"Please ask your server administrator to install the module." : "Замолите администратора вашег сервера да инсталира тај модул.",
"PHP module %s not installed." : "ПХП модул %s није инсталиран.",
"PHP setting \"%s\" is not set to \"%s\"." : "ПХП поставка „%s“ није постављена на „%s“.",
+ "Adjusting this setting in php.ini will make ownCloud run again" : "Подешавање ове поставке у php.ini датотеци ће омогућитит програму ownCloud да се поново покрене",
+ "Please ask your server administrator to update PHP to the latest version. Your PHP version is no longer supported by ownCloud and the PHP community." : "Замолите вашег администратора сервера да ажурира PHP на најновију верзију. PHP верзија вашег система више није подржана од страна програма ownCloud и PHP заједнице.",
+ "PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code." : "ПХП је подешен да попуњава сирове податке. Од верзије 5.6 то може довести да ПХП шаље упозорења и за потпуно исправан код.",
+ "To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini" : "Да би решили овај проблем подесите <code>always_populate_raw_post_data</code> на <code>-1</code> у датотеци php.ini",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
- "PostgreSQL >= 9 required" : "Захтеван је ПостгреСкул >= 9"
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP модули су инсталирани али се и даље воде као недостајући?",
+ "Please ask your server administrator to restart the web server." : "Замолите вашег администратора сервера да поново покрене веб сервер.",
+ "PostgreSQL >= 9 required" : "Захтеван је ПостгреСкул >= 9",
+ "Please upgrade your database version" : "Молимо вас да надградите верзије ваше базе",
+ "Error occurred while checking PostgreSQL version" : "Дошло је до грешке приликом провере верзије програма PostgreSQL",
+ "Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "Проверите да ли имате PostgreSQL >= 9 или проверите дневнике записа за више информација о грешци",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Промените дозволе у 0770 како директоријуми не би могли бити излистани од стране других корисника.",
+ "Data directory (%s) is readable by other users" : "Директоријум података (%s) могу читати остали корисници",
+ "Data directory (%s) must be an absolute path" : "Директоријум података (%s) мора бити апсолутна путања",
+ "Check the value of \"datadirectory\" in your configuration" : "Проверите податак за \"datadirectory\" у вашој конфигурацији",
+ "Data directory (%s) is invalid" : "Директоријум података (%s) није валидан",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Проверите да ли директоријум података садржи датотеку \".ocdata\" у свом основном директоријуму.",
+ "Could not obtain lock type %d on \"%s\"." : "Не могу да остварим закључаност %d за „%s“."
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index ea8ed73b8be..d457ba217dc 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -138,6 +138,8 @@ OC.L10N.register(
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "PostgreSQL >= 9 sürümüne sahip olduğunuzu doğrulayın veya hata hakkında daha fazla bilgi için günlükleri denetleyin",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Lütfen izinleri 0770 olarak ayarlayıp dizinin diğer kullanıcılar tarafından görülememesini sağlayın.",
"Data directory (%s) is readable by other users" : "Veri dizini (%s) diğer kullanıcılar tarafından okunabilir",
+ "Data directory (%s) must be an absolute path" : "Veri dizini (%s) tam yol olmalıdır",
+ "Check the value of \"datadirectory\" in your configuration" : "Yapılandırmanızdaki \"datadirectory\" değerini denetleyin",
"Data directory (%s) is invalid" : "Veri dizini (%s) geçersiz",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Lütfen veri dizininin kökünde \".ocdata\" adlı bir dosyanın bulunduğunu denetleyin.",
"Could not obtain lock type %d on \"%s\"." : "\"%s\" üzerinde %d kilit türü alınamadı."
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index 5d954a5f830..7c710c48643 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -136,6 +136,8 @@
"Please make sure you have PostgreSQL >= 9 or check the logs for more information about the error" : "PostgreSQL >= 9 sürümüne sahip olduğunuzu doğrulayın veya hata hakkında daha fazla bilgi için günlükleri denetleyin",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Lütfen izinleri 0770 olarak ayarlayıp dizinin diğer kullanıcılar tarafından görülememesini sağlayın.",
"Data directory (%s) is readable by other users" : "Veri dizini (%s) diğer kullanıcılar tarafından okunabilir",
+ "Data directory (%s) must be an absolute path" : "Veri dizini (%s) tam yol olmalıdır",
+ "Check the value of \"datadirectory\" in your configuration" : "Yapılandırmanızdaki \"datadirectory\" değerini denetleyin",
"Data directory (%s) is invalid" : "Veri dizini (%s) geçersiz",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Lütfen veri dizininin kökünde \".ocdata\" adlı bir dosyanın bulunduğunu denetleyin.",
"Could not obtain lock type %d on \"%s\"." : "\"%s\" üzerinde %d kilit türü alınamadı."
diff --git a/lib/private/app.php b/lib/private/app.php
index 84bc23608fb..4b3d4b82b82 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -207,7 +207,7 @@ class OC_App {
self::$shippedApps = json_decode(file_get_contents($shippedJson), true);
self::$shippedApps = self::$shippedApps['shippedApps'];
} else {
- self::$shippedApps = ['files', 'files_encryption', 'files_external',
+ self::$shippedApps = ['files', 'encryption', 'files_external',
'files_sharing', 'files_trashbin', 'files_versions', 'provisioning_api',
'user_ldap', 'user_webdavauth'];
}
diff --git a/lib/private/app/appmanager.php b/lib/private/app/appmanager.php
index 1cfa0bce25c..2a147d4de6f 100644
--- a/lib/private/app/appmanager.php
+++ b/lib/private/app/appmanager.php
@@ -24,6 +24,7 @@ namespace OC\App;
use OCP\App\IAppManager;
use OCP\IAppConfig;
+use OCP\ICacheFactory;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserSession;
@@ -44,6 +45,9 @@ class AppManager implements IAppManager {
*/
private $groupManager;
+ /** @var \OCP\ICacheFactory */
+ private $memCacheFactory;
+
/**
* @var string[] $appId => $enabled
*/
@@ -53,11 +57,16 @@ class AppManager implements IAppManager {
* @param \OCP\IUserSession $userSession
* @param \OCP\IAppConfig $appConfig
* @param \OCP\IGroupManager $groupManager
+ * @param \OCP\ICacheFactory $memCacheFactory
*/
- public function __construct(IUserSession $userSession, IAppConfig $appConfig, IGroupManager $groupManager) {
+ public function __construct(IUserSession $userSession,
+ IAppConfig $appConfig,
+ IGroupManager $groupManager,
+ ICacheFactory $memCacheFactory) {
$this->userSession = $userSession;
$this->appConfig = $appConfig;
$this->groupManager = $groupManager;
+ $this->memCacheFactory = $memCacheFactory;
}
/**
@@ -157,6 +166,7 @@ class AppManager implements IAppManager {
public function enableApp($appId) {
$this->installedAppsCache[$appId] = 'yes';
$this->appConfig->setValue($appId, 'enabled', 'yes');
+ $this->clearAppsCache();
}
/**
@@ -172,6 +182,7 @@ class AppManager implements IAppManager {
}, $groups);
$this->installedAppsCache[$appId] = json_encode($groupIds);
$this->appConfig->setValue($appId, 'enabled', json_encode($groupIds));
+ $this->clearAppsCache();
}
/**
@@ -186,5 +197,14 @@ class AppManager implements IAppManager {
}
unset($this->installedAppsCache[$appId]);
$this->appConfig->setValue($appId, 'enabled', 'no');
+ $this->clearAppsCache();
+ }
+
+ /**
+ * Clear the cached list of apps when enabling/disabling an app
+ */
+ protected function clearAppsCache() {
+ $settingsMemCache = $this->memCacheFactory->create('settings');
+ $settingsMemCache->clear('listApps');
}
}
diff --git a/lib/private/cache/file.php b/lib/private/cache/file.php
index a2f229fb89c..c70698eb7f8 100644
--- a/lib/private/cache/file.php
+++ b/lib/private/cache/file.php
@@ -33,6 +33,7 @@ namespace OC\Cache;
use OC\Files\Filesystem;
use OC\Files\View;
+use OCP\Security\ISecureRandom;
class File {
protected $storage;
@@ -66,13 +67,10 @@ class File {
*/
public function get($key) {
$result = null;
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
if ($this->hasKey($key)) {
$storage = $this->getStorage();
$result = $storage->file_get_contents($key);
}
- \OC_FileProxy::$enabled = $proxyStatus;
return $result;
}
@@ -84,13 +82,10 @@ class File {
*/
public function size($key) {
$result = 0;
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
if ($this->hasKey($key)) {
$storage = $this->getStorage();
$result = $storage->filesize($key);
}
- \OC_FileProxy::$enabled = $proxyStatus;
return $result;
}
@@ -100,15 +95,22 @@ class File {
public function set($key, $value, $ttl = 0) {
$storage = $this->getStorage();
$result = false;
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
- if ($storage and $storage->file_put_contents($key, $value)) {
+ // unique id to avoid chunk collision, just in case
+ $uniqueId = \OC::$server->getSecureRandom()->getLowStrengthGenerator()->generate(
+ 16,
+ ISecureRandom::CHAR_DIGITS . ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER
+ );
+
+ // use part file to prevent hasKey() to find the key
+ // while it is being written
+ $keyPart = $key . '.' . $uniqueId . '.part';
+ if ($storage and $storage->file_put_contents($keyPart, $value)) {
if ($ttl === 0) {
$ttl = 86400; // 60*60*24
}
- $result = $storage->touch($key, time() + $ttl);
+ $result = $storage->touch($keyPart, time() + $ttl);
+ $result &= $storage->rename($keyPart, $key);
}
- \OC_FileProxy::$enabled = $proxyStatus;
return $result;
}
diff --git a/lib/private/cache/fileglobalgc.php b/lib/private/cache/fileglobalgc.php
index 57068736104..0d966282383 100644
--- a/lib/private/cache/fileglobalgc.php
+++ b/lib/private/cache/fileglobalgc.php
@@ -72,7 +72,9 @@ class FileGlobalGC extends Job {
}
$paths = $this->getExpiredPaths($cacheDir, $now);
array_walk($paths, function($file) {
- unlink($file);
+ if (file_exists($file)) {
+ unlink($file);
+ }
});
}
}
diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php
index 4fbcb732688..b4acaa15073 100644
--- a/lib/private/connector/sabre/file.php
+++ b/lib/private/connector/sabre/file.php
@@ -35,7 +35,24 @@
namespace OC\Connector\Sabre;
-class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
+use OC\Connector\Sabre\Exception\EntityTooLarge;
+use OC\Connector\Sabre\Exception\FileLocked;
+use OC\Connector\Sabre\Exception\UnsupportedMediaType;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+use OCP\Files\EntityTooLargeException;
+use OCP\Files\InvalidContentException;
+use OCP\Files\InvalidPathException;
+use OCP\Files\LockNotAcquiredException;
+use OCP\Files\NotPermittedException;
+use OCP\Files\StorageNotAvailableException;
+use Sabre\DAV\Exception;
+use Sabre\DAV\Exception\BadRequest;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\Exception\NotImplemented;
+use Sabre\DAV\Exception\ServiceUnavailable;
+use Sabre\DAV\IFile;
+
+class File extends Node implements IFile {
/**
* Updates the data
@@ -56,27 +73,22 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
*
* @param resource $data
*
- * @throws \Sabre\DAV\Exception\Forbidden
- * @throws \OC\Connector\Sabre\Exception\UnsupportedMediaType
- * @throws \Sabre\DAV\Exception\BadRequest
- * @throws \Sabre\DAV\Exception
- * @throws \OC\Connector\Sabre\Exception\EntityTooLarge
- * @throws \Sabre\DAV\Exception\ServiceUnavailable
+ * @throws Forbidden
+ * @throws UnsupportedMediaType
+ * @throws BadRequest
+ * @throws Exception
+ * @throws EntityTooLarge
+ * @throws ServiceUnavailable
* @return string|null
*/
public function put($data) {
try {
if ($this->info && $this->fileView->file_exists($this->path) &&
!$this->info->isUpdateable()) {
- throw new \Sabre\DAV\Exception\Forbidden();
+ throw new Forbidden();
}
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("File is not updatable: ".$e->getMessage());
- }
-
- // throw an exception if encryption was disabled but the files are still encrypted
- if (\OC_Util::encryptedFiles()) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("Encryption is disabled");
+ } catch (StorageNotAvailableException $e) {
+ throw new ServiceUnavailable("File is not updatable: ".$e->getMessage());
}
// verify path of the target
@@ -104,31 +116,29 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
\OC_Log::write('webdav', '\OC\Files\Filesystem::file_put_contents() failed', \OC_Log::ERROR);
$this->fileView->unlink($partFilePath);
// because we have no clue about the cause we can only throw back a 500/Internal Server Error
- throw new \Sabre\DAV\Exception('Could not write file contents');
+ throw new Exception('Could not write file contents');
}
- } catch (\OCP\Files\NotPermittedException $e) {
+ } catch (NotPermittedException $e) {
// a more general case - due to whatever reason the content could not be written
- throw new \Sabre\DAV\Exception\Forbidden($e->getMessage());
-
- } catch (\OCP\Files\EntityTooLargeException $e) {
+ throw new Forbidden($e->getMessage());
+ } catch (EntityTooLargeException $e) {
// the file is too big to be stored
- throw new \OC\Connector\Sabre\Exception\EntityTooLarge($e->getMessage());
-
- } catch (\OCP\Files\InvalidContentException $e) {
+ throw new EntityTooLarge($e->getMessage());
+ } catch (InvalidContentException $e) {
// the file content is not permitted
- throw new \OC\Connector\Sabre\Exception\UnsupportedMediaType($e->getMessage());
-
- } catch (\OCP\Files\InvalidPathException $e) {
+ throw new UnsupportedMediaType($e->getMessage());
+ } catch (InvalidPathException $e) {
// the path for the file was not valid
// TODO: find proper http status code for this case
- throw new \Sabre\DAV\Exception\Forbidden($e->getMessage());
- } catch (\OCP\Files\LockNotAcquiredException $e) {
+ throw new Forbidden($e->getMessage());
+ } catch (LockNotAcquiredException $e) {
// the file is currently being written to by another process
- throw new \OC\Connector\Sabre\Exception\FileLocked($e->getMessage(), $e->getCode(), $e);
- } catch (\OCA\Files_Encryption\Exception\EncryptionException $e) {
- throw new \Sabre\DAV\Exception\Forbidden($e->getMessage());
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("Failed to write file contents: ".$e->getMessage());
+ throw new FileLocked($e->getMessage(), $e->getCode(), $e);
+ } catch (GenericEncryptionException $e) {
+ // returning 503 will allow retry of the operation at a later point in time
+ throw new ServiceUnavailable("Encryption not ready: " . $e->getMessage());
+ } catch (StorageNotAvailableException $e) {
+ throw new ServiceUnavailable("Failed to write file contents: ".$e->getMessage());
}
try {
@@ -140,7 +150,7 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
$actual = $this->fileView->filesize($partFilePath);
if ($actual != $expected) {
$this->fileView->unlink($partFilePath);
- throw new \Sabre\DAV\Exception\BadRequest('expected filesize ' . $expected . ' got ' . $actual);
+ throw new BadRequest('expected filesize ' . $expected . ' got ' . $actual);
}
}
@@ -152,12 +162,12 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
if ($renameOkay === false || $fileExists === false) {
\OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR);
$this->fileView->unlink($partFilePath);
- throw new \Sabre\DAV\Exception('Could not rename part file to final file');
+ throw new Exception('Could not rename part file to final file');
}
}
- catch (\OCP\Files\LockNotAcquiredException $e) {
+ catch (LockNotAcquiredException $e) {
// the file is currently being written to by another process
- throw new \OC\Connector\Sabre\Exception\FileLocked($e->getMessage(), $e->getCode(), $e);
+ throw new FileLocked($e->getMessage(), $e->getCode(), $e);
}
}
@@ -169,8 +179,8 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
}
}
$this->refreshInfo();
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("Failed to check file size: ".$e->getMessage());
+ } catch (StorageNotAvailableException $e) {
+ throw new ServiceUnavailable("Failed to check file size: ".$e->getMessage());
}
return '"' . $this->info->getEtag() . '"';
@@ -179,43 +189,39 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
/**
* Returns the data
* @return string|resource
- * @throws \Sabre\DAV\Exception\Forbidden
- * @throws \Sabre\DAV\Exception\ServiceUnavailable
+ * @throws Forbidden
+ * @throws ServiceUnavailable
*/
public function get() {
//throw exception if encryption is disabled but files are still encrypted
- if (\OC_Util::encryptedFiles()) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("Encryption is disabled");
- } else {
- try {
- return $this->fileView->fopen(ltrim($this->path, '/'), 'rb');
- } catch (\OCA\Files_Encryption\Exception\EncryptionException $e) {
- throw new \Sabre\DAV\Exception\Forbidden($e->getMessage());
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("Failed to open file: ".$e->getMessage());
- }
+ try {
+ return $this->fileView->fopen(ltrim($this->path, '/'), 'rb');
+ } catch (GenericEncryptionException $e) {
+ // returning 503 will allow retry of the operation at a later point in time
+ throw new ServiceUnavailable("Encryption not ready: " . $e->getMessage());
+ } catch (StorageNotAvailableException $e) {
+ throw new ServiceUnavailable("Failed to open file: ".$e->getMessage());
}
-
}
/**
* Delete the current file
- * @throws \Sabre\DAV\Exception\Forbidden
- * @throws \Sabre\DAV\Exception\ServiceUnavailable
+ * @throws Forbidden
+ * @throws ServiceUnavailable
*/
public function delete() {
if (!$this->info->isDeletable()) {
- throw new \Sabre\DAV\Exception\Forbidden();
+ throw new Forbidden();
}
try {
if (!$this->fileView->unlink($this->path)) {
// assume it wasn't possible to delete due to permissions
- throw new \Sabre\DAV\Exception\Forbidden();
+ throw new Forbidden();
}
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("Failed to unlink: ".$e->getMessage());
+ } catch (StorageNotAvailableException $e) {
+ throw new ServiceUnavailable("Failed to unlink: ".$e->getMessage());
}
}
@@ -255,10 +261,10 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
/**
* @param resource $data
* @return null|string
- * @throws \Sabre\DAV\Exception
- * @throws \Sabre\DAV\Exception\BadRequest
- * @throws \Sabre\DAV\Exception\NotImplemented
- * @throws \Sabre\DAV\Exception\ServiceUnavailable
+ * @throws Exception
+ * @throws BadRequest
+ * @throws NotImplemented
+ * @throws ServiceUnavailable
*/
private function createFileChunked($data)
{
@@ -266,7 +272,7 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
$info = \OC_FileChunking::decodeName($name);
if (empty($info)) {
- throw new \Sabre\DAV\Exception\NotImplemented();
+ throw new NotImplemented();
}
$chunk_handler = new \OC_FileChunking($info);
$bytesWritten = $chunk_handler->store($info['index'], $data);
@@ -277,7 +283,7 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
$expected = $_SERVER['CONTENT_LENGTH'];
if ($bytesWritten != $expected) {
$chunk_handler->remove($info['index']);
- throw new \Sabre\DAV\Exception\BadRequest(
+ throw new BadRequest(
'expected filesize ' . $expected . ' got ' . $bytesWritten);
}
}
@@ -303,7 +309,7 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
if ($fileExists) {
$this->fileView->unlink($targetPath);
}
- throw new \Sabre\DAV\Exception('Could not rename part file assembled from chunks');
+ throw new Exception('Could not rename part file assembled from chunks');
}
} else {
// assemble directly into the final file
@@ -320,8 +326,8 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
$info = $this->fileView->getFileInfo($targetPath);
return $info->getEtag();
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- throw new \Sabre\DAV\Exception\ServiceUnavailable("Failed to put file: ".$e->getMessage());
+ } catch (StorageNotAvailableException $e) {
+ throw new ServiceUnavailable("Failed to put file: ".$e->getMessage());
}
}
diff --git a/lib/private/datetimezone.php b/lib/private/datetimezone.php
index acc956e66f3..512c39be3ea 100644
--- a/lib/private/datetimezone.php
+++ b/lib/private/datetimezone.php
@@ -48,13 +48,14 @@ class DateTimeZone implements IDateTimeZone {
/**
* Get the timezone of the current user, based on his session information and config data
*
+ * @param bool|int $timestamp
* @return \DateTimeZone
*/
- public function getTimeZone() {
+ public function getTimeZone($timestamp = false) {
$timeZone = $this->config->getUserValue($this->session->get('user_id'), 'core', 'timezone', null);
if ($timeZone === null) {
if ($this->session->exists('timezone')) {
- return $this->guessTimeZoneFromOffset($this->session->get('timezone'));
+ return $this->guessTimeZoneFromOffset($this->session->get('timezone'), $timestamp);
}
$timeZone = $this->getDefaultTimeZone();
}
@@ -74,9 +75,10 @@ class DateTimeZone implements IDateTimeZone {
* we try to find it manually, before falling back to UTC.
*
* @param mixed $offset
+ * @param bool|int $timestamp
* @return \DateTimeZone
*/
- protected function guessTimeZoneFromOffset($offset) {
+ protected function guessTimeZoneFromOffset($offset, $timestamp) {
try {
// Note: the timeZone name is the inverse to the offset,
// so a positive offset means negative timeZone
@@ -93,7 +95,13 @@ class DateTimeZone implements IDateTimeZone {
// we try to guess one timezone that has the same offset
foreach (\DateTimeZone::listIdentifiers() as $timeZone) {
$dtz = new \DateTimeZone($timeZone);
- $dtOffset = $dtz->getOffset(new \DateTime());
+ $dateTime = new \DateTime();
+
+ if ($timestamp !== false) {
+ $dateTime->setTimestamp($timestamp);
+ }
+
+ $dtOffset = $dtz->getOffset($dateTime);
if ($dtOffset == 3600 * $offset) {
return $dtz;
}
diff --git a/lib/private/encryption/exceptions/decryptionfailedexception.php b/lib/private/encryption/exceptions/decryptionfailedexception.php
new file mode 100644
index 00000000000..406ae12968e
--- /dev/null
+++ b/lib/private/encryption/exceptions/decryptionfailedexception.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class DecryptionFailedException extends GenericEncryptionException {
+
+}
diff --git a/lib/private/encryption/exceptions/emptyencryptiondataexception.php b/lib/private/encryption/exceptions/emptyencryptiondataexception.php
new file mode 100644
index 00000000000..739614b3ec2
--- /dev/null
+++ b/lib/private/encryption/exceptions/emptyencryptiondataexception.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class EmptyEncryptionDataException extends GenericEncryptionException{
+
+}
diff --git a/lib/private/encryption/exceptions/encryptionfailedexception.php b/lib/private/encryption/exceptions/encryptionfailedexception.php
new file mode 100644
index 00000000000..4195ca0a5a8
--- /dev/null
+++ b/lib/private/encryption/exceptions/encryptionfailedexception.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class EncryptionFailedException extends GenericEncryptionException{
+
+}
diff --git a/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php b/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php
index d401f0323ba..d927939484f 100644
--- a/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php
+++ b/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php
@@ -1,29 +1,35 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption\Exceptions;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
-class EncryptionHeaderKeyExistsException extends \Exception {
+class EncryptionHeaderKeyExistsException extends GenericEncryptionException {
-} \ No newline at end of file
+ /**
+ * @param string $key
+ */
+ public function __construct($key) {
+ parent::__construct('header key "'. $key . '" already reserved by ownCloud');
+ }
+}
diff --git a/lib/private/encryption/exceptions/encryptionheadertolargeexception.php b/lib/private/encryption/exceptions/encryptionheadertolargeexception.php
new file mode 100644
index 00000000000..40c51782a32
--- /dev/null
+++ b/lib/private/encryption/exceptions/encryptionheadertolargeexception.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class EncryptionHeaderToLargeException extends GenericEncryptionException {
+
+ public function __construct() {
+ parent::__construct('max header size exceeded');
+ }
+
+}
diff --git a/lib/private/encryption/exceptions/modulealreadyexistsexception.php b/lib/private/encryption/exceptions/modulealreadyexistsexception.php
index 41fc0188e24..c72ad7b7ab2 100644
--- a/lib/private/encryption/exceptions/modulealreadyexistsexception.php
+++ b/lib/private/encryption/exceptions/modulealreadyexistsexception.php
@@ -1,28 +1,37 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption\Exceptions;
-class ModuleAlreadyExistsException extends \Exception {
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class ModuleAlreadyExistsException extends GenericEncryptionException {
+
+ /**
+ * @param string $id
+ * @param string $name
+ */
+ public function __construct($id, $name) {
+ parent::__construct('Id "' . $id . '" already used by encryption module "' . $name . '"');
+ }
}
diff --git a/lib/private/encryption/exceptions/moduledoesnotexistsexception.php b/lib/private/encryption/exceptions/moduledoesnotexistsexception.php
index 5507bd03dab..d6fbb2b6e51 100644
--- a/lib/private/encryption/exceptions/moduledoesnotexistsexception.php
+++ b/lib/private/encryption/exceptions/moduledoesnotexistsexception.php
@@ -1,28 +1,29 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption\Exceptions;
-class ModuleDoesNotExistsException extends \Exception {
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class ModuleDoesNotExistsException extends GenericEncryptionException {
}
diff --git a/lib/private/encryption/exceptions/unknowncipherexception.php b/lib/private/encryption/exceptions/unknowncipherexception.php
new file mode 100644
index 00000000000..91535183169
--- /dev/null
+++ b/lib/private/encryption/exceptions/unknowncipherexception.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class UnknownCipherException extends GenericEncryptionException {
+
+}
diff --git a/lib/private/encryption/file.php b/lib/private/encryption/file.php
new file mode 100644
index 00000000000..48cd0d1187b
--- /dev/null
+++ b/lib/private/encryption/file.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Encryption;
+
+class File implements \OCP\Encryption\IFile {
+
+ /** @var Util */
+ protected $util;
+
+ public function __construct(Util $util) {
+ $this->util = $util;
+ }
+
+
+ /**
+ * get list of users with access to the file
+ *
+ * @param string $path to the file
+ * @return array
+ */
+ public function getAccessList($path) {
+
+ // Make sure that a share key is generated for the owner too
+ list($owner, $ownerPath) = $this->util->getUidAndFilename($path);
+
+ // always add owner to the list of users with access to the file
+ $userIds = array($owner);
+
+ if (!$this->util->isFile($ownerPath)) {
+ return array('users' => $userIds, 'public' => false);
+ }
+
+ $ownerPath = substr($ownerPath, strlen('/files'));
+ $ownerPath = $this->util->stripPartialFileExtension($ownerPath);
+
+ // Find out who, if anyone, is sharing the file
+ $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner);
+ $userIds = \array_merge($userIds, $result['users']);
+ $public = $result['public'] || $result['remote'];
+
+ // check if it is a group mount
+ if (\OCP\App::isEnabled("files_external")) {
+ $mounts = \OC_Mount_Config::getSystemMountPoints();
+ foreach ($mounts as $mount) {
+ if ($mount['mountpoint'] == substr($ownerPath, 1, strlen($mount['mountpoint']))) {
+ $mountedFor = $this->util->getUserWithAccessToMountPoint($mount['applicable']['users'], $mount['applicable']['groups']);
+ $userIds = array_merge($userIds, $mountedFor);
+ }
+ }
+ }
+
+ // Remove duplicate UIDs
+ $uniqueUserIds = array_unique($userIds);
+
+ return array('users' => $uniqueUserIds, 'public' => $public);
+ }
+
+}
diff --git a/lib/private/encryption/keys/factory.php b/lib/private/encryption/keys/factory.php
index a214b238615..0e2b0292a68 100644
--- a/lib/private/encryption/keys/factory.php
+++ b/lib/private/encryption/keys/factory.php
@@ -1,24 +1,22 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption\Keys;
diff --git a/lib/private/encryption/keys/storage.php b/lib/private/encryption/keys/storage.php
index 041db2a2cb8..40bd3056b1a 100644
--- a/lib/private/encryption/keys/storage.php
+++ b/lib/private/encryption/keys/storage.php
@@ -1,31 +1,30 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption\Keys;
use OC\Encryption\Util;
use OC\Files\View;
-use OCA\Files_Encryption\Exception\EncryptionException;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
class Storage implements \OCP\Encryption\Keys\IStorage {
@@ -253,13 +252,13 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
*
* @param string $path path to the file, relative to data/
* @return string
- * @throws EncryptionException
+ * @throws GenericEncryptionException
* @internal param string $keyId
*/
private function getFileKeyDir($path) {
if ($this->view->is_dir($path)) {
- throw new EncryptionException('file was expected but directory was given', EncryptionException::GENERIC);
+ throw new GenericEncryptionException("file was expected but directory was given: $path");
}
list($owner, $filename) = $this->util->getUidAndFilename($path);
@@ -283,7 +282,12 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
* @param string $owner
* @param bool $systemWide
*/
- public function renameKeys($source, $target, $owner, $systemWide) {
+ public function renameKeys($source, $target) {
+
+ list($owner, $source) = $this->util->getUidAndFilename($source);
+ list(, $target) = $this->util->getUidAndFilename($target);
+ $systemWide = $this->util->isSystemWideMountPoint($target);
+
if ($systemWide) {
$sourcePath = $this->keys_base_dir . $source . '/';
$targetPath = $this->keys_base_dir . $target . '/';
@@ -299,6 +303,34 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
}
/**
+ * copy keys if a file was renamed
+ *
+ * @param string $source
+ * @param string $target
+ * @param string $owner
+ * @param bool $systemWide
+ */
+ public function copyKeys($source, $target) {
+
+ list($owner, $source) = $this->util->getUidAndFilename($source);
+ list(, $target) = $this->util->getUidAndFilename($target);
+ $systemWide = $this->util->isSystemWideMountPoint($target);
+
+ if ($systemWide) {
+ $sourcePath = $this->keys_base_dir . $source . '/';
+ $targetPath = $this->keys_base_dir . $target . '/';
+ } else {
+ $sourcePath = '/' . $owner . $this->keys_base_dir . $source . '/';
+ $targetPath = '/' . $owner . $this->keys_base_dir . $target . '/';
+ }
+
+ if ($this->view->file_exists($sourcePath)) {
+ $this->keySetPreparation(dirname($targetPath));
+ $this->view->copy($sourcePath, $targetPath);
+ }
+ }
+
+ /**
* Make preparations to filesystem for saving a keyfile
*
* @param string $path relative to the views root
@@ -306,7 +338,7 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
protected function keySetPreparation($path) {
// If the file resides within a subdirectory, create it
if (!$this->view->file_exists($path)) {
- $sub_dirs = explode('/', $path);
+ $sub_dirs = explode('/', ltrim($path, '/'));
$dir = '';
foreach ($sub_dirs as $sub_dir) {
$dir .= '/' . $sub_dir;
diff --git a/lib/private/encryption/manager.php b/lib/private/encryption/manager.php
index 5164025239c..74cad0a75bb 100644
--- a/lib/private/encryption/manager.php
+++ b/lib/private/encryption/manager.php
@@ -1,29 +1,30 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption;
+use OC\Files\Storage\Wrapper\Encryption;
use OCP\Encryption\IEncryptionModule;
+use OCP\Files\Mount\IMountPoint;
class Manager implements \OCP\Encryption\IManager {
@@ -66,10 +67,9 @@ class Manager implements \OCP\Encryption\IManager {
public function registerEncryptionModule(IEncryptionModule $module) {
$id = $module->getId();
$name = $module->getDisplayName();
- if (isset($this->encryptionModules[$id])) {
- $message = 'Id "' . $id . '" already used by encryption module "' . $name . '"';
- throw new Exceptions\ModuleAlreadyExistsException($message);
+ if (isset($this->encryptionModules[$id])) {
+ throw new Exceptions\ModuleAlreadyExistsException($id, $name);
}
$defaultEncryptionModuleId = $this->getDefaultEncryptionModuleId();
@@ -106,12 +106,24 @@ class Manager implements \OCP\Encryption\IManager {
* @return IEncryptionModule
* @throws Exceptions\ModuleDoesNotExistsException
*/
- public function getEncryptionModule($moduleId) {
- if (isset($this->encryptionModules[$moduleId])) {
- return $this->encryptionModules[$moduleId];
- } else {
- $message = "Module with id: $moduleId does not exists.";
- throw new Exceptions\ModuleDoesNotExistsException($message);
+ public function getEncryptionModule($moduleId = '') {
+ if (!empty($moduleId)) {
+ if (isset($this->encryptionModules[$moduleId])) {
+ return $this->encryptionModules[$moduleId];
+ } else {
+ $message = "Module with id: $moduleId does not exists.";
+ throw new Exceptions\ModuleDoesNotExistsException($message);
+ }
+ } else { // get default module and return this
+ // For now we simply return the first module until we have a way
+ // to enable multiple modules and define a default module
+ $module = reset($this->encryptionModules);
+ if ($module) {
+ return $module;
+ } else {
+ $message = 'No encryption module registered';
+ throw new Exceptions\ModuleDoesNotExistsException($message);
+ }
}
}
@@ -166,5 +178,25 @@ class Manager implements \OCP\Encryption\IManager {
}
}
-
+ public static function setupStorage() {
+ \OC\Files\Filesystem::addStorageWrapper('oc_encryption', function ($mountPoint, $storage, IMountPoint $mount) {
+ $parameters = [
+ 'storage' => $storage,
+ 'mountPoint' => $mountPoint,
+ 'mount' => $mount];
+
+ if (!($storage instanceof \OC\Files\Storage\Shared)) {
+ $manager = \OC::$server->getEncryptionManager();
+ $util = new \OC\Encryption\Util(
+ new \OC\Files\View(), \OC::$server->getUserManager(), \OC::$server->getConfig());
+ $user = \OC::$server->getUserSession()->getUser();
+ $logger = \OC::$server->getLogger();
+ $uid = $user ? $user->getUID() : null;
+ $fileHelper = \OC::$server->getEncryptionFilesHelper();
+ return new Encryption($parameters, $manager, $util, $logger, $fileHelper, $uid);
+ } else {
+ return $storage;
+ }
+ }, 2);
+ }
}
diff --git a/lib/private/encryption/update.php b/lib/private/encryption/update.php
index 06dc330151e..7a170a03adc 100644
--- a/lib/private/encryption/update.php
+++ b/lib/private/encryption/update.php
@@ -1,24 +1,23 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption;
@@ -46,12 +45,16 @@ class Update {
/** @var string */
protected $uid;
+ /** @var \OC\Encryption\File */
+ protected $file;
+
/**
*
* @param \OC\Files\View $view
* @param \OC\Encryption\Util $util
* @param \OC\Files\Mount\Manager $mountManager
* @param \OC\Encryption\Manager $encryptionManager
+ * @param \OC\Encryption\File $file
* @param string $uid
*/
public function __construct(
@@ -59,6 +62,7 @@ class Update {
Util $util,
Mount\Manager $mountManager,
Manager $encryptionManager,
+ File $file,
$uid
) {
@@ -66,6 +70,7 @@ class Update {
$this->util = $util;
$this->mountManager = $mountManager;
$this->encryptionManager = $encryptionManager;
+ $this->file = $file;
$this->uid = $uid;
}
@@ -87,25 +92,29 @@ class Update {
* @param int $fileSource file source id
*/
private function update($fileSource) {
- $path = \OC\Files\Filesystem::getPath($fileSource);
- $absPath = '/' . $this->uid . '/files' . $path;
-
- $mount = $this->mountManager->find($path);
- $mountPoint = $mount->getMountPoint();
-
- // if a folder was shared, get a list of all (sub-)folders
- if ($this->view->is_dir($absPath)) {
- $allFiles = $this->util->getAllFiles($absPath, $mountPoint);
- } else {
- $allFiles = array($absPath);
- }
+ $path = \OC\Files\Filesystem::getPath($fileSource);
+ $info = \OC\Files\Filesystem::getFileInfo($path);
+ $owner = \OC\Files\Filesystem::getOwner($path);
+ $view = new \OC\Files\View('/' . $owner . '/files');
+ $ownerPath = $view->getPath($info->getId());
+ $absPath = '/' . $owner . '/files' . $ownerPath;
+
+ $mount = $this->mountManager->find($path);
+ $mountPoint = $mount->getMountPoint();
+
+ // if a folder was shared, get a list of all (sub-)folders
+ if ($this->view->is_dir($absPath)) {
+ $allFiles = $this->util->getAllFiles($absPath, $mountPoint);
+ } else {
+ $allFiles = array($absPath);
+ }
- $encryptionModule = $this->encryptionManager->getDefaultEncryptionModule();
+ $encryptionModule = $this->encryptionManager->getDefaultEncryptionModule();
- foreach ($allFiles as $path) {
- $usersSharing = $this->util->getSharingUsersArray($path);
- $encryptionModule->update($absPath, $this->uid, $usersSharing);
- }
+ foreach ($allFiles as $path) {
+ $usersSharing = $this->file->getAccessList($path);
+ $encryptionModule->update($path, $this->uid, $usersSharing);
+ }
}
-} \ No newline at end of file
+}
diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php
index 85e852ec2c9..e7cf607c7b1 100644
--- a/lib/private/encryption/util.php
+++ b/lib/private/encryption/util.php
@@ -1,31 +1,32 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Encryption;
-use OC\Encryption\Exceptions\EncryptionHeaderToLargeException;
use OC\Encryption\Exceptions\EncryptionHeaderKeyExistsException;
+use OC\Encryption\Exceptions\EncryptionHeaderToLargeException;
+use OC\Files\View;
use OCP\Encryption\IEncryptionModule;
+use OCP\IConfig;
class Util {
@@ -49,7 +50,7 @@ class Util {
*/
protected $blockSize = 8192;
- /** @var \OC\Files\View */
+ /** @var View */
protected $view;
/** @var array */
@@ -58,19 +59,30 @@ class Util {
/** @var \OC\User\Manager */
protected $userManager;
+ /** @var IConfig */
+ protected $config;
+
/** @var array paths excluded from encryption */
protected $excludedPaths;
/**
- * @param \OC\Files\View $view root view
+ *
+ * @param \OC\Files\View $view
+ * @param \OC\User\Manager $userManager
+ * @param IConfig $config
*/
- public function __construct(\OC\Files\View $view, \OC\User\Manager $userManager) {
+ public function __construct(
+ \OC\Files\View $view,
+ \OC\User\Manager $userManager,
+ IConfig $config) {
+
$this->ocHeaderKeys = [
self::HEADER_ENCRYPTION_MODULE_KEY
];
$this->view = $view;
$this->userManager = $userManager;
+ $this->config = $config;
$this->excludedPaths[] = 'files_encryption';
}
@@ -81,7 +93,7 @@ class Util {
* @param array $header
* @return string
*/
- public function getEncryptionModuleId(array $header) {
+ public function getEncryptionModuleId(array $header = null) {
$id = '';
$encryptionModuleKey = self::HEADER_ENCRYPTION_MODULE_KEY;
@@ -134,14 +146,14 @@ class Util {
$header = self::HEADER_START . ':' . self::HEADER_ENCRYPTION_MODULE_KEY . ':' . $encryptionModule->getId() . ':';
foreach ($headerData as $key => $value) {
if (in_array($key, $this->ocHeaderKeys)) {
- throw new EncryptionHeaderKeyExistsException('header key "'. $key . '" already reserved by ownCloud');
+ throw new EncryptionHeaderKeyExistsException($key);
}
$header .= $key . ':' . $value . ':';
}
$header .= self::HEADER_END;
if (strlen($header) > $this->getHeaderSize()) {
- throw new EncryptionHeaderToLargeException('max header size exceeded', EncryptionException::ENCRYPTION_HEADER_TO_LARGE);
+ throw new EncryptionHeaderToLargeException();
}
$paddedHeader = str_pad($header, $this->headerSize, self::HEADER_PADDING_CHAR, STR_PAD_RIGHT);
@@ -150,53 +162,10 @@ class Util {
}
/**
- * Find, sanitise and format users sharing a file
- * @note This wraps other methods into a portable bundle
- * @param string $path path relative to current users files folder
- * @return array
- */
- public function getSharingUsersArray($path) {
-
- // Make sure that a share key is generated for the owner too
- list($owner, $ownerPath) = $this->getUidAndFilename($path);
-
- // always add owner to the list of users with access to the file
- $userIds = array($owner);
-
- if (!$this->isFile($ownerPath)) {
- return array('users' => $userIds, 'public' => false);
- }
-
- $ownerPath = substr($ownerPath, strlen('/files'));
- $ownerPath = $this->stripPartialFileExtension($ownerPath);
-
- // Find out who, if anyone, is sharing the file
- $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner);
- $userIds = \array_merge($userIds, $result['users']);
- $public = $result['public'] || $result['remote'];
-
- // check if it is a group mount
- if (\OCP\App::isEnabled("files_external")) {
- $mounts = \OC_Mount_Config::getSystemMountPoints();
- foreach ($mounts as $mount) {
- if ($mount['mountpoint'] == substr($ownerPath, 1, strlen($mount['mountpoint']))) {
- $mountedFor = $this->getUserWithAccessToMountPoint($mount['applicable']['users'], $mount['applicable']['groups']);
- $userIds = array_merge($userIds, $mountedFor);
- }
- }
- }
-
- // Remove duplicate UIDs
- $uniqueUserIds = array_unique($userIds);
-
- return array('users' => $uniqueUserIds, 'public' => $public);
- }
-
- /**
* go recursively through a dir and collect all files and sub files.
*
* @param string $dir relative to the users files folder
- * @param strinf $mountPoint
+ * @param string $mountPoint
* @return array with list of files relative to the users files folder
*/
public function getAllFiles($dir, $mountPoint = '') {
@@ -210,11 +179,11 @@ class Util {
foreach ($content as $c) {
// getDirectoryContent() returns the paths relative to the mount points, so we need
// to re-construct the complete path
- $path = ($mountPoint !== '') ? $mountPoint . '/' . $c['path'] : $c['path'];
+ $path = ($mountPoint !== '') ? $mountPoint . '/' . $c->getPath() : $c->getPath();
if ($c['type'] === 'dir') {
- $dirList[] = $path;
+ $dirList[] = \OC\Files\Filesystem::normalizePath($path);
} else {
- $result[] = $path;
+ $result[] = \OC\Files\Filesystem::normalizePath($path);
}
}
@@ -230,7 +199,7 @@ class Util {
* @param string $path
* @return boolean
*/
- protected function isFile($path) {
+ public function isFile($path) {
if (substr($path, 0, strlen('/files/')) === '/files/') {
return true;
}
@@ -256,7 +225,7 @@ class Util {
}
/**
- * get the owner and the path for the owner
+ * get the owner and the path for the file relative to the owners files folder
*
* @param string $path
* @return array
@@ -270,55 +239,15 @@ class Util {
$uid = $parts[1];
}
if (!$this->userManager->userExists($uid)) {
- throw new \BadMethodCallException('path needs to be relative to the system wide data folder and point to a user specific file');
- }
-
- $pathinfo = pathinfo($path);
- $partfile = false;
- $parentFolder = false;
- if (array_key_exists('extension', $pathinfo) && $pathinfo['extension'] === 'part') {
- // if the real file exists we check this file
- $filePath = $pathinfo['dirname'] . '/' . $pathinfo['filename'];
- if ($this->view->file_exists($filePath)) {
- $pathToCheck = $pathinfo['dirname'] . '/' . $pathinfo['filename'];
- } else { // otherwise we look for the parent
- $pathToCheck = $pathinfo['dirname'];
- $parentFolder = true;
- }
- $partfile = true;
- } else {
- $pathToCheck = $path;
- }
-
- $pathToCheck = substr($pathToCheck, strlen('/' . $uid));
-
- $this->view->chroot('/' . $uid);
- $owner = $this->view->getOwner($pathToCheck);
-
- // Check that UID is valid
- if (!$this->userManager->userExists($owner)) {
- throw new \BadMethodCallException('path needs to be relative to the system wide data folder and point to a user specific file');
+ throw new \BadMethodCallException(
+ 'path needs to be relative to the system wide data folder and point to a user specific file'
+ );
}
- \OC\Files\Filesystem::initMountPoints($owner);
+ $ownerPath = implode('/', array_slice($parts, 2));
- $info = $this->view->getFileInfo($pathToCheck);
- $this->view->chroot('/' . $owner);
- $ownerPath = $this->view->getPath($info->getId());
- $this->view->chroot('/');
+ return array($uid, \OC\Files\Filesystem::normalizePath($ownerPath));
- if ($parentFolder) {
- $ownerPath = $ownerPath . '/'. $pathinfo['filename'];
- }
-
- if ($partfile) {
- $ownerPath = $ownerPath . '.' . $pathinfo['extension'];
- }
-
- return array(
- $owner,
- \OC\Files\Filesystem::normalizePath($ownerPath)
- );
}
/**
@@ -348,7 +277,7 @@ class Util {
}
}
- protected function getUserWithAccessToMountPoint($users, $groups) {
+ public function getUserWithAccessToMountPoint($users, $groups) {
$result = array();
if (in_array('all', $users)) {
$result = \OCP\User::getUsers();
@@ -398,9 +327,6 @@ class Util {
return true;
}
- $v1 = $this->userManager->userExists($root[1]);
- $v2 = in_array($root[2], $this->excludedPaths);
-
// detect user specific folders
if ($this->userManager->userExists($root[1])
&& in_array($root[2], $this->excludedPaths)) {
@@ -411,4 +337,16 @@ class Util {
return false;
}
+ /**
+ * check if recovery key is enabled for user
+ *
+ * @param string $uid
+ * @return boolean
+ */
+ public function recoveryEnabled($uid) {
+ $enabled = $this->config->getUserValue($uid, 'encryption', 'recovery_enabled', '0');
+
+ return ($enabled === '1') ? true : false;
+ }
+
}
diff --git a/lib/private/filechunking.php b/lib/private/filechunking.php
index e8a58b2538d..82bf61fa7b1 100644
--- a/lib/private/filechunking.php
+++ b/lib/private/filechunking.php
@@ -189,8 +189,7 @@ class OC_FileChunking {
$absolutePath = \OC\Files\Filesystem::normalizePath(\OC\Files\Filesystem::getView()->getAbsolutePath($path));
$data = '';
// use file_put_contents as method because that best matches what this function does
- if (OC_FileProxy::runPreProxies('file_put_contents', $absolutePath, $data)
- && \OC\Files\Filesystem::isValidPath($path)) {
+ if (\OC\Files\Filesystem::isValidPath($path)) {
$path = \OC\Files\Filesystem::getView()->getRelativePath($absolutePath);
$exists = \OC\Files\Filesystem::file_exists($path);
$run = true;
@@ -231,7 +230,6 @@ class OC_FileChunking {
\OC\Files\Filesystem::signal_post_write,
array( \OC\Files\Filesystem::signal_param_path => $path)
);
- OC_FileProxy::runPostProxies('file_put_contents', $absolutePath, $count);
return $count > 0;
}else{
return false;
diff --git a/lib/private/fileproxy.php b/lib/private/fileproxy.php
deleted file mode 100644
index 8b28e866ac2..00000000000
--- a/lib/private/fileproxy.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-/**
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Felix Moeller <mail@felixmoeller.de>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
- * @author Scrutinizer Auto-Fixer <auto-fixer@scrutinizer-ci.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@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/>
- *
- */
-
-/**
- * Class for manipulating filesystem requests
- *
- * Manipulation happens by using 2 kind of proxy operations, pre and post proxies
- * that manipulate the filesystem call and the result of the call respectively
- *
- * A pre-proxy recieves the filepath as arugments (or 2 filespaths in case of
- * operations like copy or move) and return a boolean
- * If a pre-proxy returns false the file operation will be canceled
- * All filesystem operations have a pre-proxy
- *
- * A post-proxy recieves 2 arguments, the filepath and the result of the operation.
- * The return value of the post-proxy will be used as the new result of the operation
- * The operations that have a post-proxy are:
- * file_get_contents, is_file, is_dir, file_exists, stat, is_readable,
- * is_writable, filemtime, filectime, file_get_contents,
- * getMimeType, hash, fopen, free_space and search
- */
-
-class OC_FileProxy{
- private static $proxies=array();
- public static $enabled=true;
-
- /**
- * fallback function when a proxy operation is not implemented
- * @param string $function the name of the proxy operation
- * @param mixed $arguments
- *
- * this implements a dummy proxy for all operations
- */
- public function __call($function, $arguments) {
- if(substr($function, 0, 3)=='pre') {
- return true;
- }else{
- return $arguments[1];
- }
- }
-
- /**
- * register a proxy to be used
- * @param OC_FileProxy $proxy
- */
- public static function register($proxy) {
- self::$proxies[]=$proxy;
- }
-
- /**
- * @param string $operation
- */
- public static function getProxies($operation = null) {
- if ($operation === null) {
- // return all
- return self::$proxies;
- }
- $proxies=array();
- foreach(self::$proxies as $proxy) {
- if(method_exists($proxy, $operation)) {
- $proxies[]=$proxy;
- }
- }
- return $proxies;
- }
-
- /**
- * @param string $operation
- * @param string|boolean $filepath
- */
- public static function runPreProxies($operation,&$filepath,&$filepath2=null) {
- if(!self::$enabled) {
- return true;
- }
- $operation='pre'.$operation;
- $proxies=self::getProxies($operation);
- foreach($proxies as $proxy) {
- if(!is_null($filepath2)) {
- if($proxy->$operation($filepath, $filepath2)===false) {
- return false;
- }
- }else{
- if($proxy->$operation($filepath)===false) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * @param string $operation
- * @param string|boolean $path
- *
- * @return string
- */
- public static function runPostProxies($operation, $path, $result) {
- if(!self::$enabled) {
- return $result;
- }
- $operation='post'.$operation;
- $proxies=self::getProxies($operation);
- foreach($proxies as $proxy) {
- $result=$proxy->$operation($path, $result);
- }
- return $result;
- }
-
- public static function clearProxies() {
- self::$proxies=array();
- }
-}
diff --git a/lib/private/files.php b/lib/private/files.php
index 0f48dca9715..97f9d8163b1 100644
--- a/lib/private/files.php
+++ b/lib/private/files.php
@@ -69,7 +69,7 @@ class OC_Files {
$filesize = \OC\Files\Filesystem::filesize($filename);
header('Content-Type: '.\OC_Helper::getSecureMimeType(\OC\Files\Filesystem::getMimeType($filename)));
if ($filesize > -1) {
- header("Content-Length: ".$filesize);
+ OC_Response::setContentLengthHeader($filesize);
}
}
}
@@ -122,7 +122,7 @@ class OC_Files {
if ($get_type === self::FILE) {
$zip = false;
- if ($xsendfile && OC_App::isEnabled('files_encryption')) {
+ if ($xsendfile && \OC::$server->getEncryptionManager()->isEnabled()) {
$xsendfile = false;
}
} else {
diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php
index 1d012268970..c5e118946e5 100644
--- a/lib/private/files/cache/cache.php
+++ b/lib/private/files/cache/cache.php
@@ -152,7 +152,7 @@ class Cache {
$params = array($file);
}
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
- `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
+ `storage_mtime`, `encrypted`, `etag`, `permissions`
FROM `*PREFIX*filecache` ' . $where;
$result = \OC_DB::executeAudited($sql, $params);
$data = $result->fetchRow();
@@ -175,7 +175,6 @@ class Cache {
$data['mtime'] = (int)$data['mtime'];
$data['storage_mtime'] = (int)$data['storage_mtime'];
$data['encrypted'] = (bool)$data['encrypted'];
- $data['unencrypted_size'] = 0 + $data['unencrypted_size'];
$data['storage'] = $this->storageId;
$data['mimetype'] = $this->getMimetype($data['mimetype']);
$data['mimepart'] = $this->getMimetype($data['mimepart']);
@@ -208,7 +207,7 @@ class Cache {
public function getFolderContentsById($fileId) {
if ($fileId > -1) {
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
- `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
+ `storage_mtime`, `encrypted`, `etag`, `permissions`
FROM `*PREFIX*filecache` WHERE `parent` = ? ORDER BY `name` ASC';
$result = \OC_DB::executeAudited($sql, array($fileId));
$files = $result->fetchAll();
@@ -218,10 +217,6 @@ class Cache {
if ($file['storage_mtime'] == 0) {
$file['storage_mtime'] = $file['mtime'];
}
- if ($file['encrypted'] or ($file['unencrypted_size'] > 0 and $file['mimetype'] === 'httpd/unix-directory')) {
- $file['encrypted_size'] = $file['size'];
- $file['size'] = $file['unencrypted_size'];
- }
$file['permissions'] = (int)$file['permissions'];
$file['mtime'] = (int)$file['mtime'];
$file['storage_mtime'] = (int)$file['storage_mtime'];
@@ -287,7 +282,7 @@ class Cache {
$this->update($id, $data);
return $id;
} else {
- throw new \RuntimeException('File entry exists when inserting and does not exist on select... go away');
+ throw new \RuntimeException('File entry could not be inserted with insertIfNotExist() but could also not be selected with getId() in order to perform an update. Please try again.');
}
}
}
@@ -325,7 +320,7 @@ class Cache {
*/
function buildParts(array $data) {
$fields = array(
- 'path', 'parent', 'name', 'mimetype', 'size', 'mtime', 'storage_mtime', 'encrypted', 'unencrypted_size',
+ 'path', 'parent', 'name', 'mimetype', 'size', 'mtime', 'storage_mtime', 'encrypted',
'etag', 'permissions');
$params = array();
$queryParts = array();
@@ -521,7 +516,7 @@ class Cache {
$sql = '
SELECT `fileid`, `storage`, `path`, `parent`, `name`,
`mimetype`, `mimepart`, `size`, `mtime`, `encrypted`,
- `unencrypted_size`, `etag`, `permissions`
+ `etag`, `permissions`
FROM `*PREFIX*filecache`
WHERE `storage` = ? AND `name` ILIKE ?';
$result = \OC_DB::executeAudited($sql,
@@ -549,7 +544,7 @@ class Cache {
} else {
$where = '`mimepart` = ?';
}
- $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
+ $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `etag`, `permissions`
FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `storage` = ?';
$mimetype = $this->getMimetypeId($mimetype);
$result = \OC_DB::executeAudited($sql, array($mimetype, $this->getNumericStorageId()));
@@ -574,7 +569,7 @@ class Cache {
public function searchByTag($tag, $userId) {
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, ' .
'`mimetype`, `mimepart`, `size`, `mtime`, ' .
- '`encrypted`, `unencrypted_size`, `etag`, `permissions` ' .
+ '`encrypted`, `etag`, `permissions` ' .
'FROM `*PREFIX*filecache` `file`, ' .
'`*PREFIX*vcategory_to_object` `tagmap`, ' .
'`*PREFIX*vcategory` `tag` ' .
@@ -638,17 +633,15 @@ class Cache {
}
if (isset($entry['mimetype']) && $entry['mimetype'] === 'httpd/unix-directory') {
$id = $entry['fileid'];
- $sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2, ' .
- 'SUM(`unencrypted_size`) AS f3 ' .
+ $sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2 ' .
'FROM `*PREFIX*filecache` ' .
'WHERE `parent` = ? AND `storage` = ?';
$result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId()));
if ($row = $result->fetchRow()) {
$result->closeCursor();
- list($sum, $min, $unencryptedSum) = array_values($row);
+ list($sum, $min) = array_values($row);
$sum = 0 + $sum;
$min = 0 + $min;
- $unencryptedSum = 0 + $unencryptedSum;
if ($min === -1) {
$totalSize = $min;
} else {
@@ -658,15 +651,9 @@ class Cache {
if ($entry['size'] !== $totalSize) {
$update['size'] = $totalSize;
}
- if (!isset($entry['unencrypted_size']) or $entry['unencrypted_size'] !== $unencryptedSum) {
- $update['unencrypted_size'] = $unencryptedSum;
- }
if (count($update) > 0) {
$this->update($id, $update);
}
- if ($totalSize !== -1 and $unencryptedSum > 0) {
- $totalSize = $unencryptedSum;
- }
} else {
$result->closeCursor();
}
diff --git a/lib/private/files/cache/homecache.php b/lib/private/files/cache/homecache.php
index aa075d41221..1b85462d615 100644
--- a/lib/private/files/cache/homecache.php
+++ b/lib/private/files/cache/homecache.php
@@ -48,26 +48,18 @@ class HomeCache extends Cache {
}
if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
$id = $entry['fileid'];
- $sql = 'SELECT SUM(`size`) AS f1, ' .
- 'SUM(`unencrypted_size`) AS f2 FROM `*PREFIX*filecache` ' .
+ $sql = 'SELECT SUM(`size`) AS f1 ' .
+ 'FROM `*PREFIX*filecache` ' .
'WHERE `parent` = ? AND `storage` = ? AND `size` >= 0';
$result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId()));
if ($row = $result->fetchRow()) {
$result->closeCursor();
- list($sum, $unencryptedSum) = array_values($row);
+ list($sum) = array_values($row);
$totalSize = 0 + $sum;
- $unencryptedSize = 0 + $unencryptedSum;
$entry['size'] += 0;
- if (!isset($entry['unencrypted_size'])) {
- $entry['unencrypted_size'] = 0;
- }
- $entry['unencrypted_size'] += 0;
if ($entry['size'] !== $totalSize) {
$this->update($id, array('size' => $totalSize));
}
- if ($entry['unencrypted_size'] !== $unencryptedSize) {
- $this->update($id, array('unencrypted_size' => $unencryptedSize));
- }
}
}
return $totalSize;
diff --git a/lib/private/files/cache/storage.php b/lib/private/files/cache/storage.php
index 86803b5f01d..2007f0c9e3d 100644
--- a/lib/private/files/cache/storage.php
+++ b/lib/private/files/cache/storage.php
@@ -62,7 +62,7 @@ class Storage {
if ($row = $result->fetchRow()) {
$this->numericId = $row['numeric_id'];
} else {
- throw new \RuntimeException('Storage exists when inserting and does not exist on select... go away');
+ throw new \RuntimeException('Storage could neither be inserted nor be selected from the database');
}
}
}
diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php
index 03aad56e103..82c8f3de690 100644
--- a/lib/private/files/fileinfo.php
+++ b/lib/private/files/fileinfo.php
@@ -170,13 +170,6 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess {
/**
* @return int
*/
- public function getUnencryptedSize() {
- return isset($this->data['unencrypted_size']) ? $this->data['unencrypted_size'] : 0;
- }
-
- /**
- * @return int
- */
public function getPermissions() {
return $this->data['permissions'];
}
diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php
index eef76125311..95e630b7765 100644
--- a/lib/private/files/filesystem.php
+++ b/lib/private/files/filesystem.php
@@ -349,7 +349,7 @@ class Filesystem {
return true;
}
- static public function initMounts() {
+ static public function initMountManager() {
if (!self::$mounts) {
self::$mounts = new Mount\Manager();
}
diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php
index 9fef53fa95a..ed85d3c07cc 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/files/storage/common.php
@@ -56,6 +56,9 @@ use OCP\Files\ReservedWordException;
* in classes which extend it, e.g. $this->stat() .
*/
abstract class Common implements Storage {
+
+ use LocalTempFileTrait;
+
protected $cache;
protected $scanner;
protected $watcher;
@@ -63,11 +66,6 @@ abstract class Common implements Storage {
protected $mountOptions = [];
- /**
- * @var string[]
- */
- protected $cachedFiles = array();
-
public function __construct($parameters) {
}
@@ -247,27 +245,6 @@ abstract class Common implements Storage {
return $this->getCachedFile($path);
}
- /**
- * @param string $path
- * @return string
- */
- protected function toTmpFile($path) { //no longer in the storage api, still useful here
- $source = $this->fopen($path, 'r');
- if (!$source) {
- return false;
- }
- if ($pos = strrpos($path, '.')) {
- $extension = substr($path, $pos);
- } else {
- $extension = '';
- }
- $tmpFile = \OC_Helper::tmpFile($extension);
- $target = fopen($tmpFile, 'w');
- \OC_Helper::streamCopy($source, $target);
- fclose($target);
- return $tmpFile;
- }
-
public function getLocalFolder($path) {
$baseDir = \OC_Helper::tmpFolder();
$this->addLocalFolder($path, $baseDir);
@@ -451,20 +428,6 @@ abstract class Common implements Storage {
}
/**
- * @param string $path
- */
- protected function getCachedFile($path) {
- if (!isset($this->cachedFiles[$path])) {
- $this->cachedFiles[$path] = $this->toTmpFile($path);
- }
- return $this->cachedFiles[$path];
- }
-
- protected function removeCachedFile($path) {
- unset($this->cachedFiles[$path]);
- }
-
- /**
* Check if the storage is an instance of $class or is a wrapper for a storage that is an instance of $class
*
* @param string $class
diff --git a/lib/private/files/storage/local.php b/lib/private/files/storage/local.php
index cf82e218969..6bd9b4401d6 100644
--- a/lib/private/files/storage/local.php
+++ b/lib/private/files/storage/local.php
@@ -228,6 +228,19 @@ if (\OC_Util::runningOnWindows()) {
$this->unlink($path2);
}
+ if ($this->is_dir($path1)) {
+ // we cant move folders across devices, use copy instead
+ $stat1 = stat(dirname($this->getSourcePath($path1)));
+ $stat2 = stat(dirname($this->getSourcePath($path2)));
+ if ($stat1['dev'] !== $stat2['dev']) {
+ $result = $this->copy($path1, $path2);
+ if ($result) {
+ $result &= $this->rmdir($path1);
+ }
+ return $result;
+ }
+ }
+
return rename($this->getSourcePath($path1), $this->getSourcePath($path2));
}
diff --git a/lib/private/files/storage/localtempfiletrait.php b/lib/private/files/storage/localtempfiletrait.php
new file mode 100644
index 00000000000..444e4e2e89e
--- /dev/null
+++ b/lib/private/files/storage/localtempfiletrait.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Storage;
+
+use OC\Files\Cache\Cache;
+use OC\Files\Cache\Scanner;
+use OC\Files\Filesystem;
+use OC\Files\Cache\Watcher;
+use OCP\Files\FileNameTooLongException;
+use OCP\Files\InvalidCharacterInPathException;
+use OCP\Files\InvalidPathException;
+use OCP\Files\ReservedWordException;
+
+/**
+ * Storage backend class for providing common filesystem operation methods
+ * which are not storage-backend specific.
+ *
+ * \OC\Files\Storage\Common is never used directly; it is extended by all other
+ * storage backends, where its methods may be overridden, and additional
+ * (backend-specific) methods are defined.
+ *
+ * Some \OC\Files\Storage\Common methods call functions which are first defined
+ * in classes which extend it, e.g. $this->stat() .
+ */
+trait LocalTempFileTrait {
+
+ /**
+ * @var string[]
+ */
+ protected $cachedFiles = array();
+
+ /**
+ * @param string $path
+ */
+ protected function getCachedFile($path) {
+ if (!isset($this->cachedFiles[$path])) {
+ $this->cachedFiles[$path] = $this->toTmpFile($path);
+ }
+ return $this->cachedFiles[$path];
+ }
+
+ protected function removeCachedFile($path) {
+ unset($this->cachedFiles[$path]);
+ }
+
+ /**
+ * @param string $path
+ * @return string
+ */
+ protected function toTmpFile($path) { //no longer in the storage api, still useful here
+ $source = $this->fopen($path, 'r');
+ if (!$source) {
+ return false;
+ }
+ if ($pos = strrpos($path, '.')) {
+ $extension = substr($path, $pos);
+ } else {
+ $extension = '';
+ }
+ $tmpFile = \OC_Helper::tmpFile($extension);
+ $target = fopen($tmpFile, 'w');
+ \OC_Helper::streamCopy($source, $target);
+ fclose($target);
+ return $tmpFile;
+ }
+}
diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php
index 0e70c99c8d7..e4f9781b382 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/files/storage/wrapper/encryption.php
@@ -1,32 +1,35 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Files\Storage\Wrapper;
use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
+use OC\Files\Storage\LocalTempFileTrait;
+use OCP\Files\Mount\IMountPoint;
class Encryption extends Wrapper {
+ use LocalTempFileTrait;
+
/** @var string */
private $mountPoint;
@@ -45,11 +48,18 @@ class Encryption extends Wrapper {
/** @var array */
private $unencryptedSize;
+ /** @var \OC\Encryption\File */
+ private $fileHelper;
+
+ /** @var IMountPoint */
+ private $mount;
+
/**
* @param array $parameters
* @param \OC\Encryption\Manager $encryptionManager
* @param \OC\Encryption\Util $util
* @param \OC\Log $logger
+ * @param \OC\Encryption\File $fileHelper
* @param string $uid user who perform the read/write operation (null for public access)
*/
public function __construct(
@@ -57,14 +67,17 @@ class Encryption extends Wrapper {
\OC\Encryption\Manager $encryptionManager = null,
\OC\Encryption\Util $util = null,
\OC\Log $logger = null,
+ \OC\Encryption\File $fileHelper = null,
$uid = null
) {
$this->mountPoint = $parameters['mountPoint'];
+ $this->mount = $parameters['mount'];
$this->encryptionManager = $encryptionManager;
$this->util = $util;
$this->logger = $logger;
$this->uid = $uid;
+ $this->fileHelper = $fileHelper;
$this->unencryptedSize = array();
parent::__construct($parameters);
}
@@ -77,27 +90,18 @@ class Encryption extends Wrapper {
* @return int
*/
public function filesize($path) {
- $size = 0;
$fullPath = $this->getFullPath($path);
-
- $encryptedSize = $this->storage->filesize($path);
+ $size = $this->storage->filesize($path);
$info = $this->getCache()->get($path);
- if($encryptedSize > 0 && $info['encrypted']) {
- $size = $info['unencrypted_size'];
- if ($size <= 0) {
- $encryptionModule = $this->getEncryptionModule($path);
- if ($encryptionModule) {
- $size = $encryptionModule->calculateUnencryptedSize($fullPath);
- $this->getCache()->update($info['fileid'], array('unencrypted_size' => $size));
- }
- }
- } else if (isset($this->unencryptedSize[$fullPath]) && isset($info['fileid'])) {
+ if (isset($this->unencryptedSize[$fullPath])) {
$size = $this->unencryptedSize[$fullPath];
+ }
+
+ if (isset($info['fileid'])) {
$info['encrypted'] = true;
- $info['unencrypted_size'] = $size;
- $info['size'] = $encryptedSize;
+ $info['size'] = $size;
$this->getCache()->put($path, $info);
}
@@ -112,23 +116,18 @@ class Encryption extends Wrapper {
*/
public function file_get_contents($path) {
- $data = null;
$encryptionModule = $this->getEncryptionModule($path);
if ($encryptionModule) {
-
- $handle = $this->fopen($path, 'r');
-
- if (is_resource($handle)) {
- while (!feof($handle)) {
- $data .= fread($handle, $this->util->getBlockSize());
- }
+ $handle = $this->fopen($path, "r");
+ if (!$handle) {
+ return false;
}
- } else {
- $data = $this->storage->file_get_contents($path);
+ $data = stream_get_contents($handle);
+ fclose($handle);
+ return $data;
}
-
- return $data;
+ return $this->storage->file_get_contents($path);
}
/**
@@ -141,8 +140,9 @@ class Encryption extends Wrapper {
public function file_put_contents($path, $data) {
// file put content will always be translated to a stream write
$handle = $this->fopen($path, 'w');
- fwrite($handle, $data);
- return fclose($handle);
+ $written = fwrite($handle, $data);
+ fclose($handle);
+ return $written;
}
/**
@@ -158,8 +158,8 @@ class Encryption extends Wrapper {
$encryptionModule = $this->getEncryptionModule($path);
if ($encryptionModule) {
- $keyStorage = \OC::$server->getEncryptionKeyStorage($encryptionModule->getId());
- $keyStorage->deleteAllFileKeys($this->getFullPath($path));
+ $keyStorage = $this->getKeyStorage($encryptionModule->getId());
+ $keyStorage->deleteAllFileKeys($this->getFullPath($path));
}
return $this->storage->unlink($path);
@@ -177,17 +177,14 @@ class Encryption extends Wrapper {
return $this->storage->rename($path1, $path2);
}
- $fullPath1 = $this->getFullPath($path1);
- list($owner, $source) = $this->util->getUidAndFilename($fullPath1);
+ $source = $this->getFullPath($path1);
$result = $this->storage->rename($path1, $path2);
if ($result) {
- $fullPath2 = $this->getFullPath($path2);
- $systemWide = $this->util->isSystemWideMountPoint($this->mountPoint);
- list(, $target) = $this->util->getUidAndFilename($fullPath2);
+ $target = $this->getFullPath($path2);
$encryptionModule = $this->getEncryptionModule($path2);
if ($encryptionModule) {
- $keyStorage = \OC::$server->getEncryptionKeyStorage($encryptionModule->getId());
- $keyStorage->renameKeys($source, $target, $owner, $systemWide);
+ $keyStorage = $this->getKeyStorage($encryptionModule->getId());
+ $keyStorage->renameKeys($source, $target);
}
}
@@ -202,9 +199,22 @@ class Encryption extends Wrapper {
* @return bool
*/
public function copy($path1, $path2) {
- // todo copy encryption keys, get users with access to the file and reencrypt
- // or is this to encryption module specific? Then we can hand this over
- return $this->storage->copy($path1, $path2);
+ if ($this->util->isExcluded($path1)) {
+ return $this->storage->rename($path1, $path2);
+ }
+
+ $source = $this->getFullPath($path1);
+ $result = $this->storage->copy($path1, $path2);
+ if ($result) {
+ $target = $this->getFullPath($path2);
+ $encryptionModule = $this->getEncryptionModule($path2);
+ if ($encryptionModule) {
+ $keyStorage = $this->getKeyStorage($encryptionModule->getId());
+ $keyStorage->copyKeys($source, $target);
+ }
+ }
+
+ return $result;
}
/**
@@ -223,7 +233,17 @@ class Encryption extends Wrapper {
$encryptionModuleId = $this->util->getEncryptionModuleId($header);
$size = $unencryptedSize = 0;
- if ($this->file_exists($path)) {
+ $targetExists = $this->file_exists($path);
+ $targetIsEncrypted = false;
+ if ($targetExists) {
+ // in case the file exists we require the explicit module as
+ // specified in the file header - otherwise we need to fail hard to
+ // prevent data loss on client side
+ if (!empty($encryptionModuleId)) {
+ $targetIsEncrypted = true;
+ $encryptionModule = $this->encryptionManager->getEncryptionModule($encryptionModuleId);
+ }
+
$size = $this->storage->filesize($path);
$unencryptedSize = $this->filesize($path);
}
@@ -254,10 +274,18 @@ class Encryption extends Wrapper {
'" not found, file will be stored unencrypted');
}
+ // encryption disabled on write of new file and write to existing unencrypted file -> don't encrypt
+ $encEnabled = $this->encryptionManager->isEnabled();
+ if (!$encEnabled || !$this->mount->getOption('encrypt', true)) {
+ if (!$targetExists || !$targetIsEncrypted) {
+ $shouldEncrypt = false;
+ }
+ }
+
if($shouldEncrypt === true && !$this->util->isExcluded($fullPath) && $encryptionModule !== null) {
$source = $this->storage->fopen($path, $mode);
$handle = \OC\Files\Stream\Encryption::wrap($source, $path, $fullPath, $header,
- $this->uid, $encryptionModule, $this->storage, $this, $this->util, $mode,
+ $this->uid, $encryptionModule, $this->storage, $this, $this->util, $this->fileHelper, $mode,
$size, $unencryptedSize);
return $handle;
} else {
@@ -266,6 +294,57 @@ class Encryption extends Wrapper {
}
/**
+ * get the path to a local version of the file.
+ * The local version of the file can be temporary and doesn't have to be persistent across requests
+ *
+ * @param string $path
+ * @return string
+ */
+ public function getLocalFile($path) {
+ return $this->getCachedFile($path);
+ }
+
+ /**
+ * Returns the wrapped storage's value for isLocal()
+ *
+ * @return bool wrapped storage's isLocal() value
+ */
+ public function isLocal() {
+ return false;
+ }
+
+ /**
+ * see http://php.net/manual/en/function.stat.php
+ * only the following keys are required in the result: size and mtime
+ *
+ * @param string $path
+ * @return array
+ */
+ public function stat($path) {
+ $stat = $this->storage->stat($path);
+ $fileSize = $this->filesize($path);
+ $stat['size'] = $fileSize;
+ $stat[7] = $fileSize;
+ return $stat;
+ }
+
+ /**
+ * see http://php.net/manual/en/function.hash.php
+ *
+ * @param string $type
+ * @param string $path
+ * @param bool $raw
+ * @return string
+ */
+ public function hash($type, $path, $raw = false) {
+ $fh = $this->fopen($path, 'rb');
+ $ctx = hash_init($type);
+ hash_update_stream($ctx, $fh);
+ fclose($fh);
+ return hash_final($ctx, $raw);
+ }
+
+ /**
* return full path, including mount point
*
* @param string $path relative to mount point
@@ -295,7 +374,9 @@ class Encryption extends Wrapper {
* read encryption module needed to read/write the file located at $path
*
* @param string $path
- * @return \OCP\Encryption\IEncryptionModule|null
+ * @return null|\OCP\Encryption\IEncryptionModule
+ * @throws ModuleDoesNotExistsException
+ * @throws \Exception
*/
protected function getEncryptionModule($path) {
$encryptionModule = null;
@@ -305,7 +386,7 @@ class Encryption extends Wrapper {
try {
$encryptionModule = $this->encryptionManager->getEncryptionModule($encryptionModuleId);
} catch (ModuleDoesNotExistsException $e) {
- $this->logger->critical('Encryption module defined in "' . $path . '" mot loaded!');
+ $this->logger->critical('Encryption module defined in "' . $path . '" not loaded!');
throw $e;
}
}
@@ -316,4 +397,13 @@ class Encryption extends Wrapper {
$this->unencryptedSize[$path] = $unencryptedSize;
}
+ /**
+ * @param string $encryptionModuleId
+ * @return \OCP\Encryption\Keys\IStorage
+ */
+ protected function getKeyStorage($encryptionModuleId) {
+ $keyStorage = \OC::$server->getEncryptionKeyStorage($encryptionModuleId);
+ return $keyStorage;
+ }
+
}
diff --git a/lib/private/files/storage/wrapper/quota.php b/lib/private/files/storage/wrapper/quota.php
index 34bd2589947..3c0fda98dad 100644
--- a/lib/private/files/storage/wrapper/quota.php
+++ b/lib/private/files/storage/wrapper/quota.php
@@ -60,11 +60,6 @@ class Quota extends Wrapper {
$cache = $this->getCache();
$data = $cache->get($path);
if (is_array($data) and isset($data['size'])) {
- if (isset($data['unencrypted_size'])
- && $data['unencrypted_size'] > 0
- ) {
- return $data['unencrypted_size'];
- }
return $data['size'];
} else {
return \OCP\Files\FileInfo::SPACE_NOT_COMPUTED;
diff --git a/lib/private/files/stream/encryption.php b/lib/private/files/stream/encryption.php
index ddef9067bad..9ba98e61d3e 100644
--- a/lib/private/files/stream/encryption.php
+++ b/lib/private/files/stream/encryption.php
@@ -1,24 +1,24 @@
<?php
-
/**
- * ownCloud - Encryption stream wrapper
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author jknockaert <jasper@knockaert.nl>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OC\Files\Stream;
@@ -31,6 +31,9 @@ class Encryption extends Wrapper {
/** @var \OC\Encryption\Util */
protected $util;
+ /** @var \OC\Encryption\File */
+ protected $file;
+
/** @var \OCP\Encryption\IEncryptionModule */
protected $encryptionModule;
@@ -43,6 +46,9 @@ class Encryption extends Wrapper {
/** @var string */
protected $internalPath;
+ /** @var string */
+ protected $cache;
+
/** @var integer */
protected $size;
@@ -72,13 +78,16 @@ class Encryption extends Wrapper {
/**
* user who perform the read/write operation null for public access
*
- * @var string
+ * @var string
*/
protected $uid;
/** @var bool */
protected $readOnly;
+ /** @var bool */
+ protected $writeFlag;
+
/** @var array */
protected $expectedContextProperties;
@@ -91,6 +100,7 @@ class Encryption extends Wrapper {
'encryptionModule',
'header',
'uid',
+ 'file',
'util',
'size',
'unencryptedSize',
@@ -106,11 +116,12 @@ class Encryption extends Wrapper {
* @param string $internalPath relative to mount point
* @param string $fullPath relative to data/
* @param array $header
- * @param sting $uid
+ * @param string $uid
* @param \OCP\Encryption\IEncryptionModule $encryptionModule
* @param \OC\Files\Storage\Storage $storage
- * @param OC\Files\Storage\Wrapper\Encryption $encStorage
+ * @param \OC\Files\Storage\Wrapper\Encryption $encStorage
* @param \OC\Encryption\Util $util
+ * @param \OC\Encryption\File $file
* @param string $mode
* @param int $size
* @param int $unencryptedSize
@@ -119,9 +130,15 @@ class Encryption extends Wrapper {
* @throws \BadMethodCallException
*/
public static function wrap($source, $internalPath, $fullPath, array $header,
- $uid, \OCP\Encryption\IEncryptionModule $encryptionModule,
- \OC\Files\Storage\Storage $storage, \OC\Files\Storage\Wrapper\Encryption $encStorage,
- \OC\Encryption\Util $util, $mode, $size, $unencryptedSize) {
+ $uid,
+ \OCP\Encryption\IEncryptionModule $encryptionModule,
+ \OC\Files\Storage\Storage $storage,
+ \OC\Files\Storage\Wrapper\Encryption $encStorage,
+ \OC\Encryption\Util $util,
+ \OC\Encryption\File $file,
+ $mode,
+ $size,
+ $unencryptedSize) {
$context = stream_context_create(array(
'ocencryption' => array(
@@ -133,6 +150,7 @@ class Encryption extends Wrapper {
'header' => $header,
'uid' => $uid,
'util' => $util,
+ 'file' => $file,
'size' => $size,
'unencryptedSize' => $unencryptedSize,
'encryptionStorage' => $encStorage
@@ -180,7 +198,7 @@ class Encryption extends Wrapper {
$context = parent::loadContext($name);
foreach ($this->expectedContextProperties as $property) {
- if (isset($context[$property])) {
+ if (array_key_exists($property, $context)) {
$this->{$property} = $context[$property];
} else {
throw new \BadMethodCallException('Invalid context, "' . $property . '" options not set');
@@ -194,6 +212,8 @@ class Encryption extends Wrapper {
$this->loadContext('ocencryption');
$this->position = 0;
+ $this->cache = '';
+ $this->writeFlag = false;
$this->unencryptedBlockSize = $this->encryptionModule->getUnencryptedBlockSize();
if (
@@ -216,7 +236,7 @@ class Encryption extends Wrapper {
$sharePath = dirname($path);
}
- $accessList = $this->util->getSharingUsersArray($sharePath);
+ $accessList = $this->file->getAccessList($sharePath);
$this->newHeader = $this->encryptionModule->begin($this->fullPath, $this->uid, $this->header, $accessList);
return true;
@@ -228,25 +248,26 @@ class Encryption extends Wrapper {
$result = '';
// skip the header if we read the file from the beginning
- if ($this->position === 0 && !empty($this->header)) {
- parent::stream_read($this->util->getBlockSize());
+ if ($this->position === 0) {
+ parent::stream_read($this->util->getHeaderSize());
}
+// $count = min($count, $this->unencryptedSize - $this->position);
while ($count > 0) {
$remainingLength = $count;
// update the cache of the current block
- $data = parent::stream_read($this->util->getBlockSize());
- $decrypted = $this->encryptionModule->decrypt($data);
+ $this->readCache();
// determine the relative position in the current block
$blockPosition = ($this->position % $this->unencryptedBlockSize);
// if entire read inside current block then only position needs to be updated
if ($remainingLength < ($this->unencryptedBlockSize - $blockPosition)) {
- $result .= substr($decrypted, $blockPosition, $remainingLength);
+ $result .= substr($this->cache, $blockPosition, $remainingLength);
$this->position += $remainingLength;
$count = 0;
- // otherwise remainder of current block is fetched, the block is flushed and the position updated
+ // otherwise remainder of current block is fetched, the block is flushed and the position updated
} else {
- $result .= substr($decrypted, $blockPosition);
+ $result .= substr($this->cache, $blockPosition);
+ $this->flush();
$this->position += ($this->unencryptedBlockSize - $blockPosition);
$count -= ($this->unencryptedBlockSize - $blockPosition);
}
@@ -259,6 +280,7 @@ class Encryption extends Wrapper {
if ($this->position === 0) {
$this->writeHeader();
+ $this->size+=$this->util->getHeaderSize();
}
$length = 0;
@@ -266,9 +288,8 @@ class Encryption extends Wrapper {
while (strlen($data) > 0) {
$remainingLength = strlen($data);
- // read current block
- $currentBlock = parent::stream_read($this->util->getBlockSize());
- $decrypted = $this->encryptionModule->decrypt($currentBlock, $this->uid);
+ // set the cache to the current 6126 block
+ $this->readCache();
// for seekable streams the pointer is moved back to the beginning of the encrypted block
// flush will start writing there when the position moves to another block
@@ -277,7 +298,10 @@ class Encryption extends Wrapper {
$resultFseek = parent::stream_seek($positionInFile);
// only allow writes on seekable streams, or at the end of the encrypted stream
- if ($resultFseek || $positionInFile === $this->size) {
+ if (!($this->readOnly) && ($resultFseek || $positionInFile === $this->size)) {
+
+ // switch the writeFlag so flush() will write the block
+ $this->writeFlag = true;
// determine the relative position in the current block
$blockPosition = ($this->position % $this->unencryptedBlockSize);
@@ -285,28 +309,22 @@ class Encryption extends Wrapper {
// if so, overwrite existing data (if any)
// update position and liberate $data
if ($remainingLength < ($this->unencryptedBlockSize - $blockPosition)) {
- $decrypted = substr($decrypted, 0, $blockPosition)
- . $data . substr($decrypted, $blockPosition + $remainingLength);
- $encrypted = $this->encryptionModule->encrypt($decrypted);
- parent::stream_write($encrypted);
+ $this->cache = substr($this->cache, 0, $blockPosition)
+ . $data . substr($this->cache, $blockPosition + $remainingLength);
$this->position += $remainingLength;
$length += $remainingLength;
$data = '';
- // if $data doens't fit the current block, the fill the current block and reiterate
- // after the block is filled, it is flushed and $data is updatedxxx
+ // if $data doesn't fit the current block, the fill the current block and reiterate
+ // after the block is filled, it is flushed and $data is updatedxxx
} else {
- $decrypted = substr($decrypted, 0, $blockPosition) .
+ $this->cache = substr($this->cache, 0, $blockPosition) .
substr($data, 0, $this->unencryptedBlockSize - $blockPosition);
- $encrypted = $this->encryptionModule->encrypt($decrypted);
- parent::stream_write($encrypted);
+ $this->flush();
$this->position += ($this->unencryptedBlockSize - $blockPosition);
- $this->size = max($this->size, $this->stream_tell());
$length += ($this->unencryptedBlockSize - $blockPosition);
$data = substr($data, $this->unencryptedBlockSize - $blockPosition);
}
} else {
- $encrypted = $this->encryptionModule->encrypt($data);
- parent::stream_write($encrypted);
$data = '';
}
}
@@ -345,7 +363,11 @@ class Encryption extends Wrapper {
$newFilePosition = floor($newPosition / $this->unencryptedBlockSize)
* $this->util->getBlockSize() + $this->util->getHeaderSize();
+ $oldFilePosition = parent::stream_tell();
if (parent::stream_seek($newFilePosition)) {
+ parent::stream_seek($oldFilePosition);
+ $this->flush();
+ parent::stream_seek($newFilePosition);
$this->position = $newPosition;
$return = true;
}
@@ -355,13 +377,6 @@ class Encryption extends Wrapper {
public function stream_close() {
$this->flush();
- return parent::stream_close();
- }
-
- /**
- * tell encryption module that we are done and write remaining data to the file
- */
- protected function flush() {
$remainingData = $this->encryptionModule->end($this->fullPath);
if ($this->readOnly === false) {
if(!empty($remainingData)) {
@@ -369,17 +384,50 @@ class Encryption extends Wrapper {
}
$this->encryptionStorage->updateUnencryptedSize($this->fullPath, $this->unencryptedSize);
}
+ return parent::stream_close();
+ }
+
+ /**
+ * write block to file
+ */
+ protected function flush() {
+ // write to disk only when writeFlag was set to 1
+ if ($this->writeFlag) {
+ // Disable the file proxies so that encryption is not
+ // automatically attempted when the file is written to disk -
+ // we are handling that separately here and we don't want to
+ // get into an infinite loop
+ $encrypted = $this->encryptionModule->encrypt($this->cache);
+ parent::stream_write($encrypted);
+ $this->writeFlag = false;
+ $this->size = max($this->size, parent::stream_tell());
+ }
+ // always empty the cache (otherwise readCache() will not fill it with the new block)
+ $this->cache = '';
}
+ /**
+ * read block to file
+ */
+ protected function readCache() {
+ // cache should always be empty string when this function is called
+ // don't try to fill the cache when trying to write at the end of the unencrypted file when it coincides with new block
+ if ($this->cache === '' && !($this->position === $this->unencryptedSize && ($this->position % $this->unencryptedBlockSize) === 0)) {
+ // Get the data from the file handle
+ $data = parent::stream_read($this->util->getBlockSize());
+ $this->cache = $this->encryptionModule->decrypt($data);
+ }
+ }
/**
* write header at beginning of encrypted file
*
+ * @return integer
* @throws EncryptionHeaderKeyExistsException if header key is already in use
*/
private function writeHeader() {
$header = $this->util->createHeader($this->newHeader, $this->encryptionModule);
- parent::stream_write($header);
+ return parent::stream_write($header);
}
}
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index f8ec4a0eb43..0f371bbc5ea 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -515,8 +515,7 @@ class View {
public function file_put_contents($path, $data) {
if (is_resource($data)) { //not having to deal with streams in file_put_contents makes life easier
$absolutePath = Filesystem::normalizePath($this->getAbsolutePath($path));
- if (\OC_FileProxy::runPreProxies('file_put_contents', $absolutePath, $data)
- and Filesystem::isValidPath($path)
+ if (Filesystem::isValidPath($path)
and !Filesystem::isFileBlacklisted($path)
) {
$path = $this->getRelativePath($absolutePath);
@@ -537,7 +536,6 @@ class View {
if ($this->shouldEmitHooks($path) && $result !== false) {
$this->emit_file_hooks_post($exists, $path);
}
- \OC_FileProxy::runPostProxies('file_put_contents', $absolutePath, $count);
return $result;
} else {
return false;
@@ -591,8 +589,7 @@ class View {
$absolutePath1 = Filesystem::normalizePath($this->getAbsolutePath($path1));
$absolutePath2 = Filesystem::normalizePath($this->getAbsolutePath($path2));
if (
- \OC_FileProxy::runPreProxies('rename', $absolutePath1, $absolutePath2)
- and Filesystem::isValidPath($path2)
+ Filesystem::isValidPath($path2)
and Filesystem::isValidPath($path1)
and !Filesystem::isFileBlacklisted($path2)
) {
@@ -635,14 +632,12 @@ class View {
$sourceMountPoint = $mount->getMountPoint();
$result = $mount->moveMount($absolutePath2);
$manager->moveMount($sourceMountPoint, $mount->getMountPoint());
- \OC_FileProxy::runPostProxies('rename', $absolutePath1, $absolutePath2);
} else {
$result = false;
}
} elseif ($mp1 == $mp2) {
if ($storage1) {
$result = $storage1->rename($internalPath1, $internalPath2);
- \OC_FileProxy::runPostProxies('rename', $absolutePath1, $absolutePath2);
} else {
$result = false;
}
@@ -718,8 +713,7 @@ class View {
$absolutePath1 = Filesystem::normalizePath($this->getAbsolutePath($path1));
$absolutePath2 = Filesystem::normalizePath($this->getAbsolutePath($path2));
if (
- \OC_FileProxy::runPreProxies('copy', $absolutePath1, $absolutePath2)
- and Filesystem::isValidPath($path2)
+ Filesystem::isValidPath($path2)
and Filesystem::isValidPath($path1)
and !Filesystem::isFileBlacklisted($path2)
) {
@@ -927,7 +921,7 @@ class View {
public function hash($type, $path, $raw = false) {
$postFix = (substr($path, -1, 1) === '/') ? '/' : '';
$absolutePath = Filesystem::normalizePath($this->getAbsolutePath($path));
- if (\OC_FileProxy::runPreProxies('hash', $absolutePath) && Filesystem::isValidPath($path)) {
+ if (Filesystem::isValidPath($path)) {
$path = $this->getRelativePath($absolutePath);
if ($path == null) {
return false;
@@ -942,7 +936,6 @@ class View {
list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix);
if ($storage) {
$result = $storage->hash($type, $internalPath, $raw);
- $result = \OC_FileProxy::runPostProxies('hash', $absolutePath, $result);
return $result;
}
}
@@ -975,8 +968,7 @@ class View {
private function basicOperation($operation, $path, $hooks = array(), $extraParam = null) {
$postFix = (substr($path, -1, 1) === '/') ? '/' : '';
$absolutePath = Filesystem::normalizePath($this->getAbsolutePath($path));
- if (\OC_FileProxy::runPreProxies($operation, $absolutePath, $extraParam)
- and Filesystem::isValidPath($path)
+ if (Filesystem::isValidPath($path)
and !Filesystem::isFileBlacklisted($path)
) {
$path = $this->getRelativePath($absolutePath);
@@ -993,8 +985,6 @@ class View {
$result = $storage->$operation($internalPath);
}
- $result = \OC_FileProxy::runPostProxies($operation, $this->getAbsolutePath($path), $result);
-
if (in_array('delete', $hooks) and $result) {
$this->updater->remove($path);
}
@@ -1168,8 +1158,6 @@ class View {
$data['permissions'] |= \OCP\Constants::PERMISSION_DELETE;
}
- $data = \OC_FileProxy::runPostProxies('getFileInfo', $path, $data);
-
return new FileInfo($path, $storage, $internalPath, $data, $mount);
}
diff --git a/lib/private/group/manager.php b/lib/private/group/manager.php
index 876068f4755..774a76a3063 100644
--- a/lib/private/group/manager.php
+++ b/lib/private/group/manager.php
@@ -267,7 +267,7 @@ class Manager extends PublicEmitter implements IGroupManager {
}
do {
- $filteredUsers = $this->userManager->search($search, $searchLimit, $searchOffset);
+ $filteredUsers = $this->userManager->searchDisplayName($search, $searchLimit, $searchOffset);
foreach($filteredUsers as $filteredUser) {
if($group->inGroup($filteredUser)) {
$groupUsers[]= $filteredUser;
diff --git a/lib/private/helper.php b/lib/private/helper.php
index 099c6def37f..cb95dd49beb 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -9,7 +9,6 @@
* @author François Kubler <francois@kubler.org>
* @author Frank Karlitschek <frank@owncloud.org>
* @author Georg Ehrke <georg@owncloud.com>
- * @author Georg Ehrke <georg@ownCloud.com>
* @author Jakob Sack <mail@jakobsack.de>
* @author Jan-Christoph Borchardt <hey@jancborchardt.net>
* @author Joas Schilling <nickvergessen@owncloud.com>
@@ -17,7 +16,7 @@
* @author Lukas Reschke <lukas@owncloud.com>
* @author Michael Gapczynski <GapczynskiM@gmail.com>
* @author Morris Jobke <hey@morrisjobke.de>
- * @author Olivier Paroz <github@oparoz.com>
+ * @author Olivier Paroz <owncloud@interfasys.ch>
* @author Owen Winkler <a_github@midnightcircus.com>
* @author Pellaeon Lin <nfsmwlin@gmail.com>
* @author Robin Appelman <icewind@owncloud.com>
@@ -45,6 +44,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+use Symfony\Component\Process\ExecutableFinder;
/**
* Collection of useful functions
@@ -75,6 +75,7 @@ class OC_Helper {
'application/x-perl' => 'text/code',
'application/x-php' => 'text/code',
'text/x-shellscript' => 'text/code',
+ 'application/yaml' => 'text/code',
'application/xml' => 'text/html',
'text/css' => 'text/code',
'application/x-tex' => 'text',
@@ -132,6 +133,7 @@ class OC_Helper {
* @return
* @internal param array $args with param=>value, will be appended to the returned url
* @return string the url
+ * @deprecated Use \OC::$server->getURLGenerator()->linkToRoute($route, $parameters)
*
* Returns a url to the given app and file.
*/
@@ -146,6 +148,7 @@ class OC_Helper {
* @param array $args array with param=>value, will be appended to the returned url
* The value of $args will be urlencoded
* @return string the url
+ * @deprecated Use \OC::$server->getURLGenerator()->linkTo($app, $file, $args)
*
* Returns a url to the given app and file.
*/
@@ -156,6 +159,7 @@ class OC_Helper {
/**
* @param string $key
* @return string url to the online documentation
+ * @deprecated Use \OC::$server->getURLGenerator()->linkToDocs($key)
*/
public static function linkToDocs($key) {
return OC::$server->getURLGenerator()->linkToDocs($key);
@@ -181,6 +185,7 @@ class OC_Helper {
* Makes an $url absolute
* @param string $url the url
* @return string the absolute url
+ * @deprecated Use \OC::$server->getURLGenerator()->getAbsoluteURL($url)
*
* Returns a absolute url to the given app and file.
*/
@@ -236,6 +241,7 @@ class OC_Helper {
* @param string $app app
* @param string $image image name
* @return string the url
+ * @deprecated Use \OC::$server->getURLGenerator()->imagePath($app, $image)
*
* Returns the path to the image.
*/
@@ -921,9 +927,16 @@ class OC_Helper {
}
$result = null;
if (!\OC_Util::runningOnWindows() && self::is_function_enabled('exec')) {
- exec('command -v ' . escapeshellarg($program) . ' 2> /dev/null', $output, $returnCode);
- if ($returnCode === 0 && count($output) > 0) {
- $result = escapeshellcmd($output[0]);
+ $exeSniffer = new ExecutableFinder();
+ // Returns null if nothing is found
+ $result = $exeSniffer->find($program);
+ if (empty($result)) {
+ $paths = str_replace(':','/ ',getenv('PATH'));
+ $command = 'find ' . $paths . ' -name ' . escapeshellarg($program) . ' 2> /dev/null';
+ exec($command, $output, $returnCode);
+ if (count($output) > 0) {
+ $result = escapeshellcmd($output[0]);
+ }
}
}
$memcache->set($program, $result, 3600);
diff --git a/lib/private/hook.php b/lib/private/hook.php
index d2a0fa898dd..c4ea1999b09 100644
--- a/lib/private/hook.php
+++ b/lib/private/hook.php
@@ -32,38 +32,39 @@ class OC_Hook{
/**
* connects a function to a hook
- * @param string $signalclass class name of emitter
- * @param string $signalname name of signal
- * @param string $slotclass class name of slot
- * @param string $slotname name of slot
+ *
+ * @param string $signalClass class name of emitter
+ * @param string $signalName name of signal
+ * @param string|object $slotClass class name of slot
+ * @param string $slotName name of slot
* @return bool
*
* This function makes it very easy to connect to use hooks.
*
* TODO: write example
*/
- static public function connect( $signalclass, $signalname, $slotclass, $slotname ) {
+ static public function connect($signalClass, $signalName, $slotClass, $slotName ) {
// If we're trying to connect to an emitting class that isn't
// yet registered, register it
- if( !array_key_exists( $signalclass, self::$registered )) {
- self::$registered[$signalclass] = array();
+ if( !array_key_exists($signalClass, self::$registered )) {
+ self::$registered[$signalClass] = array();
}
// If we're trying to connect to an emitting method that isn't
// yet registered, register it with the emitting class
- if( !array_key_exists( $signalname, self::$registered[$signalclass] )) {
- self::$registered[$signalclass][$signalname] = array();
+ if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
+ self::$registered[$signalClass][$signalName] = array();
}
// dont connect hooks twice
- foreach (self::$registered[$signalclass][$signalname] as $hook) {
- if ($hook['class'] === $slotclass and $hook['name'] === $slotname) {
+ foreach (self::$registered[$signalClass][$signalName] as $hook) {
+ if ($hook['class'] === $slotClass and $hook['name'] === $slotName) {
return false;
}
}
// Connect the hook handler to the requested emitter
- self::$registered[$signalclass][$signalname][] = array(
- "class" => $slotclass,
- "name" => $slotname
+ self::$registered[$signalClass][$signalName][] = array(
+ "class" => $slotClass,
+ "name" => $slotName
);
// No chance for failure ;-)
@@ -72,8 +73,9 @@ class OC_Hook{
/**
* emits a signal
- * @param string $signalclass class name of emitter
- * @param string $signalname name of signal
+ *
+ * @param string $signalClass class name of emitter
+ * @param string $signalName name of signal
* @param mixed $params default: array() array with additional data
* @return bool true if slots exists or false if not
*
@@ -81,28 +83,36 @@ class OC_Hook{
*
* TODO: write example
*/
- static public function emit( $signalclass, $signalname, $params = array()) {
+ static public function emit($signalClass, $signalName, $params = array()) {
// Return false if no hook handlers are listening to this
// emitting class
- if( !array_key_exists( $signalclass, self::$registered )) {
+ if( !array_key_exists($signalClass, self::$registered )) {
return false;
}
// Return false if no hook handlers are listening to this
// emitting method
- if( !array_key_exists( $signalname, self::$registered[$signalclass] )) {
+ if( !array_key_exists( $signalName, self::$registered[$signalClass] )) {
return false;
}
// Call all slots
- foreach( self::$registered[$signalclass][$signalname] as $i ) {
+ foreach( self::$registered[$signalClass][$signalName] as $i ) {
try {
call_user_func( array( $i["class"], $i["name"] ), $params );
} catch (Exception $e){
self::$thrownExceptions[] = $e;
+ $class = $i["class"];
+ if (is_object($i["class"])) {
+ $class = get_class($i["class"]);
+ }
+ $message = $e->getMessage();
+ if (empty($message)) {
+ $message = get_class($e);
+ }
OC_Log::write('hook',
- 'error while running hook (' . $i["class"] . '::' . $i["name"] . '): '.$e->getMessage(),
+ 'error while running hook (' . $class . '::' . $i["name"] . '): ' . $message,
OC_Log::ERROR);
}
}
diff --git a/lib/private/l10n.php b/lib/private/l10n.php
index 95b80bebdb2..59f26423afa 100644
--- a/lib/private/l10n.php
+++ b/lib/private/l10n.php
@@ -125,7 +125,7 @@ class OC_L10N implements \OCP\IL10N {
$preferred_language = str_replace('-', '_', $preferred_language);
foreach ($available as $available_language) {
if ($preferred_language === strtolower($available_language)) {
- if (is_null($app)) {
+ if (!is_array($app)) {
self::$language = $available_language;
}
return $available_language;
@@ -133,7 +133,7 @@ class OC_L10N implements \OCP\IL10N {
}
foreach ($available as $available_language) {
if (substr($preferred_language, 0, 2) === $available_language) {
- if (is_null($app)) {
+ if (!is_array($app)) {
self::$language = $available_language;
}
return $available_language;
@@ -142,6 +142,7 @@ class OC_L10N implements \OCP\IL10N {
}
}
+ self::$language = 'en';
// Last try: English
return 'en';
}
diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php
index c065a8b84f1..427a152f05f 100644
--- a/lib/private/mimetypes.list.php
+++ b/lib/private/mimetypes.list.php
@@ -53,6 +53,8 @@ return array(
'cbz' => array('application/x-cbr', null),
'cc' => array('text/x-c', null),
'cdr' => array('application/coreldraw', null),
+ 'cnf' => array('text/plain', null),
+ 'conf' => array('text/plain', null),
'cpp' => array('text/x-c++src', null),
'cr2' => array('image/x-dcraw', null),
'css' => array('text/css', null),
@@ -183,5 +185,7 @@ return array(
'xltx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.template', null),
'xml' => array('application/xml', 'text/plain'),
'xrf' => array('image/x-dcraw', null),
+ 'yaml' => array('application/yaml', 'text/plain'),
+ 'yml' => array('application/yaml', 'text/plain'),
'zip' => array('application/zip', null),
);
diff --git a/lib/private/preview.php b/lib/private/preview.php
index f8e90cafbc1..eab60e10862 100644
--- a/lib/private/preview.php
+++ b/lib/private/preview.php
@@ -3,11 +3,11 @@
* @author Björn Schießle <schiessle@owncloud.com>
* @author Frank Karlitschek <frank@owncloud.org>
* @author Georg Ehrke <georg@owncloud.com>
- * @author Georg Ehrke <georg@ownCloud.com>
* @author Joas Schilling <nickvergessen@owncloud.com>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
+ * @author Olivier Paroz <owncloud@interfasys.ch>
* @author Robin Appelman <icewind@owncloud.com>
* @author Robin McCorkell <rmccorkell@karoshi.org.uk>
* @author Thomas Müller <thomas.mueller@tmit.eu>
@@ -95,9 +95,9 @@ class Preview {
$this->userView = new \OC\Files\View('/' . $user);
//set config
- $this->configMaxX = \OC_Config::getValue('preview_max_x', null);
- $this->configMaxY = \OC_Config::getValue('preview_max_y', null);
- $this->maxScaleFactor = \OC_Config::getValue('preview_max_scale_factor', 2);
+ $this->configMaxX = \OC::$server->getConfig()->getSystemValue('preview_max_x', 2048);
+ $this->configMaxY = \OC::$server->getConfig()->getSystemValue('preview_max_y', 2048);
+ $this->maxScaleFactor = \OC::$server->getConfig()->getSystemValue('preview_max_scale_factor', 2);
//save parameters
$this->setFile($file);
@@ -246,7 +246,7 @@ class Preview {
$configMaxX = $this->getConfigMaxX();
if (!is_null($configMaxX)) {
if ($maxX > $configMaxX) {
- \OC_Log::write('core', 'maxX reduced from ' . $maxX . ' to ' . $configMaxX, \OC_Log::DEBUG);
+ \OCP\Util::writeLog('core', 'maxX reduced from ' . $maxX . ' to ' . $configMaxX, \OCP\Util::DEBUG);
$maxX = $configMaxX;
}
}
@@ -267,7 +267,7 @@ class Preview {
$configMaxY = $this->getConfigMaxY();
if (!is_null($configMaxY)) {
if ($maxY > $configMaxY) {
- \OC_Log::write('core', 'maxX reduced from ' . $maxY . ' to ' . $configMaxY, \OC_Log::DEBUG);
+ \OCP\Util::writeLog('core', 'maxX reduced from ' . $maxY . ' to ' . $configMaxY, \OCP\Util::DEBUG);
$maxY = $configMaxY;
}
}
@@ -304,12 +304,12 @@ class Preview {
public function isFileValid() {
$file = $this->getFile();
if ($file === '') {
- \OC_Log::write('core', 'No filename passed', \OC_Log::DEBUG);
+ \OCP\Util::writeLog('core', 'No filename passed', \OCP\Util::DEBUG);
return false;
}
if (!$this->fileView->file_exists($file)) {
- \OC_Log::write('core', 'File:"' . $file . '" not found', \OC_Log::DEBUG);
+ \OCP\Util::writeLog('core', 'File:"' . $file . '" not found', \OCP\Util::DEBUG);
return false;
}
@@ -321,9 +321,7 @@ class Preview {
* @return bool
*/
public function deletePreview() {
- $file = $this->getFile();
-
- $fileInfo = $this->getFileInfo($file);
+ $fileInfo = $this->getFileInfo();
if($fileInfo !== null && $fileInfo !== false) {
$fileId = $fileInfo->getId();
@@ -357,7 +355,8 @@ class Preview {
}
/**
- * check if thumbnail or bigger version of thumbnail of file is cached
+ * Checks if thumbnail or bigger version of thumbnail of file is already cached
+ *
* @param int $fileId fileId of the original image
* @return string|false path to thumbnail if it exists or false
*/
@@ -366,9 +365,11 @@ class Preview {
return false;
}
+ // This gives us a calculated path to a preview of asked dimensions
+ // thumbnailFolder/fileId/my_image-<maxX>-<maxY>.png
$preview = $this->buildCachePath($fileId);
- //does a preview with the wanted height and width already exist?
+ // This checks if a preview exists at that location
if ($this->userView->file_exists($preview)) {
return $preview;
}
@@ -377,34 +378,39 @@ class Preview {
}
/**
- * check if a bigger version of thumbnail of file is cached
+ * Checks if a bigger version of a file preview is cached and if not
+ * return the preview of max allowed dimensions
+ *
* @param int $fileId fileId of the original image
+ *
* @return string|false path to bigger thumbnail if it exists or false
- */
+ */
private function isCachedBigger($fileId) {
if (is_null($fileId)) {
return false;
}
- // in order to not loose quality we better generate aspect preserving previews from the original file
- if ($this->keepAspect) {
- return false;
- }
-
$maxX = $this->getMaxX();
//array for usable cached thumbnails
+ // FIXME: Checking only the width could lead to issues
$possibleThumbnails = $this->getPossibleThumbnails($fileId);
foreach ($possibleThumbnails as $width => $path) {
- if ($width < $maxX) {
+ if ($width === 'max' || $width < $maxX) {
continue;
} else {
return $path;
}
}
+ // At this stage, we didn't find a preview, so if the folder is not empty,
+ // we return the max preview we generated on the first run
+ if ($possibleThumbnails) {
+ return $possibleThumbnails['max'];
+ }
+
return false;
}
@@ -421,7 +427,7 @@ class Preview {
$previewPath = $this->getPreviewPath($fileId);
- $wantedAspectRatio = (float) ($this->getMaxX() / $this->getMaxY());
+ $wantedAspectRatio = (float)($this->getMaxX() / $this->getMaxY());
//array for usable cached thumbnails
$possibleThumbnails = array();
@@ -429,6 +435,11 @@ class Preview {
$allThumbnails = $this->userView->getDirectoryContent($previewPath);
foreach ($allThumbnails as $thumbnail) {
$name = rtrim($thumbnail['name'], '.png');
+ // Always add the max preview to the array
+ if (strpos($name, 'max')) {
+ $possibleThumbnails['max'] = $thumbnail['path'];
+ continue;
+ }
list($x, $y, $aspectRatio) = $this->getDimensionsFromFilename($name);
if (abs($aspectRatio - $wantedAspectRatio) >= 0.000001
@@ -482,7 +493,11 @@ class Preview {
}
/**
- * return a preview of a file
+ * Returns a preview of a file
+ *
+ * The cache is searched first and if nothing usable was found then a preview is
+ * generated by one of the providers
+ *
* @return \OCP\IImage
*/
public function getPreview() {
@@ -491,76 +506,22 @@ class Preview {
}
$this->preview = null;
- $file = $this->getFile();
- $maxX = $this->getMaxX();
- $maxY = $this->getMaxY();
- $scalingUp = $this->getScalingUp();
-
- $fileInfo = $this->getFileInfo($file);
- if($fileInfo === null || $fileInfo === false) {
+ $fileInfo = $this->getFileInfo();
+ if ($fileInfo === null || $fileInfo === false) {
return new \OC_Image();
}
- $fileId = $fileInfo->getId();
+ $fileId = $fileInfo->getId();
$cached = $this->isCached($fileId);
if ($cached) {
- $stream = $this->userView->fopen($cached, 'r');
- $this->preview = null;
- if ($stream) {
- $image = new \OC_Image();
- $image->loadFromFileHandle($stream);
- $this->preview = $image->valid() ? $image : null;
-
- $this->resizeAndCrop();
- fclose($stream);
- }
+ $this->getCachedPreview($fileId, $cached);
}
if (is_null($this->preview)) {
- $preview = null;
-
- $previewProviders = \OC::$server->getPreviewManager()->getProviders();
- foreach ($previewProviders as $supportedMimeType => $providers) {
- if (!preg_match($supportedMimeType, $this->mimeType)) {
- continue;
- }
-
- foreach ($providers as $closure) {
- $provider = $closure();
- if (!($provider instanceof \OCP\Preview\IProvider)) {
- continue;
- }
-
- \OC_Log::write('core', 'Generating preview for "' . $file . '" with "' . get_class($provider) . '"', \OC_Log::DEBUG);
-
- /** @var $provider Provider */
- $preview = $provider->getThumbnail($file, $maxX, $maxY, $scalingUp, $this->fileView);
-
- if (!($preview instanceof \OCP\IImage)) {
- continue;
- }
-
- $this->preview = $preview;
- $this->resizeAndCrop();
-
- $previewPath = $this->getPreviewPath($fileId);
- $cachePath = $this->buildCachePath($fileId);
-
- if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) {
- $this->userView->mkdir($this->getThumbnailsFolder() . '/');
- }
-
- if ($this->userView->is_dir($previewPath) === false) {
- $this->userView->mkdir($previewPath);
- }
-
- $this->userView->file_put_contents($cachePath, $preview->data());
-
- break 2;
- }
- }
+ $this->generatePreview($fileId);
}
+ // We still don't have a preview, so we generate an empty object which can't be displayed
if (is_null($this->preview)) {
$this->preview = new \OC_Image();
}
@@ -588,18 +549,58 @@ class Preview {
}
/**
+ * Retrieves the preview from the cache and resizes it if necessary
+ *
+ * @param int $fileId fileId of the original image
+ * @param string $cached the path to the cached preview
+ */
+ private function getCachedPreview($fileId, $cached) {
+ $stream = $this->userView->fopen($cached, 'r');
+ $this->preview = null;
+ if ($stream) {
+ $image = new \OC_Image();
+ $image->loadFromFileHandle($stream);
+
+ $this->preview = $image->valid() ? $image : null;
+
+ $maxX = (int)$this->getMaxX();
+ $maxY = (int)$this->getMaxY();
+ $previewX = (int)$this->preview->width();
+ $previewY = (int)$this->preview->height();
+
+ if ($previewX !== $maxX && $previewY !== $maxY) {
+ $this->resizeAndStore($fileId);
+ }
+
+ fclose($stream);
+ }
+ }
+
+ /**
+ * Resizes, crops, fixes orientation and stores in the cache
+ *
+ * @param int $fileId fileId of the original image
+ */
+ private function resizeAndStore($fileId) {
+ // Resize and store
+ $this->resizeAndCrop();
+ // We save a copy in the cache to speed up future calls
+ $cachePath = $this->buildCachePath($fileId);
+ $this->userView->file_put_contents($cachePath, $this->preview->data());
+ }
+
+ /**
* resize, crop and fix orientation
- * @return void
+ *
+ * @param bool $max
*/
- private function resizeAndCrop() {
+ private function resizeAndCrop($max = false) {
$image = $this->preview;
- $x = $this->getMaxX();
- $y = $this->getMaxY();
- $scalingUp = $this->getScalingUp();
- $maxScaleFactor = $this->getMaxScaleFactor();
+
+ list($x, $y, $scalingUp, $maxScaleFactor) = $this->getResizeData($max);
if (!($image instanceof \OCP\IImage)) {
- \OC_Log::write('core', '$this->preview is not an instance of \OCP\IImage', \OC_Log::DEBUG);
+ \OCP\Util::writeLog('core', '$this->preview is not an instance of OC_Image', \OCP\Util::DEBUG);
return;
}
@@ -617,6 +618,7 @@ class Preview {
}
}
+ // The preview already has the asked dimensions
if ($x === $realX && $y === $realY) {
$this->preview = $image;
return;
@@ -639,7 +641,7 @@ class Preview {
if (!is_null($maxScaleFactor)) {
if ($factor > $maxScaleFactor) {
- \OC_Log::write('core', 'scale factor reduced from ' . $factor . ' to ' . $maxScaleFactor, \OC_Log::DEBUG);
+ \OCP\Util::writeLog('core', 'scale factor reduced from ' . $factor . ' to ' . $maxScaleFactor, \OCP\Util::DEBUG);
$factor = $maxScaleFactor;
}
}
@@ -649,11 +651,13 @@ class Preview {
$image->preciseResize($newXSize, $newYSize);
+ // The preview has been upscaled and now has the asked dimensions
if ($newXSize === $x && $newYSize === $y) {
$this->preview = $image;
return;
}
+ // One dimension of the upscaled preview is too big
if ($newXSize >= $x && $newYSize >= $y) {
$cropX = floor(abs($x - $newXSize) * 0.5);
//don't crop previews on the Y axis, this sucks if it's a document.
@@ -666,6 +670,7 @@ class Preview {
return;
}
+ // One dimension of the upscaled preview is too small and we're allowed to scale up
if (($newXSize < $x || $newYSize < $y) && $scalingUp) {
if ($newXSize > $x) {
$cropX = floor(($newXSize - $x) * 0.5);
@@ -698,11 +703,161 @@ class Preview {
$image = new \OC_Image($backgroundLayer);
$this->preview = $image;
+
return;
}
}
/**
+ * Returns data to be used to resize a preview
+ *
+ * @param $max
+ *
+ * @return array
+ */
+ private function getResizeData($max) {
+ if (!$max) {
+ $x = $this->getMaxX();
+ $y = $this->getMaxY();
+ $scalingUp = $this->getScalingUp();
+ $maxScaleFactor = $this->getMaxScaleFactor();
+ } else {
+ $x = $this->configMaxX;
+ $y = $this->configMaxY;
+ $scalingUp = false;
+ $maxScaleFactor =1;
+ }
+
+ return [$x, $y, $scalingUp, $maxScaleFactor];
+ }
+
+ /**
+ * Returns the path to a preview based on its dimensions and aspect
+ *
+ * @param int $fileId
+ *
+ * @return string
+ */
+ private function buildCachePath($fileId) {
+ $maxX = $this->getMaxX();
+ $maxY = $this->getMaxY();
+
+ $previewPath = $this->getPreviewPath($fileId);
+ $previewPath = $previewPath . strval($maxX) . '-' . strval($maxY);
+ if ($this->keepAspect) {
+ $previewPath .= '-with-aspect';
+ }
+ $previewPath .= '.png';
+
+ return $previewPath;
+ }
+
+ /**
+ * @param int $fileId
+ *
+ * @return string
+ */
+ private function getPreviewPath($fileId) {
+ return $this->getThumbnailsFolder() . '/' . $fileId . '/';
+ }
+
+ /**
+ * Asks the provider to send a preview of the file of maximum dimensions
+ * and after saving it in the cache, it is then resized to the asked dimensions
+ *
+ * This is only called once in order to generate a large PNG of dimensions defined in the
+ * configuration file. We'll be able to quickly resize it later on.
+ * We never upscale the original conversion as this will be done later by the resizing operation
+ *
+ * @param int $fileId fileId of the original image
+ */
+ private function generatePreview($fileId) {
+ $file = $this->getFile();
+ $preview = null;
+
+ $previewProviders = \OC::$server->getPreviewManager()->getProviders();
+ foreach ($previewProviders as $supportedMimeType => $providers) {
+ if (!preg_match($supportedMimeType, $this->mimeType)) {
+ continue;
+ }
+
+ foreach ($providers as $closure) {
+ $provider = $closure();
+ if (!($provider instanceof \OCP\Preview\IProvider)) {
+ continue;
+ }
+
+ \OCP\Util::writeLog(
+ 'core', 'Generating preview for "' . $file . '" with "' . get_class($provider)
+ . '"', \OCP\Util::DEBUG
+ );
+
+ /** @var $provider Provider */
+ $preview = $provider->getThumbnail(
+ $file, $this->configMaxX, $this->configMaxY, $scalingUp = false, $this->fileView
+ );
+
+ if (!($preview instanceof \OCP\IImage)) {
+ continue;
+ }
+
+ $this->preview = $preview;
+ $previewPath = $this->getPreviewPath($fileId);
+
+ if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) {
+ $this->userView->mkdir($this->getThumbnailsFolder() . '/');
+ }
+
+ if ($this->userView->is_dir($previewPath) === false) {
+ $this->userView->mkdir($previewPath);
+ }
+
+ // This stores our large preview so that it can be used in subsequent resizing requests
+ $this->storeMaxPreview($previewPath);
+
+ break 2;
+ }
+ }
+
+ // The providers have been kind enough to give us a preview
+ if ($preview) {
+ $this->resizeAndStore($fileId);
+ }
+ }
+
+ /**
+ * Stores the max preview in the cache
+ *
+ * @param string $previewPath path to the preview
+ */
+ private function storeMaxPreview($previewPath) {
+ $maxPreview = false;
+ $preview = $this->preview;
+
+ $allThumbnails = $this->userView->getDirectoryContent($previewPath);
+ // This is so that the cache doesn't need emptying when upgrading
+ // Can be replaced by an upgrade script...
+ foreach ($allThumbnails as $thumbnail) {
+ $name = rtrim($thumbnail['name'], '.png');
+ if (strpos($name, 'max')) {
+ $maxPreview = true;
+ break;
+ }
+ }
+ // We haven't found the max preview, so we create it
+ if (!$maxPreview) {
+ // Most providers don't resize their thumbnails yet
+ $this->resizeAndCrop(true);
+
+ $maxX = $preview->width();
+ $maxY = $preview->height();
+ $previewPath = $previewPath . strval($maxX) . '-' . strval($maxY);
+ $previewPath .= '-max.png';
+ $this->userView->file_put_contents($previewPath, $preview->data());
+ }
+ }
+
+ /**
* @param array $args
*/
public static function post_write($args) {
@@ -791,30 +946,4 @@ class Preview {
$preview->deleteAllPreviews();
}
- /**
- * @param int $fileId
- * @return string
- */
- private function buildCachePath($fileId) {
- $maxX = $this->getMaxX();
- $maxY = $this->getMaxY();
-
- $previewPath = $this->getPreviewPath($fileId);
- $preview = $previewPath . strval($maxX) . '-' . strval($maxY);
- if ($this->keepAspect) {
- $preview .= '-with-aspect';
- }
- $preview .= '.png';
-
- return $preview;
- }
-
-
- /**
- * @param int $fileId
- * @return string
- */
- private function getPreviewPath($fileId) {
- return $this->getThumbnailsFolder() . '/' . $fileId . '/';
- }
}
diff --git a/lib/private/preview/bitmap.php b/lib/private/preview/bitmap.php
index 04496f7e1df..3071c788724 100644
--- a/lib/private/preview/bitmap.php
+++ b/lib/private/preview/bitmap.php
@@ -2,7 +2,7 @@
/**
* @author Joas Schilling <nickvergessen@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
- * @author Olivier Paroz <github@oparoz.com>
+ * @author Olivier Paroz <owncloud@interfasys.ch>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -23,30 +23,91 @@
namespace OC\Preview;
+use Imagick;
+
+/**
+ * Creates a PNG preview using ImageMagick via the PECL extension
+ *
+ * @package OC\Preview
+ */
abstract class Bitmap extends Provider {
+
/**
* {@inheritDoc}
*/
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
+
$tmpPath = $fileview->toTmpFile($path);
+ if (!$tmpPath) {
+ return false;
+ }
- //create imagick object from bitmap or vector file
+ // Creates \Imagick object from bitmap or vector file
try {
- // Layer 0 contains either the bitmap or
- // a flat representation of all vector layers
- $bp = new \Imagick($tmpPath . '[0]');
-
- $bp->setImageFormat('png');
+ $bp = $this->getResizedPreview($tmpPath, $maxX, $maxY);
} catch (\Exception $e) {
- \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR);
+ \OC_Log::write('core', 'ImageMagick says: ' . $e->getmessage(), \OC_Log::ERROR);
return false;
}
unlink($tmpPath);
//new bitmap image object
- $image = new \OC_Image($bp);
+ $image = new \OC_Image();
+ $image->loadFromData($bp);
//check if image object is valid
return $image->valid() ? $image : false;
}
+
+ /**
+ * Returns a preview of maxX times maxY dimensions in PNG format
+ *
+ * * The default resolution is already 72dpi, no need to change it for a bitmap output
+ * * It's possible to have proper colour conversion using profileimage().
+ * ICC profiles are here: http://www.color.org/srgbprofiles.xalter
+ * * It's possible to Gamma-correct an image via gammaImage()
+ *
+ * @param string $tmpPath the location of the file to convert
+ * @param int $maxX
+ * @param int $maxY
+ *
+ * @return \Imagick
+ */
+ private function getResizedPreview($tmpPath, $maxX, $maxY) {
+ $bp = new Imagick();
+
+ // Layer 0 contains either the bitmap or a flat representation of all vector layers
+ $bp->readImage($tmpPath . '[0]');
+
+ $bp = $this->resize($bp, $maxX, $maxY);
+
+ $bp->setImageFormat('png');
+
+ return $bp;
+ }
+
+ /**
+ * Returns a resized \Imagick object
+ *
+ * If you want to know more on the various methods available to resize an
+ * image, check out this link : @link https://stackoverflow.com/questions/8517304/what-the-difference-of-sample-resample-scale-resize-adaptive-resize-thumbnail-im
+ *
+ * @param \Imagick $bp
+ * @param int $maxX
+ * @param int $maxY
+ *
+ * @return \Imagick
+ */
+ private function resize($bp, $maxX, $maxY) {
+ list($previewWidth, $previewHeight) = array_values($bp->getImageGeometry());
+
+ // We only need to resize a preview which doesn't fit in the maximum dimensions
+ if ($previewWidth > $maxX || $previewHeight > $maxY) {
+ // TODO: LANCZOS is the default filter, CATROM could bring similar results faster
+ $bp->resizeImage($maxX, $maxY, imagick::FILTER_LANCZOS, 1, true);
+ }
+
+ return $bp;
+ }
+
}
diff --git a/lib/private/preview/bmp.php b/lib/private/preview/bmp.php
new file mode 100644
index 00000000000..0547f053cc1
--- /dev/null
+++ b/lib/private/preview/bmp.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @author Olivier Paroz <owncloud@interfasys.ch>
+ *
+ * @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\Preview;
+
+class BMP extends Image {
+ /**
+ * {@inheritDoc}
+ */
+ public function getMimeType() {
+ return '/image\/bmp/';
+ }
+}
diff --git a/lib/private/preview/gif.php b/lib/private/preview/gif.php
new file mode 100644
index 00000000000..e2b7c7e2ea2
--- /dev/null
+++ b/lib/private/preview/gif.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @author Olivier Paroz <owncloud@interfasys.ch>
+ *
+ * @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\Preview;
+
+class GIF extends Image {
+ /**
+ * {@inheritDoc}
+ */
+ public function getMimeType() {
+ return '/image\/gif/';
+ }
+}
diff --git a/lib/private/preview/image.php b/lib/private/preview/image.php
index 9770ca322e9..2c69d29f4cb 100644
--- a/lib/private/preview/image.php
+++ b/lib/private/preview/image.php
@@ -1,7 +1,7 @@
<?php
/**
* @author Georg Ehrke <georg@owncloud.com>
- * @author Georg Ehrke <georg@ownCloud.com>
+ * @author Olivier Paroz <owncloud@interfasys.ch>
* @author Joas Schilling <nickvergessen@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Thomas Müller <thomas.mueller@tmit.eu>
@@ -25,13 +25,7 @@
*/
namespace OC\Preview;
-class Image extends Provider {
- /**
- * {@inheritDoc}
- */
- public function getMimeType() {
- return '/image\/(?!tiff$)(?!svg.*).*/';
- }
+abstract class Image extends Provider {
/**
* {@inheritDoc}
diff --git a/lib/private/preview/jpeg.php b/lib/private/preview/jpeg.php
new file mode 100644
index 00000000000..69edd95835c
--- /dev/null
+++ b/lib/private/preview/jpeg.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @author Olivier Paroz <owncloud@interfasys.ch>
+ *
+ * @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\Preview;
+
+class JPEG extends Image {
+ /**
+ * {@inheritDoc}
+ */
+ public function getMimeType() {
+ return '/image\/jpeg/';
+ }
+}
diff --git a/lib/private/preview/png.php b/lib/private/preview/png.php
new file mode 100644
index 00000000000..f40c1dbcc88
--- /dev/null
+++ b/lib/private/preview/png.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @author Olivier Paroz <owncloud@interfasys.ch>
+ *
+ * @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\Preview;
+
+class PNG extends Image {
+ /**
+ * {@inheritDoc}
+ */
+ public function getMimeType() {
+ return '/image\/png/';
+ }
+}
diff --git a/lib/private/preview/xbitmap.php b/lib/private/preview/xbitmap.php
new file mode 100644
index 00000000000..db7b85ff012
--- /dev/null
+++ b/lib/private/preview/xbitmap.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @author Olivier Paroz <owncloud@interfasys.ch>
+ *
+ * @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\Preview;
+
+class XBitmap extends Image {
+ /**
+ * {@inheritDoc}
+ */
+ public function getMimeType() {
+ return '/image\/x-xbitmap/';
+ }
+}
diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php
index c4d29261f24..78ae12cd2e5 100644
--- a/lib/private/previewmanager.php
+++ b/lib/private/previewmanager.php
@@ -188,7 +188,11 @@ class PreviewManager implements IPreview {
* List of enabled default providers
*
* The following providers are enabled by default:
- * - OC\Preview\Image
+ * - OC\Preview\PNG
+ * - OC\Preview\JPEG
+ * - OC\Preview\GIF
+ * - OC\Preview\BMP
+ * - OC\Preview\XBitmap
* - OC\Preview\MarkDown
* - OC\Preview\MP3
* - OC\Preview\TXT
@@ -215,12 +219,24 @@ class PreviewManager implements IPreview {
return $this->defaultProviders;
}
- $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', [
- 'OC\Preview\Image',
+ $imageProviders = [
+ 'OC\Preview\PNG',
+ 'OC\Preview\JPEG',
+ 'OC\Preview\GIF',
+ 'OC\Preview\BMP',
+ 'OC\Preview\XBitmap'
+ ];
+
+ $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', array_merge([
'OC\Preview\MarkDown',
'OC\Preview\MP3',
'OC\Preview\TXT',
- ]);
+ ], $imageProviders));
+
+ if (in_array('OC\Preview\Image', $this->defaultProviders)) {
+ $this->defaultProviders = array_merge($this->defaultProviders, $imageProviders);
+ }
+ $this->defaultProviders = array_unique($this->defaultProviders);
return $this->defaultProviders;
}
@@ -249,7 +265,11 @@ class PreviewManager implements IPreview {
$this->registerCoreProvider('OC\Preview\TXT', '/text\/plain/');
$this->registerCoreProvider('OC\Preview\MarkDown', '/text\/(x-)?markdown/');
- $this->registerCoreProvider('OC\Preview\Image', '/image\/(?!tiff$)(?!svg.*).*/');
+ $this->registerCoreProvider('OC\Preview\PNG', '/image\/png/');
+ $this->registerCoreProvider('OC\Preview\JPEG', '/image\/jpeg/');
+ $this->registerCoreProvider('OC\Preview\GIF', '/image\/gif/');
+ $this->registerCoreProvider('OC\Preview\BMP', '/image\/bmp/');
+ $this->registerCoreProvider('OC\Preview\XBitmap', '/image\/x-xbitmap/');
$this->registerCoreProvider('OC\Preview\MP3', '/audio\/mpeg/');
// SVG, Office and Bitmap require imagick
diff --git a/lib/private/response.php b/lib/private/response.php
index ba458cb6afd..018c44d2367 100644
--- a/lib/private/response.php
+++ b/lib/private/response.php
@@ -191,6 +191,27 @@ class OC_Response {
}
/**
+ * Sets the content length header (with possible workarounds)
+ * @param string|int|float $length Length to be sent
+ */
+ static public function setContentLengthHeader($length) {
+ if (PHP_INT_SIZE === 4) {
+ if ($length > PHP_INT_MAX && stripos(PHP_SAPI, 'apache') === 0) {
+ // Apache PHP SAPI casts Content-Length headers to PHP integers.
+ // This enforces a limit of PHP_INT_MAX (2147483647 on 32-bit
+ // platforms). So, if the length is greater than PHP_INT_MAX,
+ // we just do not send a Content-Length header to prevent
+ // bodies from being received incompletely.
+ return;
+ }
+ // Convert signed integer or float to unsigned base-10 string.
+ $lfh = new \OC\LargeFileHelper;
+ $length = $lfh->formatUnsignedInteger($length);
+ }
+ header('Content-Length: '.$length);
+ }
+
+ /**
* Send file as response, checking and setting caching headers
* @param string $filepath of file to send
*/
@@ -200,7 +221,7 @@ class OC_Response {
self::setLastModifiedHeader(filemtime($filepath));
self::setETagHeader(md5_file($filepath));
- header('Content-Length: '.filesize($filepath));
+ self::setContentLengthHeader(filesize($filepath));
fpassthru($fp);
}
else {
diff --git a/lib/private/server.php b/lib/private/server.php
index 592f8d9a042..661aaf6786d 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -87,6 +87,11 @@ class Server extends SimpleContainer implements IServerContainer {
return new Encryption\Manager($c->getConfig());
});
+ $this->registerService('EncryptionFileHelper', function (Server $c) {
+ $util = new \OC\Encryption\Util(new \OC\Files\View(), $c->getUserManager(), $c->getConfig());
+ return new Encryption\File($util);
+ });
+
$this->registerService('EncryptionKeyStorageFactory', function ($c) {
return new Encryption\Keys\Factory();
});
@@ -309,10 +314,12 @@ class Server extends SimpleContainer implements IServerContainer {
return new TempManager(get_temp_dir(), $c->getLogger());
});
$this->registerService('AppManager', function(Server $c) {
- $userSession = $c->getUserSession();
- $appConfig = $c->getAppConfig();
- $groupManager = $c->getGroupManager();
- return new \OC\App\AppManager($userSession, $appConfig, $groupManager);
+ return new \OC\App\AppManager(
+ $c->getUserSession(),
+ $c->getAppConfig(),
+ $c->getGroupManager(),
+ $c->getMemCacheFactory()
+ );
});
$this->registerService('DateTimeZone', function(Server $c) {
return new DateTimeZone(
@@ -406,13 +413,20 @@ class Server extends SimpleContainer implements IServerContainer {
}
/**
+ * @return \OC\Encryption\File
+ */
+ function getEncryptionFilesHelper() {
+ return $this->query('EncryptionFileHelper');
+ }
+
+ /**
* @param string $encryptionModuleId encryption module ID
*
* @return \OCP\Encryption\Keys\IStorage
*/
function getEncryptionKeyStorage($encryptionModuleId) {
$view = new \OC\Files\View();
- $util = new \OC\Encryption\Util($view, \OC::$server->getUserManager());
+ $util = new \OC\Encryption\Util($view, \OC::$server->getUserManager(), \OC::$server->getConfig());
return $this->query('EncryptionKeyStorageFactory')->get($encryptionModuleId, $view, $util);
}
@@ -494,19 +508,7 @@ class Server extends SimpleContainer implements IServerContainer {
$dir = '/files';
if (!$folder->nodeExists($dir)) {
$folder = $folder->newFolder($dir);
-
- if (\OCP\App::isEnabled('files_encryption')) {
- // disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
- }
-
\OC_Util::copySkeleton($user, $folder);
-
- if (\OCP\App::isEnabled('files_encryption')) {
- // re-enable proxy - our work is done
- \OC_FileProxy::$enabled = $proxyStatus;
- }
} else {
$folder = $folder->get($dir);
}
diff --git a/lib/private/setup.php b/lib/private/setup.php
index 1aa2af124c6..7ca30e172ec 100644
--- a/lib/private/setup.php
+++ b/lib/private/setup.php
@@ -181,7 +181,8 @@ class Setup {
\OC\Setup::protectDataDirectory();
try {
- $htAccessWorking = \OC_Util::isHtaccessWorking();
+ $util = new \OC_Util();
+ $htAccessWorking = $util->isHtaccessWorking(\OC::$server->getConfig());
} catch (\OC\HintException $e) {
$errors[] = array(
'error' => $e->getMessage(),
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index d254b5a665c..e624e8da451 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -2290,7 +2290,7 @@ class Share extends \OC\Share\Constants {
$select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `*PREFIX*share`.`parent`, `uid_owner`, '
. '`share_type`, `share_with`, `file_source`, `path`, `file_target`, `stime`, '
. '`*PREFIX*share`.`permissions`, `expiration`, `storage`, `*PREFIX*filecache`.`parent` as `file_parent`, '
- . '`name`, `mtime`, `mimetype`, `mimepart`, `size`, `unencrypted_size`, `encrypted`, `etag`, `mail_send`';
+ . '`name`, `mtime`, `mimetype`, `mimepart`, `size`, `encrypted`, `etag`, `mail_send`';
} else {
$select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `item_target`,'
. '`*PREFIX*share`.`parent`, `share_type`, `share_with`, `uid_owner`,'
diff --git a/lib/private/util.php b/lib/private/util.php
index 5aa65401b9a..3fd0f844684 100644
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -67,7 +67,7 @@ class OC_Util {
// mount local file backend as root
$configDataDirectory = OC_Config::getValue("datadirectory", OC::$SERVERROOT . "/data");
//first set up the local "root" storage
- \OC\Files\Filesystem::initMounts();
+ \OC\Files\Filesystem::initMountManager();
if (!self::$rootMounted) {
\OC\Files\Filesystem::mount('\OC\Files\Storage\Local', array('datadir' => $configDataDirectory), '/');
self::$rootMounted = true;
@@ -96,7 +96,7 @@ class OC_Util {
$config['class'] = '\OC\Files\ObjectStore\ObjectStoreStorage';
// mount object storage as root
- \OC\Files\Filesystem::initMounts();
+ \OC\Files\Filesystem::initMountManager();
if (!self::$rootMounted) {
\OC\Files\Filesystem::mount($config['class'], $config['arguments'], '/');
self::$rootMounted = true;
@@ -133,6 +133,41 @@ class OC_Util {
self::$fsSetup = true;
}
+ \OC\Files\Filesystem::initMountManager();
+
+ \OC\Files\Filesystem::addStorageWrapper('mount_options', function ($mountPoint, \OCP\Files\Storage $storage, \OCP\Files\Mount\IMountPoint $mount) {
+ if ($storage->instanceOfStorage('\OC\Files\Storage\Common')) {
+ /** @var \OC\Files\Storage\Common $storage */
+ $storage->setMountOptions($mount->getOptions());
+ }
+ return $storage;
+ });
+
+ \OC\Files\Filesystem::addStorageWrapper('oc_quota', function ($mountPoint, $storage) {
+ // set up quota for home storages, even for other users
+ // which can happen when using sharing
+
+ /**
+ * @var \OC\Files\Storage\Storage $storage
+ */
+ if ($storage->instanceOfStorage('\OC\Files\Storage\Home')
+ || $storage->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')
+ ) {
+ /** @var \OC\Files\Storage\Home $storage */
+ if (is_object($storage->getUser())) {
+ $user = $storage->getUser()->getUID();
+ $quota = OC_Util::getUserQuota($user);
+ if ($quota !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
+ return new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage, 'quota' => $quota, 'root' => 'files'));
+ }
+ }
+ }
+
+ return $storage;
+ });
+
+ OC_Hook::emit('OC_Filesystem', 'preSetup', array('user' => $user));
+
//check if we are using an object storage
$objectStore = OC_Config::getValue('objectstore');
if (isset($objectStore)) {
@@ -146,37 +181,8 @@ class OC_Util {
return false;
}
- \OC\Files\Filesystem::addStorageWrapper('mount_options', function($mountPoint, \OCP\Files\Storage $storage, \OCP\Files\Mount\IMountPoint $mount) {
- if($storage->instanceOfStorage('\OC\Files\Storage\Common')) {
- /** @var \OC\Files\Storage\Common $storage */
- $storage->setMountOptions($mount->getOptions());
- }
- return $storage;
- });
-
//if we aren't logged in, there is no use to set up the filesystem
if ($user != "") {
- \OC\Files\Filesystem::addStorageWrapper('oc_quota', function ($mountPoint, $storage) {
- // set up quota for home storages, even for other users
- // which can happen when using sharing
-
- /**
- * @var \OC\Files\Storage\Storage $storage
- */
- if ($storage->instanceOfStorage('\OC\Files\Storage\Home')
- || $storage->instanceOfStorage('\OC\Files\ObjectStore\HomeObjectStoreStorage')
- ) {
- if (is_object($storage->getUser())) {
- $user = $storage->getUser()->getUID();
- $quota = OC_Util::getUserQuota($user);
- if ($quota !== \OCP\Files\FileInfo::SPACE_UNLIMITED) {
- return new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage, 'quota' => $quota, 'root' => 'files'));
- }
- }
- }
-
- return $storage;
- });
$userDir = '/' . $user . '/files';
@@ -806,51 +812,6 @@ class OC_Util {
return $errors;
}
-
- /**
- * check if there are still some encrypted files stored
- *
- * @return boolean
- */
- public static function encryptedFiles() {
- //check if encryption was enabled in the past
- $encryptedFiles = false;
- if (OC_App::isEnabled('files_encryption') === false) {
- $view = new OC\Files\View('/' . OCP\User::getUser());
- $keysPath = '/files_encryption/keys';
- if ($view->is_dir($keysPath)) {
- $dircontent = $view->getDirectoryContent($keysPath);
- if (!empty($dircontent)) {
- $encryptedFiles = true;
- }
- }
- }
-
- return $encryptedFiles;
- }
-
- /**
- * check if a backup from the encryption keys exists
- *
- * @return boolean
- */
- public static function backupKeysExists() {
- //check if encryption was enabled in the past
- $backupExists = false;
- if (OC_App::isEnabled('files_encryption') === false) {
- $view = new OC\Files\View('/' . OCP\User::getUser());
- $backupPath = '/files_encryption/backup.decryptAll';
- if ($view->is_dir($backupPath)) {
- $dircontent = $view->getDirectoryContent($backupPath);
- if (!empty($dircontent)) {
- $backupExists = true;
- }
- }
- }
-
- return $backupExists;
- }
-
/**
* Check for correct file permissions of data directory
*
@@ -1155,14 +1116,13 @@ class OC_Util {
/**
* Check if the .htaccess file is working
- *
- * @throws OC\HintException If the testfile can't get written.
+ * @param \OCP\IConfig $config
* @return bool
- * @description Check if the .htaccess file is working by creating a test
- * file in the data directory and trying to access via http
+ * @throws Exception
+ * @throws \OC\HintException If the test file can't get written.
*/
- public static function isHtaccessWorking() {
- if (\OC::$CLI || !OC::$server->getConfig()->getSystemValue('check_for_working_htaccess', true)) {
+ public function isHtaccessWorking(\OCP\IConfig $config) {
+ if (\OC::$CLI || !$config->getSystemValue('check_for_working_htaccess', true)) {
return true;
}
@@ -1176,7 +1136,7 @@ class OC_Util {
$testContent = 'testcontent';
// creating a test file
- $testFile = OC::$server->getConfig()->getSystemValue('datadirectory', OC::$SERVERROOT . '/data') . '/' . $fileName;
+ $testFile = $config->getSystemValue('datadirectory', OC::$SERVERROOT . '/data') . '/' . $fileName;
if (file_exists($testFile)) {// already running this test, possible recursive call
return false;
@@ -1245,36 +1205,6 @@ class OC_Util {
}
/**
- * Check if the ownCloud server can connect to the internet
- *
- * @param \OCP\Http\Client\IClientService $clientService
- * @return bool
- */
- public static function isInternetConnectionWorking(\OCP\Http\Client\IClientService $clientService) {
- // in case there is no internet connection on purpose return false
- if (self::isInternetConnectionEnabled() === false) {
- return false;
- }
-
- try {
- $client = $clientService->newClient();
- $response = $client->get('https://www.owncloud.org/');
- return $response->getStatusCode() === 200;
- } catch (\Exception $e) {
- return false;
- }
- }
-
- /**
- * Check if the connection to the internet is disabled on purpose
- *
- * @return string
- */
- public static function isInternetConnectionEnabled() {
- return \OC_Config::getValue("has_internet_connection", true);
- }
-
- /**
* clear all levels of output buffering
*
* @return void
diff --git a/lib/public/encryption/exceptions/genericencryptionexception.php b/lib/public/encryption/exceptions/genericencryptionexception.php
new file mode 100644
index 00000000000..59ab25fd61d
--- /dev/null
+++ b/lib/public/encryption/exceptions/genericencryptionexception.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Clark Tomlinson <fallen013@gmail.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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 OCP\Encryption\Exceptions;
+
+
+class GenericEncryptionException extends \Exception {
+
+ public function __construct($message = "", $code = 0, \Exception $previous = null) {
+ if (empty($message)) {
+ $message = 'Unspecified encryption exception';
+ }
+ parent::__construct($message, $code, $previous);
+ }
+
+}
diff --git a/lib/public/encryption/iencryptionmodule.php b/lib/public/encryption/iencryptionmodule.php
index 7265fee1259..2f5f5e8a807 100644
--- a/lib/public/encryption/iencryptionmodule.php
+++ b/lib/public/encryption/iencryptionmodule.php
@@ -1,24 +1,22 @@
<?php
-
/**
- * ownCloud - public interface of ownCloud for encryption modules
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCP\Encryption;
diff --git a/apps/files_encryption/appinfo/update.php b/lib/public/encryption/ifile.php
index e8ccee063ef..cc1e8f426b2 100644
--- a/apps/files_encryption/appinfo/update.php
+++ b/lib/public/encryption/ifile.php
@@ -1,7 +1,6 @@
<?php
/**
* @author Björn Schießle <schiessle@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
@@ -20,12 +19,17 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
-use OCA\Files_Encryption\Migration;
-$installedVersion=OCP\Config::getAppValue('files_encryption', 'installed_version');
+namespace OCP\Encryption;
+
+interface IFile {
+
+ /**
+ * get list of users with access to the file
+ *
+ * @param string $path to the file
+ * @return array
+ */
+ public function getAccessList($path);
-// Migration OC7 -> OC8
-if (version_compare($installedVersion, '0.7', '<')) {
- $m = new Migration();
- $m->reorganizeFolderStructure();
}
diff --git a/lib/public/encryption/imanager.php b/lib/public/encryption/imanager.php
index 9a12e401593..ec91e3580e5 100644
--- a/lib/public/encryption/imanager.php
+++ b/lib/public/encryption/imanager.php
@@ -1,30 +1,26 @@
<?php
-
/**
- * ownCloud - manage encryption modules
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCP\Encryption;
-//
-// TODO: move exceptions to OCP
-//
+
use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
use OC\Encryption\Exceptions\ModuleAlreadyExistsException;
diff --git a/lib/public/encryption/keys/istorage.php b/lib/public/encryption/keys/istorage.php
index 4c2b01f4ad0..898ab81c373 100644
--- a/lib/public/encryption/keys/istorage.php
+++ b/lib/public/encryption/keys/istorage.php
@@ -1,24 +1,23 @@
<?php
-
/**
- * ownCloud
- *
- * @copyright (C) 2015 ownCloud, Inc.
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
- * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * 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 library is distributed in the hope that it will be useful,
+ * 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.
+ * 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/>
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCP\Encryption\Keys;
@@ -122,4 +121,20 @@ interface IStorage {
*/
public function deleteSystemUserKey($keyId);
+ /**
+ * copy keys if a file was renamed
+ *
+ * @param string $source
+ * @param string $target
+ */
+ public function renameKeys($source, $target);
+
+ /**
+ * move keys if a file was renamed
+ *
+ * @param string $source
+ * @param string $target
+ */
+ public function copyKeys($source, $target);
+
}
diff --git a/lib/public/idatetimezone.php b/lib/public/idatetimezone.php
index 30fbde15ac8..eb74074aa46 100644
--- a/lib/public/idatetimezone.php
+++ b/lib/public/idatetimezone.php
@@ -25,7 +25,8 @@ namespace OCP;
interface IDateTimeZone {
/**
+ * @param bool|int $timestamp
* @return \DateTimeZone
*/
- public function getTimeZone();
+ public function getTimeZone($timestamp = false);
}
diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php
index d7df884adf8..16a680ec170 100644
--- a/lib/public/iservercontainer.php
+++ b/lib/public/iservercontainer.php
@@ -2,6 +2,7 @@
/**
* @author Bart Visscher <bartv@thisnet.nl>
* @author Bernhard Posselt <dev@bernhard-posselt.com>
+ * @author Björn Schießle <schiessle@owncloud.com>
* @author Christopher Schäpers <kondou@ts.unde.re>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Lukas Reschke <lukas@owncloud.com>
@@ -150,13 +151,19 @@ interface IServerContainer {
function getHasher();
/**
+ * Returns a SecureRandom instance
+ *
+ * @return \OCP\Security\ISecureRandom
+ */
+ function getSecureRandom();
+
+ /**
* Returns an instance of the db facade
* @deprecated use getDatabaseConnection, will be removed in ownCloud 10
* @return \OCP\IDb
*/
function getDb();
-
/**
* Returns the app config manager
*
@@ -173,6 +180,23 @@ interface IServerContainer {
function getL10N($app, $lang = null);
/**
+ * @return \OC\Encryption\Manager
+ */
+ function getEncryptionManager();
+
+ /**
+ * @return \OC\Encryption\File
+ */
+ function getEncryptionFilesHelper();
+
+ /**
+ * @param string $encryptionModuleId encryption module ID
+ *
+ * @return \OCP\Encryption\Keys\IStorage
+ */
+ function getEncryptionKeyStorage($encryptionModuleId);
+
+ /**
* Returns the URL generator
*
* @return \OCP\IURLGenerator
diff --git a/lib/public/response.php b/lib/public/response.php
index 2f0922c49ed..d4d32e89ab7 100644
--- a/lib/public/response.php
+++ b/lib/public/response.php
@@ -68,6 +68,14 @@ class Response {
}
/**
+ * Sets the content length header (with possible workarounds)
+ * @param string|int|float $length Length to be sent
+ */
+ static public function setContentLengthHeader($length) {
+ \OC_Response::setContentLengthHeader($length);
+ }
+
+ /**
* Disable browser caching
* @see enableCaching with cache_time = 0
*/
diff --git a/lib/public/util.php b/lib/public/util.php
index 3f9b71f37a9..721bcaadb62 100644
--- a/lib/public/util.php
+++ b/lib/public/util.php
@@ -219,9 +219,11 @@ class Util {
/**
* check if some encrypted files are stored
* @return bool
+ *
+ * @deprecated No longer required
*/
public static function encryptedFiles() {
- return \OC_Util::encryptedFiles();
+ return false;
}
/**
@@ -260,6 +262,7 @@ class Util {
* @param array $parameters
* @internal param array $args with param=>value, will be appended to the returned url
* @return string the url
+ * @deprecated Use \OC::$server->getURLGenerator()->linkToRoute($route, $parameters)
*/
public static function linkToRoute( $route, $parameters = array() ) {
return \OC_Helper::linkToRoute($route, $parameters);
@@ -272,6 +275,7 @@ class Util {
* @param array $args array with param=>value, will be appended to the returned url
* The value of $args will be urlencoded
* @return string the url
+ * @deprecated Use \OC::$server->getURLGenerator()->linkTo($app, $file, $args)
*/
public static function linkTo( $app, $file, $args = array() ) {
return(\OC_Helper::linkTo( $app, $file, $args ));
@@ -362,6 +366,7 @@ class Util {
* @param string $app app
* @param string $image image name
* @return string the url
+ * @deprecated Use \OC::$server->getURLGenerator()->imagePath($app, $image)
*/
public static function imagePath( $app, $image ) {
return(\OC_Helper::imagePath( $app, $image ));
@@ -389,18 +394,19 @@ class Util {
/**
* connects a function to a hook
- * @param string $signalclass class name of emitter
- * @param string $signalname name of signal
- * @param string $slotclass class name of slot
- * @param string $slotname name of slot
+ *
+ * @param string $signalClass class name of emitter
+ * @param string $signalName name of signal
+ * @param string|object $slotClass class name of slot
+ * @param string $slotName name of slot
* @return bool
*
* This function makes it very easy to connect to use hooks.
*
* TODO: write example
*/
- static public function connectHook( $signalclass, $signalname, $slotclass, $slotname ) {
- return(\OC_Hook::connect( $signalclass, $signalname, $slotclass, $slotname ));
+ static public function connectHook($signalClass, $signalName, $slotClass, $slotName ) {
+ return(\OC_Hook::connect($signalClass, $signalName, $slotClass, $slotName ));
}
/**
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
index 3d39507b998..1b36894eed8 100644
--- a/lib/repair/repairmimetypes.php
+++ b/lib/repair/repairmimetypes.php
@@ -218,6 +218,24 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
self::updateMimetypes($updatedMimetypes);
}
+ private function introduceConfMimeType() {
+ $updatedMimetypes = array(
+ 'conf' => 'text/plain',
+ 'cnf' => 'text/plain',
+ );
+
+ self::updateMimetypes($updatedMimetypes);
+ }
+
+ private function introduceYamlMimeType() {
+ $updatedMimetypes = array(
+ 'yaml' => 'application/yaml',
+ 'yml' => 'application/yaml',
+ );
+
+ self::updateMimetypes($updatedMimetypes);
+ }
+
/**
* Fix mime types
*/
@@ -245,5 +263,13 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
if ($this->introduce3dImagesMimeType()) {
$this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
}
+
+ if ($this->introduceConfMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types'));
+ }
+
+ if ($this->introduceYamlMimeType()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types'));
+ }
}
}
diff --git a/ocs/v1.php b/ocs/v1.php
index 5bba65d9a1a..398a128c64b 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -27,7 +27,7 @@
require_once '../lib/base.php';
-if (\OCP\Util::needUpgrade()) {
+if (\OCP\Util::needUpgrade() || \OC::$server->getSystemConfig()->getValue('maintenance', false)) {
// since the behavior of apps or remotes are unpredictable during
// an upgrade, return a 503 directly
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
diff --git a/settings/admin.php b/settings/admin.php
index 95afaf1ac0a..976d0a5c3f1 100644
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -159,6 +159,7 @@ foreach ($forms as $index => $form) {
if ($filesExternal) {
$formsAndMore[] = array('anchor' => 'files_external', 'section-name' => $l->t('External Storage'));
}
+
$template->assign('fileSharingSettings', $fileSharingSettings);
$template->assign('filesExternal', $filesExternal);
$template->assign('updaterAppPanel', $updaterAppPanel);
@@ -184,12 +185,13 @@ $formsMap = array_map(function ($form) {
$formsAndMore = array_merge($formsAndMore, $formsMap);
// add bottom hardcoded forms from the template
-$formsAndMore[] = array('anchor' => 'backgroundjobs', 'section-name' => $l->t('Cron'));
-$formsAndMore[] = array('anchor' => 'mail_general_settings', 'section-name' => $l->t('Email Server'));
-$formsAndMore[] = array('anchor' => 'log-section', 'section-name' => $l->t('Log'));
-$formsAndMore[] = array('anchor' => 'admin-tips', 'section-name' => $l->t('Tips & tricks'));
+$formsAndMore[] = ['anchor' => 'encryptionAPI', 'section-name' => $l->t('Server Side Encryption')];
+$formsAndMore[] = ['anchor' => 'backgroundjobs', 'section-name' => $l->t('Cron')];
+$formsAndMore[] = ['anchor' => 'mail_general_settings', 'section-name' => $l->t('Email Server')];
+$formsAndMore[] = ['anchor' => 'log-section', 'section-name' => $l->t('Log')];
+$formsAndMore[] = ['anchor' => 'admin-tips', 'section-name' => $l->t('Tips & tricks')];
if ($updaterAppPanel) {
- $formsAndMore[] = array('anchor' => 'updater', 'section-name' => $l->t('Updates'));
+ $formsAndMore[] = ['anchor' => 'updater', 'section-name' => $l->t('Updates')];
}
$template->assign('forms', $formsAndMore);
diff --git a/settings/ajax/checksetup.php b/settings/ajax/checksetup.php
deleted file mode 100644
index 6e41c11e050..00000000000
--- a/settings/ajax/checksetup.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Vincent Petry <pvince81@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/>
- *
- */
-
-OCP\JSON::checkAdminUser();
-OCP\JSON::callCheck();
-
-\OC::$server->getSession()->close();
-
-// no warning when has_internet_connection is false in the config
-$hasInternet = true;
-if (OC_Util::isInternetConnectionEnabled()) {
- $hasInternet = OC_Util::isInternetConnectionWorking(\OC::$server->getHTTPClientService());
-}
-
-OCP\JSON::success(
- array (
- 'serverHasInternetConnection' => $hasInternet,
- 'dataDirectoryProtected' => OC_Util::isHtaccessWorking()
- )
-);
diff --git a/settings/ajax/decryptall.php b/settings/ajax/decryptall.php
deleted file mode 100644
index 5925cee9dfd..00000000000
--- a/settings/ajax/decryptall.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Volkan Gezer <volkangezer@gmail.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/>
- *
- */
-OCP\JSON::checkLoggedIn();
-OCP\JSON::callCheck();
-
-//encryption app needs to be loaded
-OC_App::loadApp('files_encryption');
-
-// init encryption app
-$params = array('uid' => \OCP\User::getUser(),
- 'password' => (string)$_POST['password']);
-
-$view = new OC\Files\View('/');
-$util = new \OCA\Files_Encryption\Util($view, \OCP\User::getUser());
-$l = \OC::$server->getL10N('settings');
-
-$result = $util->initEncryption($params);
-
-if ($result !== false) {
-
- try {
- $successful = $util->decryptAll();
- } catch (\Exception $ex) {
- \OCP\Util::writeLog('encryption library', "Decryption finished unexpected: " . $ex->getMessage(), \OCP\Util::ERROR);
- $successful = false;
- }
-
- $util->closeEncryptionSession();
-
- if ($successful === true) {
- \OCP\JSON::success(array('data' => array('message' => $l->t('Files decrypted successfully'))));
- } else {
- \OCP\JSON::error(array('data' => array('message' => $l->t('Couldn\'t decrypt your files, please check your owncloud.log or ask your administrator'))));
- }
-} else {
- \OCP\JSON::error(array('data' => array('message' => $l->t('Couldn\'t decrypt your files, check your password and try again'))));
-}
-
diff --git a/settings/ajax/deletekeys.php b/settings/ajax/deletekeys.php
deleted file mode 100644
index 2192eb8c725..00000000000
--- a/settings/ajax/deletekeys.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@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/>
- *
- */
-OCP\JSON::checkLoggedIn();
-OCP\JSON::callCheck();
-
-$l = \OC::$server->getL10N('settings');
-
-$util = new \OCA\Files_Encryption\Util(new \OC\Files\View(), \OC_User::getUser());
-$result = $util->deleteBackup('decryptAll');
-
-if ($result) {
- \OCP\JSON::success(array('data' => array('message' => $l->t('Encryption keys deleted permanently'))));
-} else {
- \OCP\JSON::error(array('data' => array('message' => $l->t('Couldn\'t permanently delete your encryption keys, please check your owncloud.log or ask your administrator'))));
-}
diff --git a/settings/ajax/disableapp.php b/settings/ajax/disableapp.php
index cc02203b4a3..f99969d91a4 100644
--- a/settings/ajax/disableapp.php
+++ b/settings/ajax/disableapp.php
@@ -31,9 +31,5 @@ if (!array_key_exists('appid', $_POST)) {
$appId = (string)$_POST['appid'];
$appId = OC_App::cleanAppId($appId);
-// FIXME: Clear the cache - move that into some sane helper method
-\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-0');
-\OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-1');
-
OC_App::disable($appId);
OC_JSON::success();
diff --git a/settings/ajax/enableapp.php b/settings/ajax/enableapp.php
index aa688c4964c..b63bce76d92 100644
--- a/settings/ajax/enableapp.php
+++ b/settings/ajax/enableapp.php
@@ -30,9 +30,6 @@ $groups = isset($_POST['groups']) ? (array)$_POST['groups'] : null;
try {
OC_App::enable(OC_App::cleanAppId((string)$_POST['appid']), $groups);
- // FIXME: Clear the cache - move that into some sane helper method
- \OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-0');
- \OC::$server->getMemCacheFactory()->create('settings')->remove('listApps-1');
OC_JSON::success();
} catch (Exception $e) {
OC_Log::write('core', $e->getMessage(), OC_Log::ERROR);
diff --git a/settings/ajax/restorekeys.php b/settings/ajax/restorekeys.php
deleted file mode 100644
index 52c02b3aba4..00000000000
--- a/settings/ajax/restorekeys.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@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/>
- *
- */
-OCP\JSON::checkLoggedIn();
-OCP\JSON::callCheck();
-
-$l = \OC::$server->getL10N('settings');
-
-$util = new \OCA\Files_Encryption\Util(new \OC\Files\View(), \OC_User::getUser());
-$result = $util->restoreBackup('decryptAll');
-
-if ($result) {
- \OCP\JSON::success(array('data' => array('message' => $l->t('Backups restored successfully'))));
-} else {
- \OCP\JSON::error(array('data' => array('message' => $l->t('Couldn\'t restore your encryption keys, please check your owncloud.log or ask your administrator'))));
-}
diff --git a/settings/application.php b/settings/application.php
index 397e3b3de91..eb8f0f7a999 100644
--- a/settings/application.php
+++ b/settings/application.php
@@ -24,6 +24,7 @@
namespace OC\Settings;
use OC\Settings\Controller\AppSettingsController;
+use OC\Settings\Controller\CheckSetupController;
use OC\Settings\Controller\GroupsController;
use OC\Settings\Controller\LogSettingsController;
use OC\Settings\Controller\MailSettingsController;
@@ -44,7 +45,7 @@ class Application extends App {
/**
* @param array $urlParams
*/
- public function __construct(array $urlParams=array()){
+ public function __construct(array $urlParams=[]){
parent::__construct('settings', $urlParams);
$container = $this->getContainer();
@@ -117,6 +118,16 @@ class Application extends App {
$c->query('L10N')
);
});
+ $container->registerService('CheckSetupController', function(IContainer $c) {
+ return new CheckSetupController(
+ $c->query('AppName'),
+ $c->query('Request'),
+ $c->query('Config'),
+ $c->query('ClientService'),
+ $c->query('URLGenerator'),
+ $c->query('Util')
+ );
+ });
/**
* Middleware
@@ -178,5 +189,11 @@ class Application extends App {
$container->registerService('URLGenerator', function(IContainer $c) {
return $c->query('ServerContainer')->getURLGenerator();
});
+ $container->registerService('ClientService', function(IContainer $c) {
+ return $c->query('ServerContainer')->getHTTPClientService();
+ });
+ $container->registerService('Util', function(IContainer $c) {
+ return new \OC_Util();
+ });
}
}
diff --git a/settings/changepassword/controller.php b/settings/changepassword/controller.php
index 1be30b725df..f041cb5b29f 100644
--- a/settings/changepassword/controller.php
+++ b/settings/changepassword/controller.php
@@ -77,16 +77,43 @@ class Controller {
exit();
}
- if (\OC_App::isEnabled('files_encryption')) {
+ if (\OC_App::isEnabled('encryption')) {
//handle the recovery case
- $util = new \OCA\Files_Encryption\Util(new \OC\Files\View('/'), $username);
- $recoveryAdminEnabled = \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled');
+ $crypt = new \OCA\Encryption\Crypto\Crypt(
+ \OC::$server->getLogger(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getConfig());
+ $keyStorage = \OC::$server->getEncryptionKeyStorage(\OCA\Encryption\Crypto\Encryption::ID);
+ $util = new \OCA\Encryption\Util(
+ new \OC\Files\View(),
+ $crypt,
+ \OC::$server->getLogger(),
+ \OC::$server->getUserSession(),
+ \OC::$server->getConfig());
+ $keyManager = new \OCA\Encryption\KeyManager(
+ $keyStorage,
+ $crypt,
+ \OC::$server->getConfig(),
+ \OC::$server->getUserSession(),
+ new \OCA\Encryption\Session(\OC::$server->getSession()),
+ \OC::$server->getLogger(),
+ $util);
+ $recovery = new \OCA\Encryption\Recovery(
+ \OC::$server->getUserSession(),
+ $crypt,
+ \OC::$server->getSecureRandom(),
+ $keyManager,
+ \OC::$server->getConfig(),
+ $keyStorage,
+ \OC::$server->getEncryptionFilesHelper(),
+ new \OC\Files\View());
+ $recoveryAdminEnabled = $recovery->isRecoveryKeyEnabled();
$validRecoveryPassword = false;
$recoveryEnabledForUser = false;
if ($recoveryAdminEnabled) {
- $validRecoveryPassword = $util->checkRecoveryPassword($recoveryPassword);
- $recoveryEnabledForUser = $util->recoveryEnabledForUser();
+ $validRecoveryPassword = $keyManager->checkRecoveryPassword($recoveryPassword);
+ $recoveryEnabledForUser = $recovery->isRecoveryEnabledForUser();
}
if ($recoveryEnabledForUser && $recoveryPassword === '') {
diff --git a/settings/controller/checksetupcontroller.php b/settings/controller/checksetupcontroller.php
new file mode 100644
index 00000000000..15719ce215f
--- /dev/null
+++ b/settings/controller/checksetupcontroller.php
@@ -0,0 +1,106 @@
+<?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 OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\Http\Client\IClientService;
+use OCP\IConfig;
+use OCP\IRequest;
+use OC_Util;
+use OCP\IURLGenerator;
+
+/**
+ * @package OC\Settings\Controller
+ */
+class CheckSetupController extends Controller {
+ /** @var IConfig */
+ private $config;
+ /** @var IClientService */
+ private $clientService;
+ /** @var \OC_Util */
+ private $util;
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ /**
+ * @param string $AppName
+ * @param IRequest $request
+ * @param IConfig $config
+ * @param IClientService $clientService
+ * @param IURLGenerator $urlGenerator
+ * @param \OC_Util $util
+ */
+ public function __construct($AppName,
+ IRequest $request,
+ IConfig $config,
+ IClientService $clientService,
+ IURLGenerator $urlGenerator,
+ \OC_Util $util) {
+ parent::__construct($AppName, $request);
+ $this->config = $config;
+ $this->clientService = $clientService;
+ $this->util = $util;
+ $this->urlGenerator = $urlGenerator;
+ }
+
+ /**
+ * Checks if the ownCloud server can connect to the internet using HTTPS and HTTP
+ * @return bool
+ */
+ private function isInternetConnectionWorking() {
+ if ($this->config->getSystemValue('has_internet_connection', true) === false) {
+ return false;
+ }
+
+ try {
+ $client = $this->clientService->newClient();
+ $client->get('https://www.owncloud.org/');
+ $client->get('http://www.owncloud.org/');
+ return true;
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Checks whether a local memcache is installed or not
+ * @return bool
+ */
+ private function isMemcacheConfigured() {
+ return $this->config->getSystemValue('memcache.local', null) !== null;
+ }
+
+ /**
+ * @return DataResponse
+ */
+ public function check() {
+ return new DataResponse(
+ [
+ 'serverHasInternetConnection' => $this->isInternetConnectionWorking(),
+ 'dataDirectoryProtected' => $this->util->isHtaccessWorking($this->config),
+ 'isMemcacheConfigured' => $this->isMemcacheConfigured(),
+ 'memcacheDocs' => $this->urlGenerator->linkToDocs('admin-performance'),
+ ]
+ );
+ }
+}
diff --git a/settings/css/settings.css b/settings/css/settings.css
index c619bd7b9b3..3bc0a442f06 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -29,10 +29,19 @@ input#openid, input#webdav { width:20em; }
font-weight: bold;
}
-#displaynameerror { display:none; }
-#displaynamechanged { display:none; }
-input#identity { width:20em; }
-#email { width: 17em; }
+#displaynameerror {
+ display: none;
+}
+#displaynamechanged {
+ display: none;
+}
+input#identity {
+ width: 20em;
+}
+#displayName,
+#email {
+ width: 17em;
+}
#avatar .warning {
width: 350px;
diff --git a/settings/js/apps.js b/settings/js/apps.js
index 8431cbd4ff4..3db84e8acd5 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -132,7 +132,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
page.find("label[for='groups_enable-"+app.id+"']").hide();
page.find(".groups-enable").attr('checked', null);
} else {
- page.find('#group_select').val((app.groups || []).join(','));
+ page.find('#group_select').val((app.groups || []).join('|'));
if (app.active) {
if (app.groups.length) {
OC.Settings.Apps.setupGroupsSelect(page.find('#group_select'));
diff --git a/settings/js/personal.js b/settings/js/personal.js
index 302906702bd..43f328d2223 100644
--- a/settings/js/personal.js
+++ b/settings/js/personal.js
@@ -172,7 +172,7 @@ $(document).ready(function () {
$('#pass2').showPassword().keyup();
}
$("#passwordbutton").click(function () {
- var isIE8or9 = html.hasClass('lte9');
+ var isIE8or9 = $('html').hasClass('lte9');
// FIXME - TODO - once support for IE8 and IE9 is dropped
// for IE8 and IE9 this will check additionally if the typed in password
// is different from the placeholder, because in IE8/9 the placeholder
@@ -230,40 +230,6 @@ $(document).ready(function () {
return false;
});
- $('button:button[name="submitDecryptAll"]').click(function () {
- var privateKeyPassword = $('#decryptAll input:password[id="privateKeyPassword"]').val();
- $('#decryptAll button:button[name="submitDecryptAll"]').prop("disabled", true);
- $('#decryptAll input:password[name="privateKeyPassword"]').prop("disabled", true);
- OC.Encryption.decryptAll(privateKeyPassword);
- });
-
-
- $('button:button[name="submitRestoreKeys"]').click(function () {
- $('#restoreBackupKeys button:button[name="submitDeleteKeys"]').prop("disabled", true);
- $('#restoreBackupKeys button:button[name="submitRestoreKeys"]').prop("disabled", true);
- OC.Encryption.restoreKeys();
- });
-
- $('button:button[name="submitDeleteKeys"]').click(function () {
- $('#restoreBackupKeys button:button[name="submitDeleteKeys"]').prop("disabled", true);
- $('#restoreBackupKeys button:button[name="submitRestoreKeys"]').prop("disabled", true);
- OC.Encryption.deleteKeys();
- });
-
- $('#decryptAll input:password[name="privateKeyPassword"]').keyup(function (event) {
- var privateKeyPassword = $('#decryptAll input:password[id="privateKeyPassword"]').val();
- if (privateKeyPassword !== '') {
- $('#decryptAll button:button[name="submitDecryptAll"]').prop("disabled", false);
- if (event.which === 13) {
- $('#decryptAll button:button[name="submitDecryptAll"]').prop("disabled", true);
- $('#decryptAll input:password[name="privateKeyPassword"]').prop("disabled", true);
- OC.Encryption.decryptAll(privateKeyPassword);
- }
- } else {
- $('#decryptAll button:button[name="submitDecryptAll"]').prop("disabled", true);
- }
- });
-
var uploadparms = {
done: function (e, data) {
avatarResponseHandler(data.result);
@@ -371,47 +337,6 @@ $(document).ready(function () {
});
OC.Encryption = {
- decryptAll: function (password) {
- var message = t('settings', 'Decrypting files... Please wait, this can take some time.');
- OC.Encryption.msg.start('#decryptAll .msg', message);
- $.post('ajax/decryptall.php', {password: password}, function (data) {
- if (data.status === "error") {
- OC.Encryption.msg.finished('#decryptAll .msg', data);
- $('#decryptAll input:password[name="privateKeyPassword"]').prop("disabled", false);
- } else {
- OC.Encryption.msg.finished('#decryptAll .msg', data);
- }
- $('#restoreBackupKeys').removeClass('hidden');
- });
- },
-
- deleteKeys: function () {
- var message = t('settings', 'Delete encryption keys permanently.');
- OC.Encryption.msg.start('#restoreBackupKeys .msg', message);
- $.post('ajax/deletekeys.php', null, function (data) {
- if (data.status === "error") {
- OC.Encryption.msg.finished('#restoreBackupKeys .msg', data);
- $('#restoreBackupKeys button:button[name="submitDeleteKeys"]').prop("disabled", false);
- $('#restoreBackupKeys button:button[name="submitRestoreKeys"]').prop("disabled", false);
- } else {
- OC.Encryption.msg.finished('#restoreBackupKeys .msg', data);
- }
- });
- },
-
- restoreKeys: function () {
- var message = t('settings', 'Restore encryption keys.');
- OC.Encryption.msg.start('#restoreBackupKeys .msg', message);
- $.post('ajax/restorekeys.php', {}, function (data) {
- if (data.status === "error") {
- OC.Encryption.msg.finished('#restoreBackupKeys .msg', data);
- $('#restoreBackupKeys button:button[name="submitDeleteKeys"]').prop("disabled", false);
- $('#restoreBackupKeys button:button[name="submitRestoreKeys"]').prop("disabled", false);
- } else {
- OC.Encryption.msg.finished('#restoreBackupKeys .msg', data);
- }
- });
- }
};
OC.Encryption.msg = {
diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js
index d920cec6d96..8ab328e85e2 100644
--- a/settings/l10n/ar.js
+++ b/settings/l10n/ar.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"settings",
{
- "Cron" : "مجدول",
"Sharing" : "مشاركة",
+ "Cron" : "مجدول",
"Email Server" : "خادم البريد الالكتروني",
"Log" : "سجل",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
@@ -64,14 +64,14 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "موديل 'fileinfo' الخاص بالـPHP مفقود . نوصي بتفعيل هذا الموديل للحصول على أفضل النتائج مع خاصية التحقق ",
"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." : "هذا يعني انه من الممكن ان يكون هناك مشكلة في بعض الاحرف في اسم الملف.",
- "Execute one task with each page loaded" : "قم بتنفيذ مهمة واحدة مع كل صفحة تم تحميلها",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "الملف cron.php تم تسجيله فى خدمه webcron لاستدعاء الملف cron.php كل 15 دقيقه",
"Allow apps to use the Share API" : "السماح للتطبيقات بالمشاركة عن طريق الAPI",
"Allow users to share via link" : "السماح للمستخدم بمشاركة الملف عن طريق رابط",
"Allow public uploads" : "السماح بالرفع للعامة ",
"Expire after " : "ينتهي بعد",
"days" : "أيام",
"Allow resharing" : "السماح بإعادة المشاركة ",
+ "Execute one task with each page loaded" : "قم بتنفيذ مهمة واحدة مع كل صفحة تم تحميلها",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "الملف cron.php تم تسجيله فى خدمه webcron لاستدعاء الملف cron.php كل 15 دقيقه",
"Send mode" : "وضعية الإرسال",
"Authentication method" : "أسلوب التطابق",
"Server address" : "عنوان الخادم",
diff --git a/settings/l10n/ar.json b/settings/l10n/ar.json
index 7c6cbf33b25..047e82c4097 100644
--- a/settings/l10n/ar.json
+++ b/settings/l10n/ar.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Cron" : "مجدول",
"Sharing" : "مشاركة",
+ "Cron" : "مجدول",
"Email Server" : "خادم البريد الالكتروني",
"Log" : "سجل",
"Authentication error" : "لم يتم التأكد من الشخصية بنجاح",
@@ -62,14 +62,14 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "موديل 'fileinfo' الخاص بالـPHP مفقود . نوصي بتفعيل هذا الموديل للحصول على أفضل النتائج مع خاصية التحقق ",
"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." : "هذا يعني انه من الممكن ان يكون هناك مشكلة في بعض الاحرف في اسم الملف.",
- "Execute one task with each page loaded" : "قم بتنفيذ مهمة واحدة مع كل صفحة تم تحميلها",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "الملف cron.php تم تسجيله فى خدمه webcron لاستدعاء الملف cron.php كل 15 دقيقه",
"Allow apps to use the Share API" : "السماح للتطبيقات بالمشاركة عن طريق الAPI",
"Allow users to share via link" : "السماح للمستخدم بمشاركة الملف عن طريق رابط",
"Allow public uploads" : "السماح بالرفع للعامة ",
"Expire after " : "ينتهي بعد",
"days" : "أيام",
"Allow resharing" : "السماح بإعادة المشاركة ",
+ "Execute one task with each page loaded" : "قم بتنفيذ مهمة واحدة مع كل صفحة تم تحميلها",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "الملف cron.php تم تسجيله فى خدمه webcron لاستدعاء الملف cron.php كل 15 دقيقه",
"Send mode" : "وضعية الإرسال",
"Authentication method" : "أسلوب التطابق",
"Server address" : "عنوان الخادم",
diff --git a/settings/l10n/ast.js b/settings/l10n/ast.js
index 117fefbb66a..b517ffed460 100644
--- a/settings/l10n/ast.js
+++ b/settings/l10n/ast.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
+ "External Storage" : "Almacenamientu esternu",
+ "Cron" : "Cron",
"Email Server" : "Sirvidor de corréu-e",
"Log" : "Rexistru",
+ "Updates" : "Anovamientos",
"Authentication error" : "Fallu d'autenticación",
"Your full name has been changed." : "Camudóse'l nome completu.",
"Unable to change full name" : "Nun pue camudase'l nome completu",
@@ -93,10 +95,6 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Nun s'atopó'l módulu PHP 'fileinfo'. Encamentámoste qu'habilites esti módulu pa obtener meyores resultaos cola deteición de tribes MIME.",
"System locale can not be set to a one which supports UTF-8." : "Nun se pue escoyer una configuración rexonal que sofite UTF-8.",
"This means that there might be problems with certain characters in file names." : "Esto significa que pue haber problemes con ciertos caráuteres nos nomes de los ficheros.",
- "Cron was not executed yet!" : "¡Cron entá nun s'executó!",
- "Execute one task with each page loaded" : "Executar una xera con cada páxina cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php rexístrase nun serviciu webcron pa llamar a cron.php cada 15 minutos al traviés de HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el serviciu cron del sistema pa llamar al ficheru cron.php cada 15 mins.",
"Allow apps to use the Share API" : "Permitir a les aplicaciones usar la API de Compartición",
"Allow users to share via link" : "Permitir a los usuarios compartir vía enllaz",
"Enforce password protection" : "Ameyora la proteición por contraseña.",
@@ -110,6 +108,10 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Restrinxir a los usuarios a compartir namái con otros usuarios nos sos grupos",
"Exclude groups from sharing" : "Esclúi grupos de compartir",
"These groups will still be able to receive shares, but not to initiate them." : "Estos grupos van poder siguir recibiendo conteníos compartíos, pero nun van poder anicialos",
+ "Cron was not executed yet!" : "¡Cron entá nun s'executó!",
+ "Execute one task with each page loaded" : "Executar una xera con cada páxina cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php rexístrase nun serviciu webcron pa llamar a cron.php cada 15 minutos al traviés de HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el serviciu cron del sistema pa llamar al ficheru cron.php cada 15 mins.",
"This is used for sending out notifications." : "Esto úsase pa unviar notificaciones.",
"Send mode" : "Mou d'unviu",
"From address" : "Dende la direición",
diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json
index 22a6574a8b2..8b9e04e3526 100644
--- a/settings/l10n/ast.json
+++ b/settings/l10n/ast.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
+ "External Storage" : "Almacenamientu esternu",
+ "Cron" : "Cron",
"Email Server" : "Sirvidor de corréu-e",
"Log" : "Rexistru",
+ "Updates" : "Anovamientos",
"Authentication error" : "Fallu d'autenticación",
"Your full name has been changed." : "Camudóse'l nome completu.",
"Unable to change full name" : "Nun pue camudase'l nome completu",
@@ -91,10 +93,6 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Nun s'atopó'l módulu PHP 'fileinfo'. Encamentámoste qu'habilites esti módulu pa obtener meyores resultaos cola deteición de tribes MIME.",
"System locale can not be set to a one which supports UTF-8." : "Nun se pue escoyer una configuración rexonal que sofite UTF-8.",
"This means that there might be problems with certain characters in file names." : "Esto significa que pue haber problemes con ciertos caráuteres nos nomes de los ficheros.",
- "Cron was not executed yet!" : "¡Cron entá nun s'executó!",
- "Execute one task with each page loaded" : "Executar una xera con cada páxina cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php rexístrase nun serviciu webcron pa llamar a cron.php cada 15 minutos al traviés de HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el serviciu cron del sistema pa llamar al ficheru cron.php cada 15 mins.",
"Allow apps to use the Share API" : "Permitir a les aplicaciones usar la API de Compartición",
"Allow users to share via link" : "Permitir a los usuarios compartir vía enllaz",
"Enforce password protection" : "Ameyora la proteición por contraseña.",
@@ -108,6 +106,10 @@
"Restrict users to only share with users in their groups" : "Restrinxir a los usuarios a compartir namái con otros usuarios nos sos grupos",
"Exclude groups from sharing" : "Esclúi grupos de compartir",
"These groups will still be able to receive shares, but not to initiate them." : "Estos grupos van poder siguir recibiendo conteníos compartíos, pero nun van poder anicialos",
+ "Cron was not executed yet!" : "¡Cron entá nun s'executó!",
+ "Execute one task with each page loaded" : "Executar una xera con cada páxina cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php rexístrase nun serviciu webcron pa llamar a cron.php cada 15 minutos al traviés de HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el serviciu cron del sistema pa llamar al ficheru cron.php cada 15 mins.",
"This is used for sending out notifications." : "Esto úsase pa unviar notificaciones.",
"Send mode" : "Mou d'unviu",
"From address" : "Dende la direición",
diff --git a/settings/l10n/az.js b/settings/l10n/az.js
index 55565950134..26906097e85 100644
--- a/settings/l10n/az.js
+++ b/settings/l10n/az.js
@@ -1,10 +1,13 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
+ "Security & setup warnings" : "Təhlükəsizlik & işə salma xəbərdarlıqları",
"Sharing" : "Paylaşılır",
+ "External Storage" : "Kənar depo",
+ "Cron" : "Cron",
"Email Server" : "Email server",
"Log" : "Jurnal",
+ "Updates" : "Yenilənmələr",
"Authentication error" : "Təyinat metodikası",
"Your full name has been changed." : "Sizin tam adınız dəyişdirildi.",
"Unable to change full name" : "Tam adı dəyişmək olmur",
@@ -117,12 +120,6 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Biz təkidlə təklif edirik ki, göstərilən dillər üçün tələb edilən paketləri sisteminizdə yükləyəsiniz: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eger sizin yüklənməniz root domain-də yüklənməyibsə və sistem cron-u istifadə edirsə, orda URL generasiyası ilə bağlı problemləriniz ola bilər. Bu problemləri aşmaq üçün xahiş olunur yüklənmə vaxtı \"overwrite.cli.url\" opsiyasını config.php faylında webroot ünvanı olaraq təyin edəsiniz (Məsləhətdir: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CRON işini CLİ-dan yerinə yetirmək mümkün olmadı. Görünən texniki səhv baş verdi.",
- "Last cron job execution: %s." : "Son cron yerinə yetirilməsi işi: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Son cron yerinə yetirilməsi: %s. Nə isə yalnış görünür.",
- "Cron was not executed yet!" : "Cron hələ yerinə yetirilməyib!",
- "Execute one task with each page loaded" : "Hər səhifə yüklənməsində bir işi yerinə yetir",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php qeydə alınmış webcron servisdir hansi ki, http üzərindən hər 15 dəqiqədən bir cron.php çağırır.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Sistemin cron servisindən istifadə edin ki, cron.php faylını hər 15 dəqiqədən bir işə salasınız.",
"Allow apps to use the Share API" : "Proqramlara izin verin ki, Paylaşım API-sindən istifadə edə bilsinlər.",
"Allow users to share via link" : "Istifadəçilərə link üzərindən paylaşım etməyə izin vermək",
"Enforce password protection" : "Şifrə müdafiəsini həyata keçirmək",
@@ -137,6 +134,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "İstifadəçilərə etdikləri paylaşımı digər istifadəçilərə mail vasitəsilə xəbərdarlıq göndərilməsinə izin verin",
"Exclude groups from sharing" : "Qrupları paylaşımdan ayır",
"These groups will still be able to receive shares, but not to initiate them." : "Bu qruplar paylaşımları hələdə ala biləcəklər ancaq, yarada bilməyəcəklər",
+ "Last cron job execution: %s." : "Son cron yerinə yetirilməsi işi: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Son cron yerinə yetirilməsi: %s. Nə isə yalnış görünür.",
+ "Cron was not executed yet!" : "Cron hələ yerinə yetirilməyib!",
+ "Execute one task with each page loaded" : "Hər səhifə yüklənməsində bir işi yerinə yetir",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php qeydə alınmış webcron servisdir hansi ki, http üzərindən hər 15 dəqiqədən bir cron.php çağırır.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Sistemin cron servisindən istifadə edin ki, cron.php faylını hər 15 dəqiqədən bir işə salasınız.",
+ "Server Side Encryption" : "Server tərəf şifrələnmə",
"This is used for sending out notifications." : "Kənara xəbərdarlıqları ötürmək üçün bu istifadə edilir.",
"Send mode" : "Göndərmə rejimi",
"From address" : "Ünvandan",
@@ -158,6 +162,8 @@ OC.L10N.register(
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Jurnal faylı 100MB-dan çoxdur. Onun endirilməsi müəyyən vaxt ala bilər.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLinte verilənlər bazası kimi istifadə edilir. Geniş tətbiq üçün, biz məsləhət görürük ki, arxa sonluqda fərqli verilənlər bazasından istifadə edəsiniz. ",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.",
+ "How to do backups" : "Rezerv nüsxələr neçə edilisin",
+ "Advanced monitoring" : "İrəliləmiş monitoring",
"Version" : "Versiya",
"More apps" : "Çoxlu proqramlar",
"Developer documentation" : "Yaradıcı sənədləşməsi",
@@ -172,6 +178,7 @@ OC.L10N.register(
"Update to %s" : "Yenilə bunadək %s",
"Enable only for specific groups" : "Yalnız spesifik qruplara izin ver",
"Uninstall App" : "Proqram təminatını sil",
+ "No apps found for your version" : "Sizin versiya üçün proqram tapılmadı",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Ey ora,<br><br>ancaq deyirik ki, sizin artiq %s hesabınız var.<br><br>Sizin istifadəçi adınız: %s<br>Yetkilidir: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Şərəfə!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ey ora,\n\nancaq deyirik ki, sizin artiq %s hesabınız var.\n\nizin istifadəçi adınız: %s\nYetkilidir: %s\n\n",
diff --git a/settings/l10n/az.json b/settings/l10n/az.json
index abe9ca9ecbc..67c28617812 100644
--- a/settings/l10n/az.json
+++ b/settings/l10n/az.json
@@ -1,8 +1,11 @@
{ "translations": {
- "Cron" : "Cron",
+ "Security & setup warnings" : "Təhlükəsizlik & işə salma xəbərdarlıqları",
"Sharing" : "Paylaşılır",
+ "External Storage" : "Kənar depo",
+ "Cron" : "Cron",
"Email Server" : "Email server",
"Log" : "Jurnal",
+ "Updates" : "Yenilənmələr",
"Authentication error" : "Təyinat metodikası",
"Your full name has been changed." : "Sizin tam adınız dəyişdirildi.",
"Unable to change full name" : "Tam adı dəyişmək olmur",
@@ -115,12 +118,6 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Biz təkidlə təklif edirik ki, göstərilən dillər üçün tələb edilən paketləri sisteminizdə yükləyəsiniz: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eger sizin yüklənməniz root domain-də yüklənməyibsə və sistem cron-u istifadə edirsə, orda URL generasiyası ilə bağlı problemləriniz ola bilər. Bu problemləri aşmaq üçün xahiş olunur yüklənmə vaxtı \"overwrite.cli.url\" opsiyasını config.php faylında webroot ünvanı olaraq təyin edəsiniz (Məsləhətdir: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CRON işini CLİ-dan yerinə yetirmək mümkün olmadı. Görünən texniki səhv baş verdi.",
- "Last cron job execution: %s." : "Son cron yerinə yetirilməsi işi: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Son cron yerinə yetirilməsi: %s. Nə isə yalnış görünür.",
- "Cron was not executed yet!" : "Cron hələ yerinə yetirilməyib!",
- "Execute one task with each page loaded" : "Hər səhifə yüklənməsində bir işi yerinə yetir",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php qeydə alınmış webcron servisdir hansi ki, http üzərindən hər 15 dəqiqədən bir cron.php çağırır.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Sistemin cron servisindən istifadə edin ki, cron.php faylını hər 15 dəqiqədən bir işə salasınız.",
"Allow apps to use the Share API" : "Proqramlara izin verin ki, Paylaşım API-sindən istifadə edə bilsinlər.",
"Allow users to share via link" : "Istifadəçilərə link üzərindən paylaşım etməyə izin vermək",
"Enforce password protection" : "Şifrə müdafiəsini həyata keçirmək",
@@ -135,6 +132,13 @@
"Allow users to send mail notification for shared files to other users" : "İstifadəçilərə etdikləri paylaşımı digər istifadəçilərə mail vasitəsilə xəbərdarlıq göndərilməsinə izin verin",
"Exclude groups from sharing" : "Qrupları paylaşımdan ayır",
"These groups will still be able to receive shares, but not to initiate them." : "Bu qruplar paylaşımları hələdə ala biləcəklər ancaq, yarada bilməyəcəklər",
+ "Last cron job execution: %s." : "Son cron yerinə yetirilməsi işi: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Son cron yerinə yetirilməsi: %s. Nə isə yalnış görünür.",
+ "Cron was not executed yet!" : "Cron hələ yerinə yetirilməyib!",
+ "Execute one task with each page loaded" : "Hər səhifə yüklənməsində bir işi yerinə yetir",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php qeydə alınmış webcron servisdir hansi ki, http üzərindən hər 15 dəqiqədən bir cron.php çağırır.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Sistemin cron servisindən istifadə edin ki, cron.php faylını hər 15 dəqiqədən bir işə salasınız.",
+ "Server Side Encryption" : "Server tərəf şifrələnmə",
"This is used for sending out notifications." : "Kənara xəbərdarlıqları ötürmək üçün bu istifadə edilir.",
"Send mode" : "Göndərmə rejimi",
"From address" : "Ünvandan",
@@ -156,6 +160,8 @@
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Jurnal faylı 100MB-dan çoxdur. Onun endirilməsi müəyyən vaxt ala bilər.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLinte verilənlər bazası kimi istifadə edilir. Geniş tətbiq üçün, biz məsləhət görürük ki, arxa sonluqda fərqli verilənlər bazasından istifadə edəsiniz. ",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.",
+ "How to do backups" : "Rezerv nüsxələr neçə edilisin",
+ "Advanced monitoring" : "İrəliləmiş monitoring",
"Version" : "Versiya",
"More apps" : "Çoxlu proqramlar",
"Developer documentation" : "Yaradıcı sənədləşməsi",
@@ -170,6 +176,7 @@
"Update to %s" : "Yenilə bunadək %s",
"Enable only for specific groups" : "Yalnız spesifik qruplara izin ver",
"Uninstall App" : "Proqram təminatını sil",
+ "No apps found for your version" : "Sizin versiya üçün proqram tapılmadı",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Ey ora,<br><br>ancaq deyirik ki, sizin artiq %s hesabınız var.<br><br>Sizin istifadəçi adınız: %s<br>Yetkilidir: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Şərəfə!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ey ora,\n\nancaq deyirik ki, sizin artiq %s hesabınız var.\n\nizin istifadəçi adınız: %s\nYetkilidir: %s\n\n",
diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js
index 5684826d1fd..6ee0455602d 100644
--- a/settings/l10n/bg_BG.js
+++ b/settings/l10n/bg_BG.js
@@ -2,11 +2,12 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Предупреждения за сигурност и настройки",
- "Cron" : "Крон",
"Sharing" : "Споделяне",
- "Server Side Encryption" : "Криптиране от страна на сървъра",
+ "External Storage" : "Външно Дисково Пространство",
+ "Cron" : "Крон",
"Email Server" : "Имейл Сървър",
"Log" : "Лог",
+ "Updates" : "Обновления",
"Authentication error" : "Възникна проблем с идентификацията",
"Your full name has been changed." : "Вашето пълно име е променено.",
"Unable to change full name" : "Неуспешна промяна на пълното име.",
@@ -117,12 +118,6 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Силно препоръчваме инсталиране на необходимите паките на системата, за поддръжка на следните местоположения: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталацията не е в основата на вашия домейн и използва системния cron, могат да възникнат проблеми с генерирането на URLи. За избягване на тези проблеми, моля настройте <code>overwrite.cli.url</code> опцията в config.php файла с мрежовия път към вашята инсталация (Вероятно : \\\"%s\\\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не бе възможно да изпълним cron задачата през команден интерфейс. Следните технически грешки се появиха:",
- "Last cron job execution: %s." : "Последно изпълнение на cron задача: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Последно изпълнение на cron задача: %s. Нещо не е както трябва",
- "Cron was not executed yet!" : "Cron oще не е изпълнен!",
- "Execute one task with each page loaded" : "Изпълни по едно задание с всяка заредена страница.",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php е регистриран към webcron да се свързва с cron.php всеки 15 минути по http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Изполвай системната cron service, за връзка с cron.php файла всеки 15 минути.",
"Allow apps to use the Share API" : "Разреши приложенията да използват Share API.",
"Allow users to share via link" : "Разреши потребителите да споделят с връзка",
"Enforce password protection" : "Изискай защита с парола.",
@@ -137,6 +132,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Разреши потребителите да изпращат уведомителни писма за споделени файлове към други потребители.",
"Exclude groups from sharing" : "Забрани групи да споделят",
"These groups will still be able to receive shares, but not to initiate them." : "Тези групи ще могат да получават споделения, но няма да могат самите те да споделят.",
+ "Last cron job execution: %s." : "Последно изпълнение на cron задача: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последно изпълнение на cron задача: %s. Нещо не е както трябва",
+ "Cron was not executed yet!" : "Cron oще не е изпълнен!",
+ "Execute one task with each page loaded" : "Изпълни по едно задание с всяка заредена страница.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php е регистриран към webcron да се свързва с cron.php всеки 15 минути по http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Изполвай системната cron service, за връзка с cron.php файла всеки 15 минути.",
+ "Server Side Encryption" : "Криптиране от страна на сървъра",
"Enable Server-Side-Encryption" : "Включи криптиране от страна на сървъра",
"This is used for sending out notifications." : "Това се използва за изпращане на уведомления.",
"Send mode" : "Режим на изпращане",
diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json
index d1bf84da5a7..d7dc3131fc0 100644
--- a/settings/l10n/bg_BG.json
+++ b/settings/l10n/bg_BG.json
@@ -1,10 +1,11 @@
{ "translations": {
"Security & setup warnings" : "Предупреждения за сигурност и настройки",
- "Cron" : "Крон",
"Sharing" : "Споделяне",
- "Server Side Encryption" : "Криптиране от страна на сървъра",
+ "External Storage" : "Външно Дисково Пространство",
+ "Cron" : "Крон",
"Email Server" : "Имейл Сървър",
"Log" : "Лог",
+ "Updates" : "Обновления",
"Authentication error" : "Възникна проблем с идентификацията",
"Your full name has been changed." : "Вашето пълно име е променено.",
"Unable to change full name" : "Неуспешна промяна на пълното име.",
@@ -115,12 +116,6 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Силно препоръчваме инсталиране на необходимите паките на системата, за поддръжка на следните местоположения: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталацията не е в основата на вашия домейн и използва системния cron, могат да възникнат проблеми с генерирането на URLи. За избягване на тези проблеми, моля настройте <code>overwrite.cli.url</code> опцията в config.php файла с мрежовия път към вашята инсталация (Вероятно : \\\"%s\\\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не бе възможно да изпълним cron задачата през команден интерфейс. Следните технически грешки се появиха:",
- "Last cron job execution: %s." : "Последно изпълнение на cron задача: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Последно изпълнение на cron задача: %s. Нещо не е както трябва",
- "Cron was not executed yet!" : "Cron oще не е изпълнен!",
- "Execute one task with each page loaded" : "Изпълни по едно задание с всяка заредена страница.",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php е регистриран към webcron да се свързва с cron.php всеки 15 минути по http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Изполвай системната cron service, за връзка с cron.php файла всеки 15 минути.",
"Allow apps to use the Share API" : "Разреши приложенията да използват Share API.",
"Allow users to share via link" : "Разреши потребителите да споделят с връзка",
"Enforce password protection" : "Изискай защита с парола.",
@@ -135,6 +130,13 @@
"Allow users to send mail notification for shared files to other users" : "Разреши потребителите да изпращат уведомителни писма за споделени файлове към други потребители.",
"Exclude groups from sharing" : "Забрани групи да споделят",
"These groups will still be able to receive shares, but not to initiate them." : "Тези групи ще могат да получават споделения, но няма да могат самите те да споделят.",
+ "Last cron job execution: %s." : "Последно изпълнение на cron задача: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последно изпълнение на cron задача: %s. Нещо не е както трябва",
+ "Cron was not executed yet!" : "Cron oще не е изпълнен!",
+ "Execute one task with each page loaded" : "Изпълни по едно задание с всяка заредена страница.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php е регистриран към webcron да се свързва с cron.php всеки 15 минути по http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Изполвай системната cron service, за връзка с cron.php файла всеки 15 минути.",
+ "Server Side Encryption" : "Криптиране от страна на сървъра",
"Enable Server-Side-Encryption" : "Включи криптиране от страна на сървъра",
"This is used for sending out notifications." : "Това се използва за изпращане на уведомления.",
"Send mode" : "Режим на изпращане",
diff --git a/settings/l10n/bn_BD.js b/settings/l10n/bn_BD.js
index 0137f883004..0b773bb89a4 100644
--- a/settings/l10n/bn_BD.js
+++ b/settings/l10n/bn_BD.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"settings",
{
"Sharing" : "ভাগাভাগিরত",
+ "External Storage" : "বাহ্যিক সংরক্ষণাগার",
"Email Server" : "ইমেইল সার্ভার",
"Authentication error" : "অনুমোদন ঘটিত সমস্যা",
"Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।",
diff --git a/settings/l10n/bn_BD.json b/settings/l10n/bn_BD.json
index 67bc9461ce2..94820431bad 100644
--- a/settings/l10n/bn_BD.json
+++ b/settings/l10n/bn_BD.json
@@ -1,5 +1,6 @@
{ "translations": {
"Sharing" : "ভাগাভাগিরত",
+ "External Storage" : "বাহ্যিক সংরক্ষণাগার",
"Email Server" : "ইমেইল সার্ভার",
"Authentication error" : "অনুমোদন ঘটিত সমস্যা",
"Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।",
diff --git a/settings/l10n/bs.js b/settings/l10n/bs.js
index 61a889015bf..911d0b62fd9 100644
--- a/settings/l10n/bs.js
+++ b/settings/l10n/bs.js
@@ -1,10 +1,11 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Dijeljenje",
+ "Cron" : "Cron",
"Email Server" : "Server e-pošte",
"Log" : "Zapisnik",
+ "Updates" : "Ažuriranja",
"Authentication error" : "Grešna autentifikacije",
"Your full name has been changed." : "Vaše puno ime je promijenjeno.",
"Unable to change full name" : "Puno ime nije moguće promijeniti",
@@ -106,10 +107,6 @@ OC.L10N.register(
"System locale can not be set to a one which supports UTF-8." : "Regionalnu šemu sustava nemoguće je postaviti na neku koja podržava UTF-8.",
"This means that there might be problems with certain characters in file names." : "To znači da se mogu javiti problemi s određenim znakovima u nazivu datoteke.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Strogo se preporučuje instaliranje zahtjevnih paketa na vašem sistemu koji podržavaju jednu od slijedećih regionalnih šemi: %s.",
- "Cron was not executed yet!" : "Cron još nije izvršen!",
- "Execute one task with each page loaded" : "Izvrši jedan zadatak sa svakom učitanom stranicom",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrovan na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"Allow apps to use the Share API" : "Dozvoli aplikacijama korištenje Share API",
"Allow users to share via link" : "Dozvoli korisnicima dijeljenje putem veze",
"Enforce password protection" : "Nametni zaštitu lozinke",
@@ -124,6 +121,10 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Dozvoli korisnicima slanje notifikacijske e-pošte za podijeljene datoteke ka ostalim korisnicima",
"Exclude groups from sharing" : "Isključite grupe iz dijeljenja",
"These groups will still be able to receive shares, but not to initiate them." : "Ove će grupe i dalje moći primati dijeljene resurse, ali ne i inicirati ih",
+ "Cron was not executed yet!" : "Cron još nije izvršen!",
+ "Execute one task with each page loaded" : "Izvrši jedan zadatak sa svakom učitanom stranicom",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrovan na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"This is used for sending out notifications." : "Ovo se koristi za slanje notifikacija.",
"Send mode" : "Način rada za slanje",
"From address" : "S adrese",
diff --git a/settings/l10n/bs.json b/settings/l10n/bs.json
index 045b6998981..0129b13d3aa 100644
--- a/settings/l10n/bs.json
+++ b/settings/l10n/bs.json
@@ -1,8 +1,9 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Dijeljenje",
+ "Cron" : "Cron",
"Email Server" : "Server e-pošte",
"Log" : "Zapisnik",
+ "Updates" : "Ažuriranja",
"Authentication error" : "Grešna autentifikacije",
"Your full name has been changed." : "Vaše puno ime je promijenjeno.",
"Unable to change full name" : "Puno ime nije moguće promijeniti",
@@ -104,10 +105,6 @@
"System locale can not be set to a one which supports UTF-8." : "Regionalnu šemu sustava nemoguće je postaviti na neku koja podržava UTF-8.",
"This means that there might be problems with certain characters in file names." : "To znači da se mogu javiti problemi s određenim znakovima u nazivu datoteke.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Strogo se preporučuje instaliranje zahtjevnih paketa na vašem sistemu koji podržavaju jednu od slijedećih regionalnih šemi: %s.",
- "Cron was not executed yet!" : "Cron još nije izvršen!",
- "Execute one task with each page loaded" : "Izvrši jedan zadatak sa svakom učitanom stranicom",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrovan na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"Allow apps to use the Share API" : "Dozvoli aplikacijama korištenje Share API",
"Allow users to share via link" : "Dozvoli korisnicima dijeljenje putem veze",
"Enforce password protection" : "Nametni zaštitu lozinke",
@@ -122,6 +119,10 @@
"Allow users to send mail notification for shared files to other users" : "Dozvoli korisnicima slanje notifikacijske e-pošte za podijeljene datoteke ka ostalim korisnicima",
"Exclude groups from sharing" : "Isključite grupe iz dijeljenja",
"These groups will still be able to receive shares, but not to initiate them." : "Ove će grupe i dalje moći primati dijeljene resurse, ali ne i inicirati ih",
+ "Cron was not executed yet!" : "Cron još nije izvršen!",
+ "Execute one task with each page loaded" : "Izvrši jedan zadatak sa svakom učitanom stranicom",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrovan na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"This is used for sending out notifications." : "Ovo se koristi za slanje notifikacija.",
"Send mode" : "Način rada za slanje",
"From address" : "S adrese",
diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js
index 087f9f0adaf..f1f6866f361 100644
--- a/settings/l10n/ca.js
+++ b/settings/l10n/ca.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Seguretat i configuració de alertes",
- "Cron" : "Cron",
"Sharing" : "Compartir",
- "Server Side Encryption" : "Xifrat en el servidor",
+ "External Storage" : "Emmagatzemament extern",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correu",
"Log" : "Registre",
"Tips & tricks" : "Consells i trucs",
+ "Updates" : "Actualitzacions",
"Authentication error" : "Error d'autenticació",
"Your full name has been changed." : "El vostre nom complet ha canviat.",
"Unable to change full name" : "No s'ha pogut canviar el nom complet",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si la seva instal·lació no està situada en l'arrel del domini i usa el sistema cron, pot haver-hi problemes en generar-se els URL. Per evitar-los, configuri l'opció \"overwrite.cli.url\" en el seu arxiu config.php perquè usi la ruta de l'arrel del lloc web de la seva instal·lació (suggeriment: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No va ser possible executar cronjob via CLI. Han aparegut els següents errors tècnics:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Per favor, torni a comprovar les <a target=\"_blank\" href=\"%s\">guies d'instal·lació ↗ </a>, i verifiqui que no existeixen errors o advertiments en el <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Última execució de la tasca cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execució de la tasca cron: %s. Alguna cosa sembla malament.",
- "Cron was not executed yet!" : "El cron encara no s'ha executat!",
- "Execute one task with each page loaded" : "Executa una tasca per cada paquet carregat",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php està registrat en un servei webcron que fa una crida a cron.php cada 15 minuts a través de http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Fer servir el cron del sistema per cridar el cron.php cada 15 minuts.",
"Allow apps to use the Share API" : "Permet que les aplicacions utilitzin l'API de compartir",
"Allow users to share via link" : "Permet als usuaris compartir a través d'enllaços",
"Enforce password protection" : "Reforça la protecció amb contrasenya",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Permetre als usuaris enviar notificacions per correu electrònic dels arxius compartits a d'altres usuaris",
"Exclude groups from sharing" : "Exclou grups de compartició",
"These groups will still be able to receive shares, but not to initiate them." : "Aquests fitxers encara podran rebre compartits, però no podran iniciar-los.",
+ "Last cron job execution: %s." : "Última execució de la tasca cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execució de la tasca cron: %s. Alguna cosa sembla malament.",
+ "Cron was not executed yet!" : "El cron encara no s'ha executat!",
+ "Execute one task with each page loaded" : "Executa una tasca per cada paquet carregat",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php està registrat en un servei webcron que fa una crida a cron.php cada 15 minuts a través de http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Fer servir el cron del sistema per cridar el cron.php cada 15 minuts.",
+ "Server Side Encryption" : "Xifrat en el servidor",
"Enable Server-Side-Encryption" : "Habilitar xifrat en el servidor",
"This is used for sending out notifications." : "S'usa per enviar notificacions.",
"Send mode" : "Mode d'enviament",
diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json
index cb8eca916ca..841e28710d4 100644
--- a/settings/l10n/ca.json
+++ b/settings/l10n/ca.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Seguretat i configuració de alertes",
- "Cron" : "Cron",
"Sharing" : "Compartir",
- "Server Side Encryption" : "Xifrat en el servidor",
+ "External Storage" : "Emmagatzemament extern",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correu",
"Log" : "Registre",
"Tips & tricks" : "Consells i trucs",
+ "Updates" : "Actualitzacions",
"Authentication error" : "Error d'autenticació",
"Your full name has been changed." : "El vostre nom complet ha canviat.",
"Unable to change full name" : "No s'ha pogut canviar el nom complet",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si la seva instal·lació no està situada en l'arrel del domini i usa el sistema cron, pot haver-hi problemes en generar-se els URL. Per evitar-los, configuri l'opció \"overwrite.cli.url\" en el seu arxiu config.php perquè usi la ruta de l'arrel del lloc web de la seva instal·lació (suggeriment: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No va ser possible executar cronjob via CLI. Han aparegut els següents errors tècnics:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Per favor, torni a comprovar les <a target=\"_blank\" href=\"%s\">guies d'instal·lació ↗ </a>, i verifiqui que no existeixen errors o advertiments en el <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Última execució de la tasca cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execució de la tasca cron: %s. Alguna cosa sembla malament.",
- "Cron was not executed yet!" : "El cron encara no s'ha executat!",
- "Execute one task with each page loaded" : "Executa una tasca per cada paquet carregat",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php està registrat en un servei webcron que fa una crida a cron.php cada 15 minuts a través de http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Fer servir el cron del sistema per cridar el cron.php cada 15 minuts.",
"Allow apps to use the Share API" : "Permet que les aplicacions utilitzin l'API de compartir",
"Allow users to share via link" : "Permet als usuaris compartir a través d'enllaços",
"Enforce password protection" : "Reforça la protecció amb contrasenya",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Permetre als usuaris enviar notificacions per correu electrònic dels arxius compartits a d'altres usuaris",
"Exclude groups from sharing" : "Exclou grups de compartició",
"These groups will still be able to receive shares, but not to initiate them." : "Aquests fitxers encara podran rebre compartits, però no podran iniciar-los.",
+ "Last cron job execution: %s." : "Última execució de la tasca cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execució de la tasca cron: %s. Alguna cosa sembla malament.",
+ "Cron was not executed yet!" : "El cron encara no s'ha executat!",
+ "Execute one task with each page loaded" : "Executa una tasca per cada paquet carregat",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php està registrat en un servei webcron que fa una crida a cron.php cada 15 minuts a través de http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Fer servir el cron del sistema per cridar el cron.php cada 15 minuts.",
+ "Server Side Encryption" : "Xifrat en el servidor",
"Enable Server-Side-Encryption" : "Habilitar xifrat en el servidor",
"This is used for sending out notifications." : "S'usa per enviar notificacions.",
"Send mode" : "Mode d'enviament",
diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js
index b78990ba91f..826562c3e7a 100644
--- a/settings/l10n/cs_CZ.js
+++ b/settings/l10n/cs_CZ.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Upozornění zabezpečení a nastavení",
- "Cron" : "Cron",
"Sharing" : "Sdílení",
- "Server Side Encryption" : "Šifrování na serveru",
+ "External Storage" : "Externí úložiště",
+ "Cron" : "Cron",
"Email Server" : "Emailový server",
"Log" : "Záznam",
"Tips & tricks" : "Tipy a triky",
+ "Updates" : "Aktualizace",
"Authentication error" : "Chyba přihlášení",
"Your full name has been changed." : "Vaše celé jméno bylo změněno.",
"Unable to change full name" : "Nelze změnit celé jméno",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Instalace mimo kořenový adresář domény a používání systémového příkazu cron může způsobit problém s generováním správné URL. Pro zabránění těmto chybám nastavte prosím správnou cestu ve svém config.php souboru v hodnotě \"overwrite.cli.url\" (Je doporučena tato: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ověřte znovu prosím informace z <a target=\"_blank\" href=\"%s\">instalační příručky ↗</a> a zkontrolujte <a href=\"#log-section\">log</a> na výskyt chyb a varování.",
- "Last cron job execution: %s." : "Poslední cron proběhl: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.",
- "Cron was not executed yet!" : "Cron ještě nebyl spuštěn!",
- "Execute one task with each page loaded" : "Spustit jednu úlohu s každým načtením stránky",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrován u služby webcron, aby volal cron.php jednou za 15 minut přes http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Použít systémovou službu cron pro volání cron.php každých 15 minut.",
"Allow apps to use the Share API" : "Povolit aplikacím používat API sdílení",
"Allow users to share via link" : "Povolit uživatelům sdílení pomocí odkazů",
"Enforce password protection" : "Vynutit ochranu heslem",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Povolit uživatelům odesílat emailová upozornění na sdílené soubory ostatním uživatelům",
"Exclude groups from sharing" : "Vyjmout skupiny ze sdílení",
"These groups will still be able to receive shares, but not to initiate them." : "Těmto skupinám bude stále možno sdílet, nemohou ale sami sdílet ostatním.",
+ "Last cron job execution: %s." : "Poslední cron proběhl: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.",
+ "Cron was not executed yet!" : "Cron ještě nebyl spuštěn!",
+ "Execute one task with each page loaded" : "Spustit jednu úlohu s každým načtením stránky",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrován u služby webcron, aby volal cron.php jednou za 15 minut přes http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Použít systémovou službu cron pro volání cron.php každých 15 minut.",
+ "Server Side Encryption" : "Šifrování na serveru",
"Enable Server-Side-Encryption" : "Povolit šifrování na straně serveru",
"This is used for sending out notifications." : "Toto se používá pro odesílání upozornění.",
"Send mode" : "Mód odesílání",
diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json
index bdc82d162d5..fc02fcce313 100644
--- a/settings/l10n/cs_CZ.json
+++ b/settings/l10n/cs_CZ.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Upozornění zabezpečení a nastavení",
- "Cron" : "Cron",
"Sharing" : "Sdílení",
- "Server Side Encryption" : "Šifrování na serveru",
+ "External Storage" : "Externí úložiště",
+ "Cron" : "Cron",
"Email Server" : "Emailový server",
"Log" : "Záznam",
"Tips & tricks" : "Tipy a triky",
+ "Updates" : "Aktualizace",
"Authentication error" : "Chyba přihlášení",
"Your full name has been changed." : "Vaše celé jméno bylo změněno.",
"Unable to change full name" : "Nelze změnit celé jméno",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Instalace mimo kořenový adresář domény a používání systémového příkazu cron může způsobit problém s generováním správné URL. Pro zabránění těmto chybám nastavte prosím správnou cestu ve svém config.php souboru v hodnotě \"overwrite.cli.url\" (Je doporučena tato: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ověřte znovu prosím informace z <a target=\"_blank\" href=\"%s\">instalační příručky ↗</a> a zkontrolujte <a href=\"#log-section\">log</a> na výskyt chyb a varování.",
- "Last cron job execution: %s." : "Poslední cron proběhl: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.",
- "Cron was not executed yet!" : "Cron ještě nebyl spuštěn!",
- "Execute one task with each page loaded" : "Spustit jednu úlohu s každým načtením stránky",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrován u služby webcron, aby volal cron.php jednou za 15 minut přes http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Použít systémovou službu cron pro volání cron.php každých 15 minut.",
"Allow apps to use the Share API" : "Povolit aplikacím používat API sdílení",
"Allow users to share via link" : "Povolit uživatelům sdílení pomocí odkazů",
"Enforce password protection" : "Vynutit ochranu heslem",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Povolit uživatelům odesílat emailová upozornění na sdílené soubory ostatním uživatelům",
"Exclude groups from sharing" : "Vyjmout skupiny ze sdílení",
"These groups will still be able to receive shares, but not to initiate them." : "Těmto skupinám bude stále možno sdílet, nemohou ale sami sdílet ostatním.",
+ "Last cron job execution: %s." : "Poslední cron proběhl: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Poslední cron proběhl: %s. Vypadá to, že něco není v pořádku.",
+ "Cron was not executed yet!" : "Cron ještě nebyl spuštěn!",
+ "Execute one task with each page loaded" : "Spustit jednu úlohu s každým načtením stránky",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registrován u služby webcron, aby volal cron.php jednou za 15 minut přes http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Použít systémovou službu cron pro volání cron.php každých 15 minut.",
+ "Server Side Encryption" : "Šifrování na serveru",
"Enable Server-Side-Encryption" : "Povolit šifrování na straně serveru",
"This is used for sending out notifications." : "Toto se používá pro odesílání upozornění.",
"Send mode" : "Mód odesílání",
diff --git a/settings/l10n/da.js b/settings/l10n/da.js
index 2a643093ea8..1b45d60967b 100644
--- a/settings/l10n/da.js
+++ b/settings/l10n/da.js
@@ -1,10 +1,14 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
+ "Security & setup warnings" : "Advarsler om sikkerhed og opsætning",
"Sharing" : "Deling",
+ "External Storage" : "Ekstern opbevaring",
+ "Cron" : "Cron",
"Email Server" : "E-mailserver",
"Log" : "Log",
+ "Tips & tricks" : "Tips & tricks",
+ "Updates" : "Opdateringer",
"Authentication error" : "Adgangsfejl",
"Your full name has been changed." : "Dit fulde navn er blevet ændret.",
"Unable to change full name" : "Ikke i stand til at ændre dit fulde navn",
@@ -41,6 +45,7 @@ OC.L10N.register(
"Email sent" : "E-mail afsendt",
"You need to set your user email before being able to send test emails." : "Du skal angive din bruger-e-mail før der kan sendes test-e-mail.",
"Invalid mail address" : "Ugyldig mailadresse",
+ "A user with that name already exists." : "Dette brugernavn eksistere allerede.",
"Unable to create user." : "Kan ikke oprette brugeren.",
"Your %s account was created" : "Din %s-konto blev oprettet",
"Unable to delete user." : "Kan ikke slette brugeren.",
@@ -90,6 +95,8 @@ OC.L10N.register(
"A valid password must be provided" : "En gyldig adgangskode skal angives",
"A valid email must be provided" : "Der skal angives en gyldig e-mail",
"__language_name__" : "Dansk",
+ "Sync clients" : "Synkroniserings klienter",
+ "Personal info" : "Personlige oplysninger",
"SSL root certificates" : "SSL-rodcertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (alvorlige fejl, fejl, advarsler, info, debug)",
@@ -114,12 +121,7 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler kraftigt, at du installerer den krævede pakke på dit system, for at understøtte følgende lokaliteter: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis din installation ikke er installeret i roden af domænet, og bruger systemets cron, så kan der være problemer med URL-oprettelsen. For at undgå disse problemer, så angiv tilvalget \"overwrite.cli.url\" i din fil config.php til webrodens sti for din installation (foreslået værdi: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:",
- "Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
- "Cron was not executed yet!" : "Cron har ikke kørt endnu!",
- "Execute one task with each page loaded" : "Udføre en opgave med hver side indlæsning",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registreret til at en webcron service skal kalde cron.php hvert 15 minut over http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Brug systemets cron service til at kalde cron.php hver 15. minut",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Dobbelttjek venligst <a target=\"_blank\" href=\"%s\">, og tjek om der er fejl eller advarsler i <a href=\"#log-section\">loggen</a>.",
"Allow apps to use the Share API" : "Tillad apps til at bruge Share API",
"Allow users to share via link" : "Tillad brugere at dele via link",
"Enforce password protection" : "Tving kodeords beskyttelse",
@@ -134,6 +136,14 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Tillader brugere at sende mailnotifikationer for delte filer til andre brugere",
"Exclude groups from sharing" : "Ekskluder grupper fra at dele",
"These groups will still be able to receive shares, but not to initiate them." : "Disse grupper vil stadig kunne modtage delefiler, men ikke skabe dem.",
+ "Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
+ "Cron was not executed yet!" : "Cron har ikke kørt endnu!",
+ "Execute one task with each page loaded" : "Udføre en opgave med hver side indlæsning",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registreret til at en webcron service skal kalde cron.php hvert 15 minut over http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Brug systemets cron service til at kalde cron.php hver 15. minut",
+ "Server Side Encryption" : "Kryptering på serverdelen",
+ "Enable Server-Side-Encryption" : "Aktiver kryptering på serverdelen",
"This is used for sending out notifications." : "Dette anvendes til udsendelse af notifikationer.",
"Send mode" : "Tilstand for afsendelse",
"From address" : "Fra adresse",
@@ -155,6 +165,13 @@ OC.L10N.register(
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen er større end 100 MB. Det kan tage en del tid at hente den!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite bruges som database. Til større installationer anbefaler vi at skifte til en anden database-backend.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Brug af SQLite frarådes især når skrivebordsklienten anvendes til filsynkronisering.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For at migrere til en anden database, så brug kommandolinjeværktøjet: \"occ db:convert-type\" eller se <a target=\"_blank\" href=\"%s\">dokumentationen ↗</a>.",
+ "How to do backups" : "Hvordan man laver sikkerhedskopier",
+ "Advanced monitoring" : "Avancerede monitorering",
+ "Performance tuning" : "Ydelses optimering",
+ "Improving the config.php" : "Forbedring af config.php",
+ "Theming" : "Temaer",
+ "Hardening and security guidance" : "Modstanddygtighed og sikkerheds vejledning",
"Version" : "Version",
"More apps" : "Flere programmer",
"Developer documentation" : "Dokumentation for udviklere",
@@ -163,10 +180,13 @@ OC.L10N.register(
"Documentation:" : "Dokumentation:",
"User Documentation" : "Brugerdokumentation",
"Admin Documentation" : "Administrator 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:",
"Update to %s" : "Opdatér til %s",
"Enable only for specific groups" : "Aktivér kun for udvalgte grupper",
"Uninstall App" : "Afinstallér app",
+ "No apps found for your version" : "Ingen apps fundet til din verion",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Hejsa,<br><br>dette er blot en besked om, at du nu har en %s-konto.<br><br>Dit brugernavn: %s<br>Tilgå den: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Hej!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hejsa,\n\ndette er blot en besked om, at du nu har en %s-konto.\n\nDit brugernavn: %s\nTilgå den: %s\n\n",
@@ -187,6 +207,7 @@ OC.L10N.register(
"Current password" : "Nuværende adgangskode",
"New password" : "Nyt kodeord",
"Change password" : "Skift kodeord",
+ "Full name" : "Fulde navn",
"No display name set" : "Der er ikke angivet skærmnavn",
"Email" : "E-mail",
"Your email address" : "Din e-mailadresse",
@@ -207,6 +228,7 @@ OC.L10N.register(
"Valid until" : "Gyldig indtil",
"Issued By" : "Udstedt af",
"Valid until %s" : "Gyldig indtil %s",
+ "Import root certificate" : "Importer rodcertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypteringsprogrammet er ikke længere aktiveret. Dekrypter venligst alle dine filer",
"Log-in password" : "Log-in kodeord",
"Decrypt all Files" : "Dekrypter alle Filer ",
diff --git a/settings/l10n/da.json b/settings/l10n/da.json
index c9246b94f73..018468e8041 100644
--- a/settings/l10n/da.json
+++ b/settings/l10n/da.json
@@ -1,8 +1,12 @@
{ "translations": {
- "Cron" : "Cron",
+ "Security & setup warnings" : "Advarsler om sikkerhed og opsætning",
"Sharing" : "Deling",
+ "External Storage" : "Ekstern opbevaring",
+ "Cron" : "Cron",
"Email Server" : "E-mailserver",
"Log" : "Log",
+ "Tips & tricks" : "Tips & tricks",
+ "Updates" : "Opdateringer",
"Authentication error" : "Adgangsfejl",
"Your full name has been changed." : "Dit fulde navn er blevet ændret.",
"Unable to change full name" : "Ikke i stand til at ændre dit fulde navn",
@@ -39,6 +43,7 @@
"Email sent" : "E-mail afsendt",
"You need to set your user email before being able to send test emails." : "Du skal angive din bruger-e-mail før der kan sendes test-e-mail.",
"Invalid mail address" : "Ugyldig mailadresse",
+ "A user with that name already exists." : "Dette brugernavn eksistere allerede.",
"Unable to create user." : "Kan ikke oprette brugeren.",
"Your %s account was created" : "Din %s-konto blev oprettet",
"Unable to delete user." : "Kan ikke slette brugeren.",
@@ -88,6 +93,8 @@
"A valid password must be provided" : "En gyldig adgangskode skal angives",
"A valid email must be provided" : "Der skal angives en gyldig e-mail",
"__language_name__" : "Dansk",
+ "Sync clients" : "Synkroniserings klienter",
+ "Personal info" : "Personlige oplysninger",
"SSL root certificates" : "SSL-rodcertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (alvorlige fejl, fejl, advarsler, info, debug)",
@@ -112,12 +119,7 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler kraftigt, at du installerer den krævede pakke på dit system, for at understøtte følgende lokaliteter: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis din installation ikke er installeret i roden af domænet, og bruger systemets cron, så kan der være problemer med URL-oprettelsen. For at undgå disse problemer, så angiv tilvalget \"overwrite.cli.url\" i din fil config.php til webrodens sti for din installation (foreslået værdi: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:",
- "Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
- "Cron was not executed yet!" : "Cron har ikke kørt endnu!",
- "Execute one task with each page loaded" : "Udføre en opgave med hver side indlæsning",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registreret til at en webcron service skal kalde cron.php hvert 15 minut over http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Brug systemets cron service til at kalde cron.php hver 15. minut",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Dobbelttjek venligst <a target=\"_blank\" href=\"%s\">, og tjek om der er fejl eller advarsler i <a href=\"#log-section\">loggen</a>.",
"Allow apps to use the Share API" : "Tillad apps til at bruge Share API",
"Allow users to share via link" : "Tillad brugere at dele via link",
"Enforce password protection" : "Tving kodeords beskyttelse",
@@ -132,6 +134,14 @@
"Allow users to send mail notification for shared files to other users" : "Tillader brugere at sende mailnotifikationer for delte filer til andre brugere",
"Exclude groups from sharing" : "Ekskluder grupper fra at dele",
"These groups will still be able to receive shares, but not to initiate them." : "Disse grupper vil stadig kunne modtage delefiler, men ikke skabe dem.",
+ "Last cron job execution: %s." : "Seneste udførsel af cronjob: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Seneste udførsel af cronjob: %s. Der er vist noget galt.",
+ "Cron was not executed yet!" : "Cron har ikke kørt endnu!",
+ "Execute one task with each page loaded" : "Udføre en opgave med hver side indlæsning",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registreret til at en webcron service skal kalde cron.php hvert 15 minut over http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Brug systemets cron service til at kalde cron.php hver 15. minut",
+ "Server Side Encryption" : "Kryptering på serverdelen",
+ "Enable Server-Side-Encryption" : "Aktiver kryptering på serverdelen",
"This is used for sending out notifications." : "Dette anvendes til udsendelse af notifikationer.",
"Send mode" : "Tilstand for afsendelse",
"From address" : "Fra adresse",
@@ -153,6 +163,13 @@
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen er større end 100 MB. Det kan tage en del tid at hente den!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite bruges som database. Til større installationer anbefaler vi at skifte til en anden database-backend.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Brug af SQLite frarådes især når skrivebordsklienten anvendes til filsynkronisering.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For at migrere til en anden database, så brug kommandolinjeværktøjet: \"occ db:convert-type\" eller se <a target=\"_blank\" href=\"%s\">dokumentationen ↗</a>.",
+ "How to do backups" : "Hvordan man laver sikkerhedskopier",
+ "Advanced monitoring" : "Avancerede monitorering",
+ "Performance tuning" : "Ydelses optimering",
+ "Improving the config.php" : "Forbedring af config.php",
+ "Theming" : "Temaer",
+ "Hardening and security guidance" : "Modstanddygtighed og sikkerheds vejledning",
"Version" : "Version",
"More apps" : "Flere programmer",
"Developer documentation" : "Dokumentation for udviklere",
@@ -161,10 +178,13 @@
"Documentation:" : "Dokumentation:",
"User Documentation" : "Brugerdokumentation",
"Admin Documentation" : "Administrator 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:",
"Update to %s" : "Opdatér til %s",
"Enable only for specific groups" : "Aktivér kun for udvalgte grupper",
"Uninstall App" : "Afinstallér app",
+ "No apps found for your version" : "Ingen apps fundet til din verion",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Hejsa,<br><br>dette er blot en besked om, at du nu har en %s-konto.<br><br>Dit brugernavn: %s<br>Tilgå den: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Hej!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hejsa,\n\ndette er blot en besked om, at du nu har en %s-konto.\n\nDit brugernavn: %s\nTilgå den: %s\n\n",
@@ -185,6 +205,7 @@
"Current password" : "Nuværende adgangskode",
"New password" : "Nyt kodeord",
"Change password" : "Skift kodeord",
+ "Full name" : "Fulde navn",
"No display name set" : "Der er ikke angivet skærmnavn",
"Email" : "E-mail",
"Your email address" : "Din e-mailadresse",
@@ -205,6 +226,7 @@
"Valid until" : "Gyldig indtil",
"Issued By" : "Udstedt af",
"Valid until %s" : "Gyldig indtil %s",
+ "Import root certificate" : "Importer rodcertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypteringsprogrammet er ikke længere aktiveret. Dekrypter venligst alle dine filer",
"Log-in password" : "Log-in kodeord",
"Decrypt all Files" : "Dekrypter alle Filer ",
diff --git a/settings/l10n/de.js b/settings/l10n/de.js
index 3b2dfe4645f..2cce10d4792 100644
--- a/settings/l10n/de.js
+++ b/settings/l10n/de.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen",
- "Cron" : "Cron",
"Sharing" : "Teilen",
- "Server Side Encryption" : "Serverseitige Verschlüsselung",
+ "External Storage" : "Externer Speicher",
+ "Cron" : "Cron",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Tips & tricks" : "Tipps & Tricks",
+ "Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
"Your full name has been changed." : "Dein vollständiger Name ist geändert worden.",
"Unable to change full name" : "Der vollständige Name konnte nicht geändert werden",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Wenn sich Deine Installation nicht im Wurzelverzeichnis der Domain befindet und Cron aus dem System genutzt wird, kann es zu Fehlern bei der URL-Generierung kommen. Um dies zu verhindern, setze bitte die „overwrite.cli.url“-Option in Deiner config.php auf das Web-Wurzelverzeichnis Deiner Installation (Vorschlag: „%s“).",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Die Ausführung des Cron-Jobs über die Kommandozeile war nicht möglich. Die folgenden technischen Fehler sind dabei aufgetreten:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Bitte überprüfe noch einmal die <a target=\"_blank\" href=\"%s\">Installationsanleitungen ↗</a> und kontrolliere das <a href=\"#log-section\">Log</a> auf mögliche Fehler oder Warnungen.",
- "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
- "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
- "Execute one task with each page loaded" : "Führe eine Aufgabe mit jeder geladenen Seite aus",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
"Allow apps to use the Share API" : "Erlaubt Apps die Nutzung der Share-API",
"Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen",
"Enforce password protection" : "Passwortschutz erzwingen",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Benutzern erlauben, E-Mail-Benachrichtigungen für freigegebene Dateien an andere Benutzer zu senden",
"Exclude groups from sharing" : "Gruppen von Freigaben ausschließen",
"These groups will still be able to receive shares, but not to initiate them." : "Diese Gruppen können weiterhin Freigaben empfangen, aber selbst keine mehr initiieren.",
+ "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
+ "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
+ "Execute one task with each page loaded" : "Führe eine Aufgabe mit jeder geladenen Seite aus",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
+ "Server Side Encryption" : "Serverseitige Verschlüsselung",
"Enable Server-Side-Encryption" : "Serverseitige Verschlüsselung aktivieren",
"This is used for sending out notifications." : "Dies wird zum Senden von Benachrichtigungen verwendet.",
"Send mode" : "Sendemodus",
diff --git a/settings/l10n/de.json b/settings/l10n/de.json
index 3c3507c2077..d23b89e2ff3 100644
--- a/settings/l10n/de.json
+++ b/settings/l10n/de.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen",
- "Cron" : "Cron",
"Sharing" : "Teilen",
- "Server Side Encryption" : "Serverseitige Verschlüsselung",
+ "External Storage" : "Externer Speicher",
+ "Cron" : "Cron",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Tips & tricks" : "Tipps & Tricks",
+ "Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
"Your full name has been changed." : "Dein vollständiger Name ist geändert worden.",
"Unable to change full name" : "Der vollständige Name konnte nicht geändert werden",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Wenn sich Deine Installation nicht im Wurzelverzeichnis der Domain befindet und Cron aus dem System genutzt wird, kann es zu Fehlern bei der URL-Generierung kommen. Um dies zu verhindern, setze bitte die „overwrite.cli.url“-Option in Deiner config.php auf das Web-Wurzelverzeichnis Deiner Installation (Vorschlag: „%s“).",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Die Ausführung des Cron-Jobs über die Kommandozeile war nicht möglich. Die folgenden technischen Fehler sind dabei aufgetreten:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Bitte überprüfe noch einmal die <a target=\"_blank\" href=\"%s\">Installationsanleitungen ↗</a> und kontrolliere das <a href=\"#log-section\">Log</a> auf mögliche Fehler oder Warnungen.",
- "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
- "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
- "Execute one task with each page loaded" : "Führe eine Aufgabe mit jeder geladenen Seite aus",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
"Allow apps to use the Share API" : "Erlaubt Apps die Nutzung der Share-API",
"Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen",
"Enforce password protection" : "Passwortschutz erzwingen",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Benutzern erlauben, E-Mail-Benachrichtigungen für freigegebene Dateien an andere Benutzer zu senden",
"Exclude groups from sharing" : "Gruppen von Freigaben ausschließen",
"These groups will still be able to receive shares, but not to initiate them." : "Diese Gruppen können weiterhin Freigaben empfangen, aber selbst keine mehr initiieren.",
+ "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
+ "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
+ "Execute one task with each page loaded" : "Führe eine Aufgabe mit jeder geladenen Seite aus",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
+ "Server Side Encryption" : "Serverseitige Verschlüsselung",
"Enable Server-Side-Encryption" : "Serverseitige Verschlüsselung aktivieren",
"This is used for sending out notifications." : "Dies wird zum Senden von Benachrichtigungen verwendet.",
"Send mode" : "Sendemodus",
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index dadd39969b3..cc2d698916a 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen",
- "Cron" : "Cron",
"Sharing" : "Teilen",
- "Server Side Encryption" : "Serverseitige Verschlüsselung",
+ "External Storage" : "Externer Speicher",
+ "Cron" : "Cron",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Tips & tricks" : "Tipps & Tricks",
+ "Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
"Your full name has been changed." : "Ihr vollständiger Name ist geändert worden.",
"Unable to change full name" : "Der vollständige Name konnte nicht geändert werden",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Wenn sich Ihre Installation nicht im Wurzelverzeichnis der Domain befindet und Cron aus dem System genutzt wird, kann es zu Fehlern bei der URL-Generierung kommen. Um dies zu verhindern, setzen Sie bitte die „overwrite.cli.url“-Option in Ihrer config.php auf das Web-Wurzelverzeichnis Ihrer Installation (Vorschlag: „%s“).",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Die Ausführung des Cron-Jobs über die Kommandozeile war nicht möglich. Die folgenden technischen Fehler sind dabei aufgetreten:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Bitte überprüfen Sie noch einmal die <a target=\"_blank\" href=\"%s\">Installationsanleitungen ↗</a> und kontrollieren Sie das <a href=\"#log-section\">Log</a> auf mögliche Fehler oder Warnungen.",
- "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
- "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
- "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
"Allow apps to use the Share API" : "Anwendungen erlauben, die Share-API zu benutzen",
"Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen",
"Enforce password protection" : "Passwortschutz erzwingen",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Benutzern erlauben, E-Mail-Benachrichtigungen für freigegebene Dateien an andere Benutzer zu senden",
"Exclude groups from sharing" : "Gruppen von Freigaben ausschließen",
"These groups will still be able to receive shares, but not to initiate them." : "Diese Gruppen können weiterhin Freigaben empfangen, aber selbst keine mehr initiieren.",
+ "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
+ "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
+ "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
+ "Server Side Encryption" : "Serverseitige Verschlüsselung",
"Enable Server-Side-Encryption" : "Serverseitige Verschlüsselung aktivieren",
"This is used for sending out notifications." : "Dies wird für das Senden von Benachrichtigungen verwendet.",
"Send mode" : "Sendemodus",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index a1c71b14e2a..e6c70c60b40 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen",
- "Cron" : "Cron",
"Sharing" : "Teilen",
- "Server Side Encryption" : "Serverseitige Verschlüsselung",
+ "External Storage" : "Externer Speicher",
+ "Cron" : "Cron",
"Email Server" : "E-Mail-Server",
"Log" : "Log",
"Tips & tricks" : "Tipps & Tricks",
+ "Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
"Your full name has been changed." : "Ihr vollständiger Name ist geändert worden.",
"Unable to change full name" : "Der vollständige Name konnte nicht geändert werden",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Wenn sich Ihre Installation nicht im Wurzelverzeichnis der Domain befindet und Cron aus dem System genutzt wird, kann es zu Fehlern bei der URL-Generierung kommen. Um dies zu verhindern, setzen Sie bitte die „overwrite.cli.url“-Option in Ihrer config.php auf das Web-Wurzelverzeichnis Ihrer Installation (Vorschlag: „%s“).",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Die Ausführung des Cron-Jobs über die Kommandozeile war nicht möglich. Die folgenden technischen Fehler sind dabei aufgetreten:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Bitte überprüfen Sie noch einmal die <a target=\"_blank\" href=\"%s\">Installationsanleitungen ↗</a> und kontrollieren Sie das <a href=\"#log-section\">Log</a> auf mögliche Fehler oder Warnungen.",
- "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
- "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
- "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
"Allow apps to use the Share API" : "Anwendungen erlauben, die Share-API zu benutzen",
"Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen",
"Enforce password protection" : "Passwortschutz erzwingen",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Benutzern erlauben, E-Mail-Benachrichtigungen für freigegebene Dateien an andere Benutzer zu senden",
"Exclude groups from sharing" : "Gruppen von Freigaben ausschließen",
"These groups will still be able to receive shares, but not to initiate them." : "Diese Gruppen können weiterhin Freigaben empfangen, aber selbst keine mehr initiieren.",
+ "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.",
+ "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!",
+ "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.",
+ "Server Side Encryption" : "Serverseitige Verschlüsselung",
"Enable Server-Side-Encryption" : "Serverseitige Verschlüsselung aktivieren",
"This is used for sending out notifications." : "Dies wird für das Senden von Benachrichtigungen verwendet.",
"Send mode" : "Sendemodus",
diff --git a/settings/l10n/el.js b/settings/l10n/el.js
index d1cfc99cd1a..895cb07bbf2 100644
--- a/settings/l10n/el.js
+++ b/settings/l10n/el.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων",
- "Cron" : "Cron",
"Sharing" : "Διαμοιρασμός",
- "Server Side Encryption" : "Κρυπτογράφηση από τον Διακομιστή",
+ "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο",
+ "Cron" : "Cron",
"Email Server" : "Διακομιστής Email",
"Log" : "Καταγραφές",
"Tips & tricks" : "Συμβουλές & τεχνάσματα",
+ "Updates" : "Ενημερώσεις",
"Authentication error" : "Σφάλμα πιστοποίησης",
"Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.",
"Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Παρακαλώ ελέγξτε ξανά <a target=\"_blank\" href=\"%s\">τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.",
- "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!",
- "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.",
"Allow apps to use the Share API" : "Επιτρέπει την χρήση του API διαμοιρασμού σε εφαρμογές ",
"Allow users to share via link" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μέσω συνδέσμου",
"Enforce password protection" : "Επιβολή προστασίας με κωδικό",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Να επιτρέπεται η αποστολή ειδοποιήσεων σε άλλους χρήστες, μέσω αλληλογραφίας για κοινόχρηστα αρχεία",
"Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό",
"These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.",
+ "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.",
+ "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!",
+ "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.",
+ "Server Side Encryption" : "Κρυπτογράφηση από τον Διακομιστή",
"Enable Server-Side-Encryption" : "Ενεργοποίηση Κρυπτογράφησης από το Διακομηστή",
"This is used for sending out notifications." : "Χρησιμοποιείται για αποστολή ειδοποιήσεων.",
"Send mode" : "Κατάσταση αποστολής",
diff --git a/settings/l10n/el.json b/settings/l10n/el.json
index 791168786f7..4e85a3bbd4f 100644
--- a/settings/l10n/el.json
+++ b/settings/l10n/el.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων",
- "Cron" : "Cron",
"Sharing" : "Διαμοιρασμός",
- "Server Side Encryption" : "Κρυπτογράφηση από τον Διακομιστή",
+ "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο",
+ "Cron" : "Cron",
"Email Server" : "Διακομιστής Email",
"Log" : "Καταγραφές",
"Tips & tricks" : "Συμβουλές & τεχνάσματα",
+ "Updates" : "Ενημερώσεις",
"Authentication error" : "Σφάλμα πιστοποίησης",
"Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.",
"Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Παρακαλώ ελέγξτε ξανά <a target=\"_blank\" href=\"%s\">τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.",
- "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!",
- "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.",
"Allow apps to use the Share API" : "Επιτρέπει την χρήση του API διαμοιρασμού σε εφαρμογές ",
"Allow users to share via link" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μέσω συνδέσμου",
"Enforce password protection" : "Επιβολή προστασίας με κωδικό",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Να επιτρέπεται η αποστολή ειδοποιήσεων σε άλλους χρήστες, μέσω αλληλογραφίας για κοινόχρηστα αρχεία",
"Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό",
"These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.",
+ "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.",
+ "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!",
+ "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.",
+ "Server Side Encryption" : "Κρυπτογράφηση από τον Διακομιστή",
"Enable Server-Side-Encryption" : "Ενεργοποίηση Κρυπτογράφησης από το Διακομηστή",
"This is used for sending out notifications." : "Χρησιμοποιείται για αποστολή ειδοποιήσεων.",
"Send mode" : "Κατάσταση αποστολής",
diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js
index 28cdff8a3e7..c7fbba2198c 100644
--- a/settings/l10n/en_GB.js
+++ b/settings/l10n/en_GB.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Sharing",
+ "External Storage" : "External Storage",
+ "Cron" : "Cron",
"Email Server" : "Email Server",
"Log" : "Log",
+ "Updates" : "Updates",
"Authentication error" : "Authentication error",
"Your full name has been changed." : "Your full name has been changed.",
"Unable to change full name" : "Unable to change full name",
@@ -117,12 +119,6 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We strongly suggest installing the required packages on your system to support one of the following locales: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:",
- "Last cron job execution: %s." : "Last cron job execution: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Last cron job execution: %s. Something seems wrong.",
- "Cron was not executed yet!" : "Cron was not executed yet!",
- "Execute one task with each page loaded" : "Execute one task with each page loaded",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is registered at a webcron service to call cron.php every 15 minutes over http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Use system's cron service to call the cron.php file every 15 minutes.",
"Allow apps to use the Share API" : "Allow apps to use the Share API",
"Allow users to share via link" : "Allow users to share via link",
"Enforce password protection" : "Enforce password protection",
@@ -137,6 +133,12 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Allow users to send email notification for shared files to other users",
"Exclude groups from sharing" : "Exclude groups from sharing",
"These groups will still be able to receive shares, but not to initiate them." : "These groups will still be able to receive shares, but not to initiate them.",
+ "Last cron job execution: %s." : "Last cron job execution: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Last cron job execution: %s. Something seems wrong.",
+ "Cron was not executed yet!" : "Cron was not executed yet!",
+ "Execute one task with each page loaded" : "Execute one task with each page loaded",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is registered at a webcron service to call cron.php every 15 minutes over http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Use system's cron service to call the cron.php file every 15 minutes.",
"This is used for sending out notifications." : "This is used for sending out notifications.",
"Send mode" : "Send mode",
"From address" : "From address",
diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json
index cf38b70b9af..13a6e87945c 100644
--- a/settings/l10n/en_GB.json
+++ b/settings/l10n/en_GB.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Sharing",
+ "External Storage" : "External Storage",
+ "Cron" : "Cron",
"Email Server" : "Email Server",
"Log" : "Log",
+ "Updates" : "Updates",
"Authentication error" : "Authentication error",
"Your full name has been changed." : "Your full name has been changed.",
"Unable to change full name" : "Unable to change full name",
@@ -115,12 +117,6 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We strongly suggest installing the required packages on your system to support one of the following locales: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:",
- "Last cron job execution: %s." : "Last cron job execution: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Last cron job execution: %s. Something seems wrong.",
- "Cron was not executed yet!" : "Cron was not executed yet!",
- "Execute one task with each page loaded" : "Execute one task with each page loaded",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is registered at a webcron service to call cron.php every 15 minutes over http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Use system's cron service to call the cron.php file every 15 minutes.",
"Allow apps to use the Share API" : "Allow apps to use the Share API",
"Allow users to share via link" : "Allow users to share via link",
"Enforce password protection" : "Enforce password protection",
@@ -135,6 +131,12 @@
"Allow users to send mail notification for shared files to other users" : "Allow users to send email notification for shared files to other users",
"Exclude groups from sharing" : "Exclude groups from sharing",
"These groups will still be able to receive shares, but not to initiate them." : "These groups will still be able to receive shares, but not to initiate them.",
+ "Last cron job execution: %s." : "Last cron job execution: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Last cron job execution: %s. Something seems wrong.",
+ "Cron was not executed yet!" : "Cron was not executed yet!",
+ "Execute one task with each page loaded" : "Execute one task with each page loaded",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is registered at a webcron service to call cron.php every 15 minutes over http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Use system's cron service to call the cron.php file every 15 minutes.",
"This is used for sending out notifications." : "This is used for sending out notifications.",
"Send mode" : "Send mode",
"From address" : "From address",
diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js
index 5df38e81420..ae9b23a72fb 100644
--- a/settings/l10n/eo.js
+++ b/settings/l10n/eo.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Kunhavigo",
+ "External Storage" : "Malena memorilo",
+ "Cron" : "Cron",
"Email Server" : "Retpoŝtoservilo",
"Log" : "Protokolo",
+ "Updates" : "Ĝisdatigoj",
"Authentication error" : "Aŭtentiga eraro",
"Your full name has been changed." : "Via plena nomo ŝanĝitas.",
"Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon",
diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json
index 9e982cd6705..54c46fe9def 100644
--- a/settings/l10n/eo.json
+++ b/settings/l10n/eo.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Kunhavigo",
+ "External Storage" : "Malena memorilo",
+ "Cron" : "Cron",
"Email Server" : "Retpoŝtoservilo",
"Log" : "Protokolo",
+ "Updates" : "Ĝisdatigoj",
"Authentication error" : "Aŭtentiga eraro",
"Your full name has been changed." : "Via plena nomo ŝanĝitas.",
"Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon",
diff --git a/settings/l10n/es.js b/settings/l10n/es.js
index 775af70019b..972f528f759 100644
--- a/settings/l10n/es.js
+++ b/settings/l10n/es.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Avisos de seguidad y configuración",
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Server Side Encryption" : "Cifrado en el servidor",
+ "External Storage" : "Almacenamiento externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Registro",
"Tips & tricks" : "Sugerencias y trucos",
+ "Updates" : "Actualizaciones",
"Authentication error" : "Error de autenticación",
"Your full name has been changed." : "Se ha cambiado su nombre completo.",
"Unable to change full name" : "No se puede cambiar el nombre completo",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si su instalación no está ubicada en la raíz del dominio y usa el cron del sistema, puede haber problemas al generarse los URL. Para evitarlos, configure la opción \"overwrite.cli.url\" en su archivo config.php para que use la ruta de la raíz del sitio web de su instalación (sugerencia: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No fue posible ejecutar cronjob vía CLI. Han aparecido los siguientes errores técnicos:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor revise las <a target=\"_blank\" href=\"%s\">guías de instalación ↗</a>, y compruebe los errores o avisos en el <a ref=\"#log-section\">registro</a>.",
- "Last cron job execution: %s." : "Cron se ejecutó por última vez: %s",
- "Last cron job execution: %s. Something seems wrong." : "Cron se ejecutó por última vez: %s. Algo va mal.",
- "Cron was not executed yet!" : "¡Cron aún no ha sido ejecutado!",
- "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 15 minutos.",
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición",
"Allow users to share via link" : "Permite a los usuarios compartir por medio de enlaces",
"Enforce password protection" : "Forzar la protección por contraseña.",
@@ -141,7 +136,14 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Permitir a los usuarios enviar notificaciones por correo electrónico de los archivos compartidos a otros usuarios",
"Exclude groups from sharing" : "Excluye grupos de compartir",
"These groups will still be able to receive shares, but not to initiate them." : "Estos grupos aún podrán recibir contenidos compartidos, pero no podrán, pero no podrán iniciarlos.",
- "Enable Server-Side-Encryption" : "Habilitar Cifrado en el servidor",
+ "Last cron job execution: %s." : "Cron se ejecutó por última vez: %s",
+ "Last cron job execution: %s. Something seems wrong." : "Cron se ejecutó por última vez: %s. Algo va mal.",
+ "Cron was not executed yet!" : "¡Cron aún no ha sido ejecutado!",
+ "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 15 minutos.",
+ "Server Side Encryption" : "Cifrado en el servidor",
+ "Enable Server-Side-Encryption" : "Habilitar cifrado en el servidor",
"This is used for sending out notifications." : "Esto se usa para enviar notificaciones.",
"Send mode" : "Modo de envío",
"From address" : "Desde la dirección",
@@ -167,8 +169,8 @@ OC.L10N.register(
"How to do backups" : "Cómo hacer copias de seguridad",
"Advanced monitoring" : "Monitorización avanzada",
"Performance tuning" : "Ajuste de rendimiento",
- "Improving the config.php" : "Mejorando el config.php",
- "Theming" : "Personalizando el tema",
+ "Improving the config.php" : "Mejorar el config.php",
+ "Theming" : "Personalizar el tema",
"Hardening and security guidance" : "Guía de protección y seguridad",
"Version" : "Versión",
"More apps" : "Más aplicaciones",
@@ -178,8 +180,8 @@ OC.L10N.register(
"Documentation:" : "Documentación:",
"User Documentation" : "Documentación de usuario",
"Admin Documentation" : "Documentación para administradores",
- "Show description …" : "Mostrar descripción …",
- "Hide description …" : "Ocultar descripción …",
+ "Show description …" : "Mostrar descripción…",
+ "Hide description …" : "Ocultar descripción…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicación no puede instalarse porque las siguientes dependencias no están cumplimentadas:",
"Update to %s" : "Actualizar a %s",
"Enable only for specific groups" : "Activar solamente para grupos específicos",
diff --git a/settings/l10n/es.json b/settings/l10n/es.json
index 43bd7b15f02..6ef77db4346 100644
--- a/settings/l10n/es.json
+++ b/settings/l10n/es.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Avisos de seguidad y configuración",
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
- "Server Side Encryption" : "Cifrado en el servidor",
+ "External Storage" : "Almacenamiento externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Registro",
"Tips & tricks" : "Sugerencias y trucos",
+ "Updates" : "Actualizaciones",
"Authentication error" : "Error de autenticación",
"Your full name has been changed." : "Se ha cambiado su nombre completo.",
"Unable to change full name" : "No se puede cambiar el nombre completo",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si su instalación no está ubicada en la raíz del dominio y usa el cron del sistema, puede haber problemas al generarse los URL. Para evitarlos, configure la opción \"overwrite.cli.url\" en su archivo config.php para que use la ruta de la raíz del sitio web de su instalación (sugerencia: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No fue posible ejecutar cronjob vía CLI. Han aparecido los siguientes errores técnicos:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor revise las <a target=\"_blank\" href=\"%s\">guías de instalación ↗</a>, y compruebe los errores o avisos en el <a ref=\"#log-section\">registro</a>.",
- "Last cron job execution: %s." : "Cron se ejecutó por última vez: %s",
- "Last cron job execution: %s. Something seems wrong." : "Cron se ejecutó por última vez: %s. Algo va mal.",
- "Cron was not executed yet!" : "¡Cron aún no ha sido ejecutado!",
- "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 15 minutos.",
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición",
"Allow users to share via link" : "Permite a los usuarios compartir por medio de enlaces",
"Enforce password protection" : "Forzar la protección por contraseña.",
@@ -139,7 +134,14 @@
"Allow users to send mail notification for shared files to other users" : "Permitir a los usuarios enviar notificaciones por correo electrónico de los archivos compartidos a otros usuarios",
"Exclude groups from sharing" : "Excluye grupos de compartir",
"These groups will still be able to receive shares, but not to initiate them." : "Estos grupos aún podrán recibir contenidos compartidos, pero no podrán, pero no podrán iniciarlos.",
- "Enable Server-Side-Encryption" : "Habilitar Cifrado en el servidor",
+ "Last cron job execution: %s." : "Cron se ejecutó por última vez: %s",
+ "Last cron job execution: %s. Something seems wrong." : "Cron se ejecutó por última vez: %s. Algo va mal.",
+ "Cron was not executed yet!" : "¡Cron aún no ha sido ejecutado!",
+ "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 15 minutos.",
+ "Server Side Encryption" : "Cifrado en el servidor",
+ "Enable Server-Side-Encryption" : "Habilitar cifrado en el servidor",
"This is used for sending out notifications." : "Esto se usa para enviar notificaciones.",
"Send mode" : "Modo de envío",
"From address" : "Desde la dirección",
@@ -165,8 +167,8 @@
"How to do backups" : "Cómo hacer copias de seguridad",
"Advanced monitoring" : "Monitorización avanzada",
"Performance tuning" : "Ajuste de rendimiento",
- "Improving the config.php" : "Mejorando el config.php",
- "Theming" : "Personalizando el tema",
+ "Improving the config.php" : "Mejorar el config.php",
+ "Theming" : "Personalizar el tema",
"Hardening and security guidance" : "Guía de protección y seguridad",
"Version" : "Versión",
"More apps" : "Más aplicaciones",
@@ -176,8 +178,8 @@
"Documentation:" : "Documentación:",
"User Documentation" : "Documentación de usuario",
"Admin Documentation" : "Documentación para administradores",
- "Show description …" : "Mostrar descripción …",
- "Hide description …" : "Ocultar descripción …",
+ "Show description …" : "Mostrar descripción…",
+ "Hide description …" : "Ocultar descripción…",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicación no puede instalarse porque las siguientes dependencias no están cumplimentadas:",
"Update to %s" : "Actualizar a %s",
"Enable only for specific groups" : "Activar solamente para grupos específicos",
diff --git a/settings/l10n/es_AR.js b/settings/l10n/es_AR.js
index 84990bfda56..6dad931a95e 100644
--- a/settings/l10n/es_AR.js
+++ b/settings/l10n/es_AR.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
+ "External Storage" : "Almacenamiento externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Log",
+ "Updates" : "Actualizaciones",
"Authentication error" : "Error al autenticar",
"Your full name has been changed." : "Su nombre completo ha sido cambiado.",
"Unable to change full name" : "Imposible cambiar el nombre completo",
@@ -68,12 +70,12 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "El módulo PHP 'fileinfo' no existe. Es recomendable que actives este módulo para obtener mejores resultados con la detección mime-type",
"System locale can not be set to a one which supports UTF-8." : "La localización del sistema no puede cambiarse a una que soporta UTF-8",
"This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de archivos.",
- "Execute one task with each page loaded" : "Ejecutá una tarea con cada pagina cargada.",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado en el servicio webcron para llamarlo cada 15 minutos usando http.",
"Allow apps to use the Share API" : "Permitir a las aplicaciones usar la Share API",
"Allow public uploads" : "Permitir subidas públicas",
"Allow users to send mail notification for shared files" : "Habilitar a los usuarios para enviar notificaciones por correo para archivos compartidos",
"Allow resharing" : "Permitir Re-Compartir",
+ "Execute one task with each page loaded" : "Ejecutá una tarea con cada pagina cargada.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado en el servicio webcron para llamarlo cada 15 minutos usando http.",
"This is used for sending out notifications." : "Esto es usado para enviar notificaciones.",
"Send mode" : "Modo de envio",
"From address" : "Dirección remitente",
diff --git a/settings/l10n/es_AR.json b/settings/l10n/es_AR.json
index dc4cede6f34..27b4b773431 100644
--- a/settings/l10n/es_AR.json
+++ b/settings/l10n/es_AR.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
+ "External Storage" : "Almacenamiento externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correo electrónico",
"Log" : "Log",
+ "Updates" : "Actualizaciones",
"Authentication error" : "Error al autenticar",
"Your full name has been changed." : "Su nombre completo ha sido cambiado.",
"Unable to change full name" : "Imposible cambiar el nombre completo",
@@ -66,12 +68,12 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "El módulo PHP 'fileinfo' no existe. Es recomendable que actives este módulo para obtener mejores resultados con la detección mime-type",
"System locale can not be set to a one which supports UTF-8." : "La localización del sistema no puede cambiarse a una que soporta UTF-8",
"This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de archivos.",
- "Execute one task with each page loaded" : "Ejecutá una tarea con cada pagina cargada.",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado en el servicio webcron para llamarlo cada 15 minutos usando http.",
"Allow apps to use the Share API" : "Permitir a las aplicaciones usar la Share API",
"Allow public uploads" : "Permitir subidas públicas",
"Allow users to send mail notification for shared files" : "Habilitar a los usuarios para enviar notificaciones por correo para archivos compartidos",
"Allow resharing" : "Permitir Re-Compartir",
+ "Execute one task with each page loaded" : "Ejecutá una tarea con cada pagina cargada.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado en el servicio webcron para llamarlo cada 15 minutos usando http.",
"This is used for sending out notifications." : "Esto es usado para enviar notificaciones.",
"Send mode" : "Modo de envio",
"From address" : "Dirección remitente",
diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js
index 8de83cceef6..bfbd94c26a6 100644
--- a/settings/l10n/es_MX.js
+++ b/settings/l10n/es_MX.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
+ "External Storage" : "Almacenamiento externo",
+ "Cron" : "Cron",
"Log" : "Registro",
"Authentication error" : "Error de autenticación",
"Your full name has been changed." : "Se ha cambiado su nombre completo.",
@@ -52,11 +53,11 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "No se ha encontrado el modulo PHP 'fileinfo'. Le recomendamos encarecidamente que habilite este módulo para obtener mejores resultados con la detección de tipos MIME.",
"System locale can not be set to a one which supports UTF-8." : "No se puede escoger una configuración regional que soporte UTF-8.",
"This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de los archivos.",
- "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición",
"Allow public uploads" : "Permitir subidas públicas",
"Allow resharing" : "Permitir re-compartición",
+ "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
"Server address" : "Dirección del servidor",
"Port" : "Puerto",
"Log level" : "Nivel de registro",
diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json
index 49cc3ccc41c..810d1ea693a 100644
--- a/settings/l10n/es_MX.json
+++ b/settings/l10n/es_MX.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Compartiendo",
+ "External Storage" : "Almacenamiento externo",
+ "Cron" : "Cron",
"Log" : "Registro",
"Authentication error" : "Error de autenticación",
"Your full name has been changed." : "Se ha cambiado su nombre completo.",
@@ -50,11 +51,11 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "No se ha encontrado el modulo PHP 'fileinfo'. Le recomendamos encarecidamente que habilite este módulo para obtener mejores resultados con la detección de tipos MIME.",
"System locale can not be set to a one which supports UTF-8." : "No se puede escoger una configuración regional que soporte UTF-8.",
"This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de los archivos.",
- "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
"Allow apps to use the Share API" : "Permitir a las aplicaciones utilizar la API de Compartición",
"Allow public uploads" : "Permitir subidas públicas",
"Allow resharing" : "Permitir re-compartición",
+ "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php se registra en un servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.",
"Server address" : "Dirección del servidor",
"Port" : "Puerto",
"Log level" : "Nivel de registro",
diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js
index 77b743cbfe8..0a470aab5c7 100644
--- a/settings/l10n/et_EE.js
+++ b/settings/l10n/et_EE.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Jagamine",
+ "External Storage" : "Väline salvestuskoht",
+ "Cron" : "Cron",
"Email Server" : "Postiserver",
"Log" : "Logi",
+ "Updates" : "Uuendused",
"Authentication error" : "Autentimise viga",
"Your full name has been changed." : "Sinu täispikk nimi on muudetud.",
"Unable to change full name" : "Täispika nime muutmine ebaõnnestus",
@@ -93,10 +95,6 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP moodul 'fileinfo' puudub. Soovitame tungivalt see lisada saavutamaks parimaid tulemusi failitüüpide tuvastamisel.",
"System locale can not be set to a one which supports UTF-8." : "Süsteemi lokaliseeringuks ei saa panna sellist, mis toetab UTF-8-t.",
"This means that there might be problems with certain characters in file names." : "See tähendab, et võib esineda probleeme failide nimedes mõnede sümbolitega.",
- "Cron was not executed yet!" : "Cron pole kordagi käivitatud!",
- "Execute one task with each page loaded" : "Käivita toiming igal lehe laadimisel",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php on registreeritud webcron teenuses, et käivitada fail cron.php iga 15 minuti tagant üle http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Kasuta süsteemi cron teenust, et käivitada fail cron.php iga 15 minuti järel.",
"Allow apps to use the Share API" : "Luba rakendustel kasutada Share API-t",
"Allow users to share via link" : "Luba kasutajatel lingiga jagamist ",
"Enforce password protection" : "Sunni parooliga kaitsmist",
@@ -110,6 +108,10 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires",
"Exclude groups from sharing" : "Eemalda grupid jagamisest",
"These groups will still be able to receive shares, but not to initiate them." : "Need grupid saavad vastu võtta jagamisi, kuid ise jagamisi algatada ei saa.",
+ "Cron was not executed yet!" : "Cron pole kordagi käivitatud!",
+ "Execute one task with each page loaded" : "Käivita toiming igal lehe laadimisel",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php on registreeritud webcron teenuses, et käivitada fail cron.php iga 15 minuti tagant üle http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Kasuta süsteemi cron teenust, et käivitada fail cron.php iga 15 minuti järel.",
"This is used for sending out notifications." : "Seda kasutatakse teadete välja saatmiseks.",
"Send mode" : "Saatmise viis",
"From address" : "Saatja aadress",
diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json
index 9875ff9031b..1168fca0822 100644
--- a/settings/l10n/et_EE.json
+++ b/settings/l10n/et_EE.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Jagamine",
+ "External Storage" : "Väline salvestuskoht",
+ "Cron" : "Cron",
"Email Server" : "Postiserver",
"Log" : "Logi",
+ "Updates" : "Uuendused",
"Authentication error" : "Autentimise viga",
"Your full name has been changed." : "Sinu täispikk nimi on muudetud.",
"Unable to change full name" : "Täispika nime muutmine ebaõnnestus",
@@ -91,10 +93,6 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP moodul 'fileinfo' puudub. Soovitame tungivalt see lisada saavutamaks parimaid tulemusi failitüüpide tuvastamisel.",
"System locale can not be set to a one which supports UTF-8." : "Süsteemi lokaliseeringuks ei saa panna sellist, mis toetab UTF-8-t.",
"This means that there might be problems with certain characters in file names." : "See tähendab, et võib esineda probleeme failide nimedes mõnede sümbolitega.",
- "Cron was not executed yet!" : "Cron pole kordagi käivitatud!",
- "Execute one task with each page loaded" : "Käivita toiming igal lehe laadimisel",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php on registreeritud webcron teenuses, et käivitada fail cron.php iga 15 minuti tagant üle http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Kasuta süsteemi cron teenust, et käivitada fail cron.php iga 15 minuti järel.",
"Allow apps to use the Share API" : "Luba rakendustel kasutada Share API-t",
"Allow users to share via link" : "Luba kasutajatel lingiga jagamist ",
"Enforce password protection" : "Sunni parooliga kaitsmist",
@@ -108,6 +106,10 @@
"Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires",
"Exclude groups from sharing" : "Eemalda grupid jagamisest",
"These groups will still be able to receive shares, but not to initiate them." : "Need grupid saavad vastu võtta jagamisi, kuid ise jagamisi algatada ei saa.",
+ "Cron was not executed yet!" : "Cron pole kordagi käivitatud!",
+ "Execute one task with each page loaded" : "Käivita toiming igal lehe laadimisel",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php on registreeritud webcron teenuses, et käivitada fail cron.php iga 15 minuti tagant üle http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Kasuta süsteemi cron teenust, et käivitada fail cron.php iga 15 minuti järel.",
"This is used for sending out notifications." : "Seda kasutatakse teadete välja saatmiseks.",
"Send mode" : "Saatmise viis",
"From address" : "Saatja aadress",
diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js
index 58e6159da5e..1b47a013546 100644
--- a/settings/l10n/eu.js
+++ b/settings/l10n/eu.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Partekatzea",
+ "External Storage" : "Kanpoko biltegiratzea",
+ "Cron" : "Cron",
"Email Server" : "Eposta zerbitzaria",
"Log" : "Log",
+ "Updates" : "Eguneraketak",
"Authentication error" : "Autentifikazio errorea",
"Your full name has been changed." : "Zure izena aldatu egin da.",
"Unable to change full name" : "Ezin izan da izena aldatu",
@@ -110,10 +112,6 @@ OC.L10N.register(
"This means that there might be problems with certain characters in file names." : "Honek esan nahi du fitxategien izenetako karaktere batzuekin arazoak egon daitezkeela.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Biziki gomendatzen dizugu beharrezkoak diren paketea zure sisteman instalatzea honi euskarria eman ahal izateko: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Zure instalazioa ez badago domeinuaren sustraian egina eta erabiltzen badu sistemaren cron-a, arazoak izan daitezke URL sorreran. Arazo horiek saihesteko ezarri \"overwrite.cli.url\" opzioa zure config.php fitxategian zure instalazioaren webroot bidera (Proposatua: \"%s\")",
- "Cron was not executed yet!" : "Cron-a oraindik ez da exekutatu!",
- "Execute one task with each page loaded" : "Exekutatu zeregin bat orri karga bakoitzean",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php webcron zerbitzu batean erregistratua dago cron.php 15 minuturo http bidez deitzeko.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Erabili sistemaren cron zerbitzua deitzeko cron.php fitxategia 15 minutuan behin.",
"Allow apps to use the Share API" : "Baimendu aplikazioak partekatzeko APIa erabiltzeko",
"Allow users to share via link" : "Baimendu erabiltzaileak esteken bidez partekatzea",
"Enforce password protection" : "Betearazi pasahitzaren babesa",
@@ -128,6 +126,10 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Baimendu erabiltzaileak beste erabiltzaileei epostako jakinarazpenak bidaltzen partekatutako fitxategientzat",
"Exclude groups from sharing" : "Baztertu taldeak partekatzean",
"These groups will still be able to receive shares, but not to initiate them." : "Talde hauek oraindik jaso ahal izango dute partekatzeak, baina ezingo dute partekatu",
+ "Cron was not executed yet!" : "Cron-a oraindik ez da exekutatu!",
+ "Execute one task with each page loaded" : "Exekutatu zeregin bat orri karga bakoitzean",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php webcron zerbitzu batean erregistratua dago cron.php 15 minuturo http bidez deitzeko.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Erabili sistemaren cron zerbitzua deitzeko cron.php fitxategia 15 minutuan behin.",
"This is used for sending out notifications." : "Hau jakinarazpenak bidaltzeko erabiltzen da.",
"Send mode" : "Bidaltzeko modua",
"From address" : "Helbidetik",
diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json
index 4f69c7a4fd8..c3e403c629f 100644
--- a/settings/l10n/eu.json
+++ b/settings/l10n/eu.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Partekatzea",
+ "External Storage" : "Kanpoko biltegiratzea",
+ "Cron" : "Cron",
"Email Server" : "Eposta zerbitzaria",
"Log" : "Log",
+ "Updates" : "Eguneraketak",
"Authentication error" : "Autentifikazio errorea",
"Your full name has been changed." : "Zure izena aldatu egin da.",
"Unable to change full name" : "Ezin izan da izena aldatu",
@@ -108,10 +110,6 @@
"This means that there might be problems with certain characters in file names." : "Honek esan nahi du fitxategien izenetako karaktere batzuekin arazoak egon daitezkeela.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Biziki gomendatzen dizugu beharrezkoak diren paketea zure sisteman instalatzea honi euskarria eman ahal izateko: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Zure instalazioa ez badago domeinuaren sustraian egina eta erabiltzen badu sistemaren cron-a, arazoak izan daitezke URL sorreran. Arazo horiek saihesteko ezarri \"overwrite.cli.url\" opzioa zure config.php fitxategian zure instalazioaren webroot bidera (Proposatua: \"%s\")",
- "Cron was not executed yet!" : "Cron-a oraindik ez da exekutatu!",
- "Execute one task with each page loaded" : "Exekutatu zeregin bat orri karga bakoitzean",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php webcron zerbitzu batean erregistratua dago cron.php 15 minuturo http bidez deitzeko.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Erabili sistemaren cron zerbitzua deitzeko cron.php fitxategia 15 minutuan behin.",
"Allow apps to use the Share API" : "Baimendu aplikazioak partekatzeko APIa erabiltzeko",
"Allow users to share via link" : "Baimendu erabiltzaileak esteken bidez partekatzea",
"Enforce password protection" : "Betearazi pasahitzaren babesa",
@@ -126,6 +124,10 @@
"Allow users to send mail notification for shared files to other users" : "Baimendu erabiltzaileak beste erabiltzaileei epostako jakinarazpenak bidaltzen partekatutako fitxategientzat",
"Exclude groups from sharing" : "Baztertu taldeak partekatzean",
"These groups will still be able to receive shares, but not to initiate them." : "Talde hauek oraindik jaso ahal izango dute partekatzeak, baina ezingo dute partekatu",
+ "Cron was not executed yet!" : "Cron-a oraindik ez da exekutatu!",
+ "Execute one task with each page loaded" : "Exekutatu zeregin bat orri karga bakoitzean",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php webcron zerbitzu batean erregistratua dago cron.php 15 minuturo http bidez deitzeko.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Erabili sistemaren cron zerbitzua deitzeko cron.php fitxategia 15 minutuan behin.",
"This is used for sending out notifications." : "Hau jakinarazpenak bidaltzeko erabiltzen da.",
"Send mode" : "Bidaltzeko modua",
"From address" : "Helbidetik",
diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js
index a4c3ac22f3e..ee6571d8f52 100644
--- a/settings/l10n/fa.js
+++ b/settings/l10n/fa.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "زمانبند",
"Sharing" : "اشتراک گذاری",
+ "External Storage" : "حافظه خارجی",
+ "Cron" : "زمانبند",
"Email Server" : "سرور ایمیل",
"Log" : "کارنامه",
+ "Updates" : "به روز رسانی ها",
"Authentication error" : "خطا در اعتبار سنجی",
"Your full name has been changed." : "نام کامل شما تغییر یافت",
"Unable to change full name" : "امکان تغییر نام کامل وجود ندارد",
@@ -78,9 +80,6 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "ماژول 'fileinfo' PHP از کار افتاده است.ما اکیدا توصیه می کنیم که این ماژول را فعال کنید تا نتایج بهتری به وسیله ی mime-type detection دریافت کنید.",
- "Cron was not executed yet!" : "کران هنوز اجرا نشده است!",
- "Execute one task with each page loaded" : "اجرای یک وظیفه با هر بار بارگذاری صفحه",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php در یک سرویس webcron ثبت شده است که هر 15 دقیقه یک بار بر روی بستر http فراخوانی شود.",
"Allow apps to use the Share API" : "اجازه ی برنامه ها برای استفاده از API اشتراک گذاری",
"Allow users to share via link" : "اجازه دادن به کاربران برای اشتراک گذاری توسط پیوند",
"Enforce password protection" : "اجبار برای محافظت توسط رمز عبور",
@@ -91,6 +90,9 @@ OC.L10N.register(
"Enforce expiration date" : "اعمال تاریخ اتمام اشتراک گذاری",
"Allow resharing" : "مجوز اشتراک گذاری مجدد",
"Exclude groups from sharing" : "مستثنی شدن گروه ها از اشتراک گذاری",
+ "Cron was not executed yet!" : "کران هنوز اجرا نشده است!",
+ "Execute one task with each page loaded" : "اجرای یک وظیفه با هر بار بارگذاری صفحه",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php در یک سرویس webcron ثبت شده است که هر 15 دقیقه یک بار بر روی بستر http فراخوانی شود.",
"This is used for sending out notifications." : "این برای ارسال هشدار ها استفاده می شود",
"Send mode" : "حالت ارسال",
"From address" : "آدرس فرستنده",
diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json
index d3452f17d41..d81b373c7d5 100644
--- a/settings/l10n/fa.json
+++ b/settings/l10n/fa.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "زمانبند",
"Sharing" : "اشتراک گذاری",
+ "External Storage" : "حافظه خارجی",
+ "Cron" : "زمانبند",
"Email Server" : "سرور ایمیل",
"Log" : "کارنامه",
+ "Updates" : "به روز رسانی ها",
"Authentication error" : "خطا در اعتبار سنجی",
"Your full name has been changed." : "نام کامل شما تغییر یافت",
"Unable to change full name" : "امکان تغییر نام کامل وجود ندارد",
@@ -76,9 +78,6 @@
"SSL" : "SSL",
"TLS" : "TLS",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "ماژول 'fileinfo' PHP از کار افتاده است.ما اکیدا توصیه می کنیم که این ماژول را فعال کنید تا نتایج بهتری به وسیله ی mime-type detection دریافت کنید.",
- "Cron was not executed yet!" : "کران هنوز اجرا نشده است!",
- "Execute one task with each page loaded" : "اجرای یک وظیفه با هر بار بارگذاری صفحه",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php در یک سرویس webcron ثبت شده است که هر 15 دقیقه یک بار بر روی بستر http فراخوانی شود.",
"Allow apps to use the Share API" : "اجازه ی برنامه ها برای استفاده از API اشتراک گذاری",
"Allow users to share via link" : "اجازه دادن به کاربران برای اشتراک گذاری توسط پیوند",
"Enforce password protection" : "اجبار برای محافظت توسط رمز عبور",
@@ -89,6 +88,9 @@
"Enforce expiration date" : "اعمال تاریخ اتمام اشتراک گذاری",
"Allow resharing" : "مجوز اشتراک گذاری مجدد",
"Exclude groups from sharing" : "مستثنی شدن گروه ها از اشتراک گذاری",
+ "Cron was not executed yet!" : "کران هنوز اجرا نشده است!",
+ "Execute one task with each page loaded" : "اجرای یک وظیفه با هر بار بارگذاری صفحه",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php در یک سرویس webcron ثبت شده است که هر 15 دقیقه یک بار بر روی بستر http فراخوانی شود.",
"This is used for sending out notifications." : "این برای ارسال هشدار ها استفاده می شود",
"Send mode" : "حالت ارسال",
"From address" : "آدرس فرستنده",
diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js
index 868a45b856b..7d381417b80 100644
--- a/settings/l10n/fi_FI.js
+++ b/settings/l10n/fi_FI.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Turvallisuus- ja asetusvaroitukset",
- "Cron" : "Cron",
"Sharing" : "Jakaminen",
- "Server Side Encryption" : "Palvelinpään salaus",
+ "External Storage" : "Erillinen tallennusväline",
+ "Cron" : "Cron",
"Email Server" : "Sähköpostipalvelin",
"Log" : "Loki",
"Tips & tricks" : "Vinkit",
+ "Updates" : "Päivitykset",
"Authentication error" : "Tunnistautumisvirhe",
"Your full name has been changed." : "Koko nimesi on muutettu.",
"Unable to change full name" : "Koko nimen muuttaminen epäonnistui",
@@ -115,12 +116,6 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Suosittelemme asentamaan vaaditut paketit järjestelmään, jotta järjestelmässä on tuki yhdelle seuraavista maa-asetuksista: %s.",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Cron-työn suorittaminen komentorivin kautta ei onnistunut. Ilmeni seuraavia teknisiä virheitä:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lue tarkasti <a target=\"_blank\" href=\"%s\">asennusohjeet ↗</a>, tarkista myös mahdolliset virheet ja varoitukset <a href=\"#log-section\">lokitiedostosta</a>.",
- "Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.",
- "Cron was not executed yet!" : "Cronia ei suoritettu vielä!",
- "Execute one task with each page loaded" : "Suorita yksi tehtävä jokaista ladattua sivua kohden",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php kutsuu webcron-palvelun kautta cron.php:ta 15 minuutin välein http:tä käyttäen.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Käytä järjestelmän cron-palvelua cron.php-tiedoston kutsumista varten 15 minuutin välein.",
"Allow apps to use the Share API" : "Salli sovellusten käyttää jakamisen ohjelmointirajapintaa",
"Allow users to share via link" : "Salli käyttäjien jakaa linkkien kautta",
"Enforce password protection" : "Pakota salasanasuojaus",
@@ -135,6 +130,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Salli käyttäjien lähettää muille käyttäjille sähköpostitse ilmoitus jaetuista tiedostoista",
"Exclude groups from sharing" : "Kiellä ryhmiä jakamasta",
"These groups will still be able to receive shares, but not to initiate them." : "Nämä ryhmät kykenevät vastaanottamaan jakoja, mutta eivät kuitenkaan itse pysty luoda jakoja.",
+ "Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.",
+ "Cron was not executed yet!" : "Cronia ei suoritettu vielä!",
+ "Execute one task with each page loaded" : "Suorita yksi tehtävä jokaista ladattua sivua kohden",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php kutsuu webcron-palvelun kautta cron.php:ta 15 minuutin välein http:tä käyttäen.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Käytä järjestelmän cron-palvelua cron.php-tiedoston kutsumista varten 15 minuutin välein.",
+ "Server Side Encryption" : "Palvelinpään salaus",
"Enable Server-Side-Encryption" : "Käytä palvelinpään salausta",
"This is used for sending out notifications." : "Tätä käytetään ilmoitusten lähettämiseen.",
"Send mode" : "Lähetystila",
diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json
index c90c382520e..24663101f41 100644
--- a/settings/l10n/fi_FI.json
+++ b/settings/l10n/fi_FI.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Turvallisuus- ja asetusvaroitukset",
- "Cron" : "Cron",
"Sharing" : "Jakaminen",
- "Server Side Encryption" : "Palvelinpään salaus",
+ "External Storage" : "Erillinen tallennusväline",
+ "Cron" : "Cron",
"Email Server" : "Sähköpostipalvelin",
"Log" : "Loki",
"Tips & tricks" : "Vinkit",
+ "Updates" : "Päivitykset",
"Authentication error" : "Tunnistautumisvirhe",
"Your full name has been changed." : "Koko nimesi on muutettu.",
"Unable to change full name" : "Koko nimen muuttaminen epäonnistui",
@@ -113,12 +114,6 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Suosittelemme asentamaan vaaditut paketit järjestelmään, jotta järjestelmässä on tuki yhdelle seuraavista maa-asetuksista: %s.",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Cron-työn suorittaminen komentorivin kautta ei onnistunut. Ilmeni seuraavia teknisiä virheitä:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lue tarkasti <a target=\"_blank\" href=\"%s\">asennusohjeet ↗</a>, tarkista myös mahdolliset virheet ja varoitukset <a href=\"#log-section\">lokitiedostosta</a>.",
- "Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.",
- "Cron was not executed yet!" : "Cronia ei suoritettu vielä!",
- "Execute one task with each page loaded" : "Suorita yksi tehtävä jokaista ladattua sivua kohden",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php kutsuu webcron-palvelun kautta cron.php:ta 15 minuutin välein http:tä käyttäen.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Käytä järjestelmän cron-palvelua cron.php-tiedoston kutsumista varten 15 minuutin välein.",
"Allow apps to use the Share API" : "Salli sovellusten käyttää jakamisen ohjelmointirajapintaa",
"Allow users to share via link" : "Salli käyttäjien jakaa linkkien kautta",
"Enforce password protection" : "Pakota salasanasuojaus",
@@ -133,6 +128,13 @@
"Allow users to send mail notification for shared files to other users" : "Salli käyttäjien lähettää muille käyttäjille sähköpostitse ilmoitus jaetuista tiedostoista",
"Exclude groups from sharing" : "Kiellä ryhmiä jakamasta",
"These groups will still be able to receive shares, but not to initiate them." : "Nämä ryhmät kykenevät vastaanottamaan jakoja, mutta eivät kuitenkaan itse pysty luoda jakoja.",
+ "Last cron job execution: %s." : "Viimeisin cron-työn suoritus: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Viimeisin cron-työn suoritus: %s. Jokin vaikuttaa menneen pieleen.",
+ "Cron was not executed yet!" : "Cronia ei suoritettu vielä!",
+ "Execute one task with each page loaded" : "Suorita yksi tehtävä jokaista ladattua sivua kohden",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php kutsuu webcron-palvelun kautta cron.php:ta 15 minuutin välein http:tä käyttäen.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Käytä järjestelmän cron-palvelua cron.php-tiedoston kutsumista varten 15 minuutin välein.",
+ "Server Side Encryption" : "Palvelinpään salaus",
"Enable Server-Side-Encryption" : "Käytä palvelinpään salausta",
"This is used for sending out notifications." : "Tätä käytetään ilmoitusten lähettämiseen.",
"Send mode" : "Lähetystila",
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index 4e2d2740f87..c23848aeb3e 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -1,10 +1,14 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
+ "Security & setup warnings" : "Avertissements de sécurité ou de configuration",
"Sharing" : "Partage",
+ "External Storage" : "Stockage externe",
+ "Cron" : "Cron",
"Email Server" : "Serveur mail",
"Log" : "Log",
+ "Tips & tricks" : "Trucs et astuces",
+ "Updates" : "Mises à jour",
"Authentication error" : "Erreur d'authentification",
"Your full name has been changed." : "Votre nom complet a été modifié.",
"Unable to change full name" : "Impossible de changer le nom complet",
@@ -60,7 +64,7 @@ OC.L10N.register(
"Error while enabling app" : "Erreur lors de l'activation de l'application",
"Updating...." : "Mise à jour...",
"Error while updating app" : "Erreur lors de la mise à jour de l'application",
- "Updated" : "Mise à jour effectuée avec succès",
+ "Updated" : "Mise à jour effectuée",
"Uninstalling ...." : "Désintallation...",
"Error while uninstalling app" : "Erreur lors de la désinstallation de l'application",
"Uninstall" : "Désinstaller",
@@ -91,6 +95,8 @@ OC.L10N.register(
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
"A valid email must be provided" : "Vous devez fournir une adresse de courriel valide",
"__language_name__" : "Français",
+ "Sync clients" : "Clients de synchronisation",
+ "Personal info" : "Informations personnelles",
"SSL root certificates" : "Certificats racine SSL",
"Encryption" : "Chiffrement",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)",
@@ -115,12 +121,7 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets requis à la prise en charge de l'un des paramètres régionaux suivants : %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :",
- "Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.",
- "Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.",
- "Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !",
- "Execute one task with each page loaded" : "Exécute une tâche à chaque chargement de page",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php est enregistré en tant que service webcron pour appeler cron.php toutes les 15 minutes via http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.",
"Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage",
"Allow users to share via link" : "Autoriser les utilisateurs à partager par lien",
"Enforce password protection" : "Obliger la protection par mot de passe",
@@ -135,6 +136,14 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Autoriser les utilisateurs à envoyer une notification par courriel concernant les fichiers partagés",
"Exclude groups from sharing" : "Empêcher certains groupes de partager",
"These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ",
+ "Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.",
+ "Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !",
+ "Execute one task with each page loaded" : "Exécute une tâche à chaque chargement de page",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php est enregistré auprès d'un service webcron qui l'exécutera toutes les 15 minutes via http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.",
+ "Server Side Encryption" : "Chiffrement côté serveur",
+ "Enable Server-Side-Encryption" : "Activer le chiffrement côté serveur",
"This is used for sending out notifications." : "Ceci est utilisé pour l'envoi des notifications.",
"Send mode" : "Mode d'envoi",
"From address" : "Adresse source",
@@ -156,6 +165,13 @@ OC.L10N.register(
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "La taille du fichier journal excède 100 Mo. Le télécharger peut prendre un certain temps!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite est actuellement utilisé comme gestionnaire de base de données. Pour des installations plus volumineuses, nous vous conseillons d'utiliser un autre gestionnaire de base de données.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "En particulier si vous utilisez le client de bureau pour synchroniser vos données : l'utilisation de SQLite est alors déconseillée.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Pour migrer vers un autre type de base de données, utilisez la ligne de commande : 'occ db:convert-type' ou consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a>.",
+ "How to do backups" : "Comment faire des sauvegardes",
+ "Advanced monitoring" : "Surveillance avancée",
+ "Performance tuning" : "Ajustement des performances",
+ "Improving the config.php" : "Amélioration du config.php ",
+ "Theming" : "Thème",
+ "Hardening and security guidance" : "Guide pour le renforcement et la sécurité",
"Version" : "Version",
"More apps" : "Plus d'applications",
"Developer documentation" : "Documentation pour les développeurs",
@@ -170,6 +186,7 @@ OC.L10N.register(
"Update to %s" : "Mettre à niveau vers la version %s",
"Enable only for specific groups" : "Activer uniquement pour certains groupes",
"Uninstall App" : "Désinstaller l'application",
+ "No apps found for your version" : "Pas d'application trouvée pour votre version",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Bonjour,<br><br>Un compte %s a été créé pour vous.<br><br>Votre nom d'utilisateur est : %s<br>Visitez votre compte : <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "À bientôt !",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Bonjour,<br><br>Un compte %s a été créé pour vous.<br><br>Votre nom d'utilisateur est : %s<br>Visitez votre compte : %s<br><br>\n",
@@ -190,6 +207,7 @@ OC.L10N.register(
"Current password" : "Mot de passe actuel",
"New password" : "Nouveau mot de passe",
"Change password" : "Changer de mot de passe",
+ "Full name" : "Nom complet",
"No display name set" : "Aucun nom d'affichage configuré",
"Email" : "Adresse mail",
"Your email address" : "Votre adresse mail",
@@ -210,6 +228,7 @@ OC.L10N.register(
"Valid until" : "Valide jusqu'à",
"Issued By" : "Délivré par",
"Valid until %s" : "Valide jusqu'à %s",
+ "Import root certificate" : "Importer un certificat racine",
"The encryption app is no longer enabled, please decrypt all your files" : "L'app de chiffrement n’est plus activée, veuillez déchiffrer tous vos fichiers",
"Log-in password" : "Mot de passe de connexion",
"Decrypt all Files" : "Déchiffrer tous les fichiers",
@@ -220,7 +239,7 @@ OC.L10N.register(
"Show storage location" : "Afficher l'emplacement du stockage",
"Show last log in" : "Montrer la dernière connexion",
"Show user backend" : "Montrer la source de l'identifiant",
- "Send email to new user" : "Envoyer un courriel au nouvel utilisateur",
+ "Send email to new user" : "Envoyer un courriel aux utilisateurs créés",
"Show email address" : "Afficher l'adresse email",
"Username" : "Nom d'utilisateur",
"E-Mail" : "Courriel",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index 9dfa37e04f2..78a0ef69e65 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -1,8 +1,12 @@
{ "translations": {
- "Cron" : "Cron",
+ "Security & setup warnings" : "Avertissements de sécurité ou de configuration",
"Sharing" : "Partage",
+ "External Storage" : "Stockage externe",
+ "Cron" : "Cron",
"Email Server" : "Serveur mail",
"Log" : "Log",
+ "Tips & tricks" : "Trucs et astuces",
+ "Updates" : "Mises à jour",
"Authentication error" : "Erreur d'authentification",
"Your full name has been changed." : "Votre nom complet a été modifié.",
"Unable to change full name" : "Impossible de changer le nom complet",
@@ -58,7 +62,7 @@
"Error while enabling app" : "Erreur lors de l'activation de l'application",
"Updating...." : "Mise à jour...",
"Error while updating app" : "Erreur lors de la mise à jour de l'application",
- "Updated" : "Mise à jour effectuée avec succès",
+ "Updated" : "Mise à jour effectuée",
"Uninstalling ...." : "Désintallation...",
"Error while uninstalling app" : "Erreur lors de la désinstallation de l'application",
"Uninstall" : "Désinstaller",
@@ -89,6 +93,8 @@
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
"A valid email must be provided" : "Vous devez fournir une adresse de courriel valide",
"__language_name__" : "Français",
+ "Sync clients" : "Clients de synchronisation",
+ "Personal info" : "Informations personnelles",
"SSL root certificates" : "Certificats racine SSL",
"Encryption" : "Chiffrement",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)",
@@ -113,12 +119,7 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets requis à la prise en charge de l'un des paramètres régionaux suivants : %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :",
- "Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.",
- "Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.",
- "Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !",
- "Execute one task with each page loaded" : "Exécute une tâche à chaque chargement de page",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php est enregistré en tant que service webcron pour appeler cron.php toutes les 15 minutes via http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.",
"Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage",
"Allow users to share via link" : "Autoriser les utilisateurs à partager par lien",
"Enforce password protection" : "Obliger la protection par mot de passe",
@@ -133,6 +134,14 @@
"Allow users to send mail notification for shared files to other users" : "Autoriser les utilisateurs à envoyer une notification par courriel concernant les fichiers partagés",
"Exclude groups from sharing" : "Empêcher certains groupes de partager",
"These groups will still be able to receive shares, but not to initiate them." : "Ces groupes ne pourront plus initier de partage, mais ils pourront toujours rejoindre les partages faits par d'autres. ",
+ "Last cron job execution: %s." : "Dernière tâche cron exécutée : %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Dernière tâche cron exécutée : %s. Quelque chose s'est mal passé.",
+ "Cron was not executed yet!" : "Le cron n'a pas encore été exécuté !",
+ "Execute one task with each page loaded" : "Exécute une tâche à chaque chargement de page",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php est enregistré auprès d'un service webcron qui l'exécutera toutes les 15 minutes via http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.",
+ "Server Side Encryption" : "Chiffrement côté serveur",
+ "Enable Server-Side-Encryption" : "Activer le chiffrement côté serveur",
"This is used for sending out notifications." : "Ceci est utilisé pour l'envoi des notifications.",
"Send mode" : "Mode d'envoi",
"From address" : "Adresse source",
@@ -154,6 +163,13 @@
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "La taille du fichier journal excède 100 Mo. Le télécharger peut prendre un certain temps!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite est actuellement utilisé comme gestionnaire de base de données. Pour des installations plus volumineuses, nous vous conseillons d'utiliser un autre gestionnaire de base de données.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "En particulier si vous utilisez le client de bureau pour synchroniser vos données : l'utilisation de SQLite est alors déconseillée.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Pour migrer vers un autre type de base de données, utilisez la ligne de commande : 'occ db:convert-type' ou consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a>.",
+ "How to do backups" : "Comment faire des sauvegardes",
+ "Advanced monitoring" : "Surveillance avancée",
+ "Performance tuning" : "Ajustement des performances",
+ "Improving the config.php" : "Amélioration du config.php ",
+ "Theming" : "Thème",
+ "Hardening and security guidance" : "Guide pour le renforcement et la sécurité",
"Version" : "Version",
"More apps" : "Plus d'applications",
"Developer documentation" : "Documentation pour les développeurs",
@@ -168,6 +184,7 @@
"Update to %s" : "Mettre à niveau vers la version %s",
"Enable only for specific groups" : "Activer uniquement pour certains groupes",
"Uninstall App" : "Désinstaller l'application",
+ "No apps found for your version" : "Pas d'application trouvée pour votre version",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Bonjour,<br><br>Un compte %s a été créé pour vous.<br><br>Votre nom d'utilisateur est : %s<br>Visitez votre compte : <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "À bientôt !",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Bonjour,<br><br>Un compte %s a été créé pour vous.<br><br>Votre nom d'utilisateur est : %s<br>Visitez votre compte : %s<br><br>\n",
@@ -188,6 +205,7 @@
"Current password" : "Mot de passe actuel",
"New password" : "Nouveau mot de passe",
"Change password" : "Changer de mot de passe",
+ "Full name" : "Nom complet",
"No display name set" : "Aucun nom d'affichage configuré",
"Email" : "Adresse mail",
"Your email address" : "Votre adresse mail",
@@ -208,6 +226,7 @@
"Valid until" : "Valide jusqu'à",
"Issued By" : "Délivré par",
"Valid until %s" : "Valide jusqu'à %s",
+ "Import root certificate" : "Importer un certificat racine",
"The encryption app is no longer enabled, please decrypt all your files" : "L'app de chiffrement n’est plus activée, veuillez déchiffrer tous vos fichiers",
"Log-in password" : "Mot de passe de connexion",
"Decrypt all Files" : "Déchiffrer tous les fichiers",
@@ -218,7 +237,7 @@
"Show storage location" : "Afficher l'emplacement du stockage",
"Show last log in" : "Montrer la dernière connexion",
"Show user backend" : "Montrer la source de l'identifiant",
- "Send email to new user" : "Envoyer un courriel au nouvel utilisateur",
+ "Send email to new user" : "Envoyer un courriel aux utilisateurs créés",
"Show email address" : "Afficher l'adresse email",
"Username" : "Nom d'utilisateur",
"E-Mail" : "Courriel",
diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js
index 3fb9d5c52d9..9eac5c02e7d 100644
--- a/settings/l10n/gl.js
+++ b/settings/l10n/gl.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Avisos de seguridade e configuración",
- "Cron" : "Cron",
"Sharing" : "Compartindo",
- "Server Side Encryption" : "Cifrado na parte do servidor",
+ "External Storage" : "Almacenamento externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correo",
"Log" : "Rexistro",
"Tips & tricks" : "Trucos e consellos",
+ "Updates" : "Actualizacións",
"Authentication error" : "Produciuse un erro de autenticación",
"Your full name has been changed." : "O seu nome completo foi cambiado",
"Unable to change full name" : "Non é posíbel cambiar o nome completo",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a instalación no está feita na raíz do dominio e usa o sistema cron, pode haber problemas coa xeración de URL. Para evitar estes problemas, axuste a opción «overwrite.cli.url» no seu ficheiro config.php á ruta webroot da instalación (suxestión: «%s»)",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non foi posíbel executar a tarefa de cron programada desde a liña de ordes. Atopáronse os seguintes erros técnicos:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Volva comprobar as <a target=\"_blank\" href=\"%s\">guías de instalación ↗</a>, e comprobe que non existen erros ou avisos no <a href=\"#log-section\">rexistro</a>.>.",
- "Last cron job execution: %s." : "Última execución da tarefa de cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execución da tarefa de cron: %s. Semella que algo vai mal",
- "Cron was not executed yet!" : "«Cron» aínda non foi executado!",
- "Execute one task with each page loaded" : "Executar unha tarefa con cada páxina cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está rexistrado nun servizo de WebCron para chamar a cron.php cada 15 minutos a través de HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Use o servizo «cron» do sistema para chamar ao ficheiro cron.php cada 15 minutos.",
"Allow apps to use the Share API" : "Permitir que as aplicacións empreguen o API para compartir",
"Allow users to share via link" : "Permitir que os usuarios compartan a través de ligazóns",
"Enforce password protection" : "Forzar a protección por contrasinal",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Permitirlle aos usuarios enviar notificacións por correo a outros usuarios para notificarlles os ficheiros compartidos",
"Exclude groups from sharing" : "Excluír grupos da compartición",
"These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderán recibir comparticións, mais non inicialas.",
+ "Last cron job execution: %s." : "Última execución da tarefa de cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execución da tarefa de cron: %s. Semella que algo vai mal",
+ "Cron was not executed yet!" : "«Cron» aínda non foi executado!",
+ "Execute one task with each page loaded" : "Executar unha tarefa con cada páxina cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está rexistrado nun servizo de WebCron para chamar a cron.php cada 15 minutos a través de HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Use o servizo «cron» do sistema para chamar ao ficheiro cron.php cada 15 minutos.",
+ "Server Side Encryption" : "Cifrado na parte do servidor",
"Enable Server-Side-Encryption" : "Activar o cifrado na parte do servidor",
"This is used for sending out notifications." : "Isto utilizase para o envío de notificacións.",
"Send mode" : "Modo de envío",
@@ -169,7 +171,7 @@ OC.L10N.register(
"Performance tuning" : "Afinación do rendemento",
"Improving the config.php" : "Mellorando o config.php",
"Theming" : "Tematización",
- "Hardening and security guidance" : "Orientacións sobre endurecemento e seguridade",
+ "Hardening and security guidance" : "Orientacións sobre fortificación e seguridade",
"Version" : "Versión",
"More apps" : "Máis aplicativos",
"Developer documentation" : "Documentación do desenvolvedor",
diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json
index 16116dc971a..ead3602888e 100644
--- a/settings/l10n/gl.json
+++ b/settings/l10n/gl.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Avisos de seguridade e configuración",
- "Cron" : "Cron",
"Sharing" : "Compartindo",
- "Server Side Encryption" : "Cifrado na parte do servidor",
+ "External Storage" : "Almacenamento externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de correo",
"Log" : "Rexistro",
"Tips & tricks" : "Trucos e consellos",
+ "Updates" : "Actualizacións",
"Authentication error" : "Produciuse un erro de autenticación",
"Your full name has been changed." : "O seu nome completo foi cambiado",
"Unable to change full name" : "Non é posíbel cambiar o nome completo",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a instalación no está feita na raíz do dominio e usa o sistema cron, pode haber problemas coa xeración de URL. Para evitar estes problemas, axuste a opción «overwrite.cli.url» no seu ficheiro config.php á ruta webroot da instalación (suxestión: «%s»)",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non foi posíbel executar a tarefa de cron programada desde a liña de ordes. Atopáronse os seguintes erros técnicos:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Volva comprobar as <a target=\"_blank\" href=\"%s\">guías de instalación ↗</a>, e comprobe que non existen erros ou avisos no <a href=\"#log-section\">rexistro</a>.>.",
- "Last cron job execution: %s." : "Última execución da tarefa de cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execución da tarefa de cron: %s. Semella que algo vai mal",
- "Cron was not executed yet!" : "«Cron» aínda non foi executado!",
- "Execute one task with each page loaded" : "Executar unha tarefa con cada páxina cargada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está rexistrado nun servizo de WebCron para chamar a cron.php cada 15 minutos a través de HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Use o servizo «cron» do sistema para chamar ao ficheiro cron.php cada 15 minutos.",
"Allow apps to use the Share API" : "Permitir que as aplicacións empreguen o API para compartir",
"Allow users to share via link" : "Permitir que os usuarios compartan a través de ligazóns",
"Enforce password protection" : "Forzar a protección por contrasinal",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Permitirlle aos usuarios enviar notificacións por correo a outros usuarios para notificarlles os ficheiros compartidos",
"Exclude groups from sharing" : "Excluír grupos da compartición",
"These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderán recibir comparticións, mais non inicialas.",
+ "Last cron job execution: %s." : "Última execución da tarefa de cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execución da tarefa de cron: %s. Semella que algo vai mal",
+ "Cron was not executed yet!" : "«Cron» aínda non foi executado!",
+ "Execute one task with each page loaded" : "Executar unha tarefa con cada páxina cargada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está rexistrado nun servizo de WebCron para chamar a cron.php cada 15 minutos a través de HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Use o servizo «cron» do sistema para chamar ao ficheiro cron.php cada 15 minutos.",
+ "Server Side Encryption" : "Cifrado na parte do servidor",
"Enable Server-Side-Encryption" : "Activar o cifrado na parte do servidor",
"This is used for sending out notifications." : "Isto utilizase para o envío de notificacións.",
"Send mode" : "Modo de envío",
@@ -167,7 +169,7 @@
"Performance tuning" : "Afinación do rendemento",
"Improving the config.php" : "Mellorando o config.php",
"Theming" : "Tematización",
- "Hardening and security guidance" : "Orientacións sobre endurecemento e seguridade",
+ "Hardening and security guidance" : "Orientacións sobre fortificación e seguridade",
"Version" : "Versión",
"More apps" : "Máis aplicativos",
"Developer documentation" : "Documentación do desenvolvedor",
diff --git a/settings/l10n/he.js b/settings/l10n/he.js
index 54665287722..1f57f9516e6 100644
--- a/settings/l10n/he.js
+++ b/settings/l10n/he.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "שיתוף",
+ "External Storage" : "אחסון חיצוני",
+ "Cron" : "Cron",
"Log" : "יומן",
"Authentication error" : "שגיאת הזדהות",
"Language changed" : "שפה השתנתה",
@@ -34,9 +35,9 @@ OC.L10N.register(
"Encryption" : "הצפנה",
"None" : "כלום",
"Login" : "התחברות",
- "Execute one task with each page loaded" : "יש להפעיל משימה אחת עם כל עמוד שנטען",
"Allow apps to use the Share API" : "לאפשר ליישום להשתמש ב־API השיתוף",
"Allow resharing" : "לאפשר שיתוף מחדש",
+ "Execute one task with each page loaded" : "יש להפעיל משימה אחת עם כל עמוד שנטען",
"Server address" : "כתובת שרת",
"Port" : "פורט",
"Credentials" : "פרטי גישה",
diff --git a/settings/l10n/he.json b/settings/l10n/he.json
index 7e6b6f69e0e..ce2e69f8b83 100644
--- a/settings/l10n/he.json
+++ b/settings/l10n/he.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "שיתוף",
+ "External Storage" : "אחסון חיצוני",
+ "Cron" : "Cron",
"Log" : "יומן",
"Authentication error" : "שגיאת הזדהות",
"Language changed" : "שפה השתנתה",
@@ -32,9 +33,9 @@
"Encryption" : "הצפנה",
"None" : "כלום",
"Login" : "התחברות",
- "Execute one task with each page loaded" : "יש להפעיל משימה אחת עם כל עמוד שנטען",
"Allow apps to use the Share API" : "לאפשר ליישום להשתמש ב־API השיתוף",
"Allow resharing" : "לאפשר שיתוף מחדש",
+ "Execute one task with each page loaded" : "יש להפעיל משימה אחת עם כל עמוד שנטען",
"Server address" : "כתובת שרת",
"Port" : "פורט",
"Credentials" : "פרטי גישה",
diff --git a/settings/l10n/hr.js b/settings/l10n/hr.js
index 3cfe291de6b..037f9ff1e1c 100644
--- a/settings/l10n/hr.js
+++ b/settings/l10n/hr.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Dijeljenje zajedničkih resursa",
+ "External Storage" : "Vanjsko spremište",
+ "Cron" : "Cron",
"Email Server" : "Poslužitelj e-pošte",
"Log" : "Zapisnik",
+ "Updates" : "nadogradnje",
"Authentication error" : "Pogrešna autentikacija",
"Your full name has been changed." : "Vaše puno ime je promijenjeno.",
"Unable to change full name" : "Puno ime nije moguće promijeniti.",
@@ -91,10 +93,6 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modul 'fileinfo' nedostaje. Tolo vam preporučjemo da taj modul omogućitekako biste dobili najbolje rezultate u detekciji mime vrste.",
"System locale can not be set to a one which supports UTF-8." : "Regionalnu shemu sustava nemoguće je postaviti na neku koja podržava UTF-8.",
"This means that there might be problems with certain characters in file names." : "To znači da se mogu javiti problemi s određenim znakovima u datoteci.",
- "Cron was not executed yet!" : "Cron još nije izvršen!",
- "Execute one task with each page loaded" : "Izvršite jedan zadatak sa svakom učitanom stranicom",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registriran na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"Allow apps to use the Share API" : "Dopustite apps korištenje Share API",
"Allow users to share via link" : "Dopustite korisnicia dijeljenje putem veze",
"Enforce password protection" : "Nametnite zaštitu lozinki",
@@ -108,6 +106,10 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Ograničite korisnike na meusobno dijeljenje resursa samo s korisnicima unutar svoje grupe",
"Exclude groups from sharing" : "Isključite grupe iz dijeljenja zajedničkih resursa",
"These groups will still be able to receive shares, but not to initiate them." : "Ove će grupe još uvijek moći primati dijeljene resurse, ali ne i inicirati ih",
+ "Cron was not executed yet!" : "Cron još nije izvršen!",
+ "Execute one task with each page loaded" : "Izvršite jedan zadatak sa svakom učitanom stranicom",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registriran na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"This is used for sending out notifications." : "Ovo se koristi za slanje notifikacija.",
"Send mode" : "Način rada za slanje",
"From address" : "S adrese",
diff --git a/settings/l10n/hr.json b/settings/l10n/hr.json
index 827aef793dc..b48b3bc4827 100644
--- a/settings/l10n/hr.json
+++ b/settings/l10n/hr.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Dijeljenje zajedničkih resursa",
+ "External Storage" : "Vanjsko spremište",
+ "Cron" : "Cron",
"Email Server" : "Poslužitelj e-pošte",
"Log" : "Zapisnik",
+ "Updates" : "nadogradnje",
"Authentication error" : "Pogrešna autentikacija",
"Your full name has been changed." : "Vaše puno ime je promijenjeno.",
"Unable to change full name" : "Puno ime nije moguće promijeniti.",
@@ -89,10 +91,6 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modul 'fileinfo' nedostaje. Tolo vam preporučjemo da taj modul omogućitekako biste dobili najbolje rezultate u detekciji mime vrste.",
"System locale can not be set to a one which supports UTF-8." : "Regionalnu shemu sustava nemoguće je postaviti na neku koja podržava UTF-8.",
"This means that there might be problems with certain characters in file names." : "To znači da se mogu javiti problemi s određenim znakovima u datoteci.",
- "Cron was not executed yet!" : "Cron još nije izvršen!",
- "Execute one task with each page loaded" : "Izvršite jedan zadatak sa svakom učitanom stranicom",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registriran na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"Allow apps to use the Share API" : "Dopustite apps korištenje Share API",
"Allow users to share via link" : "Dopustite korisnicia dijeljenje putem veze",
"Enforce password protection" : "Nametnite zaštitu lozinki",
@@ -106,6 +104,10 @@
"Restrict users to only share with users in their groups" : "Ograničite korisnike na meusobno dijeljenje resursa samo s korisnicima unutar svoje grupe",
"Exclude groups from sharing" : "Isključite grupe iz dijeljenja zajedničkih resursa",
"These groups will still be able to receive shares, but not to initiate them." : "Ove će grupe još uvijek moći primati dijeljene resurse, ali ne i inicirati ih",
+ "Cron was not executed yet!" : "Cron još nije izvršen!",
+ "Execute one task with each page loaded" : "Izvršite jedan zadatak sa svakom učitanom stranicom",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je registriran na webcron usluzi da poziva cron.php svakih 15 minuta preko http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Koristite cron uslugu sustava za pozivanje cron.php datoteke svakih 15 minuta.",
"This is used for sending out notifications." : "Ovo se koristi za slanje notifikacija.",
"Send mode" : "Način rada za slanje",
"From address" : "S adrese",
diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js
index 8ab1065916f..fbdca20bce4 100644
--- a/settings/l10n/hu_HU.js
+++ b/settings/l10n/hu_HU.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Ütemezett feladatok",
"Sharing" : "Megosztás",
+ "External Storage" : "Külső tárolási szolgáltatások becsatolása",
+ "Cron" : "Ütemezett feladatok",
"Email Server" : "E-mail kiszolgáló",
"Log" : "Naplózás",
+ "Updates" : "Frissítések",
"Authentication error" : "Azonosítási hiba",
"Your full name has been changed." : "Az Ön teljes nevét módosítottuk.",
"Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét",
@@ -90,10 +92,6 @@ 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.",
- "Cron was not executed yet!" : "A cron feladat még nem futott le!",
- "Execute one task with each page loaded" : "Egy-egy feladat végrehajtása minden alkalommal, amikor egy weboldalt letöltenek",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "A cron.php webcron szolgáltatásként van regisztrálva, hogy 15 percenként egyszer lefuttassa a cron.php-t.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.",
"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",
@@ -107,6 +105,10 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "A csoporttagok csak a saját csoportjukon belül oszthassanak meg anyagokat",
"Exclude groups from sharing" : "Csoportok megosztási jogának tiltása",
"These groups will still be able to receive shares, but not to initiate them." : "E csoportok tagjaival meg lehet osztani anyagokat, de ők nem hozhatnak létre megosztást.",
+ "Cron was not executed yet!" : "A cron feladat még nem futott le!",
+ "Execute one task with each page loaded" : "Egy-egy feladat végrehajtása minden alkalommal, amikor egy weboldalt letöltenek",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "A cron.php webcron szolgáltatásként van regisztrálva, hogy 15 percenként egyszer lefuttassa a cron.php-t.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.",
"This is used for sending out notifications." : "Ezt használjuk a jelentések kiküldésére.",
"Send mode" : "Küldési mód",
"From address" : "A feladó címe",
diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json
index 3a3a10839ba..b854bc9da87 100644
--- a/settings/l10n/hu_HU.json
+++ b/settings/l10n/hu_HU.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Ütemezett feladatok",
"Sharing" : "Megosztás",
+ "External Storage" : "Külső tárolási szolgáltatások becsatolása",
+ "Cron" : "Ütemezett feladatok",
"Email Server" : "E-mail kiszolgáló",
"Log" : "Naplózás",
+ "Updates" : "Frissítések",
"Authentication error" : "Azonosítási hiba",
"Your full name has been changed." : "Az Ön teljes nevét módosítottuk.",
"Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét",
@@ -88,10 +90,6 @@
"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.",
- "Cron was not executed yet!" : "A cron feladat még nem futott le!",
- "Execute one task with each page loaded" : "Egy-egy feladat végrehajtása minden alkalommal, amikor egy weboldalt letöltenek",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "A cron.php webcron szolgáltatásként van regisztrálva, hogy 15 percenként egyszer lefuttassa a cron.php-t.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.",
"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",
@@ -105,6 +103,10 @@
"Restrict users to only share with users in their groups" : "A csoporttagok csak a saját csoportjukon belül oszthassanak meg anyagokat",
"Exclude groups from sharing" : "Csoportok megosztási jogának tiltása",
"These groups will still be able to receive shares, but not to initiate them." : "E csoportok tagjaival meg lehet osztani anyagokat, de ők nem hozhatnak létre megosztást.",
+ "Cron was not executed yet!" : "A cron feladat még nem futott le!",
+ "Execute one task with each page loaded" : "Egy-egy feladat végrehajtása minden alkalommal, amikor egy weboldalt letöltenek",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "A cron.php webcron szolgáltatásként van regisztrálva, hogy 15 percenként egyszer lefuttassa a cron.php-t.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.",
"This is used for sending out notifications." : "Ezt használjuk a jelentések kiküldésére.",
"Send mode" : "Küldési mód",
"From address" : "A feladó címe",
diff --git a/settings/l10n/id.js b/settings/l10n/id.js
index d33bcb30ff5..3c65f8b0c9c 100644
--- a/settings/l10n/id.js
+++ b/settings/l10n/id.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Berbagi",
+ "External Storage" : "Penyimpanan Eksternal",
+ "Cron" : "Cron",
"Email Server" : "Server Email",
"Log" : "Log",
+ "Updates" : "Pembaruan",
"Authentication error" : "Terjadi kesalahan saat otentikasi",
"Your full name has been changed." : "Nama lengkap Anda telah diubah",
"Unable to change full name" : "Tidak dapat mengubah nama lengkap",
@@ -110,10 +112,6 @@ OC.L10N.register(
"This means that there might be problems with certain characters in file names." : "Ini artinya mungkin ada masalah dengan karakter tertentu pada nama berkas.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Kamu sangat menyarankan untuk menginstal paket-paket yang dibutuhkan pada sistem agar mendukung lokal berikut: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Jika instalasi Anda tidak di root domain dan menggunakan sistem cron, hal tersebut dapat menyebabkan masalah dengan pembuatan URL. Untuk mencegah masalah tersebut, mohon atur opsi \"overwrite.cli.url\" pada berkas config.php Anda ke jalur lokasi webroot instalasi Anda (Disarankan: \"%s\")",
- "Cron was not executed yet!" : "Cron masih belum dieksekusi!",
- "Execute one task with each page loaded" : "Jalankan tugas setiap kali halaman dimuat",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php didaftarkan pada layanan webcron untuk memanggil cron.php setiap 15 menit melalui http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Gunakan layanan cron sistem untuk memanggil berkas cron.php setiap 15 menit.",
"Allow apps to use the Share API" : "Izinkan aplikasi untuk menggunakan API Pembagian",
"Allow users to share via link" : "Izinkan pengguna untuk membagikan via tautan",
"Enforce password protection" : "Berlakukan perlindungan sandi",
@@ -128,6 +126,10 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Izinkan pengguna mengirim pemberitahuan email saat berbagi berkas kepada pengguna lainnya",
"Exclude groups from sharing" : "Tidak termasuk grup untuk berbagi",
"These groups will still be able to receive shares, but not to initiate them." : "Grup ini akan tetap dapat menerima berbagi, tatapi tidak dapat membagikan.",
+ "Cron was not executed yet!" : "Cron masih belum dieksekusi!",
+ "Execute one task with each page loaded" : "Jalankan tugas setiap kali halaman dimuat",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php didaftarkan pada layanan webcron untuk memanggil cron.php setiap 15 menit melalui http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Gunakan layanan cron sistem untuk memanggil berkas cron.php setiap 15 menit.",
"This is used for sending out notifications." : "Ini digunakan untuk mengirim notifikasi keluar.",
"Send mode" : "Modus kirim",
"From address" : "Dari alamat",
diff --git a/settings/l10n/id.json b/settings/l10n/id.json
index 7cb900d454c..83a40b3a573 100644
--- a/settings/l10n/id.json
+++ b/settings/l10n/id.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Berbagi",
+ "External Storage" : "Penyimpanan Eksternal",
+ "Cron" : "Cron",
"Email Server" : "Server Email",
"Log" : "Log",
+ "Updates" : "Pembaruan",
"Authentication error" : "Terjadi kesalahan saat otentikasi",
"Your full name has been changed." : "Nama lengkap Anda telah diubah",
"Unable to change full name" : "Tidak dapat mengubah nama lengkap",
@@ -108,10 +110,6 @@
"This means that there might be problems with certain characters in file names." : "Ini artinya mungkin ada masalah dengan karakter tertentu pada nama berkas.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Kamu sangat menyarankan untuk menginstal paket-paket yang dibutuhkan pada sistem agar mendukung lokal berikut: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Jika instalasi Anda tidak di root domain dan menggunakan sistem cron, hal tersebut dapat menyebabkan masalah dengan pembuatan URL. Untuk mencegah masalah tersebut, mohon atur opsi \"overwrite.cli.url\" pada berkas config.php Anda ke jalur lokasi webroot instalasi Anda (Disarankan: \"%s\")",
- "Cron was not executed yet!" : "Cron masih belum dieksekusi!",
- "Execute one task with each page loaded" : "Jalankan tugas setiap kali halaman dimuat",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php didaftarkan pada layanan webcron untuk memanggil cron.php setiap 15 menit melalui http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Gunakan layanan cron sistem untuk memanggil berkas cron.php setiap 15 menit.",
"Allow apps to use the Share API" : "Izinkan aplikasi untuk menggunakan API Pembagian",
"Allow users to share via link" : "Izinkan pengguna untuk membagikan via tautan",
"Enforce password protection" : "Berlakukan perlindungan sandi",
@@ -126,6 +124,10 @@
"Allow users to send mail notification for shared files to other users" : "Izinkan pengguna mengirim pemberitahuan email saat berbagi berkas kepada pengguna lainnya",
"Exclude groups from sharing" : "Tidak termasuk grup untuk berbagi",
"These groups will still be able to receive shares, but not to initiate them." : "Grup ini akan tetap dapat menerima berbagi, tatapi tidak dapat membagikan.",
+ "Cron was not executed yet!" : "Cron masih belum dieksekusi!",
+ "Execute one task with each page loaded" : "Jalankan tugas setiap kali halaman dimuat",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php didaftarkan pada layanan webcron untuk memanggil cron.php setiap 15 menit melalui http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Gunakan layanan cron sistem untuk memanggil berkas cron.php setiap 15 menit.",
"This is used for sending out notifications." : "Ini digunakan untuk mengirim notifikasi keluar.",
"Send mode" : "Modus kirim",
"From address" : "Dari alamat",
diff --git a/settings/l10n/is.js b/settings/l10n/is.js
index 841d6504402..85c9edbe728 100644
--- a/settings/l10n/is.js
+++ b/settings/l10n/is.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"settings",
{
+ "External Storage" : "Ytri gagnageymsla",
"Authentication error" : "Villa við auðkenningu",
"Language changed" : "Tungumáli breytt",
"Invalid request" : "Ógild fyrirspurn",
diff --git a/settings/l10n/is.json b/settings/l10n/is.json
index f20ad761bc7..925bfe8836a 100644
--- a/settings/l10n/is.json
+++ b/settings/l10n/is.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "External Storage" : "Ytri gagnageymsla",
"Authentication error" : "Villa við auðkenningu",
"Language changed" : "Tungumáli breytt",
"Invalid request" : "Ógild fyrirspurn",
diff --git a/settings/l10n/it.js b/settings/l10n/it.js
index 16d8775e4ab..e2b6030637b 100644
--- a/settings/l10n/it.js
+++ b/settings/l10n/it.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Avvisi di sicurezza e di configurazione",
- "Cron" : "Cron",
"Sharing" : "Condivisione",
- "Server Side Encryption" : "Cifratura lato server",
+ "External Storage" : "Archiviazione esterna",
+ "Cron" : "Cron",
"Email Server" : "Server di posta",
"Log" : "Log",
"Tips & tricks" : "Suggerimenti e trucchi",
+ "Updates" : "Aggiornamenti",
"Authentication error" : "Errore di autenticazione",
"Your full name has been changed." : "Il tuo nome completo è stato cambiato.",
"Unable to change full name" : "Impossibile cambiare il nome completo",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Leggi attentamente le <a target=\"_blank\" href=\"%s\">guide d'installazione ↗</a>, e controlla gli errori o gli avvisi nel <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.",
- "Cron was not executed yet!" : "Cron non è stato ancora eseguito!",
- "Execute one task with each page loaded" : "Esegui un'operazione con ogni pagina caricata",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php è registrato su un servizio webcron per invocare cron.php ogni 15 minuti su http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 15 minuti.",
"Allow apps to use the Share API" : "Consenti alle applicazioni di utilizzare le API di condivisione",
"Allow users to share via link" : "Consenti agli utenti di condivere tramite collegamento",
"Enforce password protection" : "Imponi la protezione con password",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Consenti agli utenti di inviare email di notifica per i file condivisi con altri utenti",
"Exclude groups from sharing" : "Escludi gruppi dalla condivisione",
"These groups will still be able to receive shares, but not to initiate them." : "Questi gruppi saranno in grado di ricevere condivisioni, ma non iniziarle.",
+ "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.",
+ "Cron was not executed yet!" : "Cron non è stato ancora eseguito!",
+ "Execute one task with each page loaded" : "Esegui un'operazione con ogni pagina caricata",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php è registrato su un servizio webcron per invocare cron.php ogni 15 minuti su http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 15 minuti.",
+ "Server Side Encryption" : "Cifratura lato server",
"Enable Server-Side-Encryption" : "Abilita cifratura lato server",
"This is used for sending out notifications." : "Viene utilizzato per inviare le notifiche.",
"Send mode" : "Modalità di invio",
diff --git a/settings/l10n/it.json b/settings/l10n/it.json
index c19e53c4cca..6b738f2270a 100644
--- a/settings/l10n/it.json
+++ b/settings/l10n/it.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Avvisi di sicurezza e di configurazione",
- "Cron" : "Cron",
"Sharing" : "Condivisione",
- "Server Side Encryption" : "Cifratura lato server",
+ "External Storage" : "Archiviazione esterna",
+ "Cron" : "Cron",
"Email Server" : "Server di posta",
"Log" : "Log",
"Tips & tricks" : "Suggerimenti e trucchi",
+ "Updates" : "Aggiornamenti",
"Authentication error" : "Errore di autenticazione",
"Your full name has been changed." : "Il tuo nome completo è stato cambiato.",
"Unable to change full name" : "Impossibile cambiare il nome completo",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Leggi attentamente le <a target=\"_blank\" href=\"%s\">guide d'installazione ↗</a>, e controlla gli errori o gli avvisi nel <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.",
- "Cron was not executed yet!" : "Cron non è stato ancora eseguito!",
- "Execute one task with each page loaded" : "Esegui un'operazione con ogni pagina caricata",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php è registrato su un servizio webcron per invocare cron.php ogni 15 minuti su http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 15 minuti.",
"Allow apps to use the Share API" : "Consenti alle applicazioni di utilizzare le API di condivisione",
"Allow users to share via link" : "Consenti agli utenti di condivere tramite collegamento",
"Enforce password protection" : "Imponi la protezione con password",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Consenti agli utenti di inviare email di notifica per i file condivisi con altri utenti",
"Exclude groups from sharing" : "Escludi gruppi dalla condivisione",
"These groups will still be able to receive shares, but not to initiate them." : "Questi gruppi saranno in grado di ricevere condivisioni, ma non iniziarle.",
+ "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Ultima esecuzione di cron: %s. Potrebbe esserci un problema.",
+ "Cron was not executed yet!" : "Cron non è stato ancora eseguito!",
+ "Execute one task with each page loaded" : "Esegui un'operazione con ogni pagina caricata",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php è registrato su un servizio webcron per invocare cron.php ogni 15 minuti su http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usa il servizio cron di sistema per invocare il file cron.php ogni 15 minuti.",
+ "Server Side Encryption" : "Cifratura lato server",
"Enable Server-Side-Encryption" : "Abilita cifratura lato server",
"This is used for sending out notifications." : "Viene utilizzato per inviare le notifiche.",
"Send mode" : "Modalità di invio",
diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js
index ea59b8b5876..eb1bf6cfa00 100644
--- a/settings/l10n/ja.js
+++ b/settings/l10n/ja.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "共有",
+ "External Storage" : "外部ストレージ",
+ "Cron" : "Cron",
"Email Server" : "メールサーバー",
"Log" : "ログ",
+ "Updates" : "アップデート",
"Authentication error" : "認証エラー",
"Your full name has been changed." : "名前を変更しました。",
"Unable to change full name" : "名前を変更できません",
@@ -113,10 +115,6 @@ OC.L10N.register(
"This means that there might be problems with certain characters in file names." : "これは、ファイル名の特定の文字に問題があることを意味しています。",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "次のロケールをサポートするために、システムに必要なパッケージをインストールすることを強くおすすめします: %s。",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "もし、URLがドメインのルート(/)で終わっていない場合で、システムのcronを利用している場合、URLの生成に問題が発生します。その場合は、config.php ファイルの中の \"overwrite.cli.url\" オプションをインストールしたwebrootのパスに設定してください。(推奨: \"%s\")",
- "Cron was not executed yet!" : "cronはまだ実行されていません!",
- "Execute one task with each page loaded" : "各ページの読み込み時にタスクを実行します。",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.phpは、HTTP経由で15分ごとにcron.phpを実行するようwebcronサービスに登録されています。",
- "Use system's cron service to call the cron.php file every 15 minutes." : "システムのcronサービスを利用して、15分間隔でcron.phpファイルを実行する。",
"Allow apps to use the Share API" : "アプリからの共有APIの利用を許可する",
"Allow users to share via link" : "URLリンクで共有を許可する",
"Enforce password protection" : "常にパスワード保護を有効にする",
@@ -131,6 +129,10 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "共有ファイルに関するメール通知の送信をユーザに許可する",
"Exclude groups from sharing" : "共有可能なグループから除外する",
"These groups will still be able to receive shares, but not to initiate them." : "このグループでは、フォルダー共有を開始することはできませんが、共有されたフォルダーを参照することはできます。",
+ "Cron was not executed yet!" : "cronはまだ実行されていません!",
+ "Execute one task with each page loaded" : "各ページの読み込み時にタスクを実行します。",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.phpは、HTTP経由で15分ごとにcron.phpを実行するようwebcronサービスに登録されています。",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "システムのcronサービスを利用して、15分間隔でcron.phpファイルを実行する。",
"This is used for sending out notifications." : "通知を送信する際に使用します。",
"Send mode" : "送信モード",
"From address" : "送信元アドレス",
diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json
index 7661dd43000..b20348da064 100644
--- a/settings/l10n/ja.json
+++ b/settings/l10n/ja.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "共有",
+ "External Storage" : "外部ストレージ",
+ "Cron" : "Cron",
"Email Server" : "メールサーバー",
"Log" : "ログ",
+ "Updates" : "アップデート",
"Authentication error" : "認証エラー",
"Your full name has been changed." : "名前を変更しました。",
"Unable to change full name" : "名前を変更できません",
@@ -111,10 +113,6 @@
"This means that there might be problems with certain characters in file names." : "これは、ファイル名の特定の文字に問題があることを意味しています。",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "次のロケールをサポートするために、システムに必要なパッケージをインストールすることを強くおすすめします: %s。",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "もし、URLがドメインのルート(/)で終わっていない場合で、システムのcronを利用している場合、URLの生成に問題が発生します。その場合は、config.php ファイルの中の \"overwrite.cli.url\" オプションをインストールしたwebrootのパスに設定してください。(推奨: \"%s\")",
- "Cron was not executed yet!" : "cronはまだ実行されていません!",
- "Execute one task with each page loaded" : "各ページの読み込み時にタスクを実行します。",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.phpは、HTTP経由で15分ごとにcron.phpを実行するようwebcronサービスに登録されています。",
- "Use system's cron service to call the cron.php file every 15 minutes." : "システムのcronサービスを利用して、15分間隔でcron.phpファイルを実行する。",
"Allow apps to use the Share API" : "アプリからの共有APIの利用を許可する",
"Allow users to share via link" : "URLリンクで共有を許可する",
"Enforce password protection" : "常にパスワード保護を有効にする",
@@ -129,6 +127,10 @@
"Allow users to send mail notification for shared files to other users" : "共有ファイルに関するメール通知の送信をユーザに許可する",
"Exclude groups from sharing" : "共有可能なグループから除外する",
"These groups will still be able to receive shares, but not to initiate them." : "このグループでは、フォルダー共有を開始することはできませんが、共有されたフォルダーを参照することはできます。",
+ "Cron was not executed yet!" : "cronはまだ実行されていません!",
+ "Execute one task with each page loaded" : "各ページの読み込み時にタスクを実行します。",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.phpは、HTTP経由で15分ごとにcron.phpを実行するようwebcronサービスに登録されています。",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "システムのcronサービスを利用して、15分間隔でcron.phpファイルを実行する。",
"This is used for sending out notifications." : "通知を送信する際に使用します。",
"Send mode" : "送信モード",
"From address" : "送信元アドレス",
diff --git a/settings/l10n/ka_GE.js b/settings/l10n/ka_GE.js
index 5bfcb269f8e..b971b147186 100644
--- a/settings/l10n/ka_GE.js
+++ b/settings/l10n/ka_GE.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron–ი",
"Sharing" : "გაზიარება",
+ "External Storage" : "ექსტერნალ საცავი",
+ "Cron" : "Cron–ი",
"Log" : "ლოგი",
"Authentication error" : "ავთენტიფიკაციის შეცდომა",
"Language changed" : "ენა შეცვლილია",
@@ -34,9 +35,9 @@ OC.L10N.register(
"None" : "არა",
"Login" : "ლოგინი",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP მოდული 'fileinfo' არ არსებობს. ჩვენ გირჩევთ რომ აუცილებლად ჩართოთ ეს მოდული, რომ მიიღოთ კარგი შედეგები mime-type–ს აღმოჩენისას.",
- "Execute one task with each page loaded" : "გაუშვი თითო მოქმედება ყველა ჩატვირთულ გვერდზე",
"Allow apps to use the Share API" : "დაუშვი აპლიკაციების უფლება Share API –ზე",
"Allow resharing" : "გადაზიარების დაშვება",
+ "Execute one task with each page loaded" : "გაუშვი თითო მოქმედება ყველა ჩატვირთულ გვერდზე",
"Server address" : "სერვერის მისამართი",
"Port" : "პორტი",
"Credentials" : "იუზერ/პაროლი",
diff --git a/settings/l10n/ka_GE.json b/settings/l10n/ka_GE.json
index 6e90bcc62b6..40bf3812518 100644
--- a/settings/l10n/ka_GE.json
+++ b/settings/l10n/ka_GE.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron–ი",
"Sharing" : "გაზიარება",
+ "External Storage" : "ექსტერნალ საცავი",
+ "Cron" : "Cron–ი",
"Log" : "ლოგი",
"Authentication error" : "ავთენტიფიკაციის შეცდომა",
"Language changed" : "ენა შეცვლილია",
@@ -32,9 +33,9 @@
"None" : "არა",
"Login" : "ლოგინი",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP მოდული 'fileinfo' არ არსებობს. ჩვენ გირჩევთ რომ აუცილებლად ჩართოთ ეს მოდული, რომ მიიღოთ კარგი შედეგები mime-type–ს აღმოჩენისას.",
- "Execute one task with each page loaded" : "გაუშვი თითო მოქმედება ყველა ჩატვირთულ გვერდზე",
"Allow apps to use the Share API" : "დაუშვი აპლიკაციების უფლება Share API –ზე",
"Allow resharing" : "გადაზიარების დაშვება",
+ "Execute one task with each page loaded" : "გაუშვი თითო მოქმედება ყველა ჩატვირთულ გვერდზე",
"Server address" : "სერვერის მისამართი",
"Port" : "პორტი",
"Credentials" : "იუზერ/პაროლი",
diff --git a/settings/l10n/km.js b/settings/l10n/km.js
index a4fafa830fe..580d5bcb001 100644
--- a/settings/l10n/km.js
+++ b/settings/l10n/km.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "ការ​ចែក​រំលែក",
+ "External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ",
+ "Cron" : "Cron",
"Email Server" : "ម៉ាស៊ីន​បម្រើ​អ៊ីមែល",
"Log" : "Log",
"Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ",
diff --git a/settings/l10n/km.json b/settings/l10n/km.json
index ba6da463129..87784ad3364 100644
--- a/settings/l10n/km.json
+++ b/settings/l10n/km.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "ការ​ចែក​រំលែក",
+ "External Storage" : "ឃ្លាំងផ្ទុក​ខាងក្រៅ",
+ "Cron" : "Cron",
"Email Server" : "ម៉ាស៊ីន​បម្រើ​អ៊ីមែល",
"Log" : "Log",
"Authentication error" : "កំហុស​ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ",
diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js
index 09376409741..cc557b9b690 100644
--- a/settings/l10n/ko.js
+++ b/settings/l10n/ko.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "공유",
+ "External Storage" : "외부 저장소",
+ "Cron" : "Cron",
"Email Server" : "전자우편 서버",
"Log" : "로그",
+ "Updates" : "업데이트",
"Authentication error" : "인증 오류",
"Your full name has been changed." : "전체 이름이 변경되었습니다.",
"Unable to change full name" : "전체 이름을 변경할 수 없음",
@@ -110,10 +112,6 @@ OC.L10N.register(
"This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")",
- "Cron was not executed yet!" : "Cron이 실행되지 않았습니다!",
- "Execute one task with each page loaded" : "개별 페이지를 불러올 때마다 실행",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php는 webcron 서비스에 등록되어 HTTP로 15분마다 cron.php에 접근합니다.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.",
"Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용",
"Allow users to share via link" : "사용자별 링크 공유 허용",
"Enforce password protection" : "암호 보호 강제",
@@ -128,6 +126,10 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "다른 사용자에게 공유 파일 이메일 알림 전송 허용",
"Exclude groups from sharing" : "공유에서 그룹 제외",
"These groups will still be able to receive shares, but not to initiate them." : "이 그룹의 사용자들은 다른 사용자가 공유한 파일을 받을 수는 있지만, 자기 파일을 공유할 수는 없습니다.",
+ "Cron was not executed yet!" : "Cron이 실행되지 않았습니다!",
+ "Execute one task with each page loaded" : "개별 페이지를 불러올 때마다 실행",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php는 webcron 서비스에 등록되어 HTTP로 15분마다 cron.php에 접근합니다.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.",
"This is used for sending out notifications." : "알림을 보낼 때 사용됩니다.",
"Send mode" : "보내기 모드",
"From address" : "보낸 사람 주소",
diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json
index 39dbeee3210..d4b8ddee211 100644
--- a/settings/l10n/ko.json
+++ b/settings/l10n/ko.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "공유",
+ "External Storage" : "외부 저장소",
+ "Cron" : "Cron",
"Email Server" : "전자우편 서버",
"Log" : "로그",
+ "Updates" : "업데이트",
"Authentication error" : "인증 오류",
"Your full name has been changed." : "전체 이름이 변경되었습니다.",
"Unable to change full name" : "전체 이름을 변경할 수 없음",
@@ -108,10 +110,6 @@
"This means that there might be problems with certain characters in file names." : "파일 이름의 일부 문자에 문제가 생길 수도 있습니다.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")",
- "Cron was not executed yet!" : "Cron이 실행되지 않았습니다!",
- "Execute one task with each page loaded" : "개별 페이지를 불러올 때마다 실행",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php는 webcron 서비스에 등록되어 HTTP로 15분마다 cron.php에 접근합니다.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.",
"Allow apps to use the Share API" : "앱에서 공유 API를 사용할 수 있도록 허용",
"Allow users to share via link" : "사용자별 링크 공유 허용",
"Enforce password protection" : "암호 보호 강제",
@@ -126,6 +124,10 @@
"Allow users to send mail notification for shared files to other users" : "다른 사용자에게 공유 파일 이메일 알림 전송 허용",
"Exclude groups from sharing" : "공유에서 그룹 제외",
"These groups will still be able to receive shares, but not to initiate them." : "이 그룹의 사용자들은 다른 사용자가 공유한 파일을 받을 수는 있지만, 자기 파일을 공유할 수는 없습니다.",
+ "Cron was not executed yet!" : "Cron이 실행되지 않았습니다!",
+ "Execute one task with each page loaded" : "개별 페이지를 불러올 때마다 실행",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php는 webcron 서비스에 등록되어 HTTP로 15분마다 cron.php에 접근합니다.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "시스템의 cron 서비스를 통하여 15분마다 cron.php 파일을 실행합니다.",
"This is used for sending out notifications." : "알림을 보낼 때 사용됩니다.",
"Send mode" : "보내기 모드",
"From address" : "보낸 사람 주소",
diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js
index 5016eadde14..8794c34b963 100644
--- a/settings/l10n/lt_LT.js
+++ b/settings/l10n/lt_LT.js
@@ -1,9 +1,11 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Dalijimasis",
+ "External Storage" : "Išorinės saugyklos",
+ "Cron" : "Cron",
"Log" : "Žurnalas",
+ "Updates" : "Atnaujinimai",
"Authentication error" : "Autentikacijos klaida",
"Language changed" : "Kalba pakeista",
"Invalid request" : "Klaidinga užklausa",
@@ -45,11 +47,11 @@ OC.L10N.register(
"None" : "Nieko",
"Login" : "Prisijungti",
"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ą.",
- "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.",
"Allow apps to use the Share API" : "Leidžia programoms naudoti Share API",
"Allow public uploads" : "Leisti viešus įkėlimus",
"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.",
"Server address" : "Serverio adresas",
"Port" : "Prievadas",
"Log level" : "Žurnalo išsamumas",
diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json
index 85ed9135617..198bd9bcd9d 100644
--- a/settings/l10n/lt_LT.json
+++ b/settings/l10n/lt_LT.json
@@ -1,7 +1,9 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Dalijimasis",
+ "External Storage" : "Išorinės saugyklos",
+ "Cron" : "Cron",
"Log" : "Žurnalas",
+ "Updates" : "Atnaujinimai",
"Authentication error" : "Autentikacijos klaida",
"Language changed" : "Kalba pakeista",
"Invalid request" : "Klaidinga užklausa",
@@ -43,11 +45,11 @@
"None" : "Nieko",
"Login" : "Prisijungti",
"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ą.",
- "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.",
"Allow apps to use the Share API" : "Leidžia programoms naudoti Share API",
"Allow public uploads" : "Leisti viešus įkėlimus",
"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.",
"Server address" : "Serverio adresas",
"Port" : "Prievadas",
"Log level" : "Žurnalo išsamumas",
diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js
index 9116fe8eb7e..9c4d0bc4e96 100644
--- a/settings/l10n/lv.js
+++ b/settings/l10n/lv.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Dalīšanās",
+ "External Storage" : "Ārējā krātuve",
+ "Cron" : "Cron",
"Email Server" : "E-pasta serveris",
"Log" : "Žurnāls",
"Authentication error" : "Autentifikācijas kļūda",
@@ -100,13 +101,13 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūkst PHP modulis “fileinfo”. Mēs iesakām to aktivēt, lai pēc iespējas labāk noteiktu mime tipus.",
- "Execute one task with each page loaded" : "Izpildīt vienu uzdevumu ar katru ielādēto lapu",
"Allow apps to use the Share API" : "Ļauj lietotnēm izmantot koplietošanas API",
"Allow users to share via link" : "Ļaut lietotājiem dalīties caur saitēm",
"Allow public uploads" : "Atļaut publisko augšupielādi",
"Expire after " : "Nederīga pēc",
"days" : "dienas",
"Allow resharing" : "Atļaut atkārtotu koplietošanu",
+ "Execute one task with each page loaded" : "Izpildīt vienu uzdevumu ar katru ielādēto lapu",
"Server address" : "Servera adrese",
"Port" : "Ports",
"Credentials" : "Akreditācijas dati",
diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json
index 39aef3e0866..985320d990e 100644
--- a/settings/l10n/lv.json
+++ b/settings/l10n/lv.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Dalīšanās",
+ "External Storage" : "Ārējā krātuve",
+ "Cron" : "Cron",
"Email Server" : "E-pasta serveris",
"Log" : "Žurnāls",
"Authentication error" : "Autentifikācijas kļūda",
@@ -98,13 +99,13 @@
"SSL" : "SSL",
"TLS" : "TLS",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūkst PHP modulis “fileinfo”. Mēs iesakām to aktivēt, lai pēc iespējas labāk noteiktu mime tipus.",
- "Execute one task with each page loaded" : "Izpildīt vienu uzdevumu ar katru ielādēto lapu",
"Allow apps to use the Share API" : "Ļauj lietotnēm izmantot koplietošanas API",
"Allow users to share via link" : "Ļaut lietotājiem dalīties caur saitēm",
"Allow public uploads" : "Atļaut publisko augšupielādi",
"Expire after " : "Nederīga pēc",
"days" : "dienas",
"Allow resharing" : "Atļaut atkārtotu koplietošanu",
+ "Execute one task with each page loaded" : "Izpildīt vienu uzdevumu ar katru ielādēto lapu",
"Server address" : "Servera adrese",
"Port" : "Ports",
"Credentials" : "Akreditācijas dati",
diff --git a/settings/l10n/mk.js b/settings/l10n/mk.js
index 76c578aee59..1ebd43eabcc 100644
--- a/settings/l10n/mk.js
+++ b/settings/l10n/mk.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Крон",
"Sharing" : "Споделување",
+ "External Storage" : "Надворешно складиште",
+ "Cron" : "Крон",
"Email Server" : "Сервер за електронска пошта",
"Log" : "Записник",
"Authentication error" : "Грешка во автентикација",
@@ -66,7 +67,6 @@ OC.L10N.register(
"NT LAN Manager" : "NT LAN Менаџер",
"SSL" : "SSL",
"TLS" : "TLS",
- "Execute one task with each page loaded" : "Изврши по една задача со секоја вчитана страница",
"Allow apps to use the Share API" : "Дозволете апликациите да го користат API-то за споделување",
"Allow users to share via link" : "Допушти корисниците да споделуваат со линкови",
"Enforce password protection" : "Наметни заштита на лозинка",
@@ -78,6 +78,7 @@ OC.L10N.register(
"Allow resharing" : "Овозможи повторно споделување",
"Restrict users to only share with users in their groups" : "Ограничи корисниците да споделуваат со корисници во своите групи",
"Exclude groups from sharing" : "Исклучи групи од споделување",
+ "Execute one task with each page loaded" : "Изврши по една задача со секоја вчитана страница",
"This is used for sending out notifications." : "Ова се користи за испраќање на известувања.",
"Send mode" : "Мод на испраќање",
"From address" : "Од адреса",
diff --git a/settings/l10n/mk.json b/settings/l10n/mk.json
index 7428a0a02e1..bd065363504 100644
--- a/settings/l10n/mk.json
+++ b/settings/l10n/mk.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Крон",
"Sharing" : "Споделување",
+ "External Storage" : "Надворешно складиште",
+ "Cron" : "Крон",
"Email Server" : "Сервер за електронска пошта",
"Log" : "Записник",
"Authentication error" : "Грешка во автентикација",
@@ -64,7 +65,6 @@
"NT LAN Manager" : "NT LAN Менаџер",
"SSL" : "SSL",
"TLS" : "TLS",
- "Execute one task with each page loaded" : "Изврши по една задача со секоја вчитана страница",
"Allow apps to use the Share API" : "Дозволете апликациите да го користат API-то за споделување",
"Allow users to share via link" : "Допушти корисниците да споделуваат со линкови",
"Enforce password protection" : "Наметни заштита на лозинка",
@@ -76,6 +76,7 @@
"Allow resharing" : "Овозможи повторно споделување",
"Restrict users to only share with users in their groups" : "Ограничи корисниците да споделуваат со корисници во своите групи",
"Exclude groups from sharing" : "Исклучи групи од споделување",
+ "Execute one task with each page loaded" : "Изврши по една задача со секоја вчитана страница",
"This is used for sending out notifications." : "Ова се користи за испраќање на известувања.",
"Send mode" : "Мод на испраќање",
"From address" : "Од адреса",
diff --git a/settings/l10n/mn.js b/settings/l10n/mn.js
index 685812d5936..7b56c73c2bd 100644
--- a/settings/l10n/mn.js
+++ b/settings/l10n/mn.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Крон",
"Sharing" : "Түгээлт",
+ "Cron" : "Крон",
"Email Server" : "И-мэйл сервер",
"Log" : "Лог бичилт",
"Authentication error" : "Нотолгооны алдаа",
diff --git a/settings/l10n/mn.json b/settings/l10n/mn.json
index c6d9fcd47b5..828ae435eb8 100644
--- a/settings/l10n/mn.json
+++ b/settings/l10n/mn.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Cron" : "Крон",
"Sharing" : "Түгээлт",
+ "Cron" : "Крон",
"Email Server" : "И-мэйл сервер",
"Log" : "Лог бичилт",
"Authentication error" : "Нотолгооны алдаа",
diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js
index 9dbae706c7c..912c072fa2a 100644
--- a/settings/l10n/nb_NO.js
+++ b/settings/l10n/nb_NO.js
@@ -1,10 +1,14 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
+ "Security & setup warnings" : "Advarsler om sikkerhet og oppsett",
"Sharing" : "Deling",
+ "External Storage" : "Ekstern lagring",
+ "Cron" : "Cron",
"Email Server" : "E-postserver",
"Log" : "Logg",
+ "Tips & tricks" : "Tips og triks",
+ "Updates" : "Oppdateringer",
"Authentication error" : "Autentiseringsfeil",
"Your full name has been changed." : "Ditt fulle navn er blitt endret.",
"Unable to change full name" : "Klarte ikke å endre fullt navn",
@@ -26,6 +30,7 @@ OC.L10N.register(
"No user supplied" : "Ingen bruker angitt",
"Please provide an admin recovery password, otherwise all user data will be lost" : "Vennligst oppgi et administrativt gjenopprettingspassord. Ellers vil alle brukerdata gå tapt",
"Wrong admin recovery password. Please check the password and try again." : "Feil administrativt gjenopprettingspassord. Sjekk passordet og prøv igjen.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Serveren støtter ikke endring av passord, men oppdatering av brukerens krypteringsnøkkel var vellykket.",
"Unable to change password" : "Kunne ikke endre passord",
"Enabled" : "Aktiv",
"Not enabled" : "Ikke aktivert",
@@ -36,9 +41,11 @@ OC.L10N.register(
"log-level out of allowed range" : "Loggnivå utenfor tillatt område",
"Saved" : "Lagret",
"test email settings" : "Test av innstillinger for e-post",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Et problem oppstod med sending av e-post. Sjekk innstillingene. (Feil: %s)",
"Email sent" : "E-post sendt",
"You need to set your user email before being able to send test emails." : "Du må sette e-postadressen for brukeren din før du kan teste sending av e-post.",
"Invalid mail address" : "Ugyldig e-postadresse",
+ "A user with that name already exists." : "Det finnes allerede en bruker med det navnet.",
"Unable to create user." : "Kan ikke opprette bruker.",
"Your %s account was created" : "%s-kontoen din ble opprettet",
"Unable to delete user." : "Kan ikke slette bruker.",
@@ -88,6 +95,8 @@ OC.L10N.register(
"A valid password must be provided" : "Oppgi et gyldig passord",
"A valid email must be provided" : "En gyldig e-postadresse må oppgis",
"__language_name__" : "__language_name__",
+ "Sync clients" : "Synkroniseringsklienter",
+ "Personal info" : "Personlig informasjon",
"SSL root certificates" : "SSL rotsertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (fatale problemer, feil, advarsler, info, debug)",
@@ -105,15 +114,14 @@ OC.L10N.register(
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Det ser ut for at PHP er satt opp til å fjerne innebygde doc blocks. Dette gjør at flere av kjerneapplikasjonene blir utilgjengelige.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dette forårsakes sannsynligvis av en bufrer/akselerator, som f.eks. Zend OPcache eller eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Serveren din kjører på Microsoft Windows. Vi anbefaler strekt Linux for en optimal brukeropplevelse.",
+ "APCu below version 4.0.6 is installed, for stability and performance reasons we recommend to update to a newer APCu version." : "APCu lavere enn versjon 4.0.6 er installert. Vi anbefaler å oppdatere til en nyere APCu-versjon for bedre stabilitet og ytelse.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modulen 'fileinfo' mangler. Vi anbefaler at du aktiverer denne modulen for å kunne detektere mime-typen korrekt.",
"System locale can not be set to a one which supports UTF-8." : "Kan ikke sette systemets nasjonale innstillinger til en som støtter UTF-8.",
"This means that there might be problems with certain characters in file names." : "Dette betyr at det kan forekomme problemer med visse tegn i filnavn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")",
- "Cron was not executed yet!" : "Cron er ikke utført ennå!",
- "Execute one task with each page loaded" : "Utfør en oppgave med hver side som blir lastet",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registrert i en webcron-tjeneste for å kalle cron.php hvert 15. minutt over http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert 15. minutt.",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Vennligst dobbeltsjekk <a target=\"_blank\" href=\"%s\">Installasjonsveiledningene ↗</a> og se etter feil og advarsler i <a href=\"#log-section\">loggen</a>.",
"Allow apps to use the Share API" : "Tillat apper å bruke API for Deling",
"Allow users to share via link" : "Tillat brukere å dele via lenke",
"Enforce password protection" : "Krev passordbeskyttelse",
@@ -128,6 +136,14 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Tillat at brukere sender varsler om delte filer på e-post til andre brukere",
"Exclude groups from sharing" : "Utelukk grupper fra deling",
"These groups will still be able to receive shares, but not to initiate them." : "Disse gruppene vil fremdeles kunne motta delinger men ikke lage dem.",
+ "Last cron job execution: %s." : "Siste kjøring av cron-jobb: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Siste kjøring av cron-jobb: %s. Noe ser ut til å være galt.",
+ "Cron was not executed yet!" : "Cron er ikke utført ennå!",
+ "Execute one task with each page loaded" : "Utfør en oppgave med hver side som blir lastet",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registrert i en webcron-tjeneste for å kalle cron.php hvert 15. minutt over http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert 15. minutt.",
+ "Server Side Encryption" : "Serverkryptering",
+ "Enable Server-Side-Encryption" : "Slå på serverkryptering",
"This is used for sending out notifications." : "Dette brukes for utsending av varsler.",
"Send mode" : "Sendemåte",
"From address" : "Fra adresse",
@@ -147,8 +163,15 @@ OC.L10N.register(
"More" : "Mer",
"Less" : "Mindre",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Loggfilen er over 100 MB, nedlastingen kan ta en stund!",
- "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite er brukt som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite brukes som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.",
+ "How to do backups" : "Hvordan ta sikkerhetskopier",
+ "Advanced monitoring" : "Avansert overvåking",
+ "Performance tuning" : "Tilpassing av ytelse",
+ "Improving the config.php" : "Forbedring av config.php",
+ "Theming" : "Temaer",
+ "Hardening and security guidance" : "Herding og sikkerhetsveiledning",
"Version" : "Versjon",
"More apps" : "Flere apper",
"Developer documentation" : "Utviklerdokumentasjon",
@@ -157,10 +180,13 @@ OC.L10N.register(
"Documentation:" : "Dokumentasjon:",
"User Documentation" : "Brukerdokumentasjon",
"Admin Documentation" : "Admin-dokumentasjon",
+ "Show description …" : "Vis beskrivelse …",
+ "Hide description …" : "Skjul beskrivelse …",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Denne appen kan ikke installeres fordi følgende avhengigheter ikke er tilfredsstilt:",
"Update to %s" : "Oppdater til %s",
"Enable only for specific groups" : "Aktiver kun for visse grupper",
"Uninstall App" : "Avinstaller app",
+ "No apps found for your version" : "Ingen apper funnet for din versjon",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Hei,<br><br>vil bare informere om at du nå har en %s-konto.<br><br>Brukernavnet ditt: %s<br>Gå dit: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Ha det!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nVil bare informere om at du nå har en %s-konto.\n\nBrukernavnet ditt: %s\nGå dit: %s\n\n",
@@ -173,6 +199,7 @@ OC.L10N.register(
"Desktop client" : "Skrivebordsklient",
"Android app" : "Android-app",
"iOS app" : "iOS-app",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Hvis du vil støtte prosjektet kan du\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">delta i utviklingen</a>\n\t\teller\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spre budskapet</a>!",
"Show First Run Wizard again" : "Vis \"Førstegangs veiviser\" på nytt",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Du har brukt <strong>%s</strong> av de tilgjengelige <strong>%s</strong>",
"Password" : "Passord",
@@ -180,6 +207,7 @@ OC.L10N.register(
"Current password" : "Nåværende passord",
"New password" : "Nytt passord",
"Change password" : "Endre passord",
+ "Full name" : "Fullt navn",
"No display name set" : "Visningsnavn ikke satt",
"Email" : "Epost",
"Your email address" : "Din e-postadresse",
@@ -200,12 +228,14 @@ OC.L10N.register(
"Valid until" : "Gyldig til",
"Issued By" : "Utstedt av",
"Valid until %s" : "Gyldig til %s",
+ "Import root certificate" : "Importer rotsertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypterings-appen er ikke aktiv lenger. Vennligst dekrypter alle filene dine",
"Log-in password" : "Innloggingspassord",
"Decrypt all Files" : "Dekrypter alle filer",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Krypteringsnøklene dine er flyttet til en plass for sikkerhetskopier. Hvis noe gikk galt kan du gjenopprette nøklene. Ikke slett dem permanent før du er ikker på at alle filer er dekryptert korrekt.",
"Restore Encryption Keys" : "Gjenopprett krypteringsnøkler",
"Delete Encryption Keys" : "Slett krypteringsnøkler",
+ "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Utviklet av {communityopen}ownCloud-fellesskapet{linkclose}. {githubopen}Kildekoden{linkclose} er lisensiert under {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.",
"Show storage location" : "Vis lagringssted",
"Show last log in" : "Vis site innlogging",
"Show user backend" : "Vis bruker-server",
@@ -216,7 +246,7 @@ OC.L10N.register(
"Create" : "Opprett",
"Admin Recovery Password" : "Administrativt gjenopprettingspassord",
"Enter the recovery password in order to recover the users files during password change" : "Legg inn gjenopprettingspassordet for å gjenopprette brukerfilene når passordet endres",
- "Search Users" : "Søk brukere",
+ "Search Users" : "Søk i brukere",
"Add Group" : "Legg til gruppe",
"Group" : "Gruppe",
"Everyone" : "Alle",
diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json
index 1124cf86e74..479bbbe2dbd 100644
--- a/settings/l10n/nb_NO.json
+++ b/settings/l10n/nb_NO.json
@@ -1,8 +1,12 @@
{ "translations": {
- "Cron" : "Cron",
+ "Security & setup warnings" : "Advarsler om sikkerhet og oppsett",
"Sharing" : "Deling",
+ "External Storage" : "Ekstern lagring",
+ "Cron" : "Cron",
"Email Server" : "E-postserver",
"Log" : "Logg",
+ "Tips & tricks" : "Tips og triks",
+ "Updates" : "Oppdateringer",
"Authentication error" : "Autentiseringsfeil",
"Your full name has been changed." : "Ditt fulle navn er blitt endret.",
"Unable to change full name" : "Klarte ikke å endre fullt navn",
@@ -24,6 +28,7 @@
"No user supplied" : "Ingen bruker angitt",
"Please provide an admin recovery password, otherwise all user data will be lost" : "Vennligst oppgi et administrativt gjenopprettingspassord. Ellers vil alle brukerdata gå tapt",
"Wrong admin recovery password. Please check the password and try again." : "Feil administrativt gjenopprettingspassord. Sjekk passordet og prøv igjen.",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Serveren støtter ikke endring av passord, men oppdatering av brukerens krypteringsnøkkel var vellykket.",
"Unable to change password" : "Kunne ikke endre passord",
"Enabled" : "Aktiv",
"Not enabled" : "Ikke aktivert",
@@ -34,9 +39,11 @@
"log-level out of allowed range" : "Loggnivå utenfor tillatt område",
"Saved" : "Lagret",
"test email settings" : "Test av innstillinger for e-post",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Et problem oppstod med sending av e-post. Sjekk innstillingene. (Feil: %s)",
"Email sent" : "E-post sendt",
"You need to set your user email before being able to send test emails." : "Du må sette e-postadressen for brukeren din før du kan teste sending av e-post.",
"Invalid mail address" : "Ugyldig e-postadresse",
+ "A user with that name already exists." : "Det finnes allerede en bruker med det navnet.",
"Unable to create user." : "Kan ikke opprette bruker.",
"Your %s account was created" : "%s-kontoen din ble opprettet",
"Unable to delete user." : "Kan ikke slette bruker.",
@@ -86,6 +93,8 @@
"A valid password must be provided" : "Oppgi et gyldig passord",
"A valid email must be provided" : "En gyldig e-postadresse må oppgis",
"__language_name__" : "__language_name__",
+ "Sync clients" : "Synkroniseringsklienter",
+ "Personal info" : "Personlig informasjon",
"SSL root certificates" : "SSL rotsertifikater",
"Encryption" : "Kryptering",
"Everything (fatal issues, errors, warnings, info, debug)" : "Alt (fatale problemer, feil, advarsler, info, debug)",
@@ -103,15 +112,14 @@
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Det ser ut for at PHP er satt opp til å fjerne innebygde doc blocks. Dette gjør at flere av kjerneapplikasjonene blir utilgjengelige.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dette forårsakes sannsynligvis av en bufrer/akselerator, som f.eks. Zend OPcache eller eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Serveren din kjører på Microsoft Windows. Vi anbefaler strekt Linux for en optimal brukeropplevelse.",
+ "APCu below version 4.0.6 is installed, for stability and performance reasons we recommend to update to a newer APCu version." : "APCu lavere enn versjon 4.0.6 er installert. Vi anbefaler å oppdatere til en nyere APCu-versjon for bedre stabilitet og ytelse.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modulen 'fileinfo' mangler. Vi anbefaler at du aktiverer denne modulen for å kunne detektere mime-typen korrekt.",
"System locale can not be set to a one which supports UTF-8." : "Kan ikke sette systemets nasjonale innstillinger til en som støtter UTF-8.",
"This means that there might be problems with certain characters in file names." : "Dette betyr at det kan forekomme problemer med visse tegn i filnavn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")",
- "Cron was not executed yet!" : "Cron er ikke utført ennå!",
- "Execute one task with each page loaded" : "Utfør en oppgave med hver side som blir lastet",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registrert i en webcron-tjeneste for å kalle cron.php hvert 15. minutt over http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert 15. minutt.",
+ "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Vennligst dobbeltsjekk <a target=\"_blank\" href=\"%s\">Installasjonsveiledningene ↗</a> og se etter feil og advarsler i <a href=\"#log-section\">loggen</a>.",
"Allow apps to use the Share API" : "Tillat apper å bruke API for Deling",
"Allow users to share via link" : "Tillat brukere å dele via lenke",
"Enforce password protection" : "Krev passordbeskyttelse",
@@ -126,6 +134,14 @@
"Allow users to send mail notification for shared files to other users" : "Tillat at brukere sender varsler om delte filer på e-post til andre brukere",
"Exclude groups from sharing" : "Utelukk grupper fra deling",
"These groups will still be able to receive shares, but not to initiate them." : "Disse gruppene vil fremdeles kunne motta delinger men ikke lage dem.",
+ "Last cron job execution: %s." : "Siste kjøring av cron-jobb: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Siste kjøring av cron-jobb: %s. Noe ser ut til å være galt.",
+ "Cron was not executed yet!" : "Cron er ikke utført ennå!",
+ "Execute one task with each page loaded" : "Utfør en oppgave med hver side som blir lastet",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registrert i en webcron-tjeneste for å kalle cron.php hvert 15. minutt over http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert 15. minutt.",
+ "Server Side Encryption" : "Serverkryptering",
+ "Enable Server-Side-Encryption" : "Slå på serverkryptering",
"This is used for sending out notifications." : "Dette brukes for utsending av varsler.",
"Send mode" : "Sendemåte",
"From address" : "Fra adresse",
@@ -145,8 +161,15 @@
"More" : "Mer",
"Less" : "Mindre",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Loggfilen er over 100 MB, nedlastingen kan ta en stund!",
- "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite er brukt som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
+ "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite brukes som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.",
+ "How to do backups" : "Hvordan ta sikkerhetskopier",
+ "Advanced monitoring" : "Avansert overvåking",
+ "Performance tuning" : "Tilpassing av ytelse",
+ "Improving the config.php" : "Forbedring av config.php",
+ "Theming" : "Temaer",
+ "Hardening and security guidance" : "Herding og sikkerhetsveiledning",
"Version" : "Versjon",
"More apps" : "Flere apper",
"Developer documentation" : "Utviklerdokumentasjon",
@@ -155,10 +178,13 @@
"Documentation:" : "Dokumentasjon:",
"User Documentation" : "Brukerdokumentasjon",
"Admin Documentation" : "Admin-dokumentasjon",
+ "Show description …" : "Vis beskrivelse …",
+ "Hide description …" : "Skjul beskrivelse …",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Denne appen kan ikke installeres fordi følgende avhengigheter ikke er tilfredsstilt:",
"Update to %s" : "Oppdater til %s",
"Enable only for specific groups" : "Aktiver kun for visse grupper",
"Uninstall App" : "Avinstaller app",
+ "No apps found for your version" : "Ingen apper funnet for din versjon",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Hei,<br><br>vil bare informere om at du nå har en %s-konto.<br><br>Brukernavnet ditt: %s<br>Gå dit: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Ha det!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nVil bare informere om at du nå har en %s-konto.\n\nBrukernavnet ditt: %s\nGå dit: %s\n\n",
@@ -171,6 +197,7 @@
"Desktop client" : "Skrivebordsklient",
"Android app" : "Android-app",
"iOS app" : "iOS-app",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Hvis du vil støtte prosjektet kan du\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">delta i utviklingen</a>\n\t\teller\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spre budskapet</a>!",
"Show First Run Wizard again" : "Vis \"Førstegangs veiviser\" på nytt",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Du har brukt <strong>%s</strong> av de tilgjengelige <strong>%s</strong>",
"Password" : "Passord",
@@ -178,6 +205,7 @@
"Current password" : "Nåværende passord",
"New password" : "Nytt passord",
"Change password" : "Endre passord",
+ "Full name" : "Fullt navn",
"No display name set" : "Visningsnavn ikke satt",
"Email" : "Epost",
"Your email address" : "Din e-postadresse",
@@ -198,12 +226,14 @@
"Valid until" : "Gyldig til",
"Issued By" : "Utstedt av",
"Valid until %s" : "Gyldig til %s",
+ "Import root certificate" : "Importer rotsertifikat",
"The encryption app is no longer enabled, please decrypt all your files" : "Krypterings-appen er ikke aktiv lenger. Vennligst dekrypter alle filene dine",
"Log-in password" : "Innloggingspassord",
"Decrypt all Files" : "Dekrypter alle filer",
"Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." : "Krypteringsnøklene dine er flyttet til en plass for sikkerhetskopier. Hvis noe gikk galt kan du gjenopprette nøklene. Ikke slett dem permanent før du er ikker på at alle filer er dekryptert korrekt.",
"Restore Encryption Keys" : "Gjenopprett krypteringsnøkler",
"Delete Encryption Keys" : "Slett krypteringsnøkler",
+ "Developed by the {communityopen}ownCloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}." : "Utviklet av {communityopen}ownCloud-fellesskapet{linkclose}. {githubopen}Kildekoden{linkclose} er lisensiert under {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.",
"Show storage location" : "Vis lagringssted",
"Show last log in" : "Vis site innlogging",
"Show user backend" : "Vis bruker-server",
@@ -214,7 +244,7 @@
"Create" : "Opprett",
"Admin Recovery Password" : "Administrativt gjenopprettingspassord",
"Enter the recovery password in order to recover the users files during password change" : "Legg inn gjenopprettingspassordet for å gjenopprette brukerfilene når passordet endres",
- "Search Users" : "Søk brukere",
+ "Search Users" : "Søk i brukere",
"Add Group" : "Legg til gruppe",
"Group" : "Gruppe",
"Everyone" : "Alle",
diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js
index c580f17f371..526158c0eb9 100644
--- a/settings/l10n/nl.js
+++ b/settings/l10n/nl.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Beveiligings- en instellingswaarschuwingen",
- "Cron" : "Cron",
"Sharing" : "Delen",
- "Server Side Encryption" : "Server-side versleuteling",
+ "External Storage" : "Externe opslag",
+ "Cron" : "Cron",
"Email Server" : "E-mailserver",
"Log" : "Log",
"Tips & tricks" : "Tips & trucs",
+ "Updates" : "Updates",
"Authentication error" : "Authenticatie fout",
"Your full name has been changed." : "Uw volledige naam is gewijzigd.",
"Unable to change full name" : "Kan de volledige naam niet wijzigen",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lees de <a href='%s'>installatie handleiding</a> goed door en controleer op fouten en waarschuwingen in de <a href=\"#log-section\">logging</a>.",
- "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.",
- "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!",
- "Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.",
"Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken",
"Allow users to share via link" : "Sta gebruikers toe om te delen via een link",
"Enforce password protection" : "Dwing wachtwoordbeveiliging af",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Sta gebruikers toe om e-mailnotificaties aan andere gebruikers te versturen voor gedeelde bestanden",
"Exclude groups from sharing" : "Sluit groepen uit van delen",
"These groups will still be able to receive shares, but not to initiate them." : "Deze groepen kunnen gedeelde mappen bestanden ontvangen, maar kunnen ze niet starten.",
+ "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.",
+ "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!",
+ "Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.",
+ "Server Side Encryption" : "Server-side versleuteling",
"Enable Server-Side-Encryption" : "Inschakelen server-side versleuteling",
"This is used for sending out notifications." : "Dit wordt gebruikt voor het verzenden van meldingen.",
"Send mode" : "Verstuurmodus",
diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json
index 0e2745ff294..f00fa79c9ea 100644
--- a/settings/l10n/nl.json
+++ b/settings/l10n/nl.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Beveiligings- en instellingswaarschuwingen",
- "Cron" : "Cron",
"Sharing" : "Delen",
- "Server Side Encryption" : "Server-side versleuteling",
+ "External Storage" : "Externe opslag",
+ "Cron" : "Cron",
"Email Server" : "E-mailserver",
"Log" : "Log",
"Tips & tricks" : "Tips & trucs",
+ "Updates" : "Updates",
"Authentication error" : "Authenticatie fout",
"Your full name has been changed." : "Uw volledige naam is gewijzigd.",
"Unable to change full name" : "Kan de volledige naam niet wijzigen",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lees de <a href='%s'>installatie handleiding</a> goed door en controleer op fouten en waarschuwingen in de <a href=\"#log-section\">logging</a>.",
- "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.",
- "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!",
- "Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.",
"Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken",
"Allow users to share via link" : "Sta gebruikers toe om te delen via een link",
"Enforce password protection" : "Dwing wachtwoordbeveiliging af",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Sta gebruikers toe om e-mailnotificaties aan andere gebruikers te versturen voor gedeelde bestanden",
"Exclude groups from sharing" : "Sluit groepen uit van delen",
"These groups will still be able to receive shares, but not to initiate them." : "Deze groepen kunnen gedeelde mappen bestanden ontvangen, maar kunnen ze niet starten.",
+ "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.",
+ "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!",
+ "Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.",
+ "Server Side Encryption" : "Server-side versleuteling",
"Enable Server-Side-Encryption" : "Inschakelen server-side versleuteling",
"This is used for sending out notifications." : "Dit wordt gebruikt voor het verzenden van meldingen.",
"Send mode" : "Verstuurmodus",
diff --git a/settings/l10n/nn_NO.js b/settings/l10n/nn_NO.js
index 62603c42e95..9daf6c4c198 100644
--- a/settings/l10n/nn_NO.js
+++ b/settings/l10n/nn_NO.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Deling",
+ "Cron" : "Cron",
"Log" : "Logg",
"Authentication error" : "Autentiseringsfeil",
"Language changed" : "Språk endra",
@@ -43,10 +43,10 @@ OC.L10N.register(
"Encryption" : "Kryptering",
"Login" : "Logg inn",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen «fileinfo» manglar. Me rår sterkt til å slå på denne modulen for å best mogleg oppdaga MIME-typar.",
- "Execute one task with each page loaded" : "Utfør éi oppgåve for kvar sidelasting",
"Allow apps to use the Share API" : "La app-ar bruka API-et til deling",
"Allow public uploads" : "Tillat offentlege opplastingar",
"Allow resharing" : "Tillat vidaredeling",
+ "Execute one task with each page loaded" : "Utfør éi oppgåve for kvar sidelasting",
"Server address" : "Tenaradresse",
"Log level" : "Log nivå",
"More" : "Meir",
diff --git a/settings/l10n/nn_NO.json b/settings/l10n/nn_NO.json
index 074dc6cd153..300c18683f3 100644
--- a/settings/l10n/nn_NO.json
+++ b/settings/l10n/nn_NO.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Deling",
+ "Cron" : "Cron",
"Log" : "Logg",
"Authentication error" : "Autentiseringsfeil",
"Language changed" : "Språk endra",
@@ -41,10 +41,10 @@
"Encryption" : "Kryptering",
"Login" : "Logg inn",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP-modulen «fileinfo» manglar. Me rår sterkt til å slå på denne modulen for å best mogleg oppdaga MIME-typar.",
- "Execute one task with each page loaded" : "Utfør éi oppgåve for kvar sidelasting",
"Allow apps to use the Share API" : "La app-ar bruka API-et til deling",
"Allow public uploads" : "Tillat offentlege opplastingar",
"Allow resharing" : "Tillat vidaredeling",
+ "Execute one task with each page loaded" : "Utfør éi oppgåve for kvar sidelasting",
"Server address" : "Tenaradresse",
"Log level" : "Log nivå",
"More" : "Meir",
diff --git a/settings/l10n/oc.js b/settings/l10n/oc.js
index ce2064a8198..5cece17b545 100644
--- a/settings/l10n/oc.js
+++ b/settings/l10n/oc.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Al partejar",
+ "Cron" : "Cron",
"Log" : "Jornal",
"Authentication error" : "Error d'autentificacion",
"Language changed" : "Lengas cambiadas",
diff --git a/settings/l10n/oc.json b/settings/l10n/oc.json
index 929d8a0bcbe..d1b7f7ef834 100644
--- a/settings/l10n/oc.json
+++ b/settings/l10n/oc.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Al partejar",
+ "Cron" : "Cron",
"Log" : "Jornal",
"Authentication error" : "Error d'autentificacion",
"Language changed" : "Lengas cambiadas",
diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js
index e30a4adac9c..ed400795989 100644
--- a/settings/l10n/pl.js
+++ b/settings/l10n/pl.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Udostępnianie",
+ "External Storage" : "Zewnętrzna zasoby dyskowe",
+ "Cron" : "Cron",
"Email Server" : "Serwer pocztowy",
"Log" : "Logi",
+ "Updates" : "Aktualizacje",
"Authentication error" : "Błąd uwierzytelniania",
"Your full name has been changed." : "Twoja pełna nazwa została zmieniona.",
"Unable to change full name" : "Nie można zmienić pełnej nazwy",
@@ -108,10 +110,6 @@ OC.L10N.register(
"System locale can not be set to a one which supports UTF-8." : "Ustawienia regionalne systemu nie można ustawić na jeden, który obsługuje UTF-8.",
"This means that there might be problems with certain characters in file names." : "Oznacza to, że mogą być problemy z niektórymi znakami w nazwach plików.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Zalecamy instalację na Twoim systemie komponentów wymaganych do obsługi języków: %s",
- "Cron was not executed yet!" : "Cron nie został jeszcze uruchomiony!",
- "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.",
"Allow apps to use the Share API" : "Zezwalaj aplikacjom na korzystanie z API udostępniania",
"Allow users to share via link" : "Pozwól użytkownikom współdzielić przez link",
"Enforce password protection" : "Wymuś zabezpieczenie hasłem",
@@ -125,6 +123,10 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Ogranicz użytkowników do współdzielenia wyłącznie pomiędzy użytkownikami swoich grup",
"Exclude groups from sharing" : "Wyklucz grupy z udostępniania",
"These groups will still be able to receive shares, but not to initiate them." : "Grupy te nadal będą mogli otrzymywać udostępnione udziały, ale nie do ich inicjowania.",
+ "Cron was not executed yet!" : "Cron nie został jeszcze uruchomiony!",
+ "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.",
"This is used for sending out notifications." : "To jest używane do wysyłania powiadomień",
"Send mode" : "Tryb wysyłki",
"From address" : "Z adresu",
diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json
index 7cd28522526..1cecf623463 100644
--- a/settings/l10n/pl.json
+++ b/settings/l10n/pl.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Udostępnianie",
+ "External Storage" : "Zewnętrzna zasoby dyskowe",
+ "Cron" : "Cron",
"Email Server" : "Serwer pocztowy",
"Log" : "Logi",
+ "Updates" : "Aktualizacje",
"Authentication error" : "Błąd uwierzytelniania",
"Your full name has been changed." : "Twoja pełna nazwa została zmieniona.",
"Unable to change full name" : "Nie można zmienić pełnej nazwy",
@@ -106,10 +108,6 @@
"System locale can not be set to a one which supports UTF-8." : "Ustawienia regionalne systemu nie można ustawić na jeden, który obsługuje UTF-8.",
"This means that there might be problems with certain characters in file names." : "Oznacza to, że mogą być problemy z niektórymi znakami w nazwach plików.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Zalecamy instalację na Twoim systemie komponentów wymaganych do obsługi języków: %s",
- "Cron was not executed yet!" : "Cron nie został jeszcze uruchomiony!",
- "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.",
"Allow apps to use the Share API" : "Zezwalaj aplikacjom na korzystanie z API udostępniania",
"Allow users to share via link" : "Pozwól użytkownikom współdzielić przez link",
"Enforce password protection" : "Wymuś zabezpieczenie hasłem",
@@ -123,6 +121,10 @@
"Restrict users to only share with users in their groups" : "Ogranicz użytkowników do współdzielenia wyłącznie pomiędzy użytkownikami swoich grup",
"Exclude groups from sharing" : "Wyklucz grupy z udostępniania",
"These groups will still be able to receive shares, but not to initiate them." : "Grupy te nadal będą mogli otrzymywać udostępnione udziały, ale nie do ich inicjowania.",
+ "Cron was not executed yet!" : "Cron nie został jeszcze uruchomiony!",
+ "Execute one task with each page loaded" : "Wykonuj jedno zadanie wraz z każdą wczytaną stroną",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php jest zarejestrowany w serwisie webcron do uruchamiania cron.php raz na 15 minut przez http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Użyj systemowej usługi cron do wywoływania cron.php co 15 minut.",
"This is used for sending out notifications." : "To jest używane do wysyłania powiadomień",
"Send mode" : "Tryb wysyłki",
"From address" : "Z adresu",
diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js
index c2e7f13e8df..83ae60a11b0 100644
--- a/settings/l10n/pt_BR.js
+++ b/settings/l10n/pt_BR.js
@@ -1,10 +1,14 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
+ "Security & setup warnings" : "Segurança & avisos de configuração",
"Sharing" : "Compartilhamento",
+ "External Storage" : "Armazenamento Externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de Email",
"Log" : "Registro",
+ "Tips & tricks" : "Dicas & Truques",
+ "Updates" : "Atualizações",
"Authentication error" : "Erro de autenticação",
"Your full name has been changed." : "Seu nome completo foi alterado.",
"Unable to change full name" : "Não é possível alterar o nome completo",
@@ -41,6 +45,7 @@ OC.L10N.register(
"Email sent" : "E-mail enviado",
"You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.",
"Invalid mail address" : "Endereço de e-mail inválido",
+ "A user with that name already exists." : "Um usuário com esse nome já existe.",
"Unable to create user." : "Não é possível criar usuário.",
"Your %s account was created" : "Sua conta %s foi criada",
"Unable to delete user." : "Não é possível excluir usuário.",
@@ -90,6 +95,8 @@ OC.L10N.register(
"A valid password must be provided" : "Forneça uma senha válida",
"A valid email must be provided" : "Deve ser informado um e-mail válido",
"__language_name__" : "__language_name__",
+ "Sync clients" : "Clientes de Sincronização",
+ "Personal info" : "Informação pessoal",
"SSL root certificates" : "Certificados SSL raíz",
"Encryption" : "Criptografia",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)",
@@ -114,12 +121,7 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós sugerimos a instalação dos pacotes necessários em seu sistema para suportar um dos seguintes locais: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não estiver instalada na raiz do domínio e usa cron do sistema, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" em seu arquivo config.php para o caminho webroot de sua instalação (Sugestão: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:",
- "Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
- "Cron was not executed yet!" : "Cron não foi executado ainda!",
- "Execute one task with each page loaded" : "Execute uma tarefa com cada página carregada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado no serviço webcron para chamar cron.php a cada 15 minutos sobre http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php cada 15 minutos.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verificar se há erros ou avisos no <a href=\"#log-section\">log</a>.",
"Allow apps to use the Share API" : "Permitir que aplicativos usem a API de Compartilhamento",
"Allow users to share via link" : "Permitir que os usuários compartilhem por link",
"Enforce password protection" : "Reforce a proteção por senha",
@@ -134,6 +136,14 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Permitir aos usuários enviar notificação de email de arquivos compartilhados para outros usuários",
"Exclude groups from sharing" : "Excluir grupos de compartilhamento",
"These groups will still be able to receive shares, but not to initiate them." : "Esses grupos ainda serão capazes de receber compartilhamentos, mas não para iniciá-los.",
+ "Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
+ "Cron was not executed yet!" : "Cron não foi executado ainda!",
+ "Execute one task with each page loaded" : "Execute uma tarefa com cada página carregada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado no serviço webcron para chamar cron.php a cada 15 minutos sobre http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php cada 15 minutos.",
+ "Server Side Encryption" : "Criptografia do Lado do Servidor",
+ "Enable Server-Side-Encryption" : "Habilitar a Criptografia do Lado do Servidor",
"This is used for sending out notifications." : "Isto é usado para o envio de notificações.",
"Send mode" : "Modo enviar",
"From address" : "Do Endereço",
@@ -155,6 +165,13 @@ OC.L10N.register(
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "O arquivo de log é maior que 100 MB. Baixar esse arquivo requer algum tempo!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é usada como base de dados. Para instalações maiores recomendamos mudar para um backend de banco de dados diferente.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'db occ: converter-type', verifique a <a target=\"_blank\" href=\"%s\">documentação ↗</a>.",
+ "How to do backups" : "Como fazer backups",
+ "Advanced monitoring" : "Monitoramento avançado",
+ "Performance tuning" : "Aprimorando performance",
+ "Improving the config.php" : "Melhorando o config.php",
+ "Theming" : "Elaborar um tema",
+ "Hardening and security guidance" : "Orientações de proteção e segurança",
"Version" : "Versão",
"More apps" : "Mais aplicativos",
"Developer documentation" : "Documentação do desenvolvedor",
@@ -163,10 +180,13 @@ OC.L10N.register(
"Documentation:" : "Documentação:",
"User Documentation" : "Documentação de Usuário",
"Admin Documentation" : "Documentação de Administrador",
+ "Show description …" : "Mostrar descrição ...",
+ "Hide description …" : "Esconder descrição ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Este aplicativo não pode ser instalado porque as seguintes dependências não forão cumpridas:",
"Update to %s" : "Atualizado para %s",
"Enable only for specific groups" : "Ativar apenas para grupos específicos",
"Uninstall App" : "Desinstalar Aplicativo",
+ "No apps found for your version" : "Nenhum aplicativo encontrados para a sua versão",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Olá,<br><br>somente para lembrar que agora você tem uma conta %s.<br><br>Seu nome de usuário é: %s<br>Acesse em: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Saúde!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\nsomente para lembrar que agora você tem uma conta %s.\n\nSeu nome de usuário é: %s\nAcesse em: %s\n\n",
@@ -187,6 +207,7 @@ OC.L10N.register(
"Current password" : "Senha atual",
"New password" : "Nova senha",
"Change password" : "Alterar senha",
+ "Full name" : "Nome completo",
"No display name set" : "Nenhuma exibição de nome de configuração",
"Email" : "E-mail",
"Your email address" : "Seu endereço de e-mail",
@@ -207,6 +228,7 @@ OC.L10N.register(
"Valid until" : "Válido até",
"Issued By" : "Emitido Por",
"Valid until %s" : "Válido até %s",
+ "Import root certificate" : "Importar certificado raiz",
"The encryption app is no longer enabled, please decrypt all your files" : "O aplicativo de criptografia não está habilitado, por favor descriptar todos os seus arquivos",
"Log-in password" : "Senha de login",
"Decrypt all Files" : "Descriptografar todos os Arquivos",
diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json
index 6db08998fe6..1ed0fd995a7 100644
--- a/settings/l10n/pt_BR.json
+++ b/settings/l10n/pt_BR.json
@@ -1,8 +1,12 @@
{ "translations": {
- "Cron" : "Cron",
+ "Security & setup warnings" : "Segurança & avisos de configuração",
"Sharing" : "Compartilhamento",
+ "External Storage" : "Armazenamento Externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de Email",
"Log" : "Registro",
+ "Tips & tricks" : "Dicas & Truques",
+ "Updates" : "Atualizações",
"Authentication error" : "Erro de autenticação",
"Your full name has been changed." : "Seu nome completo foi alterado.",
"Unable to change full name" : "Não é possível alterar o nome completo",
@@ -39,6 +43,7 @@
"Email sent" : "E-mail enviado",
"You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.",
"Invalid mail address" : "Endereço de e-mail inválido",
+ "A user with that name already exists." : "Um usuário com esse nome já existe.",
"Unable to create user." : "Não é possível criar usuário.",
"Your %s account was created" : "Sua conta %s foi criada",
"Unable to delete user." : "Não é possível excluir usuário.",
@@ -88,6 +93,8 @@
"A valid password must be provided" : "Forneça uma senha válida",
"A valid email must be provided" : "Deve ser informado um e-mail válido",
"__language_name__" : "__language_name__",
+ "Sync clients" : "Clientes de Sincronização",
+ "Personal info" : "Informação pessoal",
"SSL root certificates" : "Certificados SSL raíz",
"Encryption" : "Criptografia",
"Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)",
@@ -112,12 +119,7 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós sugerimos a instalação dos pacotes necessários em seu sistema para suportar um dos seguintes locais: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não estiver instalada na raiz do domínio e usa cron do sistema, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" em seu arquivo config.php para o caminho webroot de sua instalação (Sugestão: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:",
- "Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
- "Cron was not executed yet!" : "Cron não foi executado ainda!",
- "Execute one task with each page loaded" : "Execute uma tarefa com cada página carregada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado no serviço webcron para chamar cron.php a cada 15 minutos sobre http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php cada 15 minutos.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verificar se há erros ou avisos no <a href=\"#log-section\">log</a>.",
"Allow apps to use the Share API" : "Permitir que aplicativos usem a API de Compartilhamento",
"Allow users to share via link" : "Permitir que os usuários compartilhem por link",
"Enforce password protection" : "Reforce a proteção por senha",
@@ -132,6 +134,14 @@
"Allow users to send mail notification for shared files to other users" : "Permitir aos usuários enviar notificação de email de arquivos compartilhados para outros usuários",
"Exclude groups from sharing" : "Excluir grupos de compartilhamento",
"These groups will still be able to receive shares, but not to initiate them." : "Esses grupos ainda serão capazes de receber compartilhamentos, mas não para iniciá-los.",
+ "Last cron job execution: %s." : "Última execução do trabalho cron: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho cron: %s. Algo parece errado.",
+ "Cron was not executed yet!" : "Cron não foi executado ainda!",
+ "Execute one task with each page loaded" : "Execute uma tarefa com cada página carregada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado no serviço webcron para chamar cron.php a cada 15 minutos sobre http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php cada 15 minutos.",
+ "Server Side Encryption" : "Criptografia do Lado do Servidor",
+ "Enable Server-Side-Encryption" : "Habilitar a Criptografia do Lado do Servidor",
"This is used for sending out notifications." : "Isto é usado para o envio de notificações.",
"Send mode" : "Modo enviar",
"From address" : "Do Endereço",
@@ -153,6 +163,13 @@
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "O arquivo de log é maior que 100 MB. Baixar esse arquivo requer algum tempo!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é usada como base de dados. Para instalações maiores recomendamos mudar para um backend de banco de dados diferente.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'db occ: converter-type', verifique a <a target=\"_blank\" href=\"%s\">documentação ↗</a>.",
+ "How to do backups" : "Como fazer backups",
+ "Advanced monitoring" : "Monitoramento avançado",
+ "Performance tuning" : "Aprimorando performance",
+ "Improving the config.php" : "Melhorando o config.php",
+ "Theming" : "Elaborar um tema",
+ "Hardening and security guidance" : "Orientações de proteção e segurança",
"Version" : "Versão",
"More apps" : "Mais aplicativos",
"Developer documentation" : "Documentação do desenvolvedor",
@@ -161,10 +178,13 @@
"Documentation:" : "Documentação:",
"User Documentation" : "Documentação de Usuário",
"Admin Documentation" : "Documentação de Administrador",
+ "Show description …" : "Mostrar descrição ...",
+ "Hide description …" : "Esconder descrição ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Este aplicativo não pode ser instalado porque as seguintes dependências não forão cumpridas:",
"Update to %s" : "Atualizado para %s",
"Enable only for specific groups" : "Ativar apenas para grupos específicos",
"Uninstall App" : "Desinstalar Aplicativo",
+ "No apps found for your version" : "Nenhum aplicativo encontrados para a sua versão",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Olá,<br><br>somente para lembrar que agora você tem uma conta %s.<br><br>Seu nome de usuário é: %s<br>Acesse em: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Saúde!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\nsomente para lembrar que agora você tem uma conta %s.\n\nSeu nome de usuário é: %s\nAcesse em: %s\n\n",
@@ -185,6 +205,7 @@
"Current password" : "Senha atual",
"New password" : "Nova senha",
"Change password" : "Alterar senha",
+ "Full name" : "Nome completo",
"No display name set" : "Nenhuma exibição de nome de configuração",
"Email" : "E-mail",
"Your email address" : "Seu endereço de e-mail",
@@ -205,6 +226,7 @@
"Valid until" : "Válido até",
"Issued By" : "Emitido Por",
"Valid until %s" : "Válido até %s",
+ "Import root certificate" : "Importar certificado raiz",
"The encryption app is no longer enabled, please decrypt all your files" : "O aplicativo de criptografia não está habilitado, por favor descriptar todos os seus arquivos",
"Log-in password" : "Senha de login",
"Decrypt all Files" : "Descriptografar todos os Arquivos",
diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js
index d65c70a279e..f5fe176439f 100644
--- a/settings/l10n/pt_PT.js
+++ b/settings/l10n/pt_PT.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Avisos de configuração e segurança",
- "Cron" : "Cron",
"Sharing" : "Partilha",
- "Server Side Encryption" : "Encriptação do lado do Servidor",
+ "External Storage" : "Armazenamento Externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de e-mail",
"Log" : "Registo",
"Tips & tricks" : "Dicas e truqes",
+ "Updates" : "Atualizações",
"Authentication error" : "Erro na autenticação",
"Your full name has been changed." : "O seu nome completo foi alterado.",
"Unable to change full name" : "Não foi possível alterar o seu nome completo",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não está instalada na raiz do domínio e usa o sistema cron, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" no ficheiro config.php para o caminho webroot da sua instalação (Sugestão: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cronjob via CLI. Os seguintes erros técnicos apareceram:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verifique se existe algum erro ou aviso no <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Última execução de cron job: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execução de cron job: %s. Algo está errado.",
- "Cron was not executed yet!" : "Cron ainda não foi executado!",
- "Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registado num serviço webcron para chamar a página cron.php por http a cada 15 minutos.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço sistema cron para ligar o ficheiro cron.php a cada 15 minutos.",
"Allow apps to use the Share API" : "Permitir que os utilizadores usem a API de partilha",
"Allow users to share via link" : "Permitir que os utilizadores partilhem através do link",
"Enforce password protection" : "Forçar proteção por palavra-passe",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Autorizar utilizadores a enviarem notificações de email acerca de ficheiros partilhados a outros utilizadores",
"Exclude groups from sharing" : "Excluir grupos das partilhas",
"These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderão receber partilhas, mas não poderão iniciá-las.",
+ "Last cron job execution: %s." : "Última execução de cron job: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execução de cron job: %s. Algo está errado.",
+ "Cron was not executed yet!" : "Cron ainda não foi executado!",
+ "Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registado num serviço webcron para chamar a página cron.php por http a cada 15 minutos.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço sistema cron para ligar o ficheiro cron.php a cada 15 minutos.",
+ "Server Side Encryption" : "Encriptação do lado do Servidor",
"Enable Server-Side-Encryption" : "Ativar encriptação do lado do servidor",
"This is used for sending out notifications." : "Isto é utilizado para enviar notificações",
"Send mode" : "Modo de Envio",
diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json
index 7a3b285b6c2..57bb52e1c02 100644
--- a/settings/l10n/pt_PT.json
+++ b/settings/l10n/pt_PT.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Avisos de configuração e segurança",
- "Cron" : "Cron",
"Sharing" : "Partilha",
- "Server Side Encryption" : "Encriptação do lado do Servidor",
+ "External Storage" : "Armazenamento Externo",
+ "Cron" : "Cron",
"Email Server" : "Servidor de e-mail",
"Log" : "Registo",
"Tips & tricks" : "Dicas e truqes",
+ "Updates" : "Atualizações",
"Authentication error" : "Erro na autenticação",
"Your full name has been changed." : "O seu nome completo foi alterado.",
"Unable to change full name" : "Não foi possível alterar o seu nome completo",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não está instalada na raiz do domínio e usa o sistema cron, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" no ficheiro config.php para o caminho webroot da sua instalação (Sugestão: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cronjob via CLI. Os seguintes erros técnicos apareceram:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verifique se existe algum erro ou aviso no <a href=\"#log-section\">log</a>.",
- "Last cron job execution: %s." : "Última execução de cron job: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Última execução de cron job: %s. Algo está errado.",
- "Cron was not executed yet!" : "Cron ainda não foi executado!",
- "Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registado num serviço webcron para chamar a página cron.php por http a cada 15 minutos.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço sistema cron para ligar o ficheiro cron.php a cada 15 minutos.",
"Allow apps to use the Share API" : "Permitir que os utilizadores usem a API de partilha",
"Allow users to share via link" : "Permitir que os utilizadores partilhem através do link",
"Enforce password protection" : "Forçar proteção por palavra-passe",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Autorizar utilizadores a enviarem notificações de email acerca de ficheiros partilhados a outros utilizadores",
"Exclude groups from sharing" : "Excluir grupos das partilhas",
"These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderão receber partilhas, mas não poderão iniciá-las.",
+ "Last cron job execution: %s." : "Última execução de cron job: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Última execução de cron job: %s. Algo está errado.",
+ "Cron was not executed yet!" : "Cron ainda não foi executado!",
+ "Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registado num serviço webcron para chamar a página cron.php por http a cada 15 minutos.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço sistema cron para ligar o ficheiro cron.php a cada 15 minutos.",
+ "Server Side Encryption" : "Encriptação do lado do Servidor",
"Enable Server-Side-Encryption" : "Ativar encriptação do lado do servidor",
"This is used for sending out notifications." : "Isto é utilizado para enviar notificações",
"Send mode" : "Modo de Envio",
diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js
index 711716aebc0..7204b70ef5b 100644
--- a/settings/l10n/ro.js
+++ b/settings/l10n/ro.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Partajare",
+ "External Storage" : "Stocare externă",
+ "Cron" : "Cron",
"Log" : "Jurnal de activitate",
"Authentication error" : "Eroare la autentificare",
"Your full name has been changed." : "Numele tău complet a fost schimbat.",
@@ -64,11 +65,11 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Modulul PHP \"Fileinfo\" lipsește. Va recomandam sa activaţi acest modul pentru a obține cele mai bune rezultate cu detectarea mime-type.",
- "Execute one task with each page loaded" : "Execută o sarcină la fiecare pagină încărcată",
"Allow apps to use the Share API" : "Permite aplicațiilor să folosească API-ul de partajare",
"Allow public uploads" : "Permite încărcări publice",
"Allow users to send mail notification for shared files" : "Permite utilizatorilor sa expedieze notificări prin e-mail pentru dosarele comune",
"Allow resharing" : "Permite repartajarea",
+ "Execute one task with each page loaded" : "Execută o sarcină la fiecare pagină încărcată",
"Send mode" : "Modul de expediere",
"Authentication method" : "Modul de autentificare",
"Authentication required" : "Autentificare necesară",
diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json
index 9d4f3b1483a..118f67f929c 100644
--- a/settings/l10n/ro.json
+++ b/settings/l10n/ro.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Partajare",
+ "External Storage" : "Stocare externă",
+ "Cron" : "Cron",
"Log" : "Jurnal de activitate",
"Authentication error" : "Eroare la autentificare",
"Your full name has been changed." : "Numele tău complet a fost schimbat.",
@@ -62,11 +63,11 @@
"SSL" : "SSL",
"TLS" : "TLS",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Modulul PHP \"Fileinfo\" lipsește. Va recomandam sa activaţi acest modul pentru a obține cele mai bune rezultate cu detectarea mime-type.",
- "Execute one task with each page loaded" : "Execută o sarcină la fiecare pagină încărcată",
"Allow apps to use the Share API" : "Permite aplicațiilor să folosească API-ul de partajare",
"Allow public uploads" : "Permite încărcări publice",
"Allow users to send mail notification for shared files" : "Permite utilizatorilor sa expedieze notificări prin e-mail pentru dosarele comune",
"Allow resharing" : "Permite repartajarea",
+ "Execute one task with each page loaded" : "Execută o sarcină la fiecare pagină încărcată",
"Send mode" : "Modul de expediere",
"Authentication method" : "Modul de autentificare",
"Authentication required" : "Autentificare necesară",
diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js
index b15161acbc8..4e7144879c9 100644
--- a/settings/l10n/ru.js
+++ b/settings/l10n/ru.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Предупреждения безопасности и установки",
- "Cron" : "Cron (планировщик задач)",
"Sharing" : "Общий доступ",
- "Server Side Encryption" : "Шифрование на стороне сервера",
+ "External Storage" : "Внешнее хранилище",
+ "Cron" : "Cron (планировщик задач)",
"Email Server" : "Почтовый сервер",
"Log" : "Журнал",
"Tips & tricks" : "Советы и трюки",
+ "Updates" : "Обновления",
"Authentication error" : "Ошибка аутентификации",
"Your full name has been changed." : "Ваше полное имя было изменено.",
"Unable to change full name" : "Невозможно изменить полное имя",
@@ -121,12 +122,6 @@ OC.L10N.register(
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Пожалуйста, перепроверьте <a href=\"%s\">инструкцию по установке</a> и проверьте ошибки или предупреждения в <a href=\"#log-section\">журнале</a>",
- "Last cron job execution: %s." : "Последнее выполненное Cron задание: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное Cron задание: %s. Что-то кажется неправильным.",
- "Cron was not executed yet!" : "Задачи cron ещё не запускались!",
- "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.",
"Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа",
"Allow users to share via link" : "Разрешить пользователям публикации через ссылки",
"Enforce password protection" : "Защита паролем обязательна",
@@ -141,6 +136,13 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Разрешить пользователям отправлять оповещение других пользователей об открытии доступа к файлам",
"Exclude groups from sharing" : "Исключить группы из общего доступа",
"These groups will still be able to receive shares, but not to initiate them." : "Эти группы смогут получать общие ресурсы, но не могут их создавать.",
+ "Last cron job execution: %s." : "Последнее выполненное Cron задание: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное Cron задание: %s. Что-то кажется неправильным.",
+ "Cron was not executed yet!" : "Задачи cron ещё не запускались!",
+ "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.",
+ "Server Side Encryption" : "Шифрование на стороне сервера",
"Enable Server-Side-Encryption" : "Включить шифрование на стороне сервера",
"This is used for sending out notifications." : "Используется для отправки уведомлений.",
"Send mode" : "Способ отправки",
diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json
index 44e49f7cbb6..7ea41182920 100644
--- a/settings/l10n/ru.json
+++ b/settings/l10n/ru.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Предупреждения безопасности и установки",
- "Cron" : "Cron (планировщик задач)",
"Sharing" : "Общий доступ",
- "Server Side Encryption" : "Шифрование на стороне сервера",
+ "External Storage" : "Внешнее хранилище",
+ "Cron" : "Cron (планировщик задач)",
"Email Server" : "Почтовый сервер",
"Log" : "Журнал",
"Tips & tricks" : "Советы и трюки",
+ "Updates" : "Обновления",
"Authentication error" : "Ошибка аутентификации",
"Your full name has been changed." : "Ваше полное имя было изменено.",
"Unable to change full name" : "Невозможно изменить полное имя",
@@ -119,12 +120,6 @@
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:",
"Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Пожалуйста, перепроверьте <a href=\"%s\">инструкцию по установке</a> и проверьте ошибки или предупреждения в <a href=\"#log-section\">журнале</a>",
- "Last cron job execution: %s." : "Последнее выполненное Cron задание: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное Cron задание: %s. Что-то кажется неправильным.",
- "Cron was not executed yet!" : "Задачи cron ещё не запускались!",
- "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.",
"Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа",
"Allow users to share via link" : "Разрешить пользователям публикации через ссылки",
"Enforce password protection" : "Защита паролем обязательна",
@@ -139,6 +134,13 @@
"Allow users to send mail notification for shared files to other users" : "Разрешить пользователям отправлять оповещение других пользователей об открытии доступа к файлам",
"Exclude groups from sharing" : "Исключить группы из общего доступа",
"These groups will still be able to receive shares, but not to initiate them." : "Эти группы смогут получать общие ресурсы, но не могут их создавать.",
+ "Last cron job execution: %s." : "Последнее выполненное Cron задание: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное Cron задание: %s. Что-то кажется неправильным.",
+ "Cron was not executed yet!" : "Задачи cron ещё не запускались!",
+ "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.",
+ "Server Side Encryption" : "Шифрование на стороне сервера",
"Enable Server-Side-Encryption" : "Включить шифрование на стороне сервера",
"This is used for sending out notifications." : "Используется для отправки уведомлений.",
"Send mode" : "Способ отправки",
diff --git a/settings/l10n/si_LK.js b/settings/l10n/si_LK.js
index a0a10f99fbb..7b3613fcad4 100644
--- a/settings/l10n/si_LK.js
+++ b/settings/l10n/si_LK.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"settings",
{
"Sharing" : "හුවමාරු කිරීම",
+ "External Storage" : "භාහිර ගබඩාව",
"Log" : "ලඝුව",
"Authentication error" : "සත්‍යාපන දෝෂයක්",
"Language changed" : "භාෂාව ාවනස් කිරීම",
diff --git a/settings/l10n/si_LK.json b/settings/l10n/si_LK.json
index 17c19d4583f..3a6c9b836e8 100644
--- a/settings/l10n/si_LK.json
+++ b/settings/l10n/si_LK.json
@@ -1,5 +1,6 @@
{ "translations": {
"Sharing" : "හුවමාරු කිරීම",
+ "External Storage" : "භාහිර ගබඩාව",
"Log" : "ලඝුව",
"Authentication error" : "සත්‍යාපන දෝෂයක්",
"Language changed" : "භාෂාව ාවනස් කිරීම",
diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js
index e80d07a286a..308e1d8fe3a 100644
--- a/settings/l10n/sk_SK.js
+++ b/settings/l10n/sk_SK.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Zdieľanie",
+ "External Storage" : "Externé úložisko",
+ "Cron" : "Cron",
"Email Server" : "Email server",
"Log" : "Záznam",
+ "Updates" : "Aktualizácie",
"Authentication error" : "Chyba autentifikácie",
"Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.",
"Unable to change full name" : "Nemožno zmeniť meno a priezvisko",
@@ -112,10 +114,6 @@ OC.L10N.register(
"This means that there might be problems with certain characters in file names." : "To znamená, že sa môžu vyskytnúť problémy s niektorými znakmi v názvoch súborov.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Dôrazne doporučujeme nainštalovať na váš systém požadované balíčky podporujúce jednu z nasledovných znakových sád: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Inštalácia mimo koreňový priečinok domény a používanie systémového príkazu cron môže spôsobiť problém s generovaním správnej URL. Pre zabránenie týmto chybám nastavte prosím správnu cestu v svojom config.php súbore pre hodnotu \"overwrite.cli.url\" (Doporučujeme: \"%s\")",
- "Cron was not executed yet!" : "Cron sa ešte nespustil!",
- "Execute one task with each page loaded" : "Vykonať jednu úlohu s každým načítaní stránky",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je zaregistrovaná v službe WebCron a zavolá cron.php každých 15 minút cez http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Použiť systémovú službu cron na spúšťanie súboru cron.php každých 15 minút.",
"Allow apps to use the Share API" : "Povoliť aplikáciám používať API na zdieľanie",
"Allow users to share via link" : "Povoliť používateľom zdieľanie pomocou odkazov",
"Enforce password protection" : "Vynútiť ochranu heslom",
@@ -130,6 +128,10 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Povoliť používateľom zasielať emailom oznámenie o zdieľaní súborov ostatným používateľom",
"Exclude groups from sharing" : "Vybrať skupiny zo zdieľania",
"These groups will still be able to receive shares, but not to initiate them." : "Tieto skupiny budú môcť stále zdieľať, ale sami nemôžu zdieľať ostatným.",
+ "Cron was not executed yet!" : "Cron sa ešte nespustil!",
+ "Execute one task with each page loaded" : "Vykonať jednu úlohu s každým načítaní stránky",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je zaregistrovaná v službe WebCron a zavolá cron.php každých 15 minút cez http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Použiť systémovú službu cron na spúšťanie súboru cron.php každých 15 minút.",
"This is used for sending out notifications." : "Používa sa na odosielanie upozornení.",
"Send mode" : "Mód odosielania",
"From address" : "Z adresy",
diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json
index dcaadcc354d..2b92631707a 100644
--- a/settings/l10n/sk_SK.json
+++ b/settings/l10n/sk_SK.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Zdieľanie",
+ "External Storage" : "Externé úložisko",
+ "Cron" : "Cron",
"Email Server" : "Email server",
"Log" : "Záznam",
+ "Updates" : "Aktualizácie",
"Authentication error" : "Chyba autentifikácie",
"Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.",
"Unable to change full name" : "Nemožno zmeniť meno a priezvisko",
@@ -110,10 +112,6 @@
"This means that there might be problems with certain characters in file names." : "To znamená, že sa môžu vyskytnúť problémy s niektorými znakmi v názvoch súborov.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Dôrazne doporučujeme nainštalovať na váš systém požadované balíčky podporujúce jednu z nasledovných znakových sád: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Inštalácia mimo koreňový priečinok domény a používanie systémového príkazu cron môže spôsobiť problém s generovaním správnej URL. Pre zabránenie týmto chybám nastavte prosím správnu cestu v svojom config.php súbore pre hodnotu \"overwrite.cli.url\" (Doporučujeme: \"%s\")",
- "Cron was not executed yet!" : "Cron sa ešte nespustil!",
- "Execute one task with each page loaded" : "Vykonať jednu úlohu s každým načítaní stránky",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je zaregistrovaná v službe WebCron a zavolá cron.php každých 15 minút cez http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Použiť systémovú službu cron na spúšťanie súboru cron.php každých 15 minút.",
"Allow apps to use the Share API" : "Povoliť aplikáciám používať API na zdieľanie",
"Allow users to share via link" : "Povoliť používateľom zdieľanie pomocou odkazov",
"Enforce password protection" : "Vynútiť ochranu heslom",
@@ -128,6 +126,10 @@
"Allow users to send mail notification for shared files to other users" : "Povoliť používateľom zasielať emailom oznámenie o zdieľaní súborov ostatným používateľom",
"Exclude groups from sharing" : "Vybrať skupiny zo zdieľania",
"These groups will still be able to receive shares, but not to initiate them." : "Tieto skupiny budú môcť stále zdieľať, ale sami nemôžu zdieľať ostatným.",
+ "Cron was not executed yet!" : "Cron sa ešte nespustil!",
+ "Execute one task with each page loaded" : "Vykonať jednu úlohu s každým načítaní stránky",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php je zaregistrovaná v službe WebCron a zavolá cron.php každých 15 minút cez http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Použiť systémovú službu cron na spúšťanie súboru cron.php každých 15 minút.",
"This is used for sending out notifications." : "Používa sa na odosielanie upozornení.",
"Send mode" : "Mód odosielania",
"From address" : "Z adresy",
diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js
index d75b2c80a52..ac99d1f0505 100644
--- a/settings/l10n/sl.js
+++ b/settings/l10n/sl.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Periodično opravilo",
"Sharing" : "Souporaba",
+ "External Storage" : "Zunanja podatkovna shramba",
+ "Cron" : "Periodično opravilo",
"Email Server" : "Poštni strežnik",
"Log" : "Dnevnik",
+ "Updates" : "Posodobitve",
"Authentication error" : "Napaka med overjanjem",
"Your full name has been changed." : "Vaše polno ime je spremenjeno.",
"Unable to change full name" : "Ni mogoče spremeniti polnega imena",
@@ -86,6 +88,8 @@ OC.L10N.register(
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
"A valid email must be provided" : "Naveden mora biti veljaven naslov elektronske pošte.",
"__language_name__" : "Slovenščina",
+ "Sync clients" : "Uskladi odjemalce",
+ "Personal info" : "Osebni podatki",
"SSL root certificates" : "Korenska potrdila SSL",
"Encryption" : "Šifriranje",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)",
@@ -102,10 +106,6 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Manjka modul PHP 'fileinfo'. Priporočljivo je omogočiti ta modul za popolno zaznavanje vrst MIME.",
"System locale can not be set to a one which supports UTF-8." : "Sistemskih jezikovnih nastavitev ni mogoče nastaviti na možnost, ki podpira nabor UTF-8.",
"This means that there might be problems with certain characters in file names." : "To pomeni, da se lahko pojavijo napake pri nekaterih znakih v imenih datotek.",
- "Cron was not executed yet!" : "Periodično opravilo cron še ni zagnano!",
- "Execute one task with each page loaded" : "Izvedi eno nalogo z vsako naloženo stranjo.",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Datoteka cron.php je vpisana za periodično opravilo webcron za potrditev sklica vsakih 15 minut pri povezavi preko HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Uporabi storitev periodičnih opravil za klic datoteke cron.php vsakih 15 minut.",
"Allow apps to use the Share API" : "Dovoli programom uporabo vmesnika API souporabe",
"Allow users to share via link" : "Uporabnikom dovoli omogočanje souporabe s povezavami",
"Enforce password protection" : "Vsili zaščito z geslom",
@@ -119,6 +119,11 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "Uporabnikom dovoli omogočanje souporabe le znotraj njihove skupine",
"Exclude groups from sharing" : "Izloči skupine iz souporabe",
"These groups will still be able to receive shares, but not to initiate them." : "Te skupine lahko sprejemajo mape v souporabo, ne morejo pa souporabe dovoliti",
+ "Cron was not executed yet!" : "Periodično opravilo cron še ni zagnano!",
+ "Execute one task with each page loaded" : "Izvedi eno nalogo z vsako naloženo stranjo.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Datoteka cron.php je vpisana za periodično opravilo webcron za potrditev sklica vsakih 15 minut pri povezavi preko HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Uporabi storitev periodičnih opravil za klic datoteke cron.php vsakih 15 minut.",
+ "Server Side Encryption" : "Strežniško šifriranje",
"This is used for sending out notifications." : "Možnost je uporabljena za omogočanje pošiljanja obvestil.",
"Send mode" : "Način pošiljanja",
"From address" : "Naslov pošiljatelja",
diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json
index fac22743135..a09faa741eb 100644
--- a/settings/l10n/sl.json
+++ b/settings/l10n/sl.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Periodično opravilo",
"Sharing" : "Souporaba",
+ "External Storage" : "Zunanja podatkovna shramba",
+ "Cron" : "Periodično opravilo",
"Email Server" : "Poštni strežnik",
"Log" : "Dnevnik",
+ "Updates" : "Posodobitve",
"Authentication error" : "Napaka med overjanjem",
"Your full name has been changed." : "Vaše polno ime je spremenjeno.",
"Unable to change full name" : "Ni mogoče spremeniti polnega imena",
@@ -84,6 +86,8 @@
"A valid password must be provided" : "Navedeno mora biti veljavno geslo",
"A valid email must be provided" : "Naveden mora biti veljaven naslov elektronske pošte.",
"__language_name__" : "Slovenščina",
+ "Sync clients" : "Uskladi odjemalce",
+ "Personal info" : "Osebni podatki",
"SSL root certificates" : "Korenska potrdila SSL",
"Encryption" : "Šifriranje",
"Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)",
@@ -100,10 +104,6 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Manjka modul PHP 'fileinfo'. Priporočljivo je omogočiti ta modul za popolno zaznavanje vrst MIME.",
"System locale can not be set to a one which supports UTF-8." : "Sistemskih jezikovnih nastavitev ni mogoče nastaviti na možnost, ki podpira nabor UTF-8.",
"This means that there might be problems with certain characters in file names." : "To pomeni, da se lahko pojavijo napake pri nekaterih znakih v imenih datotek.",
- "Cron was not executed yet!" : "Periodično opravilo cron še ni zagnano!",
- "Execute one task with each page loaded" : "Izvedi eno nalogo z vsako naloženo stranjo.",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Datoteka cron.php je vpisana za periodično opravilo webcron za potrditev sklica vsakih 15 minut pri povezavi preko HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Uporabi storitev periodičnih opravil za klic datoteke cron.php vsakih 15 minut.",
"Allow apps to use the Share API" : "Dovoli programom uporabo vmesnika API souporabe",
"Allow users to share via link" : "Uporabnikom dovoli omogočanje souporabe s povezavami",
"Enforce password protection" : "Vsili zaščito z geslom",
@@ -117,6 +117,11 @@
"Restrict users to only share with users in their groups" : "Uporabnikom dovoli omogočanje souporabe le znotraj njihove skupine",
"Exclude groups from sharing" : "Izloči skupine iz souporabe",
"These groups will still be able to receive shares, but not to initiate them." : "Te skupine lahko sprejemajo mape v souporabo, ne morejo pa souporabe dovoliti",
+ "Cron was not executed yet!" : "Periodično opravilo cron še ni zagnano!",
+ "Execute one task with each page loaded" : "Izvedi eno nalogo z vsako naloženo stranjo.",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Datoteka cron.php je vpisana za periodično opravilo webcron za potrditev sklica vsakih 15 minut pri povezavi preko HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Uporabi storitev periodičnih opravil za klic datoteke cron.php vsakih 15 minut.",
+ "Server Side Encryption" : "Strežniško šifriranje",
"This is used for sending out notifications." : "Možnost je uporabljena za omogočanje pošiljanja obvestil.",
"Send mode" : "Način pošiljanja",
"From address" : "Naslov pošiljatelja",
diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js
index e1899e7a1ec..5a55ae8aed7 100644
--- a/settings/l10n/sq.js
+++ b/settings/l10n/sq.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Ndarje",
+ "Cron" : "Cron",
"Email Server" : "Serveri Email",
"Log" : "Historik aktiviteti",
"Authentication error" : "Gabim autentifikimi",
@@ -63,12 +63,12 @@ OC.L10N.register(
"None" : "Asgjë",
"Login" : "Hyr",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me këmbngulje të aktivizoni këtë modul për të arritur rezultate më të mirame identifikimin e tipeve te ndryshme MIME.",
- "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara",
"Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin share API",
"Allow public uploads" : "Lejo ngarkimin publik",
"Expire after " : "Skadon pas",
"days" : "diitë",
"Allow resharing" : "Lejo ri-ndarjen",
+ "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara",
"Send mode" : "Mënyra e dërgimit",
"From address" : "Nga adresa",
"mail" : "postë",
diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json
index 83154440207..60c082997bc 100644
--- a/settings/l10n/sq.json
+++ b/settings/l10n/sq.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Ndarje",
+ "Cron" : "Cron",
"Email Server" : "Serveri Email",
"Log" : "Historik aktiviteti",
"Authentication error" : "Gabim autentifikimi",
@@ -61,12 +61,12 @@
"None" : "Asgjë",
"Login" : "Hyr",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Moduli PHP 'fileinfo' mungon. Ju këshillojmë me këmbngulje të aktivizoni këtë modul për të arritur rezultate më të mirame identifikimin e tipeve te ndryshme MIME.",
- "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara",
"Allow apps to use the Share API" : "Lejoni aplikacionet të përdorin share API",
"Allow public uploads" : "Lejo ngarkimin publik",
"Expire after " : "Skadon pas",
"days" : "diitë",
"Allow resharing" : "Lejo ri-ndarjen",
+ "Execute one task with each page loaded" : "Kryeni vetëm një veprim me secilën prej faqeve të ngarkuara",
"Send mode" : "Mënyra e dërgimit",
"From address" : "Nga adresa",
"mail" : "postë",
diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js
index 15f084f3888..d32e25a9bc1 100644
--- a/settings/l10n/sr.js
+++ b/settings/l10n/sr.js
@@ -2,12 +2,13 @@ OC.L10N.register(
"settings",
{
"Security & setup warnings" : "Безбедносна и упозорења поставе",
- "Cron" : "Крон",
"Sharing" : "Дељење",
- "Server Side Encryption" : "Шифровање од стране сервера",
+ "External Storage" : "Спољашње складиште",
+ "Cron" : "Крон",
"Email Server" : "Сервер е-поште",
"Log" : "Бележење",
"Tips & tricks" : "Савети и трикови",
+ "Updates" : "Ажурирања",
"Authentication error" : "Грешка при провери идентитета",
"Your full name has been changed." : "Ваше пуно име је промењено.",
"Unable to change full name" : "Не могу да променим пуно име",
@@ -40,11 +41,11 @@ OC.L10N.register(
"log-level out of allowed range" : "ниво бележења је ван дозвољеног опсега",
"Saved" : "Сачувано",
"test email settings" : "тестирајте поставке е-поште",
- "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Појавио се проблем приликом слања е-поште. Молимо вас да проверите ваше поставке. (Грешка: %s)",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Појавио се проблем приликом слања е-поште. Проверите ваше поставке. (Грешка: %s)",
"Email sent" : "Порука је послата",
"You need to set your user email before being able to send test emails." : "Морате поставити адресу е-поште пре слања тестне поруке.",
"Invalid mail address" : "Неисправна е-адреса",
- "A user with that name already exists." : "Корисник тог имена већ постоји.",
+ "A user with that name already exists." : "Корисник са тим именом већ постоји.",
"Unable to create user." : "Не могу да направим корисника.",
"Your %s account was created" : "Ваш %s налог је направљен",
"Unable to delete user." : "Не могу да обришем корисника.",
@@ -105,10 +106,10 @@ OC.L10N.register(
"Fatal issues only" : "Само фатални проблеми",
"None" : "Ништа",
"Login" : "Пријава",
- "Plain" : "Једноставан",
+ "Plain" : "Обичан",
"NT LAN Manager" : "НТ ЛАН менаџер",
- "SSL" : "SSL",
- "TLS" : "TLS",
+ "SSL" : "ССЛ",
+ "TLS" : "ТЛС",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Омогућена је Само-читај конфигурација. То спречава постављање неке конфигурације преко веб-интерфејса. Осим тога, фајлу мора бити ручно омогућено уписивање код сваког освежавања.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
@@ -120,12 +121,7 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Препоручујемо да инсталирате потребне пакете да бисте подржали следеће локалитете: %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталација није инсталирана у основи домена и користи системски крон, може бити проблема са генерисањем веб адреса. Да бисте избегли ове проблеме, молимо вас да подесите \"overwrite.cli.url\" опцију у вашем config.php фајлу у путању веб-основе ваше инсталације (Предложено: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Није било могуће да се изврши крон задатак путем интерфејса командне линије. Појавила су се следеће техничке грешке:",
- "Last cron job execution: %s." : "Последњи извршени крон задатак: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Последњи извршени крон задатак: %s. Нешто изгледа није у реду.",
- "Cron was not executed yet!" : "Крон задатак још увек није извршен!",
- "Execute one task with each page loaded" : "Изврши један задатак са сваком учитаном страницом",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php је регистрован код вебкрон сервиса за позивање cron.php сваких 15 минута преко протокола http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 15 минута.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Молимо вас да добро проверите <a target=\"_blank\" href=\"%s\">упутства за инсталацију ↗</a>, и да проверите ли постоје било какве грешке или упозорења у <a href=\"#log-section\">дневнику записа</a>.",
"Allow apps to use the Share API" : "Дозвољава апликацијама да користе АПИ дељења",
"Allow users to share via link" : "Дозволи корисницима да деле путем везе",
"Enforce password protection" : "Захтевај заштиту лозинком",
@@ -140,7 +136,14 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Дозволи корисницима да шаљу обавештења е-поштом за дељене фајлове",
"Exclude groups from sharing" : "Изузми групе из дељења",
"These groups will still be able to receive shares, but not to initiate them." : "Ове групе ће моћи да примају дељења али не и да их праве.",
- "Enable Server-Side-Encryption" : "Омогући шифровање од стране сервера",
+ "Last cron job execution: %s." : "Последњи извршени крон задатак: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последњи извршени крон задатак: %s. Нешто изгледа није у реду.",
+ "Cron was not executed yet!" : "Крон задатак још увек није извршен!",
+ "Execute one task with each page loaded" : "Изврши један задатак са сваком учитаном страницом",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php је регистрован код вебкрон сервиса за позивање cron.php сваких 15 минута преко протокола http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 15 минута.",
+ "Server Side Encryption" : "Шифровање на страни сервера",
+ "Enable Server-Side-Encryption" : "Укључи шифровање на страни сервера",
"This is used for sending out notifications." : "Ово се користи за слање обавештења.",
"Send mode" : "Режим слања",
"From address" : "Са адресе",
@@ -162,11 +165,13 @@ OC.L10N.register(
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Фајл записника је већи од 100МБ. Преузимање може потрајати!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite се користи као базе података. За веће инсталације препоручујемо да се пребаците на други модел базе података.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "За миграцију на другу базу користите командну линију: 'occ db:convert-type', или погледајте <a target=\"_blank\" href=\"%s\">документацију ↗</a>.",
"How to do backups" : "Како правити резерве",
"Advanced monitoring" : "Напредно праћење",
"Performance tuning" : "Побољшање перформанси",
"Improving the config.php" : "Побољшање фајла поставки",
"Theming" : "Теме",
+ "Hardening and security guidance" : "Ојачавање система и безбедносне препоруке",
"Version" : "Верзија",
"More apps" : "Још апликација",
"Developer documentation" : "Програмерска документација",
@@ -181,7 +186,7 @@ OC.L10N.register(
"Update to %s" : "Ажурирај на %s",
"Enable only for specific groups" : "Укључи само за одређене групе",
"Uninstall App" : "Деинсталирај апликацију",
- "No apps found for your version" : "Нема апликација за ваше издање",
+ "No apps found for your version" : "Нема апликација за вашу верзију",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Поздрав,<br><br>само вас обавештавам да сад имате %s налог.<br><br>Ваше корисничко име: %s<br>Приступите му на: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Здраво!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Добродошли,\n\nСамо да знате да сада имате %s налог.\n\nВаше корисничко име: %s\nПриступите: %s\n",
@@ -193,8 +198,8 @@ OC.L10N.register(
"Get the apps to sync your files" : "Преузмите апликације ради синхронизовања ваших фајлова",
"Desktop client" : "Клијент за рачунар",
"Android app" : "Андроид апликација",
- "iOS app" : "iOS апликација",
- "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ако желите да подржите пројект\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">придружите се развоју</a>\n\t\tили\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">проширите реч</a>!",
+ "iOS app" : "иОС апликација",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ако желите да подржите пројект\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">придружите се развоју</a>\n\t\tили\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">разгласите свима</a>!",
"Show First Run Wizard again" : "Поново прикажи чаробњака за прво покретање",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Искористили сте <strong>%s</strong> од дозвољених <strong>%s</strong>",
"Password" : "Лозинка",
@@ -202,7 +207,7 @@ OC.L10N.register(
"Current password" : "Тренутна лозинка",
"New password" : "Нова лозинка",
"Change password" : "Измени лозинку",
- "Full name" : "Име и презиме",
+ "Full name" : "Пуно име",
"No display name set" : "Није постављено име за приказ",
"Email" : "Е-пошта",
"Your email address" : "Ваша адреса е-поште",
@@ -245,13 +250,13 @@ OC.L10N.register(
"Add Group" : "Додај групу",
"Group" : "Група",
"Everyone" : "Сви",
- "Admins" : "Аднинистрација",
+ "Admins" : "Администратори",
"Default Quota" : "Подразумевана квота",
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Унесите квоту складиштења (нпр. 512 MB или 12 GB)",
"Unlimited" : "Неограничено",
"Other" : "Друго",
"Full Name" : "Пуно име",
- "Group Admin for" : "Групни администратор за",
+ "Group Admin for" : "Администратор група",
"Quota" : "Квота",
"Storage Location" : "Локација складишта",
"User Backend" : "Позадина за кориснике",
diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json
index 89f2080699a..14369ecf782 100644
--- a/settings/l10n/sr.json
+++ b/settings/l10n/sr.json
@@ -1,11 +1,12 @@
{ "translations": {
"Security & setup warnings" : "Безбедносна и упозорења поставе",
- "Cron" : "Крон",
"Sharing" : "Дељење",
- "Server Side Encryption" : "Шифровање од стране сервера",
+ "External Storage" : "Спољашње складиште",
+ "Cron" : "Крон",
"Email Server" : "Сервер е-поште",
"Log" : "Бележење",
"Tips & tricks" : "Савети и трикови",
+ "Updates" : "Ажурирања",
"Authentication error" : "Грешка при провери идентитета",
"Your full name has been changed." : "Ваше пуно име је промењено.",
"Unable to change full name" : "Не могу да променим пуно име",
@@ -38,11 +39,11 @@
"log-level out of allowed range" : "ниво бележења је ван дозвољеног опсега",
"Saved" : "Сачувано",
"test email settings" : "тестирајте поставке е-поште",
- "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Појавио се проблем приликом слања е-поште. Молимо вас да проверите ваше поставке. (Грешка: %s)",
+ "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Појавио се проблем приликом слања е-поште. Проверите ваше поставке. (Грешка: %s)",
"Email sent" : "Порука је послата",
"You need to set your user email before being able to send test emails." : "Морате поставити адресу е-поште пре слања тестне поруке.",
"Invalid mail address" : "Неисправна е-адреса",
- "A user with that name already exists." : "Корисник тог имена већ постоји.",
+ "A user with that name already exists." : "Корисник са тим именом већ постоји.",
"Unable to create user." : "Не могу да направим корисника.",
"Your %s account was created" : "Ваш %s налог је направљен",
"Unable to delete user." : "Не могу да обришем корисника.",
@@ -103,10 +104,10 @@
"Fatal issues only" : "Само фатални проблеми",
"None" : "Ништа",
"Login" : "Пријава",
- "Plain" : "Једноставан",
+ "Plain" : "Обичан",
"NT LAN Manager" : "НТ ЛАН менаџер",
- "SSL" : "SSL",
- "TLS" : "TLS",
+ "SSL" : "ССЛ",
+ "TLS" : "ТЛС",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Омогућена је Само-читај конфигурација. То спречава постављање неке конфигурације преко веб-интерфејса. Осим тога, фајлу мора бити ручно омогућено уписивање код сваког освежавања.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "ПХП је очигледно подешен да се скида уметнуте док блокова. То ће учинити неколико кључних апликација недоступним.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ово је вероватно изазвано кешом или акцелератором као што су ЗендОПкеш или еАкцелератор.",
@@ -118,12 +119,7 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Препоручујемо да инсталирате потребне пакете да бисте подржали следеће локалитете: %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталација није инсталирана у основи домена и користи системски крон, може бити проблема са генерисањем веб адреса. Да бисте избегли ове проблеме, молимо вас да подесите \"overwrite.cli.url\" опцију у вашем config.php фајлу у путању веб-основе ваше инсталације (Предложено: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Није било могуће да се изврши крон задатак путем интерфејса командне линије. Појавила су се следеће техничке грешке:",
- "Last cron job execution: %s." : "Последњи извршени крон задатак: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Последњи извршени крон задатак: %s. Нешто изгледа није у реду.",
- "Cron was not executed yet!" : "Крон задатак још увек није извршен!",
- "Execute one task with each page loaded" : "Изврши један задатак са сваком учитаном страницом",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php је регистрован код вебкрон сервиса за позивање cron.php сваких 15 минута преко протокола http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 15 минута.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Молимо вас да добро проверите <a target=\"_blank\" href=\"%s\">упутства за инсталацију ↗</a>, и да проверите ли постоје било какве грешке или упозорења у <a href=\"#log-section\">дневнику записа</a>.",
"Allow apps to use the Share API" : "Дозвољава апликацијама да користе АПИ дељења",
"Allow users to share via link" : "Дозволи корисницима да деле путем везе",
"Enforce password protection" : "Захтевај заштиту лозинком",
@@ -138,7 +134,14 @@
"Allow users to send mail notification for shared files to other users" : "Дозволи корисницима да шаљу обавештења е-поштом за дељене фајлове",
"Exclude groups from sharing" : "Изузми групе из дељења",
"These groups will still be able to receive shares, but not to initiate them." : "Ове групе ће моћи да примају дељења али не и да их праве.",
- "Enable Server-Side-Encryption" : "Омогући шифровање од стране сервера",
+ "Last cron job execution: %s." : "Последњи извршени крон задатак: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Последњи извршени крон задатак: %s. Нешто изгледа није у реду.",
+ "Cron was not executed yet!" : "Крон задатак још увек није извршен!",
+ "Execute one task with each page loaded" : "Изврши један задатак са сваком учитаном страницом",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php је регистрован код вебкрон сервиса за позивање cron.php сваких 15 минута преко протокола http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Користите системски крон сервис за позивање cron.php фајла сваких 15 минута.",
+ "Server Side Encryption" : "Шифровање на страни сервера",
+ "Enable Server-Side-Encryption" : "Укључи шифровање на страни сервера",
"This is used for sending out notifications." : "Ово се користи за слање обавештења.",
"Send mode" : "Режим слања",
"From address" : "Са адресе",
@@ -160,11 +163,13 @@
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Фајл записника је већи од 100МБ. Преузимање може потрајати!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite се користи као базе података. За веће инсталације препоручујемо да се пребаците на други модел базе података.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "За миграцију на другу базу користите командну линију: 'occ db:convert-type', или погледајте <a target=\"_blank\" href=\"%s\">документацију ↗</a>.",
"How to do backups" : "Како правити резерве",
"Advanced monitoring" : "Напредно праћење",
"Performance tuning" : "Побољшање перформанси",
"Improving the config.php" : "Побољшање фајла поставки",
"Theming" : "Теме",
+ "Hardening and security guidance" : "Ојачавање система и безбедносне препоруке",
"Version" : "Верзија",
"More apps" : "Још апликација",
"Developer documentation" : "Програмерска документација",
@@ -179,7 +184,7 @@
"Update to %s" : "Ажурирај на %s",
"Enable only for specific groups" : "Укључи само за одређене групе",
"Uninstall App" : "Деинсталирај апликацију",
- "No apps found for your version" : "Нема апликација за ваше издање",
+ "No apps found for your version" : "Нема апликација за вашу верзију",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Поздрав,<br><br>само вас обавештавам да сад имате %s налог.<br><br>Ваше корисничко име: %s<br>Приступите му на: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Здраво!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Добродошли,\n\nСамо да знате да сада имате %s налог.\n\nВаше корисничко име: %s\nПриступите: %s\n",
@@ -191,8 +196,8 @@
"Get the apps to sync your files" : "Преузмите апликације ради синхронизовања ваших фајлова",
"Desktop client" : "Клијент за рачунар",
"Android app" : "Андроид апликација",
- "iOS app" : "iOS апликација",
- "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ако желите да подржите пројект\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">придружите се развоју</a>\n\t\tили\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">проширите реч</a>!",
+ "iOS app" : "иОС апликација",
+ "If you want to support the project\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ако желите да подржите пројект\n\t\t<a href=\"https://owncloud.org/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">придружите се развоју</a>\n\t\tили\n\t\t<a href=\"https://owncloud.org/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">разгласите свима</a>!",
"Show First Run Wizard again" : "Поново прикажи чаробњака за прво покретање",
"You have used <strong>%s</strong> of the available <strong>%s</strong>" : "Искористили сте <strong>%s</strong> од дозвољених <strong>%s</strong>",
"Password" : "Лозинка",
@@ -200,7 +205,7 @@
"Current password" : "Тренутна лозинка",
"New password" : "Нова лозинка",
"Change password" : "Измени лозинку",
- "Full name" : "Име и презиме",
+ "Full name" : "Пуно име",
"No display name set" : "Није постављено име за приказ",
"Email" : "Е-пошта",
"Your email address" : "Ваша адреса е-поште",
@@ -243,13 +248,13 @@
"Add Group" : "Додај групу",
"Group" : "Група",
"Everyone" : "Сви",
- "Admins" : "Аднинистрација",
+ "Admins" : "Администратори",
"Default Quota" : "Подразумевана квота",
"Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Унесите квоту складиштења (нпр. 512 MB или 12 GB)",
"Unlimited" : "Неограничено",
"Other" : "Друго",
"Full Name" : "Пуно име",
- "Group Admin for" : "Групни администратор за",
+ "Group Admin for" : "Администратор група",
"Quota" : "Квота",
"Storage Location" : "Локација складишта",
"User Backend" : "Позадина за кориснике",
diff --git a/settings/l10n/sr@latin.js b/settings/l10n/sr@latin.js
index e04cb787826..60e8957d25b 100644
--- a/settings/l10n/sr@latin.js
+++ b/settings/l10n/sr@latin.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"settings",
{
+ "External Storage" : "Spoljašnje skladište",
"Authentication error" : "Greška pri autentifikaciji",
"Language changed" : "Jezik je izmenjen",
"Invalid request" : "Neispravan zahtev",
diff --git a/settings/l10n/sr@latin.json b/settings/l10n/sr@latin.json
index 7d2bb0ef518..5f5b352809c 100644
--- a/settings/l10n/sr@latin.json
+++ b/settings/l10n/sr@latin.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "External Storage" : "Spoljašnje skladište",
"Authentication error" : "Greška pri autentifikaciji",
"Language changed" : "Jezik je izmenjen",
"Invalid request" : "Neispravan zahtev",
diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js
index 6e9376db90d..f102b3135b1 100644
--- a/settings/l10n/sv.js
+++ b/settings/l10n/sv.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Dela",
+ "External Storage" : "Extern lagring",
+ "Cron" : "Cron",
"Email Server" : "E-postserver",
"Log" : "Logg",
+ "Updates" : "Uppdateringar",
"Authentication error" : "Fel vid autentisering",
"Your full name has been changed." : "Hela ditt namn har ändrats",
"Unable to change full name" : "Kunde inte ändra hela namnet",
@@ -109,10 +111,6 @@ OC.L10N.register(
"This means that there might be problems with certain characters in file names." : "Detta betyder att där kan komma att uppstå problem med vissa tecken i filnamn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi rekommenderar starkt att installera de nödvändiga paketen på ditt system för att stödja en av följande språkversioner: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Om din installation inte installerades på roten av domänen och använder system cron så kan det uppstå problem med URL-genereringen. För att undvika dessa problem, var vänlig sätt \"overwrite.cli.url\"-inställningen i din config.php-fil till webbrotsökvägen av din installation (Föreslagen: \"%s\")",
- "Cron was not executed yet!" : "Cron kördes inte ännu!",
- "Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Använd systemets cron-tjänst för att anropa cron.php var 15:e minut.",
"Allow apps to use the Share API" : "Tillåt applikationer att använda delat API",
"Allow users to share via link" : "Tillåt användare att dela via länk",
"Enforce password protection" : "Tillämpa lösenordskydd",
@@ -127,6 +125,10 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Tillåt användare att skicka mejlnotifiering för delade filer till andra användare",
"Exclude groups from sharing" : "Exkludera grupp från att dela",
"These groups will still be able to receive shares, but not to initiate them." : "Dessa grupper kommer fortfarande kunna ta emot delningar, men inte skapa delningar.",
+ "Cron was not executed yet!" : "Cron kördes inte ännu!",
+ "Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Använd systemets cron-tjänst för att anropa cron.php var 15:e minut.",
"This is used for sending out notifications." : "Detta används för att skicka ut notifieringar.",
"Send mode" : "Sändningsläge",
"From address" : "Från adress",
diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json
index 1ff95dc01dc..cb477affb73 100644
--- a/settings/l10n/sv.json
+++ b/settings/l10n/sv.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Dela",
+ "External Storage" : "Extern lagring",
+ "Cron" : "Cron",
"Email Server" : "E-postserver",
"Log" : "Logg",
+ "Updates" : "Uppdateringar",
"Authentication error" : "Fel vid autentisering",
"Your full name has been changed." : "Hela ditt namn har ändrats",
"Unable to change full name" : "Kunde inte ändra hela namnet",
@@ -107,10 +109,6 @@
"This means that there might be problems with certain characters in file names." : "Detta betyder att där kan komma att uppstå problem med vissa tecken i filnamn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi rekommenderar starkt att installera de nödvändiga paketen på ditt system för att stödja en av följande språkversioner: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Om din installation inte installerades på roten av domänen och använder system cron så kan det uppstå problem med URL-genereringen. För att undvika dessa problem, var vänlig sätt \"overwrite.cli.url\"-inställningen i din config.php-fil till webbrotsökvägen av din installation (Föreslagen: \"%s\")",
- "Cron was not executed yet!" : "Cron kördes inte ännu!",
- "Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Använd systemets cron-tjänst för att anropa cron.php var 15:e minut.",
"Allow apps to use the Share API" : "Tillåt applikationer att använda delat API",
"Allow users to share via link" : "Tillåt användare att dela via länk",
"Enforce password protection" : "Tillämpa lösenordskydd",
@@ -125,6 +123,10 @@
"Allow users to send mail notification for shared files to other users" : "Tillåt användare att skicka mejlnotifiering för delade filer till andra användare",
"Exclude groups from sharing" : "Exkludera grupp från att dela",
"These groups will still be able to receive shares, but not to initiate them." : "Dessa grupper kommer fortfarande kunna ta emot delningar, men inte skapa delningar.",
+ "Cron was not executed yet!" : "Cron kördes inte ännu!",
+ "Execute one task with each page loaded" : "Exekvera en uppgift vid varje sidladdning",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php är registrerad som en webcron service att ropa på cron.php varje 15 minuter över http.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Använd systemets cron-tjänst för att anropa cron.php var 15:e minut.",
"This is used for sending out notifications." : "Detta används för att skicka ut notifieringar.",
"Send mode" : "Sändningsläge",
"From address" : "Från adress",
diff --git a/settings/l10n/ta_LK.js b/settings/l10n/ta_LK.js
index ae7170a9fa2..fc6dde15389 100644
--- a/settings/l10n/ta_LK.js
+++ b/settings/l10n/ta_LK.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"settings",
{
+ "External Storage" : "வெளி சேமிப்பு",
"Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு",
"Language changed" : "மொழி மாற்றப்பட்டது",
"Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்",
diff --git a/settings/l10n/ta_LK.json b/settings/l10n/ta_LK.json
index eb36984c312..6cf956b905b 100644
--- a/settings/l10n/ta_LK.json
+++ b/settings/l10n/ta_LK.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "External Storage" : "வெளி சேமிப்பு",
"Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு",
"Language changed" : "மொழி மாற்றப்பட்டது",
"Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்",
diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js
index 3d12a42763d..47dfa3ab93f 100644
--- a/settings/l10n/th_TH.js
+++ b/settings/l10n/th_TH.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "การแชร์ข้อมูล",
+ "External Storage" : "พื้นทีจัดเก็บข้อมูลจากภายนอก",
+ "Cron" : "Cron",
"Log" : "บันทึกการเปลี่ยนแปลง",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Language changed" : "เปลี่ยนภาษาเรียบร้อยแล้ว",
@@ -29,9 +30,9 @@ OC.L10N.register(
"Encryption" : "การเข้ารหัส",
"None" : "ไม่มี",
"Login" : "เข้าสู่ระบบ",
- "Execute one task with each page loaded" : "ประมวลคำสั่งหนึ่งงานในแต่ละครั้งที่มีการโหลดหน้าเว็บ",
"Allow apps to use the Share API" : "อนุญาตให้แอปฯสามารถใช้ API สำหรับแชร์ข้อมูลได้",
"Allow resharing" : "อนุญาตให้แชร์ข้อมูลซ้ำใหม่ได้",
+ "Execute one task with each page loaded" : "ประมวลคำสั่งหนึ่งงานในแต่ละครั้งที่มีการโหลดหน้าเว็บ",
"Server address" : "ที่อยู่เซิร์ฟเวอร์",
"Port" : "พอร์ต",
"Credentials" : "ข้อมูลส่วนตัวสำหรับเข้าระบบ",
diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json
index 1fc69a0a0f3..f97afd82dbf 100644
--- a/settings/l10n/th_TH.json
+++ b/settings/l10n/th_TH.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "การแชร์ข้อมูล",
+ "External Storage" : "พื้นทีจัดเก็บข้อมูลจากภายนอก",
+ "Cron" : "Cron",
"Log" : "บันทึกการเปลี่ยนแปลง",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Language changed" : "เปลี่ยนภาษาเรียบร้อยแล้ว",
@@ -27,9 +28,9 @@
"Encryption" : "การเข้ารหัส",
"None" : "ไม่มี",
"Login" : "เข้าสู่ระบบ",
- "Execute one task with each page loaded" : "ประมวลคำสั่งหนึ่งงานในแต่ละครั้งที่มีการโหลดหน้าเว็บ",
"Allow apps to use the Share API" : "อนุญาตให้แอปฯสามารถใช้ API สำหรับแชร์ข้อมูลได้",
"Allow resharing" : "อนุญาตให้แชร์ข้อมูลซ้ำใหม่ได้",
+ "Execute one task with each page loaded" : "ประมวลคำสั่งหนึ่งงานในแต่ละครั้งที่มีการโหลดหน้าเว็บ",
"Server address" : "ที่อยู่เซิร์ฟเวอร์",
"Port" : "พอร์ต",
"Credentials" : "ข้อมูลส่วนตัวสำหรับเข้าระบบ",
diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js
index f6b0745f622..992e8211e8c 100644
--- a/settings/l10n/tr.js
+++ b/settings/l10n/tr.js
@@ -1,11 +1,14 @@
OC.L10N.register(
"settings",
{
- "Security & setup warnings" : "Guvenlik & kurma uyarı",
- "Cron" : "Cron",
+ "Security & setup warnings" : "Güvenlik ve kurulum uyarıları",
"Sharing" : "Paylaşım",
+ "External Storage" : "Harici Depolama",
+ "Cron" : "Cron",
"Email Server" : "E-Posta Sunucusu",
"Log" : "Günlük",
+ "Tips & tricks" : "İpuçları ve hileler",
+ "Updates" : "Güncellemeler",
"Authentication error" : "Kimlik doğrulama hatası",
"Your full name has been changed." : "Tam adınız değiştirildi.",
"Unable to change full name" : "Tam adınız değiştirilirken hata",
@@ -92,6 +95,8 @@ OC.L10N.register(
"A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı",
"A valid email must be provided" : "Geçerli bir e-posta belirtilmeli",
"__language_name__" : "Türkçe",
+ "Sync clients" : "Eşitleme istemcileri",
+ "Personal info" : "Kişisel bilgi",
"SSL root certificates" : "SSL kök sertifikaları",
"Encryption" : "Şifreleme",
"Everything (fatal issues, errors, warnings, info, debug)" : "Her şey (Ciddi sorunlar, hatalar, uyarılar, bilgi, hata ayıklama)",
@@ -116,12 +121,7 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:",
- "Last cron job execution: %s." : "Son cron çalıştırılma: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.",
- "Cron was not executed yet!" : "Cron henüz çalıştırılmadı!",
- "Execute one task with each page loaded" : "Yüklenen her sayfa ile bir görev çalıştır",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php, http üzerinden her 15 dakikada bir çağrılması için webcron hizmetine kaydedilir.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını her 15 dakikada bir çağırmak için sistem cron hizmetini kullan.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum rehberlerini ↗</a> iki kez denetleyip <a href=\"#log-section\">günlük</a> içerisindeki hata ve uyarılara bakın.",
"Allow apps to use the Share API" : "Uygulamaların paylaşım API'sini kullanmasına izin ver",
"Allow users to share via link" : "Kullanıcıların bağlantı ile paylaşmasına izin ver",
"Enforce password protection" : "Parola korumasını zorla",
@@ -136,6 +136,14 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Kullanıcıların diğer kullanıcılara, paylaşılmış dosyalar için posta bildirimi göndermesine izin ver",
"Exclude groups from sharing" : "Grupları paylaşma eyleminden hariç tut",
"These groups will still be able to receive shares, but not to initiate them." : "Bu gruplar hala paylaşımları alabilecek, ancak başlatamayacaktır.",
+ "Last cron job execution: %s." : "Son cron çalıştırılma: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.",
+ "Cron was not executed yet!" : "Cron henüz çalıştırılmadı!",
+ "Execute one task with each page loaded" : "Yüklenen her sayfa ile bir görev çalıştır",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php, http üzerinden her 15 dakikada bir çağrılması için webcron hizmetine kaydedilir.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını her 15 dakikada bir çağırmak için sistem cron hizmetini kullan.",
+ "Server Side Encryption" : "Sunucu Taraflı Şifreleme",
+ "Enable Server-Side-Encryption" : "Sunucu Taraflı Şifrelemeyi Etkinleştir",
"This is used for sending out notifications." : "Bu, bildirimler gönderilirken kullanılır.",
"Send mode" : "Gönderme kipi",
"From address" : "Kimden adresi",
@@ -157,6 +165,13 @@ OC.L10N.register(
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Günlük dosyası 100 MB'dan daha büyük. İndirmek zaman alabilir!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Veritabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veritabanı arka ucuna geçmenizi öneriyoruz.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Başka bir veritabanına geçmek için komut satırı aracını kullanın: 'occ db:convert-type' veya <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.",
+ "How to do backups" : "Nasıl yedekleme yapılır",
+ "Advanced monitoring" : "Gelişmiş izleme",
+ "Performance tuning" : "Performans ayarlama",
+ "Improving the config.php" : "config.php iyileştirme",
+ "Theming" : "Tema",
+ "Hardening and security guidance" : "Sağlamlaştırma ve güvenlik rehberliği",
"Version" : "Sürüm",
"More apps" : "Daha fazla uygulama",
"Developer documentation" : "Geliştirici belgelendirmesi",
@@ -171,6 +186,7 @@ OC.L10N.register(
"Update to %s" : "%s sürümüne güncelle",
"Enable only for specific groups" : "Sadece belirli gruplar için etkinleştir",
"Uninstall App" : "Uygulamayı Kaldır",
+ "No apps found for your version" : "Sürümünüz için uygulama bulunamadı",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Merhaba,<br><br>Sadece artık bir %s hesabınızın olduğunu söylemek istedim.<br><br>Kullanıcı adınız: %s<br>Şuradan erişin: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Hoşçakalın!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Merhaba,\n\nSadece, artık bir %s hesabınızın olduğunu söylemek istedim.\n\nKullanıcı adınız: %s\nErişim: %s\n\n",
@@ -191,6 +207,7 @@ OC.L10N.register(
"Current password" : "Mevcut parola",
"New password" : "Yeni parola",
"Change password" : "Parola değiştir",
+ "Full name" : "Ad soyad",
"No display name set" : "Ekran adı ayarlanmamış",
"Email" : "E-posta",
"Your email address" : "E-posta adresiniz",
@@ -211,6 +228,7 @@ OC.L10N.register(
"Valid until" : "Geçerlilik",
"Issued By" : "Veren",
"Valid until %s" : "%s tarihine kadar geçerli",
+ "Import root certificate" : "Kök sertifikalarını içe aktar",
"The encryption app is no longer enabled, please decrypt all your files" : "Şifreleme uygulaması artık etkin değil, lütfen tüm dosyalarınızın şifrelemesini kaldırın",
"Log-in password" : "Oturum açma parolası",
"Decrypt all Files" : "Tüm Dosyaların Şifrelemesini Kaldır",
diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json
index 673727e55e1..9accebc4094 100644
--- a/settings/l10n/tr.json
+++ b/settings/l10n/tr.json
@@ -1,9 +1,12 @@
{ "translations": {
- "Security & setup warnings" : "Guvenlik & kurma uyarı",
- "Cron" : "Cron",
+ "Security & setup warnings" : "Güvenlik ve kurulum uyarıları",
"Sharing" : "Paylaşım",
+ "External Storage" : "Harici Depolama",
+ "Cron" : "Cron",
"Email Server" : "E-Posta Sunucusu",
"Log" : "Günlük",
+ "Tips & tricks" : "İpuçları ve hileler",
+ "Updates" : "Güncellemeler",
"Authentication error" : "Kimlik doğrulama hatası",
"Your full name has been changed." : "Tam adınız değiştirildi.",
"Unable to change full name" : "Tam adınız değiştirilirken hata",
@@ -90,6 +93,8 @@
"A valid password must be provided" : "Geçerli bir parola mutlaka sağlanmalı",
"A valid email must be provided" : "Geçerli bir e-posta belirtilmeli",
"__language_name__" : "Türkçe",
+ "Sync clients" : "Eşitleme istemcileri",
+ "Personal info" : "Kişisel bilgi",
"SSL root certificates" : "SSL kök sertifikaları",
"Encryption" : "Şifreleme",
"Everything (fatal issues, errors, warnings, info, debug)" : "Her şey (Ciddi sorunlar, hatalar, uyarılar, bilgi, hata ayıklama)",
@@ -114,12 +119,7 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:",
- "Last cron job execution: %s." : "Son cron çalıştırılma: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.",
- "Cron was not executed yet!" : "Cron henüz çalıştırılmadı!",
- "Execute one task with each page loaded" : "Yüklenen her sayfa ile bir görev çalıştır",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php, http üzerinden her 15 dakikada bir çağrılması için webcron hizmetine kaydedilir.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını her 15 dakikada bir çağırmak için sistem cron hizmetini kullan.",
+ "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum rehberlerini ↗</a> iki kez denetleyip <a href=\"#log-section\">günlük</a> içerisindeki hata ve uyarılara bakın.",
"Allow apps to use the Share API" : "Uygulamaların paylaşım API'sini kullanmasına izin ver",
"Allow users to share via link" : "Kullanıcıların bağlantı ile paylaşmasına izin ver",
"Enforce password protection" : "Parola korumasını zorla",
@@ -134,6 +134,14 @@
"Allow users to send mail notification for shared files to other users" : "Kullanıcıların diğer kullanıcılara, paylaşılmış dosyalar için posta bildirimi göndermesine izin ver",
"Exclude groups from sharing" : "Grupları paylaşma eyleminden hariç tut",
"These groups will still be able to receive shares, but not to initiate them." : "Bu gruplar hala paylaşımları alabilecek, ancak başlatamayacaktır.",
+ "Last cron job execution: %s." : "Son cron çalıştırılma: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Son cron çalıştırılma: %s. Bir şeyler yanlış gibi görünüyor.",
+ "Cron was not executed yet!" : "Cron henüz çalıştırılmadı!",
+ "Execute one task with each page loaded" : "Yüklenen her sayfa ile bir görev çalıştır",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php, http üzerinden her 15 dakikada bir çağrılması için webcron hizmetine kaydedilir.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını her 15 dakikada bir çağırmak için sistem cron hizmetini kullan.",
+ "Server Side Encryption" : "Sunucu Taraflı Şifreleme",
+ "Enable Server-Side-Encryption" : "Sunucu Taraflı Şifrelemeyi Etkinleştir",
"This is used for sending out notifications." : "Bu, bildirimler gönderilirken kullanılır.",
"Send mode" : "Gönderme kipi",
"From address" : "Kimden adresi",
@@ -155,6 +163,13 @@
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Günlük dosyası 100 MB'dan daha büyük. İndirmek zaman alabilir!",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Veritabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veritabanı arka ucuna geçmenizi öneriyoruz.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Başka bir veritabanına geçmek için komut satırı aracını kullanın: 'occ db:convert-type' veya <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.",
+ "How to do backups" : "Nasıl yedekleme yapılır",
+ "Advanced monitoring" : "Gelişmiş izleme",
+ "Performance tuning" : "Performans ayarlama",
+ "Improving the config.php" : "config.php iyileştirme",
+ "Theming" : "Tema",
+ "Hardening and security guidance" : "Sağlamlaştırma ve güvenlik rehberliği",
"Version" : "Sürüm",
"More apps" : "Daha fazla uygulama",
"Developer documentation" : "Geliştirici belgelendirmesi",
@@ -169,6 +184,7 @@
"Update to %s" : "%s sürümüne güncelle",
"Enable only for specific groups" : "Sadece belirli gruplar için etkinleştir",
"Uninstall App" : "Uygulamayı Kaldır",
+ "No apps found for your version" : "Sürümünüz için uygulama bulunamadı",
"Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Merhaba,<br><br>Sadece artık bir %s hesabınızın olduğunu söylemek istedim.<br><br>Kullanıcı adınız: %s<br>Şuradan erişin: <a href=\"%s\">%s</a><br><br>",
"Cheers!" : "Hoşçakalın!",
"Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Merhaba,\n\nSadece, artık bir %s hesabınızın olduğunu söylemek istedim.\n\nKullanıcı adınız: %s\nErişim: %s\n\n",
@@ -189,6 +205,7 @@
"Current password" : "Mevcut parola",
"New password" : "Yeni parola",
"Change password" : "Parola değiştir",
+ "Full name" : "Ad soyad",
"No display name set" : "Ekran adı ayarlanmamış",
"Email" : "E-posta",
"Your email address" : "E-posta adresiniz",
@@ -209,6 +226,7 @@
"Valid until" : "Geçerlilik",
"Issued By" : "Veren",
"Valid until %s" : "%s tarihine kadar geçerli",
+ "Import root certificate" : "Kök sertifikalarını içe aktar",
"The encryption app is no longer enabled, please decrypt all your files" : "Şifreleme uygulaması artık etkin değil, lütfen tüm dosyalarınızın şifrelemesini kaldırın",
"Log-in password" : "Oturum açma parolası",
"Decrypt all Files" : "Tüm Dosyaların Şifrelemesini Kaldır",
diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js
index 3ae115e3f61..0f4fd184b76 100644
--- a/settings/l10n/uk.js
+++ b/settings/l10n/uk.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Планувальник Cron",
"Sharing" : "Спільний доступ",
+ "External Storage" : "Зовнішні сховища",
+ "Cron" : "Планувальник Cron",
"Email Server" : "Сервер електронної пошти",
"Log" : "Журнал",
+ "Updates" : "Оновлення",
"Authentication error" : "Помилка автентифікації",
"Your full name has been changed." : "Ваше ім'я було змінене",
"Unable to change full name" : "Неможливо змінити ім'я",
@@ -115,12 +117,6 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файла config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:",
- "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
- "Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
- "Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.",
"Allow apps to use the Share API" : "Дозволити програмам використовувати API спільного доступу",
"Allow users to share via link" : "Дозволити користувачам ділитися через посилання",
"Enforce password protection" : "Захист паролем обов'язковий",
@@ -135,6 +131,12 @@ OC.L10N.register(
"Allow users to send mail notification for shared files to other users" : "Дозволити користувачам сповіщати листами про спільний доступ до файлів",
"Exclude groups from sharing" : "Виключити групи зі спільного доступу",
"These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.",
+ "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
+ "Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
+ "Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.",
"This is used for sending out notifications." : "Використовується для відсилання повідомлень.",
"Send mode" : "Надіслати повідомлення",
"From address" : "Адреса відправника",
diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json
index 368a3192828..484a164f0ee 100644
--- a/settings/l10n/uk.json
+++ b/settings/l10n/uk.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "Планувальник Cron",
"Sharing" : "Спільний доступ",
+ "External Storage" : "Зовнішні сховища",
+ "Cron" : "Планувальник Cron",
"Email Server" : "Сервер електронної пошти",
"Log" : "Журнал",
+ "Updates" : "Оновлення",
"Authentication error" : "Помилка автентифікації",
"Your full name has been changed." : "Ваше ім'я було змінене",
"Unable to change full name" : "Неможливо змінити ім'я",
@@ -113,12 +115,6 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Пропонуємо встановити необхідні пакети для вашої системи для підтримки однієї з наступних мов %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Якщо ваша копія ownCloud встановлена не в корені домену та використовує систему планування CRON, можливі проблеми з генерацією правильних URL. Щоб уникнути цього, встановіть опцію \"overwrite.cli.url\" файла config.php відповідно до теки розташування установки (Ймовірніше за все, це \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не вдалося запустити завдання планувальника через CLI. Відбулися наступні технічні помилки:",
- "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
- "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
- "Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
- "Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
- "Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.",
"Allow apps to use the Share API" : "Дозволити програмам використовувати API спільного доступу",
"Allow users to share via link" : "Дозволити користувачам ділитися через посилання",
"Enforce password protection" : "Захист паролем обов'язковий",
@@ -133,6 +129,12 @@
"Allow users to send mail notification for shared files to other users" : "Дозволити користувачам сповіщати листами про спільний доступ до файлів",
"Exclude groups from sharing" : "Виключити групи зі спільного доступу",
"These groups will still be able to receive shares, but not to initiate them." : "Ці групи зможуть отримувати спільні файли, але не зможуть відправляти їх.",
+ "Last cron job execution: %s." : "Останне виконане Cron завдання: %s.",
+ "Last cron job execution: %s. Something seems wrong." : "Останне виконане Cron завдання: %s. Щось здається неправильним.",
+ "Cron was not executed yet!" : "Cron-задачі ще не запускалися!",
+ "Execute one task with each page loaded" : "Виконати одне завдання для кожної завантаженої сторінки ",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зареєстрований в службі webcron та буде викликатися кожні 15 хвилин через HTTP.",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "Використовувати системний cron для виклику cron.php кожні 15 хвилин.",
"This is used for sending out notifications." : "Використовується для відсилання повідомлень.",
"Send mode" : "Надіслати повідомлення",
"From address" : "Адреса відправника",
diff --git a/settings/l10n/vi.js b/settings/l10n/vi.js
index 31f56913f88..20425649788 100644
--- a/settings/l10n/vi.js
+++ b/settings/l10n/vi.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"settings",
{
- "Cron" : "Cron",
"Sharing" : "Chia sẻ",
+ "External Storage" : "Lưu trữ ngoài",
+ "Cron" : "Cron",
"Log" : "Log",
"Authentication error" : "Lỗi xác thực",
"Your full name has been changed." : "Họ và tên đã được thay đổi.",
@@ -32,9 +33,9 @@ OC.L10N.register(
"Encryption" : "Mã hóa",
"None" : "Không gì cả",
"Login" : "Đăng nhập",
- "Execute one task with each page loaded" : "Thực thi tác vụ mỗi khi trang được tải",
"Allow apps to use the Share API" : "Cho phép các ứng dụng sử dụng chia sẻ API",
"Allow resharing" : "Cho phép chia sẻ lại",
+ "Execute one task with each page loaded" : "Thực thi tác vụ mỗi khi trang được tải",
"Server address" : "Địa chỉ máy chủ",
"Port" : "Cổng",
"Credentials" : "Giấy chứng nhận",
diff --git a/settings/l10n/vi.json b/settings/l10n/vi.json
index 63966eeb31d..b5f5c564e10 100644
--- a/settings/l10n/vi.json
+++ b/settings/l10n/vi.json
@@ -1,6 +1,7 @@
{ "translations": {
- "Cron" : "Cron",
"Sharing" : "Chia sẻ",
+ "External Storage" : "Lưu trữ ngoài",
+ "Cron" : "Cron",
"Log" : "Log",
"Authentication error" : "Lỗi xác thực",
"Your full name has been changed." : "Họ và tên đã được thay đổi.",
@@ -30,9 +31,9 @@
"Encryption" : "Mã hóa",
"None" : "Không gì cả",
"Login" : "Đăng nhập",
- "Execute one task with each page loaded" : "Thực thi tác vụ mỗi khi trang được tải",
"Allow apps to use the Share API" : "Cho phép các ứng dụng sử dụng chia sẻ API",
"Allow resharing" : "Cho phép chia sẻ lại",
+ "Execute one task with each page loaded" : "Thực thi tác vụ mỗi khi trang được tải",
"Server address" : "Địa chỉ máy chủ",
"Port" : "Cổng",
"Credentials" : "Giấy chứng nhận",
diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js
index 3b44f5e6b10..b0a808fb353 100644
--- a/settings/l10n/zh_CN.js
+++ b/settings/l10n/zh_CN.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "计划任务",
"Sharing" : "共享",
+ "External Storage" : "外部存储",
+ "Cron" : "计划任务",
"Email Server" : "电子邮件服务器",
"Log" : "日志",
+ "Updates" : "更新",
"Authentication error" : "认证错误",
"Your full name has been changed." : "您的全名已修改。",
"Unable to change full name" : "无法修改全名",
@@ -90,10 +92,6 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便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." : "这意味着一些文件名中的特定字符可能有问题。",
- "Cron was not executed yet!" : "定时任务还未被执行!",
- "Execute one task with each page loaded" : "每个页面加载后执行一个任务",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 已注册于一个 webcron 服务来通过 http 每 15 分钟执行 cron.php。",
- "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。",
"Allow apps to use the Share API" : "允许应用软件使用共享API",
"Allow users to share via link" : "允许用户通过链接分享文件",
"Enforce password protection" : "强制密码保护",
@@ -107,6 +105,10 @@ OC.L10N.register(
"Restrict users to only share with users in their groups" : "限制仅与组内用户分享",
"Exclude groups from sharing" : "在分享中排除组",
"These groups will still be able to receive shares, but not to initiate them." : "这些组将仍可以获取分享,但无法向他人分享。",
+ "Cron was not executed yet!" : "定时任务还未被执行!",
+ "Execute one task with each page loaded" : "每个页面加载后执行一个任务",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 已注册于一个 webcron 服务来通过 http 每 15 分钟执行 cron.php。",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。",
"This is used for sending out notifications." : "这被用于发送通知。",
"Send mode" : "发送模式",
"From address" : "来自地址",
@@ -123,6 +125,7 @@ OC.L10N.register(
"Log level" : "日志级别",
"More" : "更多",
"Less" : "更少",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。",
"Version" : "版本",
"More apps" : "更多应用",
"by" : "被",
diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json
index 13ceef54002..3b544e93396 100644
--- a/settings/l10n/zh_CN.json
+++ b/settings/l10n/zh_CN.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "计划任务",
"Sharing" : "共享",
+ "External Storage" : "外部存储",
+ "Cron" : "计划任务",
"Email Server" : "电子邮件服务器",
"Log" : "日志",
+ "Updates" : "更新",
"Authentication error" : "认证错误",
"Your full name has been changed." : "您的全名已修改。",
"Unable to change full name" : "无法修改全名",
@@ -88,10 +90,6 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便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." : "这意味着一些文件名中的特定字符可能有问题。",
- "Cron was not executed yet!" : "定时任务还未被执行!",
- "Execute one task with each page loaded" : "每个页面加载后执行一个任务",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 已注册于一个 webcron 服务来通过 http 每 15 分钟执行 cron.php。",
- "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。",
"Allow apps to use the Share API" : "允许应用软件使用共享API",
"Allow users to share via link" : "允许用户通过链接分享文件",
"Enforce password protection" : "强制密码保护",
@@ -105,6 +103,10 @@
"Restrict users to only share with users in their groups" : "限制仅与组内用户分享",
"Exclude groups from sharing" : "在分享中排除组",
"These groups will still be able to receive shares, but not to initiate them." : "这些组将仍可以获取分享,但无法向他人分享。",
+ "Cron was not executed yet!" : "定时任务还未被执行!",
+ "Execute one task with each page loaded" : "每个页面加载后执行一个任务",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php 已注册于一个 webcron 服务来通过 http 每 15 分钟执行 cron.php。",
+ "Use system's cron service to call the cron.php file every 15 minutes." : "使用系统 CRON 服务每 15 分钟执行一次 cron.php 文件。",
"This is used for sending out notifications." : "这被用于发送通知。",
"Send mode" : "发送模式",
"From address" : "来自地址",
@@ -121,6 +123,7 @@
"Log level" : "日志级别",
"More" : "更多",
"Less" : "更少",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "特别当使用桌面客户端来同步文件时,不鼓励使用 SQLite 。",
"Version" : "版本",
"More apps" : "更多应用",
"by" : "被",
diff --git a/settings/l10n/zh_HK.js b/settings/l10n/zh_HK.js
index 97fc876af07..44d3e759b76 100644
--- a/settings/l10n/zh_HK.js
+++ b/settings/l10n/zh_HK.js
@@ -4,6 +4,7 @@ OC.L10N.register(
"Sharing" : "分享",
"Email Server" : "電子郵件伺服器",
"Log" : "日誌",
+ "Updates" : "更新",
"Wrong password" : "密碼錯誤",
"Enabled" : "啟用",
"Not enabled" : "未啟用",
diff --git a/settings/l10n/zh_HK.json b/settings/l10n/zh_HK.json
index 222a82d9684..f860a6c82c6 100644
--- a/settings/l10n/zh_HK.json
+++ b/settings/l10n/zh_HK.json
@@ -2,6 +2,7 @@
"Sharing" : "分享",
"Email Server" : "電子郵件伺服器",
"Log" : "日誌",
+ "Updates" : "更新",
"Wrong password" : "密碼錯誤",
"Enabled" : "啟用",
"Not enabled" : "未啟用",
diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js
index 0d9210177ae..8e9104c0c19 100644
--- a/settings/l10n/zh_TW.js
+++ b/settings/l10n/zh_TW.js
@@ -1,10 +1,12 @@
OC.L10N.register(
"settings",
{
- "Cron" : "工作排程",
"Sharing" : "分享",
+ "External Storage" : "外部儲存",
+ "Cron" : "工作排程",
"Email Server" : "郵件伺服器",
"Log" : "紀錄",
+ "Updates" : "更新",
"Authentication error" : "認證錯誤",
"Your full name has been changed." : "您的全名已變更。",
"Unable to change full name" : "無法變更全名",
@@ -76,14 +78,14 @@ OC.L10N.register(
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "未偵測到 PHP 模組 'fileinfo'。我們強烈建議啟用這個模組以取得最好的 mime-type 支援。",
"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." : "這個意思是指在檔名中使用一些字元可能會有問題",
- "Cron was not executed yet!" : "排程沒有執行!",
- "Execute one task with each page loaded" : "當頁面載入時,執行",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "已經與 webcron 服務註冊好,將會每15分鐘呼叫 cron.php",
"Allow apps to use the Share API" : "允許 apps 使用分享 API",
"Allow public uploads" : "允許任何人上傳",
"Allow users to send mail notification for shared files" : "允許使用者寄送有關分享檔案的郵件通知",
"days" : "天",
"Allow resharing" : "允許轉貼分享",
+ "Cron was not executed yet!" : "排程沒有執行!",
+ "Execute one task with each page loaded" : "當頁面載入時,執行",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "已經與 webcron 服務註冊好,將會每15分鐘呼叫 cron.php",
"This is used for sending out notifications." : "這是使用於寄送通知。",
"Send mode" : "寄送模式",
"From address" : "寄件地址",
diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json
index 431a6f2ac8f..b836f990975 100644
--- a/settings/l10n/zh_TW.json
+++ b/settings/l10n/zh_TW.json
@@ -1,8 +1,10 @@
{ "translations": {
- "Cron" : "工作排程",
"Sharing" : "分享",
+ "External Storage" : "外部儲存",
+ "Cron" : "工作排程",
"Email Server" : "郵件伺服器",
"Log" : "紀錄",
+ "Updates" : "更新",
"Authentication error" : "認證錯誤",
"Your full name has been changed." : "您的全名已變更。",
"Unable to change full name" : "無法變更全名",
@@ -74,14 +76,14 @@
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "未偵測到 PHP 模組 'fileinfo'。我們強烈建議啟用這個模組以取得最好的 mime-type 支援。",
"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." : "這個意思是指在檔名中使用一些字元可能會有問題",
- "Cron was not executed yet!" : "排程沒有執行!",
- "Execute one task with each page loaded" : "當頁面載入時,執行",
- "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "已經與 webcron 服務註冊好,將會每15分鐘呼叫 cron.php",
"Allow apps to use the Share API" : "允許 apps 使用分享 API",
"Allow public uploads" : "允許任何人上傳",
"Allow users to send mail notification for shared files" : "允許使用者寄送有關分享檔案的郵件通知",
"days" : "天",
"Allow resharing" : "允許轉貼分享",
+ "Cron was not executed yet!" : "排程沒有執行!",
+ "Execute one task with each page loaded" : "當頁面載入時,執行",
+ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "已經與 webcron 服務註冊好,將會每15分鐘呼叫 cron.php",
"This is used for sending out notifications." : "這是使用於寄送通知。",
"Send mode" : "寄送模式",
"From address" : "寄件地址",
diff --git a/settings/personal.php b/settings/personal.php
index e4d278d4f28..12b320ac001 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -59,11 +59,6 @@ $email=$config->getUserValue(OC_User::getUser(), 'settings', 'email', '');
$userLang=$config->getUserValue( OC_User::getUser(), 'core', 'lang', OC_L10N::findLanguage() );
$languageCodes=OC_L10N::findAvailableLanguages();
-//check if encryption was enabled in the past
-$filesStillEncrypted = OC_Util::encryptedFiles();
-$backupKeysExists = OC_Util::backupKeysExists();
-$enableDecryptAll = $filesStillEncrypted || $backupKeysExists;
-
// array of common languages
$commonlangcodes = array(
'en', 'es', 'fr', 'de', 'de_DE', 'ja', 'ar', 'ru', 'nl', 'it', 'pt_BR', 'pt_PT', 'da', 'fi_FI', 'nb_NO', 'sv', 'tr', 'zh_CN', 'ko'
@@ -120,9 +115,6 @@ $tmpl->assign('activelanguage', $userLang);
$tmpl->assign('passwordChangeSupported', OC_User::canUserChangePassword(OC_User::getUser()));
$tmpl->assign('displayNameChangeSupported', OC_User::canUserChangeDisplayName(OC_User::getUser()));
$tmpl->assign('displayName', OC_User::getDisplayName());
-$tmpl->assign('enableDecryptAll' , $enableDecryptAll);
-$tmpl->assign('backupKeysExists' , $backupKeysExists);
-$tmpl->assign('filesStillEncrypted' , $filesStillEncrypted);
$tmpl->assign('enableAvatars', $config->getSystemValue('enable_avatars', true));
$tmpl->assign('avatarChangeSupported', OC_User::canUserChangeAvatar(OC_User::getUser()));
$tmpl->assign('certs', $certificateManager->listCertificates());
@@ -163,9 +155,6 @@ $formsAndMore = array_merge($formsAndMore, $formsMap);
// add bottom hardcoded forms from the template
$formsAndMore[]= array( 'anchor' => 'ssl-root-certificates', 'section-name' => $l->t('SSL root certificates') );
-if($enableDecryptAll) {
- $formsAndMore[]= array( 'anchor' => 'encryption', 'section-name' => $l->t('Encryption') );
-}
$tmpl->assign('forms', $formsAndMore);
$tmpl->printPage();
diff --git a/settings/routes.php b/settings/routes.php
index 5a567bb99ff..af9ac1d8eea 100644
--- a/settings/routes.php
+++ b/settings/routes.php
@@ -49,6 +49,7 @@ $application->registerRoutes($this, array(
array('name' => 'LogSettings#setLogLevel', 'url' => '/settings/admin/log/level', 'verb' => 'POST'),
array('name' => 'LogSettings#getEntries', 'url' => '/settings/admin/log/entries', 'verb' => 'GET'),
array('name' => 'LogSettings#download', 'url' => '/settings/admin/log/download', 'verb' => 'GET'),
+ ['name' => 'CheckSetup#check', 'url' => '/settings/ajax/checksetup', 'verb' => 'GET'],
)
));
@@ -88,12 +89,6 @@ $this->create('settings_personal_changepassword', '/settings/personal/changepass
->action('OC\Settings\ChangePassword\Controller', 'changePersonalPassword');
$this->create('settings_ajax_setlanguage', '/settings/ajax/setlanguage.php')
->actionInclude('settings/ajax/setlanguage.php');
-$this->create('settings_ajax_decryptall', '/settings/ajax/decryptall.php')
- ->actionInclude('settings/ajax/decryptall.php');
-$this->create('settings_ajax_restorekeys', '/settings/ajax/restorekeys.php')
- ->actionInclude('settings/ajax/restorekeys.php');
-$this->create('settings_ajax_deletekeys', '/settings/ajax/deletekeys.php')
- ->actionInclude('settings/ajax/deletekeys.php');
$this->create('settings_cert_post', '/settings/ajax/addRootCertificate')
->actionInclude('settings/ajax/addRootCertificate.php');
$this->create('settings_cert_remove', '/settings/ajax/removeRootCertificate')
@@ -112,5 +107,3 @@ $this->create('settings_ajax_navigationdetect', '/settings/ajax/navigationdetect
// admin
$this->create('settings_ajax_excludegroups', '/settings/ajax/excludegroups.php')
->actionInclude('settings/ajax/excludegroups.php');
-$this->create('settings_ajax_checksetup', '/settings/ajax/checksetup')
- ->actionInclude('settings/ajax/checksetup.php');
diff --git a/settings/templates/admin.php b/settings/templates/admin.php
index 1b0ed66563e..1b8ab0e3819 100644
--- a/settings/templates/admin.php
+++ b/settings/templates/admin.php
@@ -295,73 +295,6 @@ if ($_['cronErrors']) {
</p>
</div>
-<div class="section" id="shareAPI">
- <h2><?php p($l->t('Sharing'));?></h2>
- <p id="enable">
- <input type="checkbox" name="shareapi_enabled" id="shareAPIEnabled"
- value="1" <?php if ($_['shareAPIEnabled'] === 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="shareAPIEnabled"><?php p($l->t('Allow apps to use the Share API'));?></label><br/>
- </p>
- <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>">
- <input type="checkbox" name="shareapi_allow_links" id="allowLinks"
- value="1" <?php if ($_['allowLinks'] === 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="allowLinks"><?php p($l->t('Allow users to share via link'));?></label><br/>
- </p>
-
- <p id="publicLinkSettings" class="indent <?php if ($_['allowLinks'] !== 'yes' || $_['shareAPIEnabled'] === 'no') p('hidden'); ?>">
- <input type="checkbox" name="shareapi_enforce_links_password" id="enforceLinkPassword"
- value="1" <?php if ($_['enforceLinkPassword']) print_unescaped('checked="checked"'); ?> />
- <label for="enforceLinkPassword"><?php p($l->t('Enforce password protection'));?></label><br/>
-
- <input type="checkbox" name="shareapi_allow_public_upload" id="allowPublicUpload"
- value="1" <?php if ($_['allowPublicUpload'] == 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="allowPublicUpload"><?php p($l->t('Allow public uploads'));?></label><br/>
-
- <input type="checkbox" name="shareapi_allow_public_notification" id="allowPublicMailNotification"
- value="1" <?php if ($_['allowPublicMailNotification'] == 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="allowPublicMailNotification"><?php p($l->t('Allow users to send mail notification for shared files'));?></label><br/>
-
- <input type="checkbox" name="shareapi_default_expire_date" id="shareapiDefaultExpireDate"
- value="1" <?php if ($_['shareDefaultExpireDateSet'] === 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="shareapiDefaultExpireDate"><?php p($l->t('Set default expiration date'));?></label><br/>
-
- </p>
- <p id="setDefaultExpireDate" class="double-indent <?php if ($_['allowLinks'] !== 'yes' || $_['shareDefaultExpireDateSet'] === 'no' || $_['shareAPIEnabled'] === 'no') p('hidden');?>">
- <?php p($l->t( 'Expire after ' )); ?>
- <input type="text" name='shareapi_expire_after_n_days' id="shareapiExpireAfterNDays" placeholder="<?php p('7')?>"
- value='<?php p($_['shareExpireAfterNDays']) ?>' />
- <?php p($l->t( 'days' )); ?>
- <input type="checkbox" name="shareapi_enforce_expire_date" id="shareapiEnforceExpireDate"
- value="1" <?php if ($_['shareEnforceExpireDate'] === 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="shareapiEnforceExpireDate"><?php p($l->t('Enforce expiration date'));?></label><br/>
- </p>
- <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>">
- <input type="checkbox" name="shareapi_allow_resharing" id="allowResharing"
- value="1" <?php if ($_['allowResharing'] === 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="allowResharing"><?php p($l->t('Allow resharing'));?></label><br/>
- </p>
- <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>">
- <input type="checkbox" name="shareapi_only_share_with_group_members" id="onlyShareWithGroupMembers"
- value="1" <?php if ($_['onlyShareWithGroupMembers']) print_unescaped('checked="checked"'); ?> />
- <label for="onlyShareWithGroupMembers"><?php p($l->t('Restrict users to only share with users in their groups'));?></label><br/>
- </p>
- <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>">
- <input type="checkbox" name="shareapi_allow_mail_notification" id="allowMailNotification"
- value="1" <?php if ($_['allowMailNotification'] === 'yes') print_unescaped('checked="checked"'); ?> />
- <label for="allowMailNotification"><?php p($l->t('Allow users to send mail notification for shared files to other users'));?></label><br/>
- </p>
- <p class="<?php if ($_['shareAPIEnabled'] === 'no') p('hidden');?>">
- <input type="checkbox" name="shareapi_exclude_groups" id="shareapiExcludeGroups"
- value="1" <?php if ($_['shareExcludeGroups']) print_unescaped('checked="checked"'); ?> />
- <label for="shareapiExcludeGroups"><?php p($l->t('Exclude groups from sharing'));?></label><br/>
- </p>
- <p id="selectExcludedGroups" class="indent <?php if (!$_['shareExcludeGroups'] || $_['shareAPIEnabled'] === 'no') p('hidden'); ?>">
- <input name="shareapi_exclude_groups_list" type="hidden" id="excludedGroups" value="<?php p($_['shareExcludedGroupsList']) ?>" style="width: 400px"/>
- <br />
- <em><?php p($l->t('These groups will still be able to receive shares, but not to initiate them.')); ?></em>
- </p>
-</div>
-
<div class="section" id='encryptionAPI'>
<h2><?php p($l->t('Server Side Encryption'));?></h2>
<p id="enable">
diff --git a/settings/templates/personal.php b/settings/templates/personal.php
index 2a0b4bb0dc4..dfdc6191805 100644
--- a/settings/templates/personal.php
+++ b/settings/templates/personal.php
@@ -242,58 +242,6 @@ if($_['passwordChangeSupported']) {
</form>
</div>
-<?php if($_['enableDecryptAll']): ?>
-<div id="encryption" class="section">
-
- <h2>
- <?php p( $l->t( 'Encryption' ) ); ?>
- </h2>
-
- <?php if($_['filesStillEncrypted']): ?>
-
- <div id="decryptAll">
- <?php p($l->t( "The encryption app is no longer enabled, please decrypt all your files" )); ?>
- <p>
- <input
- type="password"
- name="privateKeyPassword"
- id="privateKeyPassword" />
- <label for="privateKeyPassword"><?php p($l->t( "Log-in password" )); ?></label>
- <br />
- <button
- type="button"
- disabled
- name="submitDecryptAll"><?php p($l->t( "Decrypt all Files" )); ?>
- </button>
- <span class="msg"></span>
- </p>
- <br />
- </div>
- <?php endif; ?>
-
- <div id="restoreBackupKeys" <?php $_['backupKeysExists'] ? '' : print_unescaped("class='hidden'") ?>>
-
- <?php p($l->t( "Your encryption keys are moved to a backup location. If something went wrong you can restore the keys. Only delete them permanently if you are sure that all files are decrypted correctly." )); ?>
- <p>
- <button
- type="button"
- name="submitRestoreKeys"><?php p($l->t( "Restore Encryption Keys" )); ?>
- </button>
- <button
- type="button"
- name="submitDeleteKeys"><?php p($l->t( "Delete Encryption Keys" )); ?>
- </button>
- <span class="msg"></span>
-
- </p>
- <br />
-
- </div>
-
-
-</div>
- <?php endif; ?>
-
<div class="section">
<h2><?php p($l->t('Version'));?></h2>
<strong><?php p($theme->getTitle()); ?></strong> <?php p(OC_Util::getHumanVersion()) ?><br />
diff --git a/settings/users.php b/settings/users.php
index 08498edec29..0fc9fbeafc2 100644
--- a/settings/users.php
+++ b/settings/users.php
@@ -45,8 +45,8 @@ $groupsInfo = new \OC\Group\MetaData(OC_User::getUser(), $isAdmin, $groupManager
$groupsInfo->setSorting($groupsInfo::SORT_USERCOUNT);
list($adminGroup, $groups) = $groupsInfo->get();
-$recoveryAdminEnabled = OC_App::isEnabled('files_encryption') &&
- $config->getAppValue( 'files_encryption', 'recoveryAdminEnabled', null );
+$recoveryAdminEnabled = OC_App::isEnabled('encryption') &&
+ $config->getAppValue( 'encryption', 'recoveryAdminEnabled', null );
if($isAdmin) {
$subadmins = OC_SubAdmin::getAllSubAdmins();
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index cebd899e785..5945dbdc11f 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -25,4 +25,3 @@ if (!class_exists('PHPUnit_Framework_TestCase')) {
OC_Hook::clear();
OC_Log::$enabled = false;
-OC_FileProxy::clearProxies();
diff --git a/tests/enable_all.php b/tests/enable_all.php
index e9b538713a5..464155b1f39 100644
--- a/tests/enable_all.php
+++ b/tests/enable_all.php
@@ -18,7 +18,7 @@ function enableApp($app) {
enableApp('files_sharing');
enableApp('files_trashbin');
-enableApp('files_encryption');
+enableApp('encryption');
enableApp('user_ldap');
enableApp('files_versions');
enableApp('provisioning_api');
diff --git a/tests/lib/app.php b/tests/lib/app.php
index 86a407c1a95..3f380f74fd2 100644
--- a/tests/lib/app.php
+++ b/tests/lib/app.php
@@ -470,7 +470,7 @@ class Test_App extends \Test\TestCase {
return $appConfig;
});
\OC::$server->registerService('AppManager', function (\OC\Server $c) use ($appConfig) {
- return new \OC\App\AppManager($c->getUserSession(), $appConfig, $c->getGroupManager());
+ return new \OC\App\AppManager($c->getUserSession(), $appConfig, $c->getGroupManager(), $c->getMemCacheFactory());
});
}
@@ -482,7 +482,7 @@ class Test_App extends \Test\TestCase {
return new \OC\AppConfig(\OC_DB::getConnection());
});
\OC::$server->registerService('AppManager', function (\OC\Server $c) {
- return new \OC\App\AppManager($c->getUserSession(), $c->getAppConfig(), $c->getGroupManager());
+ return new \OC\App\AppManager($c->getUserSession(), $c->getAppConfig(), $c->getGroupManager(), $c->getMemCacheFactory());
});
// Remove the cache of the mocked apps list with a forceRefresh
diff --git a/tests/lib/app/manager.php b/tests/lib/app/manager.php
index cb41f737469..6cf7eb3bb6c 100644
--- a/tests/lib/app/manager.php
+++ b/tests/lib/app/manager.php
@@ -54,22 +54,55 @@ class Manager extends \PHPUnit_Framework_TestCase {
return $config;
}
+ /** @var \OCP\IUserSession */
+ protected $userSession;
+
+ /** @var \OCP\IGroupManager */
+ protected $groupManager;
+
+ /** @var \OCP\IAppConfig */
+ protected $appConfig;
+
+ /** @var \OCP\ICache */
+ protected $cache;
+
+ /** @var \OCP\ICacheFactory */
+ protected $cacheFactory;
+
+ /** @var \OCP\App\IAppManager */
+ protected $manager;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->userSession = $this->getMock('\OCP\IUserSession');
+ $this->groupManager = $this->getMock('\OCP\IGroupManager');
+ $this->appConfig = $this->getAppConfig();
+ $this->cacheFactory = $this->getMock('\OCP\ICacheFactory');
+ $this->cache = $this->getMock('\OCP\ICache');
+ $this->cacheFactory->expects($this->any())
+ ->method('create')
+ ->with('settings')
+ ->willReturn($this->cache);
+ $this->manager = new \OC\App\AppManager($this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory);
+ }
+
+ protected function expectClearCache() {
+ $this->cache->expects($this->once())
+ ->method('clear')
+ ->with('listApps');
+ }
+
public function testEnableApp() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $manager->enableApp('test');
- $this->assertEquals('yes', $appConfig->getValue('test', 'enabled', 'no'));
+ $this->expectClearCache();
+ $this->manager->enableApp('test');
+ $this->assertEquals('yes', $this->appConfig->getValue('test', 'enabled', 'no'));
}
public function testDisableApp() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $manager->disableApp('test');
- $this->assertEquals('no', $appConfig->getValue('test', 'enabled', 'no'));
+ $this->expectClearCache();
+ $this->manager->disableApp('test');
+ $this->assertEquals('no', $this->appConfig->getValue('test', 'enabled', 'no'));
}
public function testEnableAppForGroups() {
@@ -77,151 +110,98 @@ class Manager extends \PHPUnit_Framework_TestCase {
new Group('group1', array(), null),
new Group('group2', array(), null)
);
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $userSession = $this->getMock('\OCP\IUserSession');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $manager->enableAppForGroups('test', $groups);
- $this->assertEquals('["group1","group2"]', $appConfig->getValue('test', 'enabled', 'no'));
+ $this->expectClearCache();
+ $this->manager->enableAppForGroups('test', $groups);
+ $this->assertEquals('["group1","group2"]', $this->appConfig->getValue('test', 'enabled', 'no'));
}
public function testIsInstalledEnabled() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', 'yes');
- $this->assertTrue($manager->isInstalled('test'));
+ $this->appConfig->setValue('test', 'enabled', 'yes');
+ $this->assertTrue($this->manager->isInstalled('test'));
}
public function testIsInstalledDisabled() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', 'no');
- $this->assertFalse($manager->isInstalled('test'));
+ $this->appConfig->setValue('test', 'enabled', 'no');
+ $this->assertFalse($this->manager->isInstalled('test'));
}
public function testIsInstalledEnabledForGroups() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', '["foo"]');
- $this->assertTrue($manager->isInstalled('test'));
+ $this->appConfig->setValue('test', 'enabled', '["foo"]');
+ $this->assertTrue($this->manager->isInstalled('test'));
}
public function testIsEnabledForUserEnabled() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', 'yes');
+ $this->appConfig->setValue('test', 'enabled', 'yes');
$user = new User('user1', null);
- $this->assertTrue($manager->isEnabledForUser('test', $user));
+ $this->assertTrue($this->manager->isEnabledForUser('test', $user));
}
public function testIsEnabledForUserDisabled() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', 'no');
+ $this->appConfig->setValue('test', 'enabled', 'no');
$user = new User('user1', null);
- $this->assertFalse($manager->isEnabledForUser('test', $user));
+ $this->assertFalse($this->manager->isEnabledForUser('test', $user));
}
public function testIsEnabledForUserEnabledForGroup() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
$user = new User('user1', null);
-
- $groupManager->expects($this->once())
+ $this->groupManager->expects($this->once())
->method('getUserGroupIds')
->with($user)
->will($this->returnValue(array('foo', 'bar')));
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', '["foo"]');
- $this->assertTrue($manager->isEnabledForUser('test', $user));
+ $this->appConfig->setValue('test', 'enabled', '["foo"]');
+ $this->assertTrue($this->manager->isEnabledForUser('test', $user));
}
public function testIsEnabledForUserDisabledForGroup() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
$user = new User('user1', null);
-
- $groupManager->expects($this->once())
+ $this->groupManager->expects($this->once())
->method('getUserGroupIds')
->with($user)
->will($this->returnValue(array('bar')));
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', '["foo"]');
- $this->assertFalse($manager->isEnabledForUser('test', $user));
+ $this->appConfig->setValue('test', 'enabled', '["foo"]');
+ $this->assertFalse($this->manager->isEnabledForUser('test', $user));
}
public function testIsEnabledForUserLoggedOut() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
-
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', '["foo"]');
- $this->assertFalse($manager->IsEnabledForUser('test'));
+ $this->appConfig->setValue('test', 'enabled', '["foo"]');
+ $this->assertFalse($this->manager->IsEnabledForUser('test'));
}
public function testIsEnabledForUserLoggedIn() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
$user = new User('user1', null);
- $userSession->expects($this->once())
+ $this->userSession->expects($this->once())
->method('getUser')
->will($this->returnValue($user));
- $groupManager->expects($this->once())
+ $this->groupManager->expects($this->once())
->method('getUserGroupIds')
->with($user)
->will($this->returnValue(array('foo', 'bar')));
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test', 'enabled', '["foo"]');
- $this->assertTrue($manager->isEnabledForUser('test'));
+ $this->appConfig->setValue('test', 'enabled', '["foo"]');
+ $this->assertTrue($this->manager->isEnabledForUser('test'));
}
public function testGetInstalledApps() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
-
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test1', 'enabled', 'yes');
- $appConfig->setValue('test2', 'enabled', 'no');
- $appConfig->setValue('test3', 'enabled', '["foo"]');
- $this->assertEquals(['test1', 'test3'], $manager->getInstalledApps());
+ $this->appConfig->setValue('test1', 'enabled', 'yes');
+ $this->appConfig->setValue('test2', 'enabled', 'no');
+ $this->appConfig->setValue('test3', 'enabled', '["foo"]');
+ $this->assertEquals(['test1', 'test3'], $this->manager->getInstalledApps());
}
public function testGetAppsForUser() {
- $userSession = $this->getMock('\OCP\IUserSession');
- $groupManager = $this->getMock('\OCP\IGroupManager');
-
$user = new User('user1', null);
-
- $groupManager->expects($this->any())
+ $this->groupManager->expects($this->any())
->method('getUserGroupIds')
->with($user)
->will($this->returnValue(array('foo', 'bar')));
- $appConfig = $this->getAppConfig();
- $manager = new \OC\App\AppManager($userSession, $appConfig, $groupManager);
- $appConfig->setValue('test1', 'enabled', 'yes');
- $appConfig->setValue('test2', 'enabled', 'no');
- $appConfig->setValue('test3', 'enabled', '["foo"]');
- $appConfig->setValue('test4', 'enabled', '["asd"]');
- $this->assertEquals(['test1', 'test3'], $manager->getEnabledAppsForUser($user));
+ $this->appConfig->setValue('test1', 'enabled', 'yes');
+ $this->appConfig->setValue('test2', 'enabled', 'no');
+ $this->appConfig->setValue('test3', 'enabled', '["foo"]');
+ $this->appConfig->setValue('test4', 'enabled', '["asd"]');
+ $this->assertEquals(['test1', 'test3'], $this->manager->getEnabledAppsForUser($user));
}
}
diff --git a/tests/lib/avatar.php b/tests/lib/avatar.php
index e852a7fc6ff..9e1f367108d 100644
--- a/tests/lib/avatar.php
+++ b/tests/lib/avatar.php
@@ -10,7 +10,9 @@
use OC\Avatar;
class Test_Avatar extends \Test\TestCase {
+ private static $trashBinStatus;
+ /** @var @var string */
private $user;
protected function setUp() {
@@ -21,6 +23,17 @@ class Test_Avatar extends \Test\TestCase {
\OC\Files\Filesystem::mount($storage, array(), '/' . $this->user . '/');
}
+ public static function setUpBeforeClass() {
+ self::$trashBinStatus = \OC_App::isEnabled('files_trashbin');
+ \OC_App::disable('files_trashbin');
+ }
+
+ public static function tearDownAfterClass() {
+ if (self::$trashBinStatus) {
+ \OC_App::enable('files_trashbin');
+ }
+ }
+
public function testAvatar() {
$avatar = new Avatar($this->user);
diff --git a/tests/lib/cache/file.php b/tests/lib/cache/file.php
index d51322036c8..153cb198f13 100644
--- a/tests/lib/cache/file.php
+++ b/tests/lib/cache/file.php
@@ -38,15 +38,8 @@ class FileCache extends \Test_Cache {
parent::setUp();
//clear all proxies and hooks so we can do clean testing
- \OC_FileProxy::clearProxies();
\OC_Hook::clear('OC_Filesystem');
- //disabled atm
- //enable only the encryption hook if needed
- //if(OC_App::isEnabled('files_encryption')) {
- // OC_FileProxy::register(new OC_FileProxy_Encryption());
- //}
-
//set up temporary storage
$this->storage = \OC\Files\Filesystem::getStorage('/');
\OC\Files\Filesystem::clearMounts();
diff --git a/tests/lib/cache/usercache.php b/tests/lib/cache/usercache.php
index 3822a714d5a..26a9158ab3a 100644
--- a/tests/lib/cache/usercache.php
+++ b/tests/lib/cache/usercache.php
@@ -34,15 +34,8 @@ class UserCache extends \Test_Cache {
parent::setUp();
//clear all proxies and hooks so we can do clean testing
- \OC_FileProxy::clearProxies();
\OC_Hook::clear('OC_Filesystem');
- //disabled atm
- //enable only the encryption hook if needed
- //if(OC_App::isEnabled('files_encryption')) {
- // OC_FileProxy::register(new OC_FileProxy_Encryption());
- //}
-
//set up temporary storage
$this->storage = \OC\Files\Filesystem::getStorage('/');
\OC\Files\Filesystem::clearMounts();
diff --git a/tests/lib/encryption/keys/storage.php b/tests/lib/encryption/keys/storage.php
index c2e5bdbd3d1..8ab46987f8c 100644
--- a/tests/lib/encryption/keys/storage.php
+++ b/tests/lib/encryption/keys/storage.php
@@ -28,6 +28,9 @@ use Test\TestCase;
class StorageTest extends TestCase {
+ /** @var Storage */
+ protected $storage;
+
/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $util;
@@ -45,6 +48,8 @@ class StorageTest extends TestCase {
->disableOriginalConstructor()
->getMock();
+ $this->storage = new Storage('encModule', $this->view, $this->util);
+
}
public function testSetFileKey() {
@@ -63,10 +68,8 @@ class StorageTest extends TestCase {
$this->equalTo('key'))
->willReturn(strlen('key'));
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key')
+ $this->storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key')
);
}
@@ -89,10 +92,8 @@ class StorageTest extends TestCase {
->with($this->equalTo('/user1/files_encryption/keys/files/foo.txt/encModule/fileKey'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertSame('key',
- $storage->getFileKey('user1/files/foo.txt', 'fileKey')
+ $this->storage->getFileKey('user1/files/foo.txt', 'fileKey')
);
}
@@ -112,10 +113,8 @@ class StorageTest extends TestCase {
$this->equalTo('key'))
->willReturn(strlen('key'));
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key')
+ $this->storage->setFileKey('user1/files/foo.txt', 'fileKey', 'key')
);
}
@@ -138,10 +137,8 @@ class StorageTest extends TestCase {
->with($this->equalTo('/files_encryption/keys/files/foo.txt/encModule/fileKey'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertSame('key',
- $storage->getFileKey('user1/files/foo.txt', 'fileKey')
+ $this->storage->getFileKey('user1/files/foo.txt', 'fileKey')
);
}
@@ -152,10 +149,8 @@ class StorageTest extends TestCase {
$this->equalTo('key'))
->willReturn(strlen('key'));
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->setSystemUserKey('shareKey_56884', 'key')
+ $this->storage->setSystemUserKey('shareKey_56884', 'key')
);
}
@@ -166,10 +161,8 @@ class StorageTest extends TestCase {
$this->equalTo('key'))
->willReturn(strlen('key'));
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->setUserKey('user1', 'publicKey', 'key')
+ $this->storage->setUserKey('user1', 'publicKey', 'key')
);
}
@@ -183,10 +176,8 @@ class StorageTest extends TestCase {
->with($this->equalTo('/files_encryption/encModule/shareKey_56884'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertSame('key',
- $storage->getSystemUserKey('shareKey_56884')
+ $this->storage->getSystemUserKey('shareKey_56884')
);
}
@@ -200,10 +191,8 @@ class StorageTest extends TestCase {
->with($this->equalTo('/user1/files_encryption/encModule/user1.publicKey'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertSame('key',
- $storage->getUserKey('user1', 'publicKey')
+ $this->storage->getUserKey('user1', 'publicKey')
);
}
@@ -213,10 +202,8 @@ class StorageTest extends TestCase {
->with($this->equalTo('/user1/files_encryption/encModule/user1.publicKey'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->deleteUserKey('user1', 'publicKey')
+ $this->storage->deleteUserKey('user1', 'publicKey')
);
}
@@ -226,10 +213,8 @@ class StorageTest extends TestCase {
->with($this->equalTo('/files_encryption/encModule/shareKey_56884'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->deleteSystemUserKey('shareKey_56884')
+ $this->storage->deleteSystemUserKey('shareKey_56884')
);
}
@@ -248,10 +233,8 @@ class StorageTest extends TestCase {
->with($this->equalTo('/files_encryption/keys/files/foo.txt/encModule/fileKey'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->deleteFileKey('user1/files/foo.txt', 'fileKey')
+ $this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey')
);
}
@@ -270,11 +253,109 @@ class StorageTest extends TestCase {
->with($this->equalTo('/user1/files_encryption/keys/files/foo.txt/encModule/fileKey'))
->willReturn(true);
- $storage = new Storage('encModule', $this->view, $this->util);
-
$this->assertTrue(
- $storage->deleteFileKey('user1/files/foo.txt', 'fileKey')
+ $this->storage->deleteFileKey('user1/files/foo.txt', 'fileKey')
+ );
+ }
+
+ /**
+ * @dataProvider dataProviderCopyRename
+ */
+ public function testRenameKeys($source, $target, $systemWideMount, $expectedSource, $expectedTarget) {
+ $this->view->expects($this->any())
+ ->method('file_exists')
+ ->willReturn(true);
+ $this->view->expects($this->any())
+ ->method('is_dir')
+ ->willReturn(true);
+ $this->view->expects($this->once())
+ ->method('rename')
+ ->with(
+ $this->equalTo($expectedSource),
+ $this->equalTo($expectedTarget))
+ ->willReturn(true);
+ $this->util->expects($this->any())
+ ->method('getUidAndFilename')
+ ->will($this->returnCallback(array($this, 'getUidAndFilenameCallback')));
+ $this->util->expects($this->any())
+ ->method('isSystemWideMountPoint')
+ ->willReturn($systemWideMount);
+
+ $this->storage->renameKeys($source, $target);
+ }
+
+ /**
+ * @dataProvider dataProviderCopyRename
+ */
+ public function testCopyKeys($source, $target, $systemWideMount, $expectedSource, $expectedTarget) {
+ $this->view->expects($this->any())
+ ->method('file_exists')
+ ->willReturn(true);
+ $this->view->expects($this->any())
+ ->method('is_dir')
+ ->willReturn(true);
+ $this->view->expects($this->once())
+ ->method('copy')
+ ->with(
+ $this->equalTo($expectedSource),
+ $this->equalTo($expectedTarget))
+ ->willReturn(true);
+ $this->util->expects($this->any())
+ ->method('getUidAndFilename')
+ ->will($this->returnCallback(array($this, 'getUidAndFilenameCallback')));
+ $this->util->expects($this->any())
+ ->method('isSystemWideMountPoint')
+ ->willReturn($systemWideMount);
+
+ $this->storage->copyKeys($source, $target);
+ }
+
+ public function getUidAndFilenameCallback() {
+ $args = func_get_args();
+
+ $path = $args[0];
+ $parts = explode('/', $path);
+
+ return array($parts[1], '/' . implode('/', array_slice($parts, 2)));
+ }
+
+ public function dataProviderCopyRename() {
+ return array(
+ array('/user1/files/foo.txt', '/user1/files/bar.txt', false,
+ '/user1/files_encryption/keys/files/foo.txt/', '/user1/files_encryption/keys/files/bar.txt/'),
+ array('/user1/files/foo/foo.txt', '/user1/files/bar.txt', false,
+ '/user1/files_encryption/keys/files/foo/foo.txt/', '/user1/files_encryption/keys/files/bar.txt/'),
+ array('/user1/files/foo.txt', '/user1/files/foo/bar.txt', false,
+ '/user1/files_encryption/keys/files/foo.txt/', '/user1/files_encryption/keys/files/foo/bar.txt/'),
+ array('/user1/files/foo.txt', '/user1/files/foo/bar.txt', true,
+ '/files_encryption/keys/files/foo.txt/', '/files_encryption/keys/files/foo/bar.txt/'),
);
}
+ public function testKeySetPreparation() {
+ $this->view->expects($this->any())
+ ->method('file_exists')
+ ->willReturn(false);
+ $this->view->expects($this->any())
+ ->method('is_dir')
+ ->willReturn(false);
+ $this->view->expects($this->any())
+ ->method('mkdir')
+ ->will($this->returnCallback(array($this, 'mkdirCallback')));
+
+ $this->mkdirStack = array(
+ '/user1/files_encryption/keys/foo',
+ '/user1/files_encryption/keys',
+ '/user1/files_encryption',
+ '/user1');
+
+ \Test_Helper::invokePrivate($this->storage, 'keySetPreparation', array('/user1/files_encryption/keys/foo'));
+ }
+
+ public function mkdirCallback() {
+ $args = func_get_args();
+ $expected = array_pop($this->mkdirStack);
+ $this->assertSame($expected, $args[0]);
+ }
+
}
diff --git a/tests/lib/encryption/managertest.php b/tests/lib/encryption/managertest.php
index ab297bae0cb..4fcbc3b9983 100644
--- a/tests/lib/encryption/managertest.php
+++ b/tests/lib/encryption/managertest.php
@@ -111,4 +111,62 @@ class ManagerTest extends TestCase {
$en0 = $m->getEncryptionModule(0);
$this->assertEquals(0, $en0->getId());
}
+
+// /**
+// * @expectedException \OC\Encryption\Exceptions\ModuleAlreadyExistsException
+// * @expectedExceptionMessage Id "0" already used by encryption module "TestDummyModule0"
+// */
+// public function testModuleRegistration() {
+// $config = $this->getMock('\OCP\IConfig');
+// $config->expects($this->any())->method('getSystemValue')->willReturn(true);
+// $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
+// $em->expects($this->any())->method('getId')->willReturn(0);
+// $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
+// $m = new Manager($config);
+// $m->registerEncryptionModule($em);
+// $this->assertTrue($m->isEnabled());
+// $m->registerEncryptionModule($em);
+// }
+//
+// public function testModuleUnRegistration() {
+// $config = $this->getMock('\OCP\IConfig');
+// $config->expects($this->any())->method('getSystemValue')->willReturn(true);
+// $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
+// $em->expects($this->any())->method('getId')->willReturn(0);
+// $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
+// $m = new Manager($config);
+// $m->registerEncryptionModule($em);
+// $this->assertTrue($m->isEnabled());
+// $m->unregisterEncryptionModule($em);
+// $this->assertFalse($m->isEnabled());
+// }
+//
+// /**
+// * @expectedException \OC\Encryption\Exceptions\ModuleDoesNotExistsException
+// * @expectedExceptionMessage Module with id: unknown does not exists.
+// */
+// public function testGetEncryptionModuleUnknown() {
+// $config = $this->getMock('\OCP\IConfig');
+// $config->expects($this->any())->method('getSystemValue')->willReturn(true);
+// $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
+// $em->expects($this->any())->method('getId')->willReturn(0);
+// $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
+// $m = new Manager($config);
+// $m->registerEncryptionModule($em);
+// $this->assertTrue($m->isEnabled());
+// $m->getEncryptionModule('unknown');
+// }
+//
+// public function testGetEncryptionModule() {
+// $config = $this->getMock('\OCP\IConfig');
+// $config->expects($this->any())->method('getSystemValue')->willReturn(true);
+// $em = $this->getMock('\OCP\Encryption\IEncryptionModule');
+// $em->expects($this->any())->method('getId')->willReturn(0);
+// $em->expects($this->any())->method('getDisplayName')->willReturn('TestDummyModule0');
+// $m = new Manager($config);
+// $m->registerEncryptionModule($em);
+// $this->assertTrue($m->isEnabled());
+// $en0 = $m->getEncryptionModule(0);
+// $this->assertEquals(0, $en0->getId());
+// }
}
diff --git a/tests/lib/encryption/utiltest.php b/tests/lib/encryption/utiltest.php
index 672f9ff5e97..03aefe61151 100644
--- a/tests/lib/encryption/utiltest.php
+++ b/tests/lib/encryption/utiltest.php
@@ -20,6 +20,9 @@ class UtilTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject */
protected $userManager;
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ private $config;
+
public function setUp() {
parent::setUp();
$this->view = $this->getMockBuilder('OC\Files\View')
@@ -29,13 +32,18 @@ class UtilTest extends TestCase {
$this->userManager = $this->getMockBuilder('OC\User\Manager')
->disableOriginalConstructor()
->getMock();
+
+ $this->config = $this->getMockBuilder('OCP\IConfig')
+ ->disableOriginalConstructor()
+ ->getMock();
+
}
/**
* @dataProvider providesHeadersForEncryptionModule
*/
public function testGetEncryptionModuleId($expected, $header) {
- $u = new Util($this->view, $this->userManager);
+ $u = new Util($this->view, $this->userManager, $this->config);
$id = $u->getEncryptionModuleId($header);
$this->assertEquals($expected, $id);
}
@@ -53,7 +61,7 @@ class UtilTest extends TestCase {
*/
public function testReadHeader($header, $expected, $moduleId) {
$expected['oc_encryption_module'] = $moduleId;
- $u = new Util($this->view, $this->userManager);
+ $u = new Util($this->view, $this->userManager, $this->config);
$result = $u->readHeader($header);
$this->assertSameSize($expected, $result);
foreach ($expected as $key => $value) {
@@ -70,7 +78,7 @@ class UtilTest extends TestCase {
$em = $this->getMock('\OCP\Encryption\IEncryptionModule');
$em->expects($this->any())->method('getId')->willReturn($moduleId);
- $u = new Util($this->view, $this->userManager);
+ $u = new Util($this->view, $this->userManager, $this->config);
$result = $u->createHeader($header, $em);
$this->assertEquals($expected, $result);
}
@@ -94,7 +102,7 @@ class UtilTest extends TestCase {
$em = $this->getMock('\OCP\Encryption\IEncryptionModule');
$em->expects($this->any())->method('getId')->willReturn('moduleId');
- $u = new Util($this->view, $this->userManager);
+ $u = new Util($this->view, $this->userManager, $this->config);
$u->createHeader($header, $em);
}
@@ -107,7 +115,7 @@ class UtilTest extends TestCase {
->method('userExists')
->will($this->returnCallback(array($this, 'isExcludedCallback')));
- $u = new Util($this->view, $this->userManager);
+ $u = new Util($this->view, $this->userManager, $this->config);
$this->assertSame($expected,
$u->isExcluded($path)
diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php
index f0ad6cf3ab1..9a64375f4e3 100644
--- a/tests/lib/files/cache/cache.php
+++ b/tests/lib/files/cache/cache.php
@@ -183,8 +183,8 @@ class Cache extends \Test\TestCase {
$file3 = 'folder/foo';
$data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
$fileData = array();
- $fileData['bar'] = array('size' => 1000, 'unencrypted_size' => 900, 'encrypted' => 1, 'mtime' => 20, 'mimetype' => 'foo/file');
- $fileData['foo'] = array('size' => 20, 'unencrypted_size' => 16, 'encrypted' => 1, 'mtime' => 25, 'mimetype' => 'foo/file');
+ $fileData['bar'] = array('size' => 1000, 'encrypted' => 1, 'mtime' => 20, 'mimetype' => 'foo/file');
+ $fileData['foo'] = array('size' => 20, 'encrypted' => 1, 'mtime' => 25, 'mimetype' => 'foo/file');
$this->cache->put($file1, $data1);
$this->cache->put($file2, $fileData['bar']);
@@ -194,8 +194,6 @@ class Cache extends \Test\TestCase {
$this->assertEquals(count($content), 2);
foreach ($content as $cachedData) {
$data = $fileData[$cachedData['name']];
- // indirect retrieval swaps unencrypted_size and size
- $this->assertEquals($data['unencrypted_size'], $cachedData['size']);
}
$file4 = 'folder/unkownSize';
@@ -207,11 +205,10 @@ class Cache extends \Test\TestCase {
$fileData['unkownSize'] = array('size' => 5, 'mtime' => 25, 'mimetype' => 'foo/file');
$this->cache->put($file4, $fileData['unkownSize']);
- $this->assertEquals(916, $this->cache->calculateFolderSize($file1));
+ $this->assertEquals(1025, $this->cache->calculateFolderSize($file1));
// direct cache entry retrieval returns the original values
$entry = $this->cache->get($file1);
$this->assertEquals(1025, $entry['size']);
- $this->assertEquals(916, $entry['unencrypted_size']);
$this->cache->remove($file2);
$this->cache->remove($file3);
diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php
index 970af2e68df..7c3ebd5a6f9 100644
--- a/tests/lib/files/cache/updater.php
+++ b/tests/lib/files/cache/updater.php
@@ -33,16 +33,12 @@ class Updater extends \Test\TestCase {
*/
protected $updater;
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
protected function setUp() {
parent::setUp();
- $this->originalStorage = Filesystem::getStorage('/');
+ $this->loginAsUser();
$this->storage = new Temporary(array());
- Filesystem::clearMounts();
Filesystem::mount($this->storage, array(), '/');
$this->view = new View('');
$this->updater = new \OC\Files\Cache\Updater($this->view);
@@ -51,8 +47,8 @@ class Updater extends \Test\TestCase {
protected function tearDown() {
Filesystem::clearMounts();
- Filesystem::mount($this->originalStorage, array(), '/');
+ $this->logout();
parent::tearDown();
}
diff --git a/tests/lib/files/cache/updaterlegacy.php b/tests/lib/files/cache/updaterlegacy.php
index 99cacca8e95..f4d52e9a390 100644
--- a/tests/lib/files/cache/updaterlegacy.php
+++ b/tests/lib/files/cache/updaterlegacy.php
@@ -22,26 +22,16 @@ class UpdaterLegacy extends \Test\TestCase {
*/
private $scanner;
- private $stateFilesEncryption;
-
/**
* @var \OC\Files\Cache\Cache $cache
*/
private $cache;
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
private static $user;
protected function setUp() {
parent::setUp();
- // remember files_encryption state
- $this->stateFilesEncryption = \OC_App::isEnabled('files_encryption');
- // we want to tests with the encryption app disabled
- \OC_App::disable('files_encryption');
-
$this->storage = new \OC\Files\Storage\Temporary(array());
$textData = "dummy file data\n";
$imgData = file_get_contents(\OC::$SERVERROOT . '/core/img/logo.png');
@@ -55,14 +45,12 @@ class UpdaterLegacy extends \Test\TestCase {
$this->scanner->scan('');
$this->cache = $this->storage->getCache();
- $this->originalStorage = Filesystem::getStorage('/');
- Filesystem::tearDown();
if (!self::$user) {
self::$user = $this->getUniqueID();
}
\OC_User::createUser(self::$user, 'password');
- \OC_User::setUserId(self::$user);
+ $this->loginAsUser(self::$user);
Filesystem::init(self::$user, '/' . self::$user . '/files');
@@ -78,13 +66,8 @@ class UpdaterLegacy extends \Test\TestCase {
}
$result = \OC_User::deleteUser(self::$user);
$this->assertTrue($result);
- Filesystem::tearDown();
- Filesystem::mount($this->originalStorage, array(), '/');
- // reset app files_encryption
- if ($this->stateFilesEncryption) {
- \OC_App::enable('files_encryption');
- }
+ $this->logout();
parent::tearDown();
}
diff --git a/tests/lib/files/cache/watcher.php b/tests/lib/files/cache/watcher.php
index ee605c64e01..e6947e36a17 100644
--- a/tests/lib/files/cache/watcher.php
+++ b/tests/lib/files/cache/watcher.php
@@ -15,14 +15,10 @@ class Watcher extends \Test\TestCase {
*/
private $storages = array();
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
protected function setUp() {
parent::setUp();
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
- \OC\Files\Filesystem::clearMounts();
+ $this->loginAsUser();
}
protected function tearDown() {
@@ -32,9 +28,7 @@ class Watcher extends \Test\TestCase {
$cache->clear();
}
- \OC\Files\Filesystem::clearMounts();
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
-
+ $this->logout();
parent::tearDown();
}
diff --git a/tests/lib/files/etagtest.php b/tests/lib/files/etagtest.php
index eec24d9f4c6..055927652bc 100644
--- a/tests/lib/files/etagtest.php
+++ b/tests/lib/files/etagtest.php
@@ -16,16 +16,11 @@ class EtagTest extends \Test\TestCase {
private $tmpDir;
- private $uid;
-
/**
* @var \OC_User_Dummy $userBackend
*/
private $userBackend;
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
protected function setUp() {
parent::setUp();
@@ -37,21 +32,15 @@ class EtagTest extends \Test\TestCase {
$this->datadir = \OC_Config::getValue('datadirectory');
$this->tmpDir = \OC_Helper::tmpFolder();
\OC_Config::setValue('datadirectory', $this->tmpDir);
- $this->uid = \OC_User::getUser();
- \OC_User::setUserId(null);
$this->userBackend = new \OC_User_Dummy();
\OC_User::useBackend($this->userBackend);
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
- \OC_Util::tearDownFS();
}
protected function tearDown() {
\OC_Config::setValue('datadirectory', $this->datadir);
- \OC_User::setUserId($this->uid);
- \OC_Util::setupFS($this->uid);
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
+ $this->logout();
parent::tearDown();
}
@@ -59,9 +48,7 @@ class EtagTest extends \Test\TestCase {
$user1 = $this->getUniqueID('user_');
$this->userBackend->createUser($user1, '');
- \OC_Util::tearDownFS();
- \OC_User::setUserId($user1);
- \OC_Util::setupFS($user1);
+ $this->loginAsUser($user1);
Filesystem::mkdir('/folder');
Filesystem::mkdir('/folder/subfolder');
Filesystem::file_put_contents('/foo.txt', 'asd');
diff --git a/tests/lib/files/filesystem.php b/tests/lib/files/filesystem.php
index 7bf59315d77..98e96e0cc78 100644
--- a/tests/lib/files/filesystem.php
+++ b/tests/lib/files/filesystem.php
@@ -28,9 +28,6 @@ class Filesystem extends \Test\TestCase {
*/
private $tmpDirs = array();
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
/**
* @return array
*/
@@ -42,20 +39,15 @@ class Filesystem extends \Test\TestCase {
protected function setUp() {
parent::setUp();
-
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
- \OC_User::setUserId('');
- \OC\Files\Filesystem::clearMounts();
+ $this->loginAsUser();
}
protected function tearDown() {
foreach ($this->tmpDirs as $dir) {
\OC_Helper::rmdirr($dir);
}
- \OC\Files\Filesystem::clearMounts();
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
- \OC_User::setUserId('');
+ $this->logout();
parent::tearDown();
}
diff --git a/tests/lib/files/node/integration.php b/tests/lib/files/node/integration.php
index 456a4a0e287..4e362607240 100644
--- a/tests/lib/files/node/integration.php
+++ b/tests/lib/files/node/integration.php
@@ -20,9 +20,6 @@ class IntegrationTests extends \Test\TestCase {
*/
private $root;
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
/**
* @var \OC\Files\Storage\Storage[]
*/
@@ -36,9 +33,6 @@ class IntegrationTests extends \Test\TestCase {
protected function setUp() {
parent::setUp();
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
- \OC\Files\Filesystem::init('', '');
- \OC\Files\Filesystem::clearMounts();
$manager = \OC\Files\Filesystem::getMountManager();
\OC_Hook::clear('OC_Filesystem');
@@ -49,7 +43,8 @@ class IntegrationTests extends \Test\TestCase {
\OC_Hook::connect('OC_Filesystem', 'post_touch', '\OC\Files\Cache\Updater', 'touchHook');
$user = new User($this->getUniqueID('user'), new \OC_User_Dummy);
- \OC_User::setUserId($user->getUID());
+ $this->loginAsUser($user->getUID());
+
$this->view = new View();
$this->root = new Root($manager, $this->view, $user);
$storage = new Temporary(array());
@@ -64,9 +59,8 @@ class IntegrationTests extends \Test\TestCase {
foreach ($this->storages as $storage) {
$storage->getCache()->clear();
}
- \OC\Files\Filesystem::clearMounts();
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
+ $this->logout();
parent::tearDown();
}
diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php
index 30f403d60df..938fecb5bf3 100644
--- a/tests/lib/files/storage/storage.php
+++ b/tests/lib/files/storage/storage.php
@@ -104,13 +104,14 @@ abstract class Storage extends \Test\TestCase {
}
public function directoryProvider() {
- return array(
- array('folder'),
- array(' folder'),
- array('folder '),
- array('folder with space'),
- array('spéciäl földer'),
- );
+ return [
+ ['folder'],
+ [' folder'],
+ ['folder '],
+ ['folder with space'],
+ ['spéciäl földer'],
+ ['test single\'quote'],
+ ];
}
function loremFileProvider() {
@@ -163,15 +164,16 @@ abstract class Storage extends \Test\TestCase {
public function copyAndMoveProvider() {
- return array(
- array('/source.txt', '/target.txt'),
- array('/source.txt', '/target with space.txt'),
- array('/source with space.txt', '/target.txt'),
- array('/source with space.txt', '/target with space.txt'),
- array('/source.txt', '/tärgét.txt'),
- array('/sòurcē.txt', '/target.txt'),
- array('/sòurcē.txt', '/tärgét.txt'),
- );
+ return [
+ ['/source.txt', '/target.txt'],
+ ['/source.txt', '/target with space.txt'],
+ ['/source with space.txt', '/target.txt'],
+ ['/source with space.txt', '/target with space.txt'],
+ ['/source.txt', '/tärgét.txt'],
+ ['/sòurcē.txt', '/target.txt'],
+ ['/sòurcē.txt', '/tärgét.txt'],
+ ['/single \' quote.txt', '/tar\'get.txt'],
+ ];
}
public function initSourceAndTarget ($source, $target = null) {
@@ -251,7 +253,7 @@ abstract class Storage extends \Test\TestCase {
$this->instance->file_put_contents('/lorem.txt', file_get_contents($textFile));
$localFile = $this->instance->getLocalFile('/lorem.txt');
$this->assertTrue(file_exists($localFile));
- $this->assertEquals(file_get_contents($localFile), file_get_contents($textFile));
+ $this->assertEquals(file_get_contents($textFile), file_get_contents($localFile));
$this->instance->mkdir('/folder');
$this->instance->file_put_contents('/folder/lorem.txt', file_get_contents($textFile));
diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php
new file mode 100644
index 00000000000..bf4464f0eb9
--- /dev/null
+++ b/tests/lib/files/storage/wrapper/encryption.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace Test\Files\Storage\Wrapper;
+
+use OC\Files\Storage\Temporary;
+use OC\Files\View;
+
+class Encryption extends \Test\Files\Storage\Storage {
+
+ /**
+ * @var Temporary
+ */
+ private $sourceStorage;
+
+ public function setUp() {
+
+ parent::setUp();
+
+ $mockModule = $this->buildMockModule();
+ $encryptionManager = $this->getMockBuilder('\OC\Encryption\Manager')
+ ->disableOriginalConstructor()
+ ->setMethods(['getDefaultEncryptionModule', 'getEncryptionModule', 'isEnabled'])
+ ->getMock();
+ $encryptionManager->expects($this->any())
+ ->method('getDefaultEncryptionModule')
+ ->willReturn($mockModule);
+ $encryptionManager->expects($this->any())
+ ->method('getEncryptionModule')
+ ->willReturn($mockModule);
+ $encryptionManager->expects($this->any())
+ ->method('isEnabled')
+ ->willReturn(true);
+
+ $config = $this->getMockBuilder('\OCP\IConfig')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $util = $this->getMock('\OC\Encryption\Util', ['getUidAndFilename'], [new View(), new \OC\User\Manager(), $config]);
+ $util->expects($this->any())
+ ->method('getUidAndFilename')
+ ->willReturnCallback(function ($path) {
+ return ['user1', $path];
+ });
+
+ $file = $this->getMockBuilder('\OC\Encryption\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $logger = $this->getMock('\OC\Log');
+
+ $this->sourceStorage = new Temporary(array());
+ $keyStore = $this->getMockBuilder('\OC\Encryption\Keys\Storage')
+ ->disableOriginalConstructor()->getMock();
+ $mount = $this->getMockBuilder('\OC\Files\Mount\MountPoint')
+ ->disableOriginalConstructor()
+ ->setMethods(['getOption'])
+ ->getMock();
+ $mount->expects($this->any())->method('getOption')->willReturn(true);
+ $this->instance = new EncryptionWrapper([
+ 'storage' => $this->sourceStorage,
+ 'root' => 'foo',
+ 'mountPoint' => '/',
+ 'mount' => $mount
+ ],
+ $encryptionManager, $util, $logger, $file, null, $keyStore
+ );
+ }
+
+ /**
+ * @return \PHPUnit_Framework_MockObject_MockObject
+ */
+ protected function buildMockModule() {
+ $encryptionModule = $this->getMockBuilder('\OCP\Encryption\IEncryptionModule')
+ ->disableOriginalConstructor()
+ ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'calculateUnencryptedSize', 'getUnencryptedBlockSize'])
+ ->getMock();
+
+ $encryptionModule->expects($this->any())->method('getId')->willReturn('UNIT_TEST_MODULE');
+ $encryptionModule->expects($this->any())->method('getDisplayName')->willReturn('Unit test module');
+ $encryptionModule->expects($this->any())->method('begin')->willReturn([]);
+ $encryptionModule->expects($this->any())->method('end')->willReturn('');
+ $encryptionModule->expects($this->any())->method('encrypt')->willReturnArgument(0);
+ $encryptionModule->expects($this->any())->method('decrypt')->willReturnArgument(0);
+ $encryptionModule->expects($this->any())->method('update')->willReturn(true);
+ $encryptionModule->expects($this->any())->method('shouldEncrypt')->willReturn(true);
+ $encryptionModule->expects($this->any())->method('calculateUnencryptedSize')->willReturn(42);
+ $encryptionModule->expects($this->any())->method('getUnencryptedBlockSize')->willReturn(8192);
+ return $encryptionModule;
+ }
+
+// public function testMkDirRooted() {
+// $this->instance->mkdir('bar');
+// $this->assertTrue($this->sourceStorage->is_dir('foo/bar'));
+// }
+//
+// public function testFilePutContentsRooted() {
+// $this->instance->file_put_contents('bar', 'asd');
+// $this->assertEquals('asd', $this->sourceStorage->file_get_contents('foo/bar'));
+// }
+}
+
+//
+// FIXME: this is too bad and needs adjustment
+//
+class EncryptionWrapper extends \OC\Files\Storage\Wrapper\Encryption {
+ private $keyStore;
+
+ public function __construct(
+ $parameters,
+ \OC\Encryption\Manager $encryptionManager = null,
+ \OC\Encryption\Util $util = null,
+ \OC\Log $logger = null,
+ \OC\Encryption\File $fileHelper = null,
+ $uid = null,
+ $keyStore = null
+ ) {
+ $this->keyStore = $keyStore;
+ parent::__construct($parameters, $encryptionManager, $util, $logger, $fileHelper, $uid);
+ }
+
+ protected function getKeyStorage($encryptionModuleId) {
+ return $this->keyStore;
+ }
+
+}
diff --git a/tests/lib/files/storage/wrapper/jail.php b/tests/lib/files/storage/wrapper/jail.php
index 270ce750ecf..a7bd684df44 100644
--- a/tests/lib/files/storage/wrapper/jail.php
+++ b/tests/lib/files/storage/wrapper/jail.php
@@ -9,10 +9,6 @@
namespace Test\Files\Storage\Wrapper;
class Jail extends \Test\Files\Storage\Storage {
- /**
- * @var string tmpDir
- */
- private $tmpDir;
/**
* @var \OC\Files\Storage\Temporary
diff --git a/tests/lib/files/storage/wrapper/quota.php b/tests/lib/files/storage/wrapper/quota.php
index 8ca8f308b71..a5828296be9 100644
--- a/tests/lib/files/storage/wrapper/quota.php
+++ b/tests/lib/files/storage/wrapper/quota.php
@@ -59,7 +59,7 @@ class Quota extends \Test\Files\Storage\Storage {
public function testFreeSpaceWithUsedSpace() {
$instance = $this->getLimitedStorage(9);
$instance->getCache()->put(
- '', array('size' => 3, 'unencrypted_size' => 0)
+ '', array('size' => 3)
);
$this->assertEquals(6, $instance->free_space(''));
}
@@ -77,7 +77,7 @@ class Quota extends \Test\Files\Storage\Storage {
$instance = new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage, 'quota' => 9));
$instance->getCache()->put(
- '', array('size' => 3, 'unencrypted_size' => 0)
+ '', array('size' => 3)
);
$this->assertEquals(6, $instance->free_space(''));
}
@@ -85,9 +85,9 @@ class Quota extends \Test\Files\Storage\Storage {
public function testFreeSpaceWithUsedSpaceAndEncryption() {
$instance = $this->getLimitedStorage(9);
$instance->getCache()->put(
- '', array('size' => 7, 'unencrypted_size' => 3)
+ '', array('size' => 7)
);
- $this->assertEquals(6, $instance->free_space(''));
+ $this->assertEquals(2, $instance->free_space(''));
}
public function testFWriteNotEnoughSpace() {
diff --git a/tests/lib/files/stream/encryption.php b/tests/lib/files/stream/encryption.php
new file mode 100644
index 00000000000..84156337ad7
--- /dev/null
+++ b/tests/lib/files/stream/encryption.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Test\Files\Stream;
+
+use OC\Files\View;
+use OCA\Encryption_Dummy\DummyModule;
+
+class Encryption extends \Test\TestCase {
+
+ /**
+ * @param string $mode
+ * @param integer $limit
+ */
+ protected function getStream($fileName, $mode, $unencryptedSize) {
+
+ $size = filesize($fileName);
+ $source = fopen($fileName, $mode);
+ $internalPath = $fileName;
+ $fullPath = $fileName;
+ $header = [];
+ $uid = '';
+ $encryptionModule = $this->buildMockModule();
+ $storage = $this->getMockBuilder('\OC\Files\Storage\Storage')
+ ->disableOriginalConstructor()->getMock();
+ $encStorage = $this->getMockBuilder('\OC\Files\Storage\Wrapper\Encryption')
+ ->disableOriginalConstructor()->getMock();
+ $config = $this->getMockBuilder('\OCP\IConfig')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $file = $this->getMockBuilder('\OC\Encryption\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $util = $this->getMock('\OC\Encryption\Util', ['getUidAndFilename'], [new View(), new \OC\User\Manager(), $config]);
+ $util->expects($this->any())
+ ->method('getUidAndFilename')
+ ->willReturn(['user1', $internalPath]);
+
+ return \OC\Files\Stream\Encryption::wrap($source, $internalPath,
+ $fullPath, $header, $uid, $encryptionModule, $storage, $encStorage,
+ $util, $file, $mode, $size, $unencryptedSize);
+ }
+
+ public function testWriteRead() {
+ $fileName = tempnam("/tmp", "FOO");
+ $stream = $this->getStream($fileName, 'w+', 0);
+ $this->assertEquals(6, fwrite($stream, 'foobar'));
+ fclose($stream);
+
+ $stream = $this->getStream($fileName, 'r', 6);
+ $this->assertEquals('foobar', fread($stream, 100));
+ fclose($stream);
+ }
+
+ public function testSeek() {
+ $fileName = tempnam("/tmp", "FOO");
+ $stream = $this->getStream($fileName, 'w+', 0);
+ $this->assertEquals(6, fwrite($stream, 'foobar'));
+ $this->assertEquals(0, fseek($stream, 3));
+ $this->assertEquals(6, fwrite($stream, 'foobar'));
+ fclose($stream);
+
+ $stream = $this->getStream($fileName, 'r', 9);
+ $this->assertEquals('foofoobar', fread($stream, 100));
+ fclose($stream);
+ }
+
+ public function testWriteReadBigFile() {
+ $expectedData = file_get_contents(\OC::$SERVERROOT . '/tests/data/lorem-big.txt');
+ // write it
+ $fileName = tempnam("/tmp", "FOO");
+ $stream = $this->getStream($fileName, 'w+', 0);
+ fwrite($stream, $expectedData);
+ fclose($stream);
+
+ // read it all
+ $stream = $this->getStream($fileName, 'r', strlen($expectedData));
+ $data = stream_get_contents($stream);
+ fclose($stream);
+
+ $this->assertEquals($expectedData, $data);
+ }
+
+ /**
+ * @return \PHPUnit_Framework_MockObject_MockObject
+ */
+ protected function buildMockModule() {
+ $encryptionModule = $this->getMockBuilder('\OCP\Encryption\IEncryptionModule')
+ ->disableOriginalConstructor()
+ ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'calculateUnencryptedSize', 'getUnencryptedBlockSize'])
+ ->getMock();
+
+ $encryptionModule->expects($this->any())->method('getId')->willReturn('UNIT_TEST_MODULE');
+ $encryptionModule->expects($this->any())->method('getDisplayName')->willReturn('Unit test module');
+ $encryptionModule->expects($this->any())->method('begin')->willReturn([]);
+ $encryptionModule->expects($this->any())->method('end')->willReturn('');
+ $encryptionModule->expects($this->any())->method('encrypt')->willReturnArgument(0);
+ $encryptionModule->expects($this->any())->method('decrypt')->willReturnArgument(0);
+ $encryptionModule->expects($this->any())->method('update')->willReturn(true);
+ $encryptionModule->expects($this->any())->method('shouldEncrypt')->willReturn(true);
+ $encryptionModule->expects($this->any())->method('calculateUnencryptedSize')->willReturn(42);
+ $encryptionModule->expects($this->any())->method('getUnencryptedBlockSize')->willReturn(8192);
+ return $encryptionModule;
+ }
+}
diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php
index 65ddfe47514..dfc683c1bcf 100644
--- a/tests/lib/files/utils/scanner.php
+++ b/tests/lib/files/utils/scanner.php
@@ -39,18 +39,14 @@ class TestScanner extends \OC\Files\Utils\Scanner {
}
class Scanner extends \Test\TestCase {
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
protected function setUp() {
parent::setUp();
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
+ $this->loginAsUser();
}
protected function tearDown() {
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
-
+ $this->logout();
parent::tearDown();
}
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index cd9f2d4afd1..2ea9e8de78f 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -27,9 +27,6 @@ class View extends \Test\TestCase {
/** @var \OC\Files\Storage\Storage */
private $tempStorage;
- /** @var \OC\Files\Storage\Storage */
- private $originalStorage;
-
protected function setUp() {
parent::setUp();
@@ -39,9 +36,10 @@ class View extends \Test\TestCase {
//login
\OC_User::createUser('test', 'test');
$this->user = \OC_User::getUser();
- \OC_User::setUserId('test');
- $this->originalStorage = \OC\Files\Filesystem::getStorage('/');
+ $this->loginAsUser('test');
+ // clear mounts but somehow keep the root storage
+ // that was initialized above...
\OC\Files\Filesystem::clearMounts();
$this->tempStorage = null;
@@ -59,9 +57,7 @@ class View extends \Test\TestCase {
system('rm -rf ' . escapeshellarg($this->tempStorage->getDataDir()));
}
- \OC\Files\Filesystem::clearMounts();
- \OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
-
+ $this->logout();
parent::tearDown();
}
diff --git a/tests/lib/group/manager.php b/tests/lib/group/manager.php
index e3462caf806..76996a2b9bb 100644
--- a/tests/lib/group/manager.php
+++ b/tests/lib/group/manager.php
@@ -448,7 +448,7 @@ class Manager extends \Test\TestCase {
$userBackend = $this->getMock('\OC_User_Backend');
$userManager->expects($this->any())
- ->method('search')
+ ->method('searchDisplayName')
->with('user3')
->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) {
switch($offset) {
@@ -513,7 +513,7 @@ class Manager extends \Test\TestCase {
$userBackend = $this->getMock('\OC_User_Backend');
$userManager->expects($this->any())
- ->method('search')
+ ->method('searchDisplayName')
->with('user3')
->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) {
switch($offset) {
@@ -580,7 +580,7 @@ class Manager extends \Test\TestCase {
$userBackend = $this->getMock('\OC_User_Backend');
$userManager->expects($this->any())
- ->method('search')
+ ->method('searchDisplayName')
->with('user3')
->will($this->returnCallback(function($search, $limit, $offset) use ($userBackend) {
switch($offset) {
diff --git a/tests/lib/preview.php b/tests/lib/preview.php
index 2a6761403f4..ea9de9b777e 100644
--- a/tests/lib/preview.php
+++ b/tests/lib/preview.php
@@ -26,6 +26,8 @@ class Preview extends TestCase {
protected function setUp() {
parent::setUp();
+ // FIXME: use proper tearDown with $this->loginAsUser() and $this->logout()
+ // (would currently break the tests for some reason)
$this->originalStorage = \OC\Files\Filesystem::getStorage('/');
// create a new user with his own filesystem view
@@ -48,6 +50,77 @@ class Preview extends TestCase {
parent::tearDown();
}
+ public function testIsMaxSizeWorking() {
+ // Max size from config
+ $maxX = 1024;
+ $maxY = 1024;
+
+ \OC::$server->getConfig()->setSystemValue('preview_max_x', $maxX);
+ \OC::$server->getConfig()->setSystemValue('preview_max_y', $maxY);
+
+ // Sample is 1680x1050 JPEG
+ $sampleFile = '/' . $this->user . '/files/testimage.jpg';
+ $this->rootView->file_put_contents($sampleFile, file_get_contents(\OC::$SERVERROOT.'/tests/data/testimage.jpg'));
+ $fileInfo = $this->rootView->getFileInfo($sampleFile);
+ $fileId = $fileInfo['fileid'];
+
+ $largeX = 1920;
+ $largeY = 1080;
+ $preview = new \OC\Preview($this->user, 'files/', 'testimage.jpg', $largeX, $largeY);
+
+ $this->assertEquals($preview->isFileValid(), true);
+
+ // There should be no cached copy
+ $isCached = $preview->isCached($fileId);
+
+ $this->assertNotEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '-max.png', $isCached);
+ $this->assertNotEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '.png', $isCached);
+ $this->assertNotEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $largeX . '-' . $largeY . '.png', $isCached);
+
+ // The returned preview should be of max size
+ $image = $preview->getPreview();
+
+ $this->assertEquals($image->width(), $maxX);
+ $this->assertEquals($image->height(), $maxY);
+
+ // The max thumbnail should be created
+ $maxThumbCacheFile = '/' . $this->user . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '-max.png';
+
+ $this->assertEquals($this->rootView->file_exists($maxThumbCacheFile), true);
+
+ // A preview of the asked size should not have been created
+ $thumbCacheFile = \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $largeX . '-' . $largeY . '.png';
+
+ $this->assertEquals($this->rootView->file_exists($thumbCacheFile), false);
+
+ // 2nd request should indicate that we have a cached copy of max dimension
+ $isCached = $preview->isCached($fileId);
+ $this->assertEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '.png', $isCached);
+
+ // Smaller previews should be based on the cached max preview
+ $smallX = 50;
+ $smallY = 50;
+ $preview = new \OC\Preview($this->user, 'files/', 'testimage.jpg', $smallX, $smallY);
+ $isCached = $preview->isCached($fileId);
+
+ $this->assertEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '.png', $isCached);
+
+ // A small preview should be created
+ $image = $preview->getPreview();
+ $this->assertEquals($image->width(), $smallX);
+ $this->assertEquals($image->height(), $smallY);
+
+ // The cache should contain the small preview
+ $thumbCacheFile = '/' . $this->user . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $smallX . '-' . $smallY . '.png';
+
+ $this->assertEquals($this->rootView->file_exists($thumbCacheFile), true);
+
+ // 2nd request should indicate that we have a cached copy of the exact dimension
+ $isCached = $preview->isCached($fileId);
+
+ $this->assertEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $smallX . '-' . $smallY . '.png', $isCached);
+ }
+
public function testIsPreviewDeleted() {
$sampleFile = '/'.$this->user.'/files/test.txt';
@@ -96,25 +169,6 @@ class Preview extends TestCase {
$this->assertEquals($this->rootView->is_dir($thumbCacheFolder), false);
}
- public function testIsMaxSizeWorking() {
-
- $maxX = 250;
- $maxY = 250;
-
- \OC_Config::setValue('preview_max_x', $maxX);
- \OC_Config::setValue('preview_max_y', $maxY);
-
- $sampleFile = '/'.$this->user.'/files/test.txt';
-
- $this->rootView->file_put_contents($sampleFile, 'dummy file data');
-
- $preview = new \OC\Preview($this->user, 'files/', 'test.txt', 1000, 1000);
- $image = $preview->getPreview();
-
- $this->assertEquals($image->width(), $maxX);
- $this->assertEquals($image->height(), $maxY);
- }
-
public function txtBlacklist() {
$txt = 'random text file';
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index efae25f7e7a..40ffc14612b 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -221,15 +221,52 @@ class RepairMimeTypes extends \Test\TestCase {
$this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
}
+ /**
+ * Test renaming the 3D image media type
+ */
public function testRename3dImagesMimeType() {
$currentMimeTypes = [
- ['test.eps', 'application/octet-stream'],
- ['test.ps', 'application/octet-stream'],
+ ['test.jps', 'application/octet-stream'],
+ ['test.mpo', 'application/octet-stream'],
];
$fixedMimeTypes = [
- ['test.eps', 'application/postscript'],
- ['test.ps', 'application/postscript'],
+ ['test.jps', 'image/jpeg'],
+ ['test.mpo', 'image/jpeg'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
+ }
+
+ /**
+ * Test renaming the conf/cnf media type
+ */
+ public function testRenameConfMimeType() {
+ $currentMimeTypes = [
+ ['test.conf', 'application/octet-stream'],
+ ['test.cnf', 'application/octet-stream'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.conf', 'text/plain'],
+ ['test.cnf', 'text/plain'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
+ }
+
+ /**
+ * Test renaming the yaml media type
+ */
+ public function testRenameYamlMimeType() {
+ $currentMimeTypes = [
+ ['test.yaml', 'application/octet-stream'],
+ ['test.yml', 'application/octet-stream'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.yaml', 'application/yaml'],
+ ['test.yml', 'application/yaml'],
];
$this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
@@ -348,6 +385,10 @@ class RepairMimeTypes extends \Test\TestCase {
['test.DNG', 'image/x-dcraw'],
['test.jps', 'image/jpeg'],
['test.MPO', 'image/jpeg'],
+ ['test.conf', 'text/plain'],
+ ['test.cnf', 'text/plain'],
+ ['test.yaml', 'application/yaml'],
+ ['test.yml', 'application/yaml'],
];
$fixedMimeTypes = [
@@ -383,6 +424,10 @@ class RepairMimeTypes extends \Test\TestCase {
['test.DNG', 'image/x-dcraw'],
['test.jps', 'image/jpeg'],
['test.MPO', 'image/jpeg'],
+ ['test.conf', 'text/plain'],
+ ['test.cnf', 'text/plain'],
+ ['test.yaml', 'application/yaml'],
+ ['test.yml', 'application/yaml'],
];
$this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
diff --git a/tests/lib/streamwrappers.php b/tests/lib/streamwrappers.php
index 2a8c8676c16..6216c5a4be8 100644
--- a/tests/lib/streamwrappers.php
+++ b/tests/lib/streamwrappers.php
@@ -21,6 +21,20 @@
*/
class Test_StreamWrappers extends \Test\TestCase {
+
+ private static $trashBinStatus;
+
+ public static function setUpBeforeClass() {
+ self::$trashBinStatus = \OC_App::isEnabled('files_trashbin');
+ \OC_App::disable('files_trashbin');
+ }
+
+ public static function tearDownAfterClass() {
+ if (self::$trashBinStatus) {
+ \OC_App::enable('files_trashbin');
+ }
+ }
+
public function testFakeDir() {
$items = array('foo', 'bar');
\OC\Files\Stream\Dir::register('test', $items);
@@ -58,6 +72,8 @@ class Test_StreamWrappers extends \Test\TestCase {
}
public function testOC() {
+ // FIXME: use proper tearDown with $this->loginAsUser() and $this->logout()
+ // (would currently break the tests for some reason)
$originalStorage = \OC\Files\Filesystem::getStorage('/');
\OC\Files\Filesystem::clearMounts();
diff --git a/tests/lib/testcase.php b/tests/lib/testcase.php
index d532a3b01c0..e66dfb13353 100644
--- a/tests/lib/testcase.php
+++ b/tests/lib/testcase.php
@@ -71,7 +71,6 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase {
self::tearDownAfterClassCleanFileCache();
self::tearDownAfterClassCleanStrayDataFiles($dataDir);
self::tearDownAfterClassCleanStrayHooks();
- self::tearDownAfterClassCleanProxies();
parent::tearDownAfterClass();
}
@@ -165,22 +164,12 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase {
}
/**
- * Clean up the list of file proxies
- *
- * Also reenables file proxies, in case a test disabled them
- */
- static protected function tearDownAfterClassCleanProxies() {
- \OC_FileProxy::$enabled = true;
- \OC_FileProxy::clearProxies();
- }
-
- /**
* Login and setup FS as a given user,
* sets the given user as the current user.
*
- * @param string $user user id
+ * @param string $user user id or empty for a generic FS
*/
- static protected function loginAsUser($user) {
+ static protected function loginAsUser($user = '') {
self::logout();
\OC\Files\Filesystem::tearDown();
\OC_User::setUserId($user);
diff --git a/tests/lib/util.php b/tests/lib/util.php
index 7d9064e0a2f..e52a9fcc618 100644
--- a/tests/lib/util.php
+++ b/tests/lib/util.php
@@ -54,24 +54,27 @@ class Test_Util extends \Test\TestCase {
public function formatDateWithTZFromSessionData() {
return array(
- array(3, 'October 13, 2012 at 2:53:25 PM GMT+3'),
- array(15, 'October 13, 2012 at 11:53:25 AM GMT+0'),
- array(-13, 'October 13, 2012 at 11:53:25 AM GMT+0'),
- array(9.5, 'October 13, 2012 at 9:23:25 PM GMT+9:30'),
- array(-4.5, 'October 13, 2012 at 7:23:25 AM GMT-4:30'),
- array(15.5, 'October 13, 2012 at 11:53:25 AM GMT+0'),
+ array(3, 'October 13, 2012 at 2:53:25 PM GMT+3', 'Etc/GMT-3'),
+ array(15, 'October 13, 2012 at 11:53:25 AM GMT+0', 'UTC'),
+ array(-13, 'October 13, 2012 at 11:53:25 AM GMT+0', 'UTC'),
+ array(9.5, 'October 13, 2012 at 9:23:25 PM GMT+9:30', 'Australia/Darwin'),
+ array(-4.5, 'October 13, 2012 at 7:23:25 AM GMT-4:30', 'America/Caracas'),
+ array(15.5, 'October 13, 2012 at 11:53:25 AM GMT+0', 'UTC'),
);
}
/**
* @dataProvider formatDateWithTZFromSessionData
*/
- function testFormatDateWithTZFromSession($offset, $expected) {
+ function testFormatDateWithTZFromSession($offset, $expected, $expectedTimeZone) {
date_default_timezone_set("UTC");
$oldDateTimeFormatter = \OC::$server->query('DateTimeFormatter');
\OC::$server->getSession()->set('timezone', $offset);
- $newDateTimeFormatter = new \OC\DateTimeFormatter(\OC::$server->getDateTimeZone()->getTimeZone(), new \OC_L10N('lib', 'en'));
+
+ $selectedTimeZone = \OC::$server->getDateTimeZone()->getTimeZone(1350129205);
+ $this->assertEquals($expectedTimeZone, $selectedTimeZone->getName());
+ $newDateTimeFormatter = new \OC\DateTimeFormatter($selectedTimeZone, new \OC_L10N('lib', 'en'));
$this->setDateFormatter($newDateTimeFormatter);
$result = OC_Util::formatDate(1350129205, false);
@@ -129,14 +132,6 @@ class Test_Util extends \Test\TestCase {
$this->assertEquals($expected, \OC_Util::fileInfoLoaded());
}
- public function testIsInternetConnectionEnabled() {
- \OC_Config::setValue("has_internet_connection", false);
- $this->assertFalse(\OC_Util::isInternetConnectionEnabled());
-
- \OC_Config::setValue("has_internet_connection", true);
- $this->assertTrue(\OC_Util::isInternetConnectionEnabled());
- }
-
function testGenerateRandomBytes() {
$result = strlen(OC_Util::generateRandomBytes(59));
$this->assertEquals(59, $result);
diff --git a/tests/settings/controller/CheckSetupControllerTest.php b/tests/settings/controller/CheckSetupControllerTest.php
new file mode 100644
index 00000000000..26f9f4e9459
--- /dev/null
+++ b/tests/settings/controller/CheckSetupControllerTest.php
@@ -0,0 +1,242 @@
+<?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 OCP\AppFramework\Http\DataResponse;
+use OCP\Http\Client\IClientService;
+use OCP\IConfig;
+use OCP\IRequest;
+use OCP\IURLGenerator;
+use OC_Util;
+use Test\TestCase;
+
+/**
+ * Class CheckSetupControllerTest
+ *
+ * @package OC\Settings\Controller
+ */
+class CheckSetupControllerTest extends TestCase {
+ /** @var CheckSetupController */
+ private $checkSetupController;
+ /** @var IRequest */
+ private $request;
+ /** @var IConfig */
+ private $config;
+ /** @var IClientService */
+ private $clientService;
+ /** @var IURLGenerator */
+ private $urlGenerator;
+ /** @var OC_Util */
+ private $util;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->request = $this->getMockBuilder('\OCP\IRequest')
+ ->disableOriginalConstructor()->getMock();
+ $this->config = $this->getMockBuilder('\OCP\IConfig')
+ ->disableOriginalConstructor()->getMock();
+ $this->config = $this->getMockBuilder('\OCP\IConfig')
+ ->disableOriginalConstructor()->getMock();
+ $this->clientService = $this->getMockBuilder('\OCP\Http\Client\IClientService')
+ ->disableOriginalConstructor()->getMock();
+ $this->util = $this->getMockBuilder('\OC_Util')
+ ->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
+ );
+ }
+
+ public function testIsInternetConnectionWorkingDisabledViaConfig() {
+ $this->config->expects($this->once())
+ ->method('getSystemValue')
+ ->with('has_internet_connection', true)
+ ->will($this->returnValue(false));
+
+ $this->assertFalse(
+ \Test_Helper::invokePrivate(
+ $this->checkSetupController,
+ 'isInternetConnectionWorking'
+ )
+ );
+ }
+
+ public function testIsInternetConnectionWorkingCorrectly() {
+ $this->config->expects($this->once())
+ ->method('getSystemValue')
+ ->with('has_internet_connection', true)
+ ->will($this->returnValue(true));
+
+ $client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+ ->disableOriginalConstructor()->getMock();
+ $client->expects($this->at(0))
+ ->method('get')
+ ->with('https://www.owncloud.org/', []);
+ $client->expects($this->at(1))
+ ->method('get')
+ ->with('http://www.owncloud.org/', []);
+
+ $this->clientService->expects($this->once())
+ ->method('newClient')
+ ->will($this->returnValue($client));
+
+
+ $this->assertTrue(
+ \Test_Helper::invokePrivate(
+ $this->checkSetupController,
+ 'isInternetConnectionWorking'
+ )
+ );
+ }
+
+ public function testIsInternetConnectionHttpsFail() {
+ $this->config->expects($this->once())
+ ->method('getSystemValue')
+ ->with('has_internet_connection', true)
+ ->will($this->returnValue(true));
+
+ $client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+ ->disableOriginalConstructor()->getMock();
+ $client->expects($this->at(0))
+ ->method('get')
+ ->with('https://www.owncloud.org/', [])
+ ->will($this->throwException(new \Exception()));
+
+ $this->clientService->expects($this->once())
+ ->method('newClient')
+ ->will($this->returnValue($client));
+
+ $this->assertFalse(
+ \Test_Helper::invokePrivate(
+ $this->checkSetupController,
+ 'isInternetConnectionWorking'
+ )
+ );
+ }
+
+ public function testIsInternetConnectionHttpFail() {
+ $this->config->expects($this->once())
+ ->method('getSystemValue')
+ ->with('has_internet_connection', true)
+ ->will($this->returnValue(true));
+
+ $client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+ ->disableOriginalConstructor()->getMock();
+ $client->expects($this->at(0))
+ ->method('get')
+ ->with('https://www.owncloud.org/', []);
+ $client->expects($this->at(1))
+ ->method('get')
+ ->with('http://www.owncloud.org/', [])
+ ->will($this->throwException(new \Exception()));
+
+ $this->clientService->expects($this->once())
+ ->method('newClient')
+ ->will($this->returnValue($client));
+
+ $this->assertFalse(
+ \Test_Helper::invokePrivate(
+ $this->checkSetupController,
+ 'isInternetConnectionWorking'
+ )
+ );
+ }
+
+ public function testIsMemcacheConfiguredFalse() {
+ $this->config->expects($this->once())
+ ->method('getSystemValue')
+ ->with('memcache.local', null)
+ ->will($this->returnValue(null));
+
+ $this->assertFalse(
+ \Test_Helper::invokePrivate(
+ $this->checkSetupController,
+ 'isMemcacheConfigured'
+ )
+ );
+ }
+
+ public function testIsMemcacheConfiguredTrue() {
+ $this->config->expects($this->once())
+ ->method('getSystemValue')
+ ->with('memcache.local', null)
+ ->will($this->returnValue('SomeProvider'));
+
+ $this->assertTrue(
+ \Test_Helper::invokePrivate(
+ $this->checkSetupController,
+ 'isMemcacheConfigured'
+ )
+ );
+ }
+
+ public function testCheck() {
+ $this->config->expects($this->at(0))
+ ->method('getSystemValue')
+ ->with('has_internet_connection', true)
+ ->will($this->returnValue(true));
+ $this->config->expects($this->at(1))
+ ->method('getSystemValue')
+ ->with('memcache.local', null)
+ ->will($this->returnValue('SomeProvider'));
+
+ $client = $this->getMockBuilder('\OCP\Http\Client\IClient')
+ ->disableOriginalConstructor()->getMock();
+ $client->expects($this->at(0))
+ ->method('get')
+ ->with('https://www.owncloud.org/', []);
+ $client->expects($this->at(1))
+ ->method('get')
+ ->with('http://www.owncloud.org/', [])
+ ->will($this->throwException(new \Exception()));
+
+ $this->clientService->expects($this->once())
+ ->method('newClient')
+ ->will($this->returnValue($client));
+
+ $this->util->expects($this->once())
+ ->method('isHtaccessWorking')
+ ->will($this->returnValue(true));
+ $this->urlGenerator->expects($this->once())
+ ->method('linkToDocs')
+ ->with('admin-performance')
+ ->willReturn('http://doc.owncloud.org/server/go.php?to=admin-performance');
+
+ $expected = new DataResponse(
+ [
+ 'serverHasInternetConnection' => false,
+ 'dataDirectoryProtected' => true,
+ 'isMemcacheConfigured' => true,
+ 'memcacheDocs' => 'http://doc.owncloud.org/server/go.php?to=admin-performance',
+ ]
+ );
+ $this->assertEquals($expected, $this->checkSetupController->check());
+ }
+}