aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--.htaccess7
-rw-r--r--apps/comments/activity/extension.php301
-rw-r--r--apps/comments/activity/listener.php128
-rw-r--r--apps/comments/appinfo/app.php17
-rw-r--r--apps/comments/appinfo/info.xml5
-rw-r--r--apps/comments/css/comments.css53
-rw-r--r--apps/comments/js/commentstabview.js59
-rw-r--r--apps/comments/tests/js/commentstabviewSpec.js78
-rw-r--r--apps/dav/appinfo/application.php42
-rw-r--r--apps/dav/appinfo/info.xml6
-rw-r--r--apps/dav/appinfo/install.php1
-rw-r--r--apps/dav/appinfo/register_command.php3
-rw-r--r--apps/dav/appinfo/v1/caldav.php69
-rw-r--r--apps/dav/appinfo/v1/carddav.php70
-rw-r--r--apps/dav/appinfo/v1/webdav.php3
-rw-r--r--apps/dav/command/migrateaddressbooks.php1
-rw-r--r--apps/dav/command/migratecalendars.php66
-rw-r--r--apps/dav/lib/caldav/caldavbackend.php134
-rw-r--r--apps/dav/lib/carddav/addressbookroot.php3
-rw-r--r--apps/dav/lib/carddav/carddavbackend.php43
-rw-r--r--apps/dav/lib/comments/commentsplugin.php5
-rw-r--r--apps/dav/lib/connector/sabre/auth.php6
-rw-r--r--apps/dav/lib/connector/sabre/checksumlist.php71
-rw-r--r--apps/dav/lib/connector/sabre/filesplugin.php12
-rw-r--r--apps/dav/lib/connector/sabre/filesreportplugin.php321
-rw-r--r--apps/dav/lib/connector/sabre/principal.php43
-rw-r--r--apps/dav/lib/connector/sabre/serverfactory.php11
-rw-r--r--apps/dav/lib/dav/sharing/backend.php19
-rw-r--r--apps/dav/lib/migration/calendaradapter.php83
-rw-r--r--apps/dav/lib/migration/migratecalendars.php94
-rw-r--r--apps/dav/tests/unit/comments/commentsplugin.php4
-rw-r--r--apps/dav/tests/unit/connector/sabre/filesreportplugin.php519
-rw-r--r--apps/dav/tests/unit/connector/sabre/principal.php5
-rw-r--r--apps/dav/tests/unit/migration/calendar_schema.xml191
-rw-r--r--apps/dav/tests/unit/migration/calendaradaptertest.php131
-rw-r--r--apps/dav/tests/unit/migration/migratecalendartest.php76
-rw-r--r--apps/federatedfilesharing/appinfo/app.php27
-rw-r--r--apps/federatedfilesharing/appinfo/info.xml14
-rw-r--r--apps/federatedfilesharing/lib/addresshandler.php184
-rw-r--r--apps/federatedfilesharing/lib/federatedshareprovider.php562
-rw-r--r--apps/federatedfilesharing/lib/notifications.php144
-rw-r--r--apps/federatedfilesharing/lib/tokenhandler.php61
-rw-r--r--apps/federatedfilesharing/tests/addresshandlertest.php198
-rw-r--r--apps/federatedfilesharing/tests/federatedshareprovidertest.php447
-rw-r--r--apps/federatedfilesharing/tests/tokenhandlertest.php62
-rw-r--r--apps/files/appinfo/info.xml2
-rw-r--r--apps/files/appinfo/install.php2
-rw-r--r--apps/files/appinfo/update.php2
-rw-r--r--apps/files/css/files.css4
-rw-r--r--apps/files/js/filelist.js4
-rw-r--r--apps/files/l10n/de.js2
-rw-r--r--apps/files/l10n/de.json2
-rw-r--r--apps/files/l10n/de_DE.js2
-rw-r--r--apps/files/l10n/de_DE.json2
-rw-r--r--apps/files/lib/backgroundjob/deleteorphaneditems.php (renamed from apps/files/lib/backgroundjob/deleteorphanedtagsjob.php)59
-rw-r--r--apps/files/tests/backgroundjob/DeleteOrphanedItemsJobTest.php (renamed from apps/files/tests/backgroundjob/DeleteOrphanedTagsJobTest.php)110
-rw-r--r--apps/files/tests/controller/ViewControllerTest.php25
-rw-r--r--apps/files/tests/js/filelistSpec.js6
-rw-r--r--apps/files_external/appinfo/application.php1
-rw-r--r--apps/files_external/appinfo/register_command.php6
-rw-r--r--apps/files_external/appinfo/routes.php7
-rw-r--r--apps/files_external/command/backends.php112
-rw-r--r--apps/files_external/command/create.php226
-rw-r--r--apps/files_external/command/verify.php145
-rw-r--r--apps/files_external/controller/ajaxcontroller.php10
-rw-r--r--apps/files_external/controller/storagescontroller.php3
-rw-r--r--apps/files_external/js/settings.js27
-rw-r--r--apps/files_external/js/statusmanager.js263
-rw-r--r--apps/files_external/l10n/af_ZA.js1
-rw-r--r--apps/files_external/l10n/af_ZA.json1
-rw-r--r--apps/files_external/l10n/ar.js6
-rw-r--r--apps/files_external/l10n/ar.json6
-rw-r--r--apps/files_external/l10n/ast.js6
-rw-r--r--apps/files_external/l10n/ast.json6
-rw-r--r--apps/files_external/l10n/az.js6
-rw-r--r--apps/files_external/l10n/az.json6
-rw-r--r--apps/files_external/l10n/bg_BG.js6
-rw-r--r--apps/files_external/l10n/bg_BG.json6
-rw-r--r--apps/files_external/l10n/bn_BD.js6
-rw-r--r--apps/files_external/l10n/bn_BD.json6
-rw-r--r--apps/files_external/l10n/bn_IN.js2
-rw-r--r--apps/files_external/l10n/bn_IN.json2
-rw-r--r--apps/files_external/l10n/bs.js4
-rw-r--r--apps/files_external/l10n/bs.json4
-rw-r--r--apps/files_external/l10n/ca.js6
-rw-r--r--apps/files_external/l10n/ca.json6
-rw-r--r--apps/files_external/l10n/cs_CZ.js16
-rw-r--r--apps/files_external/l10n/cs_CZ.json16
-rw-r--r--apps/files_external/l10n/cy_GB.js4
-rw-r--r--apps/files_external/l10n/cy_GB.json4
-rw-r--r--apps/files_external/l10n/da.js6
-rw-r--r--apps/files_external/l10n/da.json6
-rw-r--r--apps/files_external/l10n/de.js13
-rw-r--r--apps/files_external/l10n/de.json13
-rw-r--r--apps/files_external/l10n/de_AT.js1
-rw-r--r--apps/files_external/l10n/de_AT.json1
-rw-r--r--apps/files_external/l10n/de_DE.js6
-rw-r--r--apps/files_external/l10n/de_DE.json6
-rw-r--r--apps/files_external/l10n/el.js6
-rw-r--r--apps/files_external/l10n/el.json6
-rw-r--r--apps/files_external/l10n/en_GB.js6
-rw-r--r--apps/files_external/l10n/en_GB.json6
-rw-r--r--apps/files_external/l10n/eo.js6
-rw-r--r--apps/files_external/l10n/eo.json6
-rw-r--r--apps/files_external/l10n/es.js6
-rw-r--r--apps/files_external/l10n/es.json6
-rw-r--r--apps/files_external/l10n/es_AR.js4
-rw-r--r--apps/files_external/l10n/es_AR.json4
-rw-r--r--apps/files_external/l10n/es_MX.js4
-rw-r--r--apps/files_external/l10n/es_MX.json4
-rw-r--r--apps/files_external/l10n/et_EE.js6
-rw-r--r--apps/files_external/l10n/et_EE.json6
-rw-r--r--apps/files_external/l10n/eu.js6
-rw-r--r--apps/files_external/l10n/eu.json6
-rw-r--r--apps/files_external/l10n/fa.js6
-rw-r--r--apps/files_external/l10n/fa.json6
-rw-r--r--apps/files_external/l10n/fi_FI.js12
-rw-r--r--apps/files_external/l10n/fi_FI.json12
-rw-r--r--apps/files_external/l10n/fr.js17
-rw-r--r--apps/files_external/l10n/fr.json17
-rw-r--r--apps/files_external/l10n/gl.js6
-rw-r--r--apps/files_external/l10n/gl.json6
-rw-r--r--apps/files_external/l10n/he.js9
-rw-r--r--apps/files_external/l10n/he.json9
-rw-r--r--apps/files_external/l10n/hi.js2
-rw-r--r--apps/files_external/l10n/hi.json2
-rw-r--r--apps/files_external/l10n/hr.js6
-rw-r--r--apps/files_external/l10n/hr.json6
-rw-r--r--apps/files_external/l10n/hu_HU.js6
-rw-r--r--apps/files_external/l10n/hu_HU.json6
-rw-r--r--apps/files_external/l10n/hy.js1
-rw-r--r--apps/files_external/l10n/hy.json1
-rw-r--r--apps/files_external/l10n/ia.js2
-rw-r--r--apps/files_external/l10n/ia.json2
-rw-r--r--apps/files_external/l10n/id.js6
-rw-r--r--apps/files_external/l10n/id.json6
-rw-r--r--apps/files_external/l10n/is.js4
-rw-r--r--apps/files_external/l10n/is.json4
-rw-r--r--apps/files_external/l10n/it.js13
-rw-r--r--apps/files_external/l10n/it.json13
-rw-r--r--apps/files_external/l10n/ja.js12
-rw-r--r--apps/files_external/l10n/ja.json12
-rw-r--r--apps/files_external/l10n/ka_GE.js4
-rw-r--r--apps/files_external/l10n/ka_GE.json4
-rw-r--r--apps/files_external/l10n/km.js4
-rw-r--r--apps/files_external/l10n/km.json4
-rw-r--r--apps/files_external/l10n/kn.js4
-rw-r--r--apps/files_external/l10n/kn.json4
-rw-r--r--apps/files_external/l10n/ko.js6
-rw-r--r--apps/files_external/l10n/ko.json6
-rw-r--r--apps/files_external/l10n/ku_IQ.js4
-rw-r--r--apps/files_external/l10n/ku_IQ.json4
-rw-r--r--apps/files_external/l10n/lb.js2
-rw-r--r--apps/files_external/l10n/lb.json2
-rw-r--r--apps/files_external/l10n/lt_LT.js4
-rw-r--r--apps/files_external/l10n/lt_LT.json4
-rw-r--r--apps/files_external/l10n/lv.js4
-rw-r--r--apps/files_external/l10n/lv.json4
-rw-r--r--apps/files_external/l10n/mk.js4
-rw-r--r--apps/files_external/l10n/mk.json4
-rw-r--r--apps/files_external/l10n/mn.js1
-rw-r--r--apps/files_external/l10n/mn.json1
-rw-r--r--apps/files_external/l10n/ms_MY.js2
-rw-r--r--apps/files_external/l10n/ms_MY.json2
-rw-r--r--apps/files_external/l10n/nb_NO.js6
-rw-r--r--apps/files_external/l10n/nb_NO.json6
-rw-r--r--apps/files_external/l10n/nds.js5
-rw-r--r--apps/files_external/l10n/nds.json5
-rw-r--r--apps/files_external/l10n/nl.js17
-rw-r--r--apps/files_external/l10n/nl.json17
-rw-r--r--apps/files_external/l10n/nn_NO.js2
-rw-r--r--apps/files_external/l10n/nn_NO.json2
-rw-r--r--apps/files_external/l10n/oc.js6
-rw-r--r--apps/files_external/l10n/oc.json6
-rw-r--r--apps/files_external/l10n/pa.js1
-rw-r--r--apps/files_external/l10n/pa.json1
-rw-r--r--apps/files_external/l10n/pl.js6
-rw-r--r--apps/files_external/l10n/pl.json6
-rw-r--r--apps/files_external/l10n/pt_BR.js17
-rw-r--r--apps/files_external/l10n/pt_BR.json17
-rw-r--r--apps/files_external/l10n/pt_PT.js13
-rw-r--r--apps/files_external/l10n/pt_PT.json13
-rw-r--r--apps/files_external/l10n/ro.js4
-rw-r--r--apps/files_external/l10n/ro.json4
-rw-r--r--apps/files_external/l10n/ru.js7
-rw-r--r--apps/files_external/l10n/ru.json7
-rw-r--r--apps/files_external/l10n/si_LK.js4
-rw-r--r--apps/files_external/l10n/si_LK.json4
-rw-r--r--apps/files_external/l10n/sk_SK.js6
-rw-r--r--apps/files_external/l10n/sk_SK.json6
-rw-r--r--apps/files_external/l10n/sl.js6
-rw-r--r--apps/files_external/l10n/sl.json6
-rw-r--r--apps/files_external/l10n/sq.js16
-rw-r--r--apps/files_external/l10n/sq.json16
-rw-r--r--apps/files_external/l10n/sr.js6
-rw-r--r--apps/files_external/l10n/sr.json6
-rw-r--r--apps/files_external/l10n/sr@latin.js6
-rw-r--r--apps/files_external/l10n/sr@latin.json6
-rw-r--r--apps/files_external/l10n/sv.js6
-rw-r--r--apps/files_external/l10n/sv.json6
-rw-r--r--apps/files_external/l10n/ta_LK.js4
-rw-r--r--apps/files_external/l10n/ta_LK.json4
-rw-r--r--apps/files_external/l10n/te.js1
-rw-r--r--apps/files_external/l10n/te.json1
-rw-r--r--apps/files_external/l10n/th_TH.js11
-rw-r--r--apps/files_external/l10n/th_TH.json11
-rw-r--r--apps/files_external/l10n/tr.js6
-rw-r--r--apps/files_external/l10n/tr.json6
-rw-r--r--apps/files_external/l10n/ug.js4
-rw-r--r--apps/files_external/l10n/ug.json4
-rw-r--r--apps/files_external/l10n/uk.js6
-rw-r--r--apps/files_external/l10n/uk.json6
-rw-r--r--apps/files_external/l10n/ur_PK.js2
-rw-r--r--apps/files_external/l10n/ur_PK.json2
-rw-r--r--apps/files_external/l10n/vi.js4
-rw-r--r--apps/files_external/l10n/vi.json4
-rw-r--r--apps/files_external/l10n/zh_CN.js4
-rw-r--r--apps/files_external/l10n/zh_CN.json4
-rw-r--r--apps/files_external/l10n/zh_HK.js4
-rw-r--r--apps/files_external/l10n/zh_HK.json4
-rw-r--r--apps/files_external/l10n/zh_TW.js6
-rw-r--r--apps/files_external/l10n/zh_TW.json6
-rw-r--r--apps/files_external/lib/auth/password/globalauth.php88
-rw-r--r--apps/files_external/lib/config/configadapter.php10
-rw-r--r--apps/files_external/lib/definitionparameter.php16
-rw-r--r--apps/files_external/lib/failedcache.php7
-rw-r--r--apps/files_external/lib/insufficientdataformeaningfulanswerexception.php11
-rw-r--r--apps/files_external/lib/smb.php13
-rw-r--r--apps/files_external/lib/storageconfig.php2
-rw-r--r--apps/files_external/personal.php4
-rw-r--r--apps/files_external/settings.php4
-rw-r--r--apps/files_external/templates/settings.php17
-rw-r--r--apps/files_external/tests/auth/password/globalauth.php117
-rw-r--r--apps/files_sharing/api/share20ocs.php59
-rw-r--r--apps/files_sharing/appinfo/info.xml2
-rw-r--r--apps/files_sharing/appinfo/update.php2
-rw-r--r--apps/files_sharing/lib/controllers/sharecontroller.php63
-rw-r--r--apps/files_sharing/lib/migration.php6
-rw-r--r--apps/files_sharing/lib/updater.php6
-rw-r--r--apps/files_sharing/templates/settings-personal.php2
-rw-r--r--apps/files_sharing/tests/api/share20ocstest.php15
-rw-r--r--apps/files_sharing/tests/controller/sharecontroller.php20
-rw-r--r--apps/files_sharing/tests/migrationtest.php21
-rw-r--r--apps/files_versions/lib/storage.php21
-rw-r--r--apps/files_versions/tests/versions.php4
-rw-r--r--apps/systemtags/appinfo/app.php14
-rw-r--r--apps/systemtags/css/systemtagsfilelist.css29
-rw-r--r--apps/systemtags/img/tag.pngbin0 -> 293 bytes
-rw-r--r--apps/systemtags/img/tag.svg5
-rw-r--r--apps/systemtags/js/app.js87
-rw-r--r--apps/systemtags/js/filesplugin.js3
-rw-r--r--apps/systemtags/js/systemtagsfilelist.js240
-rw-r--r--apps/systemtags/list.php25
-rw-r--r--apps/systemtags/templates/list.php38
-rw-r--r--apps/systemtags/tests/js/systemtagsfilelistSpec.js226
-rw-r--r--apps/user_ldap/js/wizard/wizardTabAdvanced.js13
-rw-r--r--apps/user_ldap/l10n/cs_CZ.js1
-rw-r--r--apps/user_ldap/l10n/cs_CZ.json1
-rw-r--r--apps/user_ldap/l10n/fr.js6
-rw-r--r--apps/user_ldap/l10n/fr.json6
-rw-r--r--apps/user_ldap/l10n/he.js11
-rw-r--r--apps/user_ldap/l10n/he.json11
-rw-r--r--apps/user_ldap/l10n/it.js4
-rw-r--r--apps/user_ldap/l10n/it.json4
-rw-r--r--apps/user_ldap/l10n/ja.js2
-rw-r--r--apps/user_ldap/l10n/ja.json2
-rw-r--r--apps/user_ldap/l10n/nl.js2
-rw-r--r--apps/user_ldap/l10n/nl.json2
-rw-r--r--apps/user_ldap/l10n/pt_BR.js4
-rw-r--r--apps/user_ldap/l10n/pt_BR.json4
-rw-r--r--apps/user_ldap/l10n/pt_PT.js4
-rw-r--r--apps/user_ldap/l10n/pt_PT.json4
-rw-r--r--apps/user_ldap/l10n/sq.js6
-rw-r--r--apps/user_ldap/l10n/sq.json6
-rw-r--r--apps/user_ldap/lib/access.php17
-rw-r--r--apps/user_ldap/lib/configuration.php4
-rw-r--r--apps/user_ldap/lib/connection.php1
-rw-r--r--apps/user_ldap/lib/user/manager.php1
-rw-r--r--apps/user_ldap/lib/user/user.php30
-rw-r--r--apps/user_ldap/templates/settings.php1
-rw-r--r--apps/user_ldap/tests/integration/lib/user/IntegrationTestUserDisplayName.php103
-rw-r--r--apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php1
-rw-r--r--apps/user_ldap/tests/user/user.php27
-rw-r--r--apps/user_ldap/user_ldap.php26
-rw-r--r--build/integration/features/provisioning-v1.feature1
-rw-r--r--build/integration/features/sharing-v1.feature25
-rw-r--r--console.php2
-rw-r--r--core/ajax/share.php86
-rw-r--r--core/command/integrity/checkapp.php69
-rw-r--r--core/command/integrity/checkcore.php62
-rw-r--r--core/command/integrity/signcore.php10
-rw-r--r--core/img/appstore.pngbin2302 -> 0 bytes
-rw-r--r--core/img/appstore.svg129
-rw-r--r--core/img/desktopapp.svg34
-rw-r--r--core/img/googleplay.pngbin6491 -> 22758 bytes
-rw-r--r--core/js/files/client.js77
-rw-r--r--core/js/files/iedavclient.js96
-rw-r--r--core/js/mimetypelist.js4
-rw-r--r--core/js/setupchecks.js2
-rw-r--r--core/js/systemtags/systemtagsinputfield.js4
-rw-r--r--core/js/tests/specs/files/clientSpec.js440
-rw-r--r--core/js/update.js16
-rw-r--r--core/l10n/bg_BG.js2
-rw-r--r--core/l10n/bg_BG.json2
-rw-r--r--core/l10n/ca.js2
-rw-r--r--core/l10n/ca.json2
-rw-r--r--core/l10n/cs_CZ.js2
-rw-r--r--core/l10n/cs_CZ.json2
-rw-r--r--core/l10n/da.js2
-rw-r--r--core/l10n/da.json2
-rw-r--r--core/l10n/de.js2
-rw-r--r--core/l10n/de.json2
-rw-r--r--core/l10n/de_DE.js2
-rw-r--r--core/l10n/de_DE.json2
-rw-r--r--core/l10n/el.js2
-rw-r--r--core/l10n/el.json2
-rw-r--r--core/l10n/en_GB.js2
-rw-r--r--core/l10n/en_GB.json2
-rw-r--r--core/l10n/es.js2
-rw-r--r--core/l10n/es.json2
-rw-r--r--core/l10n/fi_FI.js2
-rw-r--r--core/l10n/fi_FI.json2
-rw-r--r--core/l10n/fr.js2
-rw-r--r--core/l10n/fr.json2
-rw-r--r--core/l10n/gl.js2
-rw-r--r--core/l10n/gl.json2
-rw-r--r--core/l10n/he.js2
-rw-r--r--core/l10n/he.json2
-rw-r--r--core/l10n/hu_HU.js2
-rw-r--r--core/l10n/hu_HU.json2
-rw-r--r--core/l10n/id.js2
-rw-r--r--core/l10n/id.json2
-rw-r--r--core/l10n/is.js2
-rw-r--r--core/l10n/is.json2
-rw-r--r--core/l10n/it.js2
-rw-r--r--core/l10n/it.json2
-rw-r--r--core/l10n/ja.js5
-rw-r--r--core/l10n/ja.json5
-rw-r--r--core/l10n/ko.js2
-rw-r--r--core/l10n/ko.json2
-rw-r--r--core/l10n/mk.js2
-rw-r--r--core/l10n/mk.json2
-rw-r--r--core/l10n/nb_NO.js2
-rw-r--r--core/l10n/nb_NO.json2
-rw-r--r--core/l10n/nl.js2
-rw-r--r--core/l10n/nl.json2
-rw-r--r--core/l10n/oc.js2
-rw-r--r--core/l10n/oc.json2
-rw-r--r--core/l10n/pt_BR.js2
-rw-r--r--core/l10n/pt_BR.json2
-rw-r--r--core/l10n/pt_PT.js2
-rw-r--r--core/l10n/pt_PT.json2
-rw-r--r--core/l10n/ru.js2
-rw-r--r--core/l10n/ru.json2
-rw-r--r--core/l10n/sk_SK.js2
-rw-r--r--core/l10n/sk_SK.json2
-rw-r--r--core/l10n/sq.js2
-rw-r--r--core/l10n/sq.json2
-rw-r--r--core/l10n/sr.js2
-rw-r--r--core/l10n/sr.json2
-rw-r--r--core/l10n/th_TH.js5
-rw-r--r--core/l10n/th_TH.json5
-rw-r--r--core/l10n/tr.js2
-rw-r--r--core/l10n/tr.json2
-rw-r--r--core/l10n/uk.js2
-rw-r--r--core/l10n/uk.json2
-rw-r--r--core/l10n/zh_CN.js2
-rw-r--r--core/l10n/zh_CN.json2
-rw-r--r--core/l10n/zh_TW.js2
-rw-r--r--core/l10n/zh_TW.json2
-rw-r--r--core/register_command.php7
-rw-r--r--core/shipped.json4
-rw-r--r--lib/l10n/cs_CZ.js1
-rw-r--r--lib/l10n/cs_CZ.json1
-rw-r--r--lib/l10n/de.js1
-rw-r--r--lib/l10n/de.json1
-rw-r--r--lib/l10n/eu.js1
-rw-r--r--lib/l10n/eu.json1
-rw-r--r--lib/l10n/fi_FI.js1
-rw-r--r--lib/l10n/fi_FI.json1
-rw-r--r--lib/l10n/fr.js4
-rw-r--r--lib/l10n/fr.json4
-rw-r--r--lib/l10n/it.js1
-rw-r--r--lib/l10n/it.json1
-rw-r--r--lib/l10n/ja.js2
-rw-r--r--lib/l10n/ja.json2
-rw-r--r--lib/l10n/nl.js1
-rw-r--r--lib/l10n/nl.json1
-rw-r--r--lib/l10n/pt_BR.js1
-rw-r--r--lib/l10n/pt_BR.json1
-rw-r--r--lib/l10n/pt_PT.js1
-rw-r--r--lib/l10n/pt_PT.json1
-rw-r--r--lib/l10n/sq.js1
-rw-r--r--lib/l10n/sq.json1
-rw-r--r--lib/private/app/appmanager.php18
-rw-r--r--lib/private/appframework/dependencyinjection/dicontainer.php4
-rw-r--r--lib/private/comments/manager.php50
-rw-r--r--lib/private/comments/managerfactory.php3
-rw-r--r--lib/private/console/application.php21
-rw-r--r--lib/private/db/mdb2schemamanager.php3
-rw-r--r--lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php (renamed from lib/private/db/querybuilder/expressionbuilder.php)19
-rw-r--r--lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php (renamed from lib/private/db/querybuilder/ociexpressionbuilder.php)25
-rw-r--r--lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php45
-rw-r--r--lib/private/db/querybuilder/querybuilder.php6
-rw-r--r--lib/private/diagnostics/querylogger.php2
-rw-r--r--lib/private/files.php10
-rw-r--r--lib/private/files/config/usermountcache.php2
-rw-r--r--lib/private/files/node/file.php2
-rw-r--r--lib/private/files/node/root.php2
-rw-r--r--lib/private/files/storage/common.php8
-rw-r--r--lib/private/files/storage/wrapper/availability.php11
-rw-r--r--lib/private/files/storage/wrapper/encryption.php8
-rw-r--r--lib/private/files/storage/wrapper/jail.php11
-rw-r--r--lib/private/files/storage/wrapper/wrapper.php11
-rw-r--r--lib/private/files/stream/dir.php1
-rw-r--r--lib/private/files/type/detection.php4
-rw-r--r--lib/private/integritycheck/checker.php22
-rw-r--r--lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php9
-rw-r--r--lib/private/repair/dropoldjobs.php1
-rw-r--r--lib/private/repair/repairmimetypes.php17
-rw-r--r--lib/private/server.php3
-rw-r--r--lib/private/setup/abstractdatabase.php3
-rw-r--r--lib/private/setup/mysql.php2
-rw-r--r--lib/private/share/helper.php4
-rw-r--r--lib/private/share/hooks.php2
-rw-r--r--lib/private/share/share.php10
-rw-r--r--lib/private/share20/manager.php104
-rw-r--r--lib/private/share20/providerfactory.php74
-rw-r--r--lib/private/share20/share.php3
-rw-r--r--lib/private/template.php23
-rw-r--r--lib/private/updater.php2
-rw-r--r--lib/private/user.php2
-rw-r--r--lib/public/app/managerevent.php86
-rw-r--r--lib/public/comments/commentsevent.php70
-rw-r--r--lib/public/comments/icommentsmanager.php2
-rw-r--r--lib/public/console/consoleevent.php69
-rw-r--r--lib/public/db/querybuilder/iexpressionbuilder.php10
-rw-r--r--lib/public/files/cache/icache.php9
-rw-r--r--lib/public/files/file.php10
-rw-r--r--lib/public/files/storage.php9
-rw-r--r--lib/public/files/storage/istorage.php19
-rw-r--r--lib/public/files/storagenotavailableexception.php26
-rw-r--r--lib/public/share/imanager.php7
-rw-r--r--lib/public/share/ishareprovider.php2
-rw-r--r--resources/codesigning/core.crt46
-rw-r--r--resources/codesigning/root.crt98
-rw-r--r--resources/config/mimetypealiases.dist.json4
-rw-r--r--resources/config/mimetypemapping.dist.json4
-rw-r--r--settings/css/settings.css7
-rw-r--r--settings/js/users/users.js32
-rw-r--r--settings/l10n/de_DE.js1
-rw-r--r--settings/l10n/de_DE.json1
-rw-r--r--settings/l10n/fr.js2
-rw-r--r--settings/l10n/fr.json2
-rw-r--r--settings/l10n/ja.js2
-rw-r--r--settings/l10n/ja.json2
-rw-r--r--settings/templates/personal.php4
-rw-r--r--tests/enable_all.php1
-rw-r--r--tests/karma.config.js1
-rw-r--r--tests/lib/app.php13
-rw-r--r--tests/lib/app/manager.php20
-rw-r--r--tests/lib/command/integrity/SignCoreTest.php19
-rw-r--r--tests/lib/db/querybuilder/expressionbuildertest.php2
-rw-r--r--tests/lib/files/storage/home.php12
-rw-r--r--tests/lib/files/storage/storage.php3
-rw-r--r--tests/lib/integritycheck/checkertest.php12
-rw-r--r--tests/lib/repair/repairmimetypes.php29
-rw-r--r--tests/lib/share/share.php8
-rw-r--r--tests/lib/share20/managertest.php217
-rw-r--r--tests/phpunit-autotest.xml2
-rw-r--r--version.php2
472 files changed, 9331 insertions, 1133 deletions
diff --git a/.gitignore b/.gitignore
index 2e42105ad83..a2fb67ef429 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@
!/apps/dav
!/apps/files
!/apps/federation
+!/apps/federatedfilesharing
!/apps/encryption
!/apps/files_external
!/apps/files_sharing
@@ -79,6 +80,9 @@ nbproject
# vim ex mode
.vimrc
+
+# ack(-grep)
+.ackrc
# Mac OS
.DS_Store
diff --git a/.htaccess b/.htaccess
index 4a4adce144c..725efa0971a 100644
--- a/.htaccess
+++ b/.htaccess
@@ -1,9 +1,12 @@
<IfModule mod_headers.c>
- <IfModule mod_fcgid.c>
- <IfModule mod_setenvif.c>
+ <IfModule mod_setenvif.c>
+ <IfModule mod_fcgid.c>
SetEnvIfNoCase ^Authorization$ "(.+)" XAUTHORIZATION=$1
RequestHeader set XAuthorization %{XAUTHORIZATION}e env=XAUTHORIZATION
</IfModule>
+ <IfModule mod_proxy_fcgi.c>
+ SetEnvIfNoCase Authorization "(.+)" HTTP_AUTHORIZATION=$1
+ </IfModule>
</IfModule>
<IfModule mod_env.c>
diff --git a/apps/comments/activity/extension.php b/apps/comments/activity/extension.php
new file mode 100644
index 00000000000..b65f1911d17
--- /dev/null
+++ b/apps/comments/activity/extension.php
@@ -0,0 +1,301 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Comments\Activity;
+
+use OCP\Activity\IExtension;
+use OCP\Activity\IManager;
+use OCP\Comments\ICommentsManager;
+use OCP\Comments\NotFoundException;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\L10N\IFactory;
+
+/**
+ * Class Extension
+ *
+ * @package OCA\Comments\Activity
+ */
+class Extension implements IExtension {
+ const APP_NAME = 'comments';
+
+ const ADD_COMMENT_SUBJECT = 'add_comment_subject';
+ const ADD_COMMENT_MESSAGE = 'add_comment_message';
+
+ /** @var IFactory */
+ protected $languageFactory;
+
+ /** @var IManager */
+ protected $activityManager;
+
+ /** @var ICommentsManager */
+ protected $commentsManager;
+
+ /** @var IURLGenerator */
+ protected $URLGenerator;
+
+ /**
+ * @param IFactory $languageFactory
+ * @param IManager $activityManager
+ * @param ICommentsManager $commentsManager
+ * @param IURLGenerator $URLGenerator
+ */
+ public function __construct(IFactory $languageFactory, IManager $activityManager, ICommentsManager $commentsManager, IURLGenerator $URLGenerator) {
+ $this->languageFactory = $languageFactory;
+ $this->activityManager = $activityManager;
+ $this->commentsManager = $commentsManager;
+ $this->URLGenerator = $URLGenerator;
+ }
+
+ protected function getL10N($languageCode = null) {
+ return $this->languageFactory->get(self::APP_NAME, $languageCode);
+ }
+
+ /**
+ * The extension can return an array of additional notification types.
+ * If no additional types are to be added false is to be returned
+ *
+ * @param string $languageCode
+ * @return array|false
+ */
+ public function getNotificationTypes($languageCode) {
+ $l = $this->getL10N($languageCode);
+
+ return array(
+ self::APP_NAME => (string) $l->t('<strong>Comments</strong> for files'),
+ );
+ }
+
+ /**
+ * For a given method additional types to be displayed in the settings can be returned.
+ * In case no additional types are to be added false is to be returned.
+ *
+ * @param string $method
+ * @return array|false
+ */
+ public function getDefaultTypes($method) {
+ return $method === self::METHOD_STREAM ? [self::APP_NAME] : false;
+ }
+
+ /**
+ * A string naming the css class for the icon to be used can be returned.
+ * If no icon is known for the given type false is to be returned.
+ *
+ * @param string $type
+ * @return string|false
+ */
+ public function getTypeIcon($type) {
+ switch ($type) {
+ case self::APP_NAME:
+ return false;
+ }
+
+ return false;
+ }
+
+ /**
+ * The extension can translate a given message to the requested languages.
+ * If no translation is available false is to be returned.
+ *
+ * @param string $app
+ * @param string $text
+ * @param array $params
+ * @param boolean $stripPath
+ * @param boolean $highlightParams
+ * @param string $languageCode
+ * @return string|false
+ */
+ public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) {
+ if ($app !== self::APP_NAME) {
+ return false;
+ }
+
+ $l = $this->getL10N($languageCode);
+
+ if ($this->activityManager->isFormattingFilteredObject()) {
+ $translation = $this->translateShort($text, $l, $params);
+ if ($translation !== false) {
+ return $translation;
+ }
+ }
+
+ return $this->translateLong($text, $l, $params);
+ }
+
+ /**
+ * @param string $text
+ * @param IL10N $l
+ * @param array $params
+ * @return bool|string
+ */
+ protected function translateShort($text, IL10N $l, array $params) {
+
+ switch ($text) {
+ case self::ADD_COMMENT_SUBJECT:
+ return (string) $l->t('%1$s commented', $params);
+ case self::ADD_COMMENT_MESSAGE:
+ return $this->convertParameterToComment($params[0], 120);
+ }
+
+ return false;
+ }
+
+ /**
+ * @param string $text
+ * @param IL10N $l
+ * @param array $params
+ * @return bool|string
+ */
+ protected function translateLong($text, IL10N $l, array $params) {
+
+ switch ($text) {
+ case self::ADD_COMMENT_SUBJECT:
+ return (string) $l->t('%1$s commented on %2$s', $params);
+ case self::ADD_COMMENT_MESSAGE:
+ return $this->convertParameterToComment($params[0]);
+ }
+
+ return false;
+ }
+
+ /**
+ * The extension can define the type of parameters for translation
+ *
+ * Currently known types are:
+ * * file => will strip away the path of the file and add a tooltip with it
+ * * username => will add the avatar of the user
+ *
+ * @param string $app
+ * @param string $text
+ * @return array|false
+ */
+ public function getSpecialParameterList($app, $text) {
+ if ($app === self::APP_NAME) {
+ switch ($text) {
+ case self::ADD_COMMENT_SUBJECT:
+ return [
+ 0 => 'username',
+ 1 => 'file',
+ ];
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * The extension can define the parameter grouping by returning the index as integer.
+ * In case no grouping is required false is to be returned.
+ *
+ * @param array $activity
+ * @return integer|false
+ */
+ public function getGroupParameter($activity) {
+ return false;
+ }
+
+ /**
+ * The extension can define additional navigation entries. The array returned has to contain two keys 'top'
+ * and 'apps' which hold arrays with the relevant entries.
+ * If no further entries are to be added false is no be returned.
+ *
+ * @return array|false
+ */
+ public function getNavigation() {
+ $l = $this->getL10N();
+ return [
+ 'apps' => [],
+ 'top' => [
+ self::APP_NAME => [
+ 'id' => self::APP_NAME,
+ 'name' => (string) $l->t('Comments'),
+ 'url' => $this->URLGenerator->linkToRoute('activity.Activities.showList', ['filter' => self::APP_NAME]),
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * 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
+ */
+ public function isFilterValid($filterValue) {
+ return $filterValue === self::APP_NAME;
+ }
+
+ /**
+ * The extension can filter the types based on the filter if required.
+ * In case no filter is to be applied false is to be returned unchanged.
+ *
+ * @param array $types
+ * @param string $filter
+ * @return array|false
+ */
+ public function filterNotificationTypes($types, $filter) {
+ if ($filter === self::APP_NAME) {
+ return array_intersect($types, [self::APP_NAME]);
+ }
+ return false;
+ }
+
+ /**
+ * For a given filter the extension can specify the sql query conditions including parameters for that query.
+ * In case the extension does not know the filter false is to be returned.
+ * The query condition and the parameters are to be returned as array with two elements.
+ * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%'));
+ *
+ * @param string $filter
+ * @return array|false
+ */
+ public function getQueryForFilter($filter) {
+ return false;
+ }
+
+ /**
+ * @param string $parameter
+ * @return string
+ */
+ protected function convertParameterToComment($parameter, $maxLength = 0) {
+ if (preg_match('/^\<parameter\>(\d*)\<\/parameter\>$/', $parameter, $matches)) {
+ try {
+ $comment = $this->commentsManager->get((int) $matches[1]);
+ $message = $comment->getMessage();
+ $message = str_replace("\n", '<br />', str_replace(['<', '>'], ['&lt;', '&gt;'], $message));
+
+ if ($maxLength && isset($message[$maxLength + 20])) {
+ $findSpace = strpos($message, ' ', $maxLength);
+ if ($findSpace !== false && $findSpace < $maxLength + 20) {
+ return substr($message, 0, $findSpace) . '…';
+ }
+ return substr($message, 0, $maxLength + 20) . '…';
+ }
+
+ return $message;
+ } catch (NotFoundException $e) {
+ return '';
+ }
+ }
+
+ return '';
+ }
+}
diff --git a/apps/comments/activity/listener.php b/apps/comments/activity/listener.php
new file mode 100644
index 00000000000..7c6970df837
--- /dev/null
+++ b/apps/comments/activity/listener.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Comments\Activity;
+
+use OCP\Activity\IManager;
+use OCP\App\IAppManager;
+use OCP\Comments\CommentsEvent;
+use OCP\Files\Config\IMountProviderCollection;
+use OCP\Files\IRootFolder;
+use OCP\Files\Node;
+use OCP\IUser;
+use OCP\IUserSession;
+use OCP\Share;
+
+class Listener {
+ /** @var IManager */
+ protected $activityManager;
+ /** @var IUserSession */
+ protected $session;
+ /** @var \OCP\App\IAppManager */
+ protected $appManager;
+ /** @var \OCP\Files\Config\IMountProviderCollection */
+ protected $mountCollection;
+ /** @var \OCP\Files\IRootFolder */
+ protected $rootFolder;
+
+ /**
+ * Listener constructor.
+ *
+ * @param IManager $activityManager
+ * @param IUserSession $session
+ * @param IAppManager $appManager
+ * @param IMountProviderCollection $mountCollection
+ * @param IRootFolder $rootFolder
+ */
+ public function __construct(IManager $activityManager,
+ IUserSession $session,
+ IAppManager $appManager,
+ IMountProviderCollection $mountCollection,
+ IRootFolder $rootFolder) {
+ $this->activityManager = $activityManager;
+ $this->session = $session;
+ $this->appManager = $appManager;
+ $this->mountCollection = $mountCollection;
+ $this->rootFolder = $rootFolder;
+ }
+
+ /**
+ * @param CommentsEvent $event
+ */
+ public function commentEvent(CommentsEvent $event) {
+ if ($event->getComment()->getObjectType() !== 'files'
+ || !in_array($event->getEvent(), [CommentsEvent::EVENT_ADD])
+ || !$this->appManager->isInstalled('activity')) {
+ // Comment not for file, not adding a comment or no activity-app enabled (save the energy)
+ return;
+ }
+
+ // Get all mount point owners
+ $cache = $this->mountCollection->getMountCache();
+ $mounts = $cache->getMountsForFileId($event->getComment()->getObjectId());
+ if (empty($mounts)) {
+ return;
+ }
+
+ $users = [];
+ foreach ($mounts as $mount) {
+ $owner = $mount->getUser()->getUID();
+ $ownerFolder = $this->rootFolder->getUserFolder($owner);
+ $nodes = $ownerFolder->getById($event->getComment()->getObjectId());
+ if (!empty($nodes)) {
+ /** @var Node $node */
+ $node = array_shift($nodes);
+ $path = $node->getPath();
+ if (strpos($path, '/' . $owner . '/files/') === 0) {
+ $path = substr($path, strlen('/' . $owner . '/files'));
+ }
+ // Get all users that have access to the mount point
+ $users = array_merge($users, Share::getUsersSharingFile($path, $owner, true, true));
+ }
+ }
+
+ $actor = $this->session->getUser();
+ if ($actor instanceof IUser) {
+ $actor = $actor->getUID();
+ } else {
+ $actor = '';
+ }
+
+ $activity = $this->activityManager->generateEvent();
+ $activity->setApp(Extension::APP_NAME)
+ ->setType(Extension::APP_NAME)
+ ->setAuthor($actor)
+ ->setObject($event->getComment()->getObjectType(), $event->getComment()->getObjectId())
+ ->setMessage(Extension::ADD_COMMENT_MESSAGE, [
+ $event->getComment()->getId(),
+ ]);
+
+ foreach ($users as $user => $path) {
+ $activity->setAffectedUser($user);
+
+ $activity->setSubject(Extension::ADD_COMMENT_SUBJECT, [
+ $actor,
+ $path,
+ ]);
+ $this->activityManager->publish($activity);
+ }
+ }
+}
diff --git a/apps/comments/appinfo/app.php b/apps/comments/appinfo/app.php
index a1eb4f6899d..e76f598c807 100644
--- a/apps/comments/appinfo/app.php
+++ b/apps/comments/appinfo/app.php
@@ -33,3 +33,20 @@ $eventDispatcher->addListener(
\OCP\Util::addStyle('comments', 'comments');
}
);
+
+$activityManager = \OC::$server->getActivityManager();
+$activityManager->registerExtension(function() {
+ $application = new \OCP\AppFramework\App('comments');
+ /** @var \OCA\Comments\Activity\Extension $extension */
+ $extension = $application->getContainer()->query('OCA\Comments\Activity\Extension');
+ return $extension;
+});
+
+$managerListener = function(\OCP\Comments\CommentsEvent $event) use ($activityManager) {
+ $application = new \OCP\AppFramework\App('comments');
+ /** @var \OCA\Comments\Activity\Listener $listener */
+ $listener = $application->getContainer()->query('OCA\Comments\Activity\Listener');
+ $listener->commentEvent($event);
+};
+
+$eventDispatcher->addListener(\OCP\Comments\CommentsEvent::EVENT_ADD, $managerListener);
diff --git a/apps/comments/appinfo/info.xml b/apps/comments/appinfo/info.xml
index f3693150639..2003fc5c096 100644
--- a/apps/comments/appinfo/info.xml
+++ b/apps/comments/appinfo/info.xml
@@ -6,8 +6,11 @@
<licence>AGPL</licence>
<author>Arthur Shiwon, Vincent Petry</author>
<default_enable/>
- <version>0.1</version>
+ <version>0.2</version>
<dependencies>
<owncloud min-version="9.0" max-version="9.0" />
</dependencies>
+ <types>
+ <logging/>
+ </types>
</info>
diff --git a/apps/comments/css/comments.css b/apps/comments/css/comments.css
index b86ed38efe7..57a731184a0 100644
--- a/apps/comments/css/comments.css
+++ b/apps/comments/css/comments.css
@@ -14,7 +14,7 @@
#commentsTabView .newCommentForm .message {
width: 90%;
- resize: none;
+ resize: vertical;
}
#commentsTabView .newCommentForm .submitLoading {
@@ -31,6 +31,49 @@
line-height: 28px;
}
+#commentsTabView .comment {
+ position: relative;
+ z-index: 1;
+}
+
+#commentsTabView .comment.collapsed .message {
+ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+ white-space: -webkit-pre-wrap; /*Chrome & Safari */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* css-3 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+ word-break: break-all;
+ white-space: normal;
+}
+
+#commentsTabView .comment.collapsed .message {
+ max-height: 70px;
+ overflow: hidden;
+}
+
+#commentsTabView .comment .message-overlay {
+ display: none;
+}
+
+#commentsTabView .comment.collapsed .message-overlay {
+ display: block;
+ position: absolute;
+ z-index: 2;
+ height: 50px;
+ pointer-events: none;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: -moz-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
+ background: -webkit-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
+ background: -o-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
+ background: -ms-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
+ background: linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
+ filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00FFFFFF', endColorstr='#FFFFFFFF');
+ background-repeat: no-repeat;
+}
+
#commentsTabView .authorRow>div {
display: inline-block;
vertical-align: middle;
@@ -77,6 +120,14 @@
visibility: hidden;
}
+#commentsTabView .message.error {
+ color: #e9322d;
+ border-color: #e9322d;
+ -webkit-box-shadow: 0 0 6px #f8b9b7;
+ -moz-box-shadow: 0 0 6px #f8b9b7;
+ box-shadow: 0 0 6px #f8b9b7;
+}
+
.app-files .action-comment>img {
margin-right: 5px;
}
diff --git a/apps/comments/js/commentstabview.js b/apps/comments/js/commentstabview.js
index 8faf98b35ab..1326d544b1a 100644
--- a/apps/comments/js/commentstabview.js
+++ b/apps/comments/js/commentstabview.js
@@ -41,7 +41,7 @@
'</div>';
var COMMENT_TEMPLATE =
- '<li class="comment{{#if isUnread}} unread{{/if}}" data-id="{{id}}">' +
+ '<li class="comment{{#if isUnread}} unread{{/if}}{{#if isLong}} collapsed{{/if}}" data-id="{{id}}">' +
' <div class="authorRow">' +
' {{#if avatarEnabled}}' +
' <div class="avatar" {{#if actorId}}data-username="{{actorId}}"{{/if}}> </div>' +
@@ -53,6 +53,9 @@
' <div class="date has-tooltip" title="{{altDate}}">{{date}}</div>' +
' </div>' +
' <div class="message">{{{formattedMessage}}}</div>' +
+ '{{#if isLong}}' +
+ ' <div class="message-overlay"></div>' +
+ '{{/if}}' +
'</li>';
/**
@@ -68,9 +71,12 @@
'click .showMore': '_onClickShowMore',
'click .action.edit': '_onClickEditComment',
'click .action.delete': '_onClickDeleteComment',
- 'click .cancel': '_onClickCloseComment'
+ 'click .cancel': '_onClickCloseComment',
+ 'click .comment': '_onClickComment'
},
+ _commentMaxLength: 1000,
+
initialize: function() {
OCA.Files.DetailTabView.prototype.initialize.apply(this, arguments);
this.collection = new OCA.Comments.CommentCollection();
@@ -80,7 +86,10 @@
this._avatarsEnabled = !!OC.config.enable_avatars;
+ this._commentMaxThreshold = this._commentMaxLength * 0.9;
+
// TODO: error handling
+ _.bindAll(this, '_onTypeComment');
},
template: function(params) {
@@ -119,7 +128,8 @@
params = _.extend({
avatarEnabled: this._avatarsEnabled,
editTooltip: t('comments', 'Edit comment'),
- isUserAuthor: OC.getCurrentUser().uid === params.actorId
+ isUserAuthor: OC.getCurrentUser().uid === params.actorId,
+ isLong: this._isLong(params.message)
}, params);
if (params.actorType === 'deleted_users') {
@@ -162,6 +172,7 @@
this.$el.find('.avatar').avatar(OC.getCurrentUser().uid, 28);
}
this.delegateEvents();
+ this.$el.find('textarea').on('keyup input change', this._onTypeComment);
},
_formatItem: function(commentModel) {
@@ -258,10 +269,11 @@
submitText: t('comments', 'Save')
}, commentToEdit.attributes)));
- $comment.addClass('hidden');
+ $comment.addClass('hidden').removeClass('collapsed');
// spawn form
$comment.after($formRow);
$formRow.data('commentEl', $comment);
+ $formRow.find('textarea').on('keyup input change', this._onTypeComment);
// copy avatar element from original to avoid flickering
$formRow.find('.avatar').replaceWith($comment.find('.avatar').clone());
@@ -270,6 +282,35 @@
return false;
},
+ _onTypeComment: function(ev) {
+ var $field = $(ev.target);
+ var len = $field.val().length;
+ var $submitButton = $field.data('submitButtonEl');
+ if (!$submitButton) {
+ $submitButton = $field.closest('form').find('.submit');
+ $field.data('submitButtonEl', $submitButton);
+ }
+ $field.tooltip('hide');
+ if (len > this._commentMaxThreshold) {
+ $field.attr('data-original-title', t('comments', 'Allowed characters {count} of {max}', {count: len, max: this._commentMaxLength}));
+ $field.tooltip({trigger: 'manual'});
+ $field.tooltip('show');
+ $field.addClass('error');
+ }
+
+ var limitExceeded = (len > this._commentMaxLength);
+ $field.toggleClass('error', limitExceeded);
+ $submitButton.prop('disabled', limitExceeded);
+ },
+
+ _onClickComment: function(ev) {
+ var $row = $(ev.target);
+ if (!$row.is('.comment')) {
+ $row = $row.closest('.comment');
+ }
+ $row.removeClass('collapsed');
+ },
+
_onClickCloseComment: function(ev) {
ev.preventDefault();
var $row = $(ev.target).closest('.comment');
@@ -318,7 +359,7 @@
var message = $textArea.val().trim();
e.preventDefault();
- if (!message.length) {
+ if (!message.length || message.length > this._commentMaxLength) {
return;
}
@@ -378,6 +419,14 @@
}
return false;
+ },
+
+ /**
+ * Returns whether the given message is long and needs
+ * collapsing
+ */
+ _isLong: function(message) {
+ return message.length > 250 || (message.match(/\n/g) || []).length > 1;
}
});
diff --git a/apps/comments/tests/js/commentstabviewSpec.js b/apps/comments/tests/js/commentstabviewSpec.js
index 9e986899f7d..70930da7520 100644
--- a/apps/comments/tests/js/commentstabviewSpec.js
+++ b/apps/comments/tests/js/commentstabviewSpec.js
@@ -25,6 +25,20 @@ describe('OCA.Comments.CommentsTabView tests', function() {
var testComments;
var clock;
+ /**
+ * Creates a dummy message with the given length
+ *
+ * @param {int} len length
+ * @return {string} message
+ */
+ function createMessageWithLength(len) {
+ var bigMessage = '';
+ for (var i = 0; i < len; i++) {
+ bigMessage += 'a';
+ }
+ return bigMessage;
+ }
+
beforeEach(function() {
clock = sinon.useFakeTimers(Date.UTC(2016, 1, 3, 10, 5, 9));
fetchStub = sinon.stub(OCA.Comments.CommentCollection.prototype, 'fetchNext');
@@ -201,7 +215,55 @@ describe('OCA.Comments.CommentsTabView tests', function() {
expect(createStub.notCalled).toEqual(true);
});
+ it('does not create a comment if the field length is too large', function() {
+ var bigMessage = '';
+ for (var i = 0; i < view._commentMaxLength * 2; i++) {
+ bigMessage += 'a';
+ }
+ view.$el.find('.message').val(bigMessage);
+ view.$el.find('form').submit();
+ expect(createStub.notCalled).toEqual(true);
+ });
+ describe('limit indicator', function() {
+ var tooltipStub;
+ var $message;
+ var $submitButton;
+
+ beforeEach(function() {
+ tooltipStub = sinon.stub($.fn, 'tooltip');
+ $message = view.$el.find('.message');
+ $submitButton = view.$el.find('.submit');
+ });
+ afterEach(function() {
+ tooltipStub.restore();
+ });
+
+ it('does not displays tooltip when limit is far away', function() {
+ $message.val(createMessageWithLength(3));
+ $message.trigger('change');
+
+ expect(tooltipStub.calledWith('show')).toEqual(false);
+ expect($submitButton.prop('disabled')).toEqual(false);
+ expect($message.hasClass('error')).toEqual(false);
+ });
+ it('displays tooltip when limit is almost reached', function() {
+ $message.val(createMessageWithLength(view._commentMaxLength - 2));
+ $message.trigger('change');
+
+ expect(tooltipStub.calledWith('show')).toEqual(true);
+ expect($submitButton.prop('disabled')).toEqual(false);
+ expect($message.hasClass('error')).toEqual(false);
+ });
+ it('displays tooltip and disabled button when limit is exceeded', function() {
+ $message.val(createMessageWithLength(view._commentMaxLength + 2));
+ $message.trigger('change');
+
+ expect(tooltipStub.calledWith('show')).toEqual(true);
+ expect($submitButton.prop('disabled')).toEqual(true);
+ expect($message.hasClass('error')).toEqual(true);
+ });
+ });
});
describe('editing comments', function() {
var saveStub;
@@ -336,6 +398,22 @@ describe('OCA.Comments.CommentsTabView tests', function() {
destroyStub.restore();
});
+ it('does not submit comment if the field is empty', function() {
+ var $comment = view.$el.find('.comment[data-id=1]');
+ $comment.find('.action.edit').click();
+ $comment.find('.message').val(' ');
+ $comment.find('form').submit();
+
+ expect(saveStub.notCalled).toEqual(true);
+ });
+ it('does not submit comment if the field length is too large', function() {
+ var $comment = view.$el.find('.comment[data-id=1]');
+ $comment.find('.action.edit').click();
+ $comment.find('.message').val(createMessageWithLength(view._commentMaxLength * 2));
+ $comment.find('form').submit();
+
+ expect(saveStub.notCalled).toEqual(true);
+ });
});
describe('read marker', function() {
var updateMarkerStub;
diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php
index 07905db7368..11ab384d75d 100644
--- a/apps/dav/appinfo/application.php
+++ b/apps/dav/appinfo/application.php
@@ -20,12 +20,16 @@
*/
namespace OCA\Dav\AppInfo;
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\ContactsManager;
use OCA\DAV\CardDAV\SyncJob;
use OCA\DAV\CardDAV\SyncService;
use OCA\DAV\HookManager;
use OCA\Dav\Migration\AddressBookAdapter;
+use OCA\Dav\Migration\CalendarAdapter;
use OCA\Dav\Migration\MigrateAddressbooks;
+use OCA\Dav\Migration\MigrateCalendars;
use \OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
use OCP\Contacts\IManager;
@@ -73,7 +77,17 @@ class Application extends App {
$c->getServer()->getUserManager(),
$c->getServer()->getGroupManager()
);
- return new \OCA\DAV\CardDAV\CardDavBackend($db, $principal, $logger);
+ return new CardDavBackend($db, $principal, $logger);
+ });
+
+ $container->registerService('CalDavBackend', function($c) {
+ /** @var IAppContainer $c */
+ $db = $c->getServer()->getDatabaseConnection();
+ $principal = new \OCA\DAV\Connector\Sabre\Principal(
+ $c->getServer()->getUserManager(),
+ $c->getServer()->getGroupManager()
+ );
+ return new CalDavBackend($db, $principal);
});
$container->registerService('MigrateAddressbooks', function($c) {
@@ -84,6 +98,15 @@ class Application extends App {
$c->query('CardDavBackend')
);
});
+
+ $container->registerService('MigrateCalendars', function($c) {
+ /** @var IAppContainer $c */
+ $db = $c->getServer()->getDatabaseConnection();
+ return new MigrateCalendars(
+ new CalendarAdapter($db),
+ $c->query('CalDavBackend')
+ );
+ });
}
/**
@@ -112,8 +135,8 @@ class Application extends App {
}
public function migrateAddressbooks() {
-
try {
+ /** @var MigrateAddressbooks $migration */
$migration = $this->getContainer()->query('MigrateAddressbooks');
$migration->setup();
$userManager = $this->getContainer()->getServer()->getUserManager();
@@ -127,4 +150,19 @@ class Application extends App {
}
}
+ public function migrateCalendars() {
+ try {
+ /** @var MigrateCalendars $migration */
+ $migration = $this->getContainer()->query('MigrateCalendars');
+ $migration->setup();
+ $userManager = $this->getContainer()->getServer()->getUserManager();
+
+ $userManager->callForAllUsers(function($user) use($migration) {
+ /** @var IUser $user */
+ $migration->migrateForUser($user->getUID());
+ });
+ } catch (\Exception $ex) {
+ $this->getContainer()->getServer()->getLogger()->logException($ex);
+ }
+ }
}
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index f035d19d862..4f3a93dbf8b 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -14,6 +14,12 @@
<files>appinfo/v1/webdav.php</files>
<webdav>appinfo/v1/webdav.php</webdav>
<dav>appinfo/v2/remote.php</dav>
+ <!-- carddav endpoints as used before ownCloud 9.0 -->
+ <contacts>appinfo/v1/carddav.php</contacts>
+ <carddav>appinfo/v1/carddav.php</carddav>
+ <!-- caldav endpoints as used before ownCloud 9.0 -->
+ <calendar>appinfo/v1/caldav.php</calendar>
+ <caldav>appinfo/v1/caldav.php</caldav>
</remote>
<public>
<webdav>appinfo/v1/publicwebdav.php</webdav>
diff --git a/apps/dav/appinfo/install.php b/apps/dav/appinfo/install.php
index f6ef533958e..a7a3220b90f 100644
--- a/apps/dav/appinfo/install.php
+++ b/apps/dav/appinfo/install.php
@@ -24,3 +24,4 @@ use OCA\Dav\AppInfo\Application;
$app = new Application();
$app->setupCron();
$app->migrateAddressbooks();
+$app->migrateCalendars();
diff --git a/apps/dav/appinfo/register_command.php b/apps/dav/appinfo/register_command.php
index e8ca370f84f..4981cab9264 100644
--- a/apps/dav/appinfo/register_command.php
+++ b/apps/dav/appinfo/register_command.php
@@ -23,6 +23,7 @@ use OCA\Dav\AppInfo\Application;
use OCA\DAV\Command\CreateAddressBook;
use OCA\DAV\Command\CreateCalendar;
use OCA\Dav\Command\MigrateAddressbooks;
+use OCA\Dav\Command\MigrateCalendars;
use OCA\DAV\Command\SyncSystemAddressBook;
$config = \OC::$server->getConfig();
@@ -44,4 +45,6 @@ if ($config->getSystemValue('debug', false)){
$app = new \OCA\Dav\AppInfo\Application();
$migration = $app->getContainer()->query('MigrateAddressbooks');
$application->add(new MigrateAddressbooks($userManager, $migration));
+ $migration = $app->getContainer()->query('MigrateCalendars');
+ $application->add(new MigrateCalendars($userManager, $migration));
}
diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php
new file mode 100644
index 00000000000..f860ced3877
--- /dev/null
+++ b/apps/dav/appinfo/v1/caldav.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+// Backends
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\Connector\Sabre\Auth;
+use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin;
+use OCA\DAV\Connector\Sabre\MaintenancePlugin;
+use OCA\DAV\Connector\Sabre\Principal;
+use Sabre\CalDAV\CalendarRoot;
+
+$authBackend = new Auth(
+ \OC::$server->getSession(),
+ \OC::$server->getUserSession(),
+ 'principals/'
+);
+$principalBackend = new Principal(
+ \OC::$server->getUserManager(),
+ \OC::$server->getGroupManager(),
+ 'principals/'
+);
+$db = \OC::$server->getDatabaseConnection();
+$calDavBackend = new CalDavBackend($db, $principalBackend);
+
+// Root nodes
+$principalCollection = new \Sabre\CalDAV\Principal\Collection($principalBackend);
+$principalCollection->disableListing = true; // Disable listing
+
+$addressBookRoot = new CalendarRoot($principalBackend, $calDavBackend);
+$addressBookRoot->disableListing = true; // Disable listing
+
+$nodes = array(
+ $principalCollection,
+ $addressBookRoot,
+);
+
+// Fire up server
+$server = new \Sabre\DAV\Server($nodes);
+$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
+$server->setBaseUri($baseuri);
+
+// Add plugins
+$server->addPlugin(new MaintenancePlugin());
+$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud'));
+$server->addPlugin(new \Sabre\CalDAV\Plugin());
+$server->addPlugin(new \Sabre\DAVACL\Plugin());
+$server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
+$server->addPlugin(new ExceptionLoggerPlugin('caldav', \OC::$server->getLogger()));
+
+// And off we go!
+$server->exec();
diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php
new file mode 100644
index 00000000000..e0c79c75b72
--- /dev/null
+++ b/apps/dav/appinfo/v1/carddav.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+// Backends
+use OCA\DAV\CardDAV\AddressBookRoot;
+use OCA\DAV\CardDAV\CardDavBackend;
+use OCA\DAV\Connector\Sabre\AppEnabledPlugin;
+use OCA\DAV\Connector\Sabre\Auth;
+use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin;
+use OCA\DAV\Connector\Sabre\MaintenancePlugin;
+use OCA\DAV\Connector\Sabre\Principal;
+use Sabre\CardDAV\Plugin;
+
+$authBackend = new Auth(
+ \OC::$server->getSession(),
+ \OC::$server->getUserSession(),
+ 'principals/'
+);
+$principalBackend = new Principal(
+ \OC::$server->getUserManager(),
+ \OC::$server->getGroupManager(),
+ 'principals/'
+);
+$db = \OC::$server->getDatabaseConnection();
+$cardDavBackend = new CardDavBackend($db, $principalBackend);
+
+// Root nodes
+$principalCollection = new \Sabre\CalDAV\Principal\Collection($principalBackend);
+$principalCollection->disableListing = true; // Disable listing
+
+$addressBookRoot = new AddressBookRoot($principalBackend, $cardDavBackend);
+$addressBookRoot->disableListing = true; // Disable listing
+
+$nodes = array(
+ $principalCollection,
+ $addressBookRoot,
+);
+
+// Fire up server
+$server = new \Sabre\DAV\Server($nodes);
+$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
+$server->setBaseUri($baseuri);
+// Add plugins
+$server->addPlugin(new MaintenancePlugin());
+$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud'));
+$server->addPlugin(new Plugin());
+$server->addPlugin(new \Sabre\DAVACL\Plugin());
+$server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin());
+$server->addPlugin(new ExceptionLoggerPlugin('carddav', \OC::$server->getLogger()));
+
+// And off we go!
+$server->exec();
diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php
index d75c3526bdd..3d3e51e84bc 100644
--- a/apps/dav/appinfo/v1/webdav.php
+++ b/apps/dav/appinfo/v1/webdav.php
@@ -40,7 +40,8 @@ $serverFactory = new \OCA\DAV\Connector\Sabre\ServerFactory(
// Backends
$authBackend = new \OCA\DAV\Connector\Sabre\Auth(
\OC::$server->getSession(),
- \OC::$server->getUserSession()
+ \OC::$server->getUserSession(),
+ 'principals/'
);
$requestUri = \OC::$server->getRequest()->getRequestUri();
diff --git a/apps/dav/command/migrateaddressbooks.php b/apps/dav/command/migrateaddressbooks.php
index 2ab7113ab1f..f37c29e7ab3 100644
--- a/apps/dav/command/migrateaddressbooks.php
+++ b/apps/dav/command/migrateaddressbooks.php
@@ -68,6 +68,7 @@ class MigrateAddressbooks extends Command {
}
$output->writeln("Start migration for $user");
$this->service->migrateForUser($user);
+ return;
}
$output->writeln("Start migration of all known users ...");
$p = new ProgressBar($output);
diff --git a/apps/dav/command/migratecalendars.php b/apps/dav/command/migratecalendars.php
new file mode 100644
index 00000000000..eda4f5fb417
--- /dev/null
+++ b/apps/dav/command/migratecalendars.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace OCA\Dav\Command;
+
+use OCP\IUser;
+use OCP\IUserManager;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\ProgressBar;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class MigrateCalendars extends Command {
+
+ /** @var IUserManager */
+ protected $userManager;
+
+ /** @var \OCA\Dav\Migration\MigrateCalendars */
+ private $service;
+
+ /**
+ * @param IUserManager $userManager
+ * @param \OCA\Dav\Migration\MigrateCalendars $service
+ */
+ function __construct(IUserManager $userManager,
+ \OCA\Dav\Migration\MigrateCalendars $service
+ ) {
+ parent::__construct();
+ $this->userManager = $userManager;
+ $this->service = $service;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('dav:migrate-calendars')
+ ->setDescription('Migrate calendars from the calendar app to core')
+ ->addArgument('user',
+ InputArgument::OPTIONAL,
+ 'User for whom all calendars will be migrated');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $this->service->setup();
+
+ if ($input->hasArgument('user')) {
+ $user = $input->getArgument('user');
+ if (!$this->userManager->userExists($user)) {
+ throw new \InvalidArgumentException("User <$user> in unknown.");
+ }
+ $output->writeln("Start migration for $user");
+ $this->service->migrateForUser($user);
+ return;
+ }
+ $output->writeln("Start migration of all known users ...");
+ $p = new ProgressBar($output);
+ $p->start();
+ $this->userManager->callForAllUsers(function($user) use ($p) {
+ $p->advance();
+ /** @var IUser $user */
+ $this->service->migrateForUser($user->getUID());
+ });
+
+ $p->finish();
+ $output->writeln('');
+ }
+}
diff --git a/apps/dav/lib/caldav/caldavbackend.php b/apps/dav/lib/caldav/caldavbackend.php
index 3aa493e5087..775612487f9 100644
--- a/apps/dav/lib/caldav/caldavbackend.php
+++ b/apps/dav/lib/caldav/caldavbackend.php
@@ -22,9 +22,11 @@
namespace OCA\DAV\CalDAV;
+use OCA\DAV\DAV\Sharing\IShareable;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCA\DAV\Connector\Sabre\Principal;
use OCA\DAV\DAV\Sharing\Backend;
+use OCP\IDBConnection;
use Sabre\CalDAV\Backend\AbstractBackend;
use Sabre\CalDAV\Backend\SchedulingSupport;
use Sabre\CalDAV\Backend\SubscriptionSupport;
@@ -59,7 +61,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
const MAX_DATE = '2038-01-01';
/**
- * List of CalDAV properties, and how they map to database fieldnames
+ * List of CalDAV properties, and how they map to database field names
* Add your own properties by simply adding on to this array.
*
* Note that only string-based properties are supported here.
@@ -75,7 +77,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
];
/**
- * List of subscription properties, and how they map to database fieldnames.
+ * List of subscription properties, and how they map to database field names.
*
* @var array
*/
@@ -89,7 +91,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
'{http://calendarserver.org/ns/}subscribed-strip-attachments' => 'stripattachments',
];
- /** @var \OCP\IDBConnection */
+ /** @var IDBConnection */
private $db;
/** @var Backend */
@@ -101,12 +103,13 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
/**
* CalDavBackend constructor.
*
- * @param \OCP\IDBConnection $db
+ * @param IDBConnection $db
+ * @param Principal $principalBackend
*/
- public function __construct(\OCP\IDBConnection $db, Principal $principalBackend) {
+ public function __construct(IDBConnection $db, Principal $principalBackend) {
$this->db = $db;
$this->principalBackend = $principalBackend;
- $this->sharingBackend = new Backend($this->db, 'calendar');
+ $this->sharingBackend = new Backend($this->db, $principalBackend, 'calendar');
}
/**
@@ -172,7 +175,9 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar[$xmlName] = $row[$dbName];
}
- $calendars[$calendar['id']] = $calendar;
+ if (!isset($calendars[$calendar['id']])) {
+ $calendars[$calendar['id']] = $calendar;
+ }
}
$stmt->closeCursor();
@@ -221,13 +226,104 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar[$xmlName] = $row[$dbName];
}
- $calendars[$calendar['id']] = $calendar;
+ if (!isset($calendars[$calendar['id']])) {
+ $calendars[$calendar['id']] = $calendar;
+ }
}
$result->closeCursor();
return array_values($calendars);
}
+ public function getCalendarByUri($principal, $uri) {
+ $fields = array_values($this->propertyMap);
+ $fields[] = 'id';
+ $fields[] = 'uri';
+ $fields[] = 'synctoken';
+ $fields[] = 'components';
+ $fields[] = 'principaluri';
+ $fields[] = 'transparent';
+
+ // Making fields a comma-delimited list
+ $query = $this->db->getQueryBuilder();
+ $query->select($fields)->from('calendars')
+ ->where($query->expr()->eq('uri', $query->createNamedParameter($uri)))
+ ->andWhere($query->expr()->eq('principaluri', $query->createNamedParameter($principal)))
+ ->setMaxResults(1);
+ $stmt = $query->execute();
+
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+ $stmt->closeCursor();
+ if ($row === false) {
+ return null;
+ }
+
+ $components = [];
+ if ($row['components']) {
+ $components = explode(',',$row['components']);
+ }
+
+ $calendar = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{' . Plugin::NS_CALENDARSERVER . '}getctag' => 'http://sabre.io/ns/sync/' . ($row['synctoken']?$row['synctoken']:'0'),
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components),
+ '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
+ ];
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ $calendar[$xmlName] = $row[$dbName];
+ }
+
+ return $calendar;
+ }
+
+ public function getCalendarById($calendarId) {
+ $fields = array_values($this->propertyMap);
+ $fields[] = 'id';
+ $fields[] = 'uri';
+ $fields[] = 'synctoken';
+ $fields[] = 'components';
+ $fields[] = 'principaluri';
+ $fields[] = 'transparent';
+
+ // Making fields a comma-delimited list
+ $query = $this->db->getQueryBuilder();
+ $query->select($fields)->from('calendars')
+ ->where($query->expr()->eq('id', $query->createNamedParameter($calendarId)))
+ ->setMaxResults(1);
+ $stmt = $query->execute();
+
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+ $stmt->closeCursor();
+ if ($row === false) {
+ return null;
+ }
+
+ $components = [];
+ if ($row['components']) {
+ $components = explode(',',$row['components']);
+ }
+
+ $calendar = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{' . Plugin::NS_CALENDARSERVER . '}getctag' => 'http://sabre.io/ns/sync/' . ($row['synctoken']?$row['synctoken']:'0'),
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components),
+ '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
+ ];
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ $calendar[$xmlName] = $row[$dbName];
+ }
+
+ return $calendar;
+ }
+
/**
* Creates a new calendar for a principal.
*
@@ -237,7 +333,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @param string $principalUri
* @param string $calendarUri
* @param array $properties
- * @return void
+ * @return int
*/
function createCalendar($principalUri, $calendarUri, array $properties) {
$values = [
@@ -274,6 +370,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$query->setValue($column, $query->createNamedParameter($value));
}
$query->execute();
+ return $query->getLastInsertId();
}
/**
@@ -1245,16 +1342,29 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
return $cardData;
}
+ /**
+ * @param IShareable $shareable
+ * @param array $add
+ * @param array $remove
+ */
public function updateShares($shareable, $add, $remove) {
$this->sharingBackend->updateShares($shareable, $add, $remove);
}
+ /**
+ * @param int $resourceId
+ * @return array
+ */
public function getShares($resourceId) {
return $this->sharingBackend->getShares($resourceId);
}
- public function applyShareAcl($addressBookId, $acl) {
- return $this->sharingBackend->applyShareAcl($addressBookId, $acl);
+ /**
+ * @param int $resourceId
+ * @param array $acl
+ * @return array
+ */
+ public function applyShareAcl($resourceId, $acl) {
+ return $this->sharingBackend->applyShareAcl($resourceId, $acl);
}
-
}
diff --git a/apps/dav/lib/carddav/addressbookroot.php b/apps/dav/lib/carddav/addressbookroot.php
index 2680135dec2..99c36c2e767 100644
--- a/apps/dav/lib/carddav/addressbookroot.php
+++ b/apps/dav/lib/carddav/addressbookroot.php
@@ -40,6 +40,9 @@ class AddressBookRoot extends \Sabre\CardDAV\AddressBookRoot {
function getName() {
+ if ($this->principalPrefix === 'principals') {
+ return parent::getName();
+ }
// Grabbing all the components of the principal path.
$parts = explode('/', $this->principalPrefix);
diff --git a/apps/dav/lib/carddav/carddavbackend.php b/apps/dav/lib/carddav/carddavbackend.php
index 9ca166c22a2..c4f29b39d0d 100644
--- a/apps/dav/lib/carddav/carddavbackend.php
+++ b/apps/dav/lib/carddav/carddavbackend.php
@@ -72,7 +72,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
public function __construct(IDBConnection $db, Principal $principalBackend) {
$this->db = $db;
$this->principalBackend = $principalBackend;
- $this->sharingBackend = new Backend($this->db, 'addressbook');
+ $this->sharingBackend = new Backend($this->db, $principalBackend, 'addressbook');
}
/**
@@ -93,11 +93,11 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* @return array
*/
function getAddressBooksForUser($principalUri) {
+ $principalUri = $this->convertPrincipal($principalUri, true);
$query = $this->db->getQueryBuilder();
$query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
->from('addressbooks')
- ->where($query->expr()->eq('principaluri', $query->createParameter('principaluri')))
- ->setParameter('principaluri', $principalUri);
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)));
$addressBooks = [];
@@ -106,7 +106,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
$addressBooks[$row['id']] = [
'id' => $row['id'],
'uri' => $row['uri'],
- 'principaluri' => $row['principaluri'],
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], false),
'{DAV:}displayname' => $row['displayname'],
'{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
'{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
@@ -133,17 +133,19 @@ class CardDavBackend implements BackendInterface, SyncSupport {
list(, $name) = URLUtil::splitPath($row['principaluri']);
$uri = $row['uri'] . '_shared_by_' . $name;
$displayName = $row['displayname'] . "($name)";
- $addressBooks[$row['id']] = [
- 'id' => $row['id'],
- 'uri' => $uri,
- 'principaluri' => $principalUri,
- '{DAV:}displayname' => $displayName,
- '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
- '{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
- '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => $row['access'] === self::ACCESS_READ,
- ];
+ if (!isset($addressBooks[$row['id']])) {
+ $addressBooks[$row['id']] = [
+ 'id' => $row['id'],
+ 'uri' => $uri,
+ 'principaluri' => $principalUri,
+ '{DAV:}displayname' => $displayName,
+ '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
+ '{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => $row['access'] === self::ACCESS_READ,
+ ];
+ }
}
$result->closeCursor();
@@ -919,4 +921,15 @@ class CardDavBackend implements BackendInterface, SyncSupport {
public function applyShareAcl($addressBookId, $acl) {
return $this->sharingBackend->applyShareAcl($addressBookId, $acl);
}
+
+ private function convertPrincipal($principalUri, $toV2) {
+ if ($this->principalBackend->getPrincipalPrefix() === 'principals') {
+ list(, $name) = URLUtil::splitPath($principalUri);
+ if ($toV2 === true) {
+ return "principals/users/$name";
+ }
+ return "principals/$name";
+ }
+ return $principalUri;
+ }
}
diff --git a/apps/dav/lib/comments/commentsplugin.php b/apps/dav/lib/comments/commentsplugin.php
index 282c14df1e8..56d94cc33e9 100644
--- a/apps/dav/lib/comments/commentsplugin.php
+++ b/apps/dav/lib/comments/commentsplugin.php
@@ -116,6 +116,11 @@ class CommentsPlugin extends ServerPlugin {
$data,
$request->getHeader('Content-Type')
);
+
+ // update read marker for the current user/poster to avoid
+ // having their own comments marked as unread
+ $node->setReadMarker(null);
+
$url = $request->getUrl() . '/' . urlencode($comment->getId());
$response->setHeader('Content-Location', $url);
diff --git a/apps/dav/lib/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php
index cc679e44dbe..a046e078482 100644
--- a/apps/dav/lib/connector/sabre/auth.php
+++ b/apps/dav/lib/connector/sabre/auth.php
@@ -49,12 +49,14 @@ class Auth extends AbstractBasic {
/**
* @param ISession $session
* @param IUserSession $userSession
+ * @param string $principalPrefix
*/
public function __construct(ISession $session,
- IUserSession $userSession) {
+ IUserSession $userSession,
+ $principalPrefix = 'principals/users/') {
$this->session = $session;
$this->userSession = $userSession;
- $this->principalPrefix = 'principals/users/';
+ $this->principalPrefix = $principalPrefix;
}
/**
diff --git a/apps/dav/lib/connector/sabre/checksumlist.php b/apps/dav/lib/connector/sabre/checksumlist.php
new file mode 100644
index 00000000000..f137222acca
--- /dev/null
+++ b/apps/dav/lib/connector/sabre/checksumlist.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OCA\DAV\Connector\Sabre;
+
+use Sabre\Xml\XmlSerializable;
+use Sabre\Xml\Element;
+use Sabre\Xml\Writer;
+
+/**
+ * Checksumlist property
+ *
+ * This property contains multiple "checksum" elements, each containing a
+ * checksum name.
+ */
+class ChecksumList implements XmlSerializable {
+ const NS_OWNCLOUD = 'http://owncloud.org/ns';
+
+ /** @var string[] of TYPE:CHECKSUM */
+ private $checksums;
+
+ /**
+ * @param string $checksum
+ */
+ public function __construct($checksum) {
+ $this->checksums = explode(',', $checksum);
+ }
+
+ /**
+ * The xmlSerialize metod is called during xml writing.
+ *
+ * Use the $writer argument to write its own xml serialization.
+ *
+ * An important note: do _not_ create a parent element. Any element
+ * implementing XmlSerializble should only ever write what's considered
+ * its 'inner xml'.
+ *
+ * The parent of the current element is responsible for writing a
+ * containing element.
+ *
+ * This allows serializers to be re-used for different element names.
+ *
+ * If you are opening new elements, you must also close them again.
+ *
+ * @param Writer $writer
+ * @return void
+ */
+ function xmlSerialize(Writer $writer) {
+
+ foreach ($this->checksums as $checksum) {
+ $writer->writeElement('{' . self::NS_OWNCLOUD . '}checksum', $checksum);
+ }
+ }
+}
diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php
index 82d00014905..2e913ee1077 100644
--- a/apps/dav/lib/connector/sabre/filesplugin.php
+++ b/apps/dav/lib/connector/sabre/filesplugin.php
@@ -47,7 +47,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified';
const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id';
const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
- const CHECKSUM_PROPERTYNAME = '{http://owncloud.org/ns}checksum';
+ const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums';
/**
* Reference to main server object
@@ -108,7 +108,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
$server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME;
$server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME;
$server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
- $server->protectedProperties[] = self::CHECKSUM_PROPERTYNAME;
+ $server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME;
// normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
$allowedProperties = ['{DAV:}getetag'];
@@ -248,13 +248,9 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
return false;
});
- $propFind->handle(self::CHECKSUM_PROPERTYNAME, function() use ($node) {
+ $propFind->handle(self::CHECKSUMS_PROPERTYNAME, function() use ($node) {
$checksum = $node->getChecksum();
-
- if ($checksum === null) {
- return '';
- }
- return $checksum;
+ return new ChecksumList($checksum);
});
}
diff --git a/apps/dav/lib/connector/sabre/filesreportplugin.php b/apps/dav/lib/connector/sabre/filesreportplugin.php
new file mode 100644
index 00000000000..5bdd7a71ddc
--- /dev/null
+++ b/apps/dav/lib/connector/sabre/filesreportplugin.php
@@ -0,0 +1,321 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Connector\Sabre;
+
+use OC\Files\View;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Exception\PreconditionFailed;
+use Sabre\DAV\Exception\ReportNotSupported;
+use Sabre\DAV\Exception\BadRequest;
+use Sabre\DAV\ServerPlugin;
+use Sabre\DAV\Tree;
+use Sabre\DAV\Xml\Element\Response;
+use Sabre\DAV\Xml\Response\MultiStatus;
+use Sabre\DAV\PropFind;
+use OCP\SystemTag\ISystemTagObjectMapper;
+use OCP\IUserSession;
+use OCP\Files\Folder;
+use OCP\IGroupManager;
+use OCP\SystemTag\ISystemTagManager;
+use OCP\SystemTag\TagNotFoundException;
+
+class FilesReportPlugin extends ServerPlugin {
+
+ // namespace
+ const NS_OWNCLOUD = 'http://owncloud.org/ns';
+ const REPORT_NAME = '{http://owncloud.org/ns}filter-files';
+ const SYSTEMTAG_PROPERTYNAME = '{http://owncloud.org/ns}systemtag';
+
+ /**
+ * Reference to main server object
+ *
+ * @var \Sabre\DAV\Server
+ */
+ private $server;
+
+ /**
+ * @var Tree
+ */
+ private $tree;
+
+ /**
+ * @var View
+ */
+ private $fileView;
+
+ /**
+ * @var ISystemTagManager
+ */
+ private $tagManager;
+
+ /**
+ * @var ISystemTagObjectMapper
+ */
+ private $tagMapper;
+
+ /**
+ * @var IUserSession
+ */
+ private $userSession;
+
+ /**
+ * @var IGroupManager
+ */
+ private $groupManager;
+
+ /**
+ * @var Folder
+ */
+ private $userFolder;
+
+ /**
+ * @param Tree $tree
+ * @param View $view
+ */
+ public function __construct(Tree $tree,
+ View $view,
+ ISystemTagManager $tagManager,
+ ISystemTagObjectMapper $tagMapper,
+ IUserSession $userSession,
+ IGroupManager $groupManager,
+ Folder $userFolder
+ ) {
+ $this->tree = $tree;
+ $this->fileView = $view;
+ $this->tagManager = $tagManager;
+ $this->tagMapper = $tagMapper;
+ $this->userSession = $userSession;
+ $this->groupManager = $groupManager;
+ $this->userFolder = $userFolder;
+ }
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by \Sabre\DAV\Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the required event subscriptions.
+ *
+ * @param \Sabre\DAV\Server $server
+ * @return void
+ */
+ public function initialize(\Sabre\DAV\Server $server) {
+
+ $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
+
+ $this->server = $server;
+ $this->server->on('report', array($this, 'onReport'));
+ }
+
+ /**
+ * Returns a list of reports this plugin supports.
+ *
+ * This will be used in the {DAV:}supported-report-set property.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+ return [self::REPORT_NAME];
+ }
+
+ /**
+ * REPORT operations to look for files
+ *
+ * @param string $reportName
+ * @param [] $report
+ * @param string $uri
+ * @return bool
+ * @throws NotFound
+ * @throws ReportNotSupported
+ */
+ public function onReport($reportName, $report, $uri) {
+ $reportTargetNode = $this->server->tree->getNodeForPath($uri);
+ if (!$reportTargetNode instanceof Directory || $reportName !== self::REPORT_NAME) {
+ throw new ReportNotSupported();
+ }
+
+ $ns = '{' . $this::NS_OWNCLOUD . '}';
+ $requestedProps = [];
+ $filterRules = [];
+
+ // parse report properties and gather filter info
+ foreach ($report as $reportProps) {
+ $name = $reportProps['name'];
+ if ($name === $ns . 'filter-rules') {
+ $filterRules = $reportProps['value'];
+ } else if ($name === '{DAV:}prop') {
+ // propfind properties
+ foreach ($reportProps['value'] as $propVal) {
+ $requestedProps[] = $propVal['name'];
+ }
+ }
+ }
+
+ if (empty($filterRules)) {
+ // an empty filter would return all existing files which would be slow
+ throw new BadRequest('Missing filter-rule block in request');
+ }
+
+ // gather all file ids matching filter
+ try {
+ $resultFileIds = $this->processFilterRules($filterRules);
+ } catch (TagNotFoundException $e) {
+ throw new PreconditionFailed('Cannot filter by non-existing tag', 0, $e);
+ }
+
+ // find sabre nodes by file id, restricted to the root node path
+ $results = $this->findNodesByFileIds($reportTargetNode, $resultFileIds);
+
+ $responses = $this->prepareResponses($requestedProps, $results);
+
+ $xml = $this->server->xml->write(
+ '{DAV:}multistatus',
+ new MultiStatus($responses)
+ );
+
+ $this->server->httpResponse->setStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type', 'application/xml; charset=utf-8');
+ $this->server->httpResponse->setBody($xml);
+
+ return false;
+ }
+
+ /**
+ * Find file ids matching the given filter rules
+ *
+ * @param array $filterRules
+ * @return array array of unique file id results
+ *
+ * @throws TagNotFoundException whenever a tag was not found
+ */
+ public function processFilterRules($filterRules) {
+ $ns = '{' . $this::NS_OWNCLOUD . '}';
+ $resultFileIds = [];
+ $systemTagIds = [];
+ foreach ($filterRules as $filterRule) {
+ if ($filterRule['name'] === $ns . 'systemtag') {
+ $systemTagIds[] = $filterRule['value'];
+ }
+ }
+
+ // check user permissions, if applicable
+ if (!$this->isAdmin()) {
+ // check visibility/permission
+ $tags = $this->tagManager->getTagsByIds($systemTagIds);
+ $unknownTagIds = [];
+ foreach ($tags as $tag) {
+ if (!$tag->isUserVisible()) {
+ $unknownTagIds[] = $tag->getId();
+ }
+ }
+
+ if (!empty($unknownTagIds)) {
+ throw new TagNotFoundException('Tag with ids ' . implode(', ', $unknownTagIds) . ' not found');
+ }
+ }
+
+ // fetch all file ids and intersect them
+ foreach ($systemTagIds as $systemTagId) {
+ $fileIds = $this->tagMapper->getObjectIdsForTags($systemTagId, 'files');
+
+ if (empty($resultFileIds)) {
+ $resultFileIds = $fileIds;
+ } else {
+ $resultFileIds = array_intersect($resultFileIds, $fileIds);
+ }
+ }
+ return $resultFileIds;
+ }
+
+ /**
+ * Prepare propfind response for the given nodes
+ *
+ * @param string[] $requestedProps requested properties
+ * @param Node[] nodes nodes for which to fetch and prepare responses
+ * @return Response[]
+ */
+ public function prepareResponses($requestedProps, $nodes) {
+ $responses = [];
+ foreach ($nodes as $node) {
+ $propFind = new PropFind($node->getPath(), $requestedProps);
+
+ $this->server->getPropertiesByNode($propFind, $node);
+ // copied from Sabre Server's getPropertiesForPath
+ $result = $propFind->getResultForMultiStatus();
+ $result['href'] = $propFind->getPath();
+
+ $resourceType = $this->server->getResourceTypeForNode($node);
+ if (in_array('{DAV:}collection', $resourceType) || in_array('{DAV:}principal', $resourceType)) {
+ $result['href'] .= '/';
+ }
+
+ $responses[] = new Response(
+ rtrim($this->server->getBaseUri(), '/') . $node->getPath(),
+ $result,
+ 200
+ );
+ }
+ return $responses;
+ }
+
+ /**
+ * Find Sabre nodes by file ids
+ *
+ * @param Node $rootNode root node for search
+ * @param array $fileIds file ids
+ * @return Node[] array of Sabre nodes
+ */
+ public function findNodesByFileIds($rootNode, $fileIds) {
+ $folder = $this->userFolder;
+ if (trim($rootNode->getPath(), '/') !== '') {
+ $folder = $folder->get($rootNode->getPath());
+ }
+
+ $results = [];
+ foreach ($fileIds as $fileId) {
+ $entry = $folder->getById($fileId);
+ if ($entry) {
+ $entry = current($entry);
+ if ($entry instanceof \OCP\Files\File) {
+ $results[] = new File($this->fileView, $entry);
+ } else if ($entry instanceof \OCP\Files\Folder) {
+ $results[] = new Directory($this->fileView, $entry);
+ }
+ }
+ }
+
+ return $results;
+ }
+
+ /**
+ * Returns whether the currently logged in user is an administrator
+ */
+ private function isAdmin() {
+ $user = $this->userSession->getUser();
+ if ($user !== null) {
+ return $this->groupManager->isAdmin($user->getUID());
+ }
+ return false;
+ }
+}
diff --git a/apps/dav/lib/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php
index 5f02d1271df..4f26390e3cc 100644
--- a/apps/dav/lib/connector/sabre/principal.php
+++ b/apps/dav/lib/connector/sabre/principal.php
@@ -46,12 +46,20 @@ class Principal implements BackendInterface {
/** @var IGroupManager */
private $groupManager;
+ /** @var string */
+ private $principalPrefix;
+
/**
* @param IUserManager $userManager
+ * @param IGroupManager $groupManager
+ * @param string $principalPrefix
*/
- public function __construct(IUserManager $userManager, IGroupManager $groupManager) {
+ public function __construct(IUserManager $userManager,
+ IGroupManager $groupManager,
+ $principalPrefix = 'principals/users/') {
$this->userManager = $userManager;
$this->groupManager = $groupManager;
+ $this->principalPrefix = trim($principalPrefix, '/');
}
/**
@@ -70,7 +78,7 @@ class Principal implements BackendInterface {
public function getPrincipalsByPrefix($prefixPath) {
$principals = [];
- if ($prefixPath === 'principals/users') {
+ if ($prefixPath === $this->principalPrefix) {
foreach($this->userManager->search('') as $user) {
$principals[] = $this->userToPrincipal($user);
}
@@ -88,20 +96,15 @@ class Principal implements BackendInterface {
* @return array
*/
public function getPrincipalByPath($path) {
- $elements = explode('/', $path);
- if ($elements[0] !== 'principals') {
- return null;
- }
- if ($elements[1] !== 'users') {
- return null;
- }
- $name = $elements[2];
- $user = $this->userManager->get($name);
+ list($prefix, $name) = URLUtil::splitPath($path);
- if (!is_null($user)) {
- return $this->userToPrincipal($user);
- }
+ if ($prefix === $this->principalPrefix) {
+ $user = $this->userManager->get($name);
+ if (!is_null($user)) {
+ return $this->userToPrincipal($user);
+ }
+ }
return null;
}
@@ -132,7 +135,7 @@ class Principal implements BackendInterface {
public function getGroupMembership($principal) {
list($prefix, $name) = URLUtil::splitPath($principal);
- if ($prefix === 'principals/users') {
+ if ($prefix === $this->principalPrefix) {
$user = $this->userManager->get($name);
if (!$user) {
throw new Exception('Principal not found');
@@ -141,11 +144,9 @@ class Principal implements BackendInterface {
$groups = $this->groupManager->getUserGroups($user);
$groups = array_map(function($group) {
/** @var IGroup $group */
- return 'principals/groups/' . $group->getGID();
+ return $this->principalPrefix . '/' . $group->getGID();
}, $groups);
- $groups[]= 'principals/users/'.$name.'/calendar-proxy-read';
- $groups[]= 'principals/users/'.$name.'/calendar-proxy-write';
return $groups;
}
return [];
@@ -200,7 +201,7 @@ class Principal implements BackendInterface {
$userId = $user->getUID();
$displayName = $user->getDisplayName();
$principal = [
- 'uri' => "principals/users/$userId",
+ 'uri' => $this->principalPrefix . '/' . $userId,
'{DAV:}displayname' => is_null($displayName) ? $userId : $displayName,
];
@@ -212,4 +213,8 @@ class Principal implements BackendInterface {
return $principal;
}
+ public function getPrincipalPrefix() {
+ return $this->principalPrefix;
+ }
+
}
diff --git a/apps/dav/lib/connector/sabre/serverfactory.php b/apps/dav/lib/connector/sabre/serverfactory.php
index fa4fda46870..9a828787a0d 100644
--- a/apps/dav/lib/connector/sabre/serverfactory.php
+++ b/apps/dav/lib/connector/sabre/serverfactory.php
@@ -115,7 +115,7 @@ class ServerFactory {
// wait with registering these until auth is handled and the filesystem is setup
$server->on('beforeMethod', function () use ($server, $objectTree, $viewCallBack) {
// ensure the skeleton is copied
- \OC::$server->getUserFolder();
+ $userFolder = \OC::$server->getUserFolder();
/** @var \OC\Files\View $view */
$view = $viewCallBack();
@@ -135,6 +135,15 @@ class ServerFactory {
if($this->userSession->isLoggedIn()) {
$server->addPlugin(new \OCA\DAV\Connector\Sabre\TagsPlugin($objectTree, $this->tagManager));
$server->addPlugin(new \OCA\DAV\Connector\Sabre\CommentPropertiesPlugin(\OC::$server->getCommentsManager(), $this->userSession));
+ $server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesReportPlugin(
+ $objectTree,
+ $view,
+ \OC::$server->getSystemTagManager(),
+ \OC::$server->getSystemTagObjectMapper(),
+ $this->userSession,
+ \OC::$server->getGroupManager(),
+ $userFolder
+ ));
// custom properties plugin must be the last one
$server->addPlugin(
new \Sabre\DAV\PropertyStorage\Plugin(
diff --git a/apps/dav/lib/dav/sharing/backend.php b/apps/dav/lib/dav/sharing/backend.php
index 0b28891fbc4..7556706b6d0 100644
--- a/apps/dav/lib/dav/sharing/backend.php
+++ b/apps/dav/lib/dav/sharing/backend.php
@@ -24,27 +24,30 @@
namespace OCA\DAV\DAV\Sharing;
+use OCA\DAV\Connector\Sabre\Principal;
use OCP\IDBConnection;
class Backend {
/** @var IDBConnection */
private $db;
+ /** @var Principal */
+ private $principalBackend;
+ /** @var string */
+ private $resourceType;
const ACCESS_OWNER = 1;
const ACCESS_READ_WRITE = 2;
const ACCESS_READ = 3;
- /** @var string */
- private $resourceType;
-
/**
- * CardDavBackend constructor.
- *
* @param IDBConnection $db
+ * @param Principal $principalBackend
+ * @param string $resourceType
*/
- public function __construct(IDBConnection $db, $resourceType) {
+ public function __construct(IDBConnection $db, Principal $principalBackend, $resourceType) {
$this->db = $db;
+ $this->principalBackend = $principalBackend;
$this->resourceType = $resourceType;
}
@@ -141,6 +144,7 @@ class Backend {
* * readOnly - boolean
* * summary - Optional, a description for the share
*
+ * @param int $resourceId
* @return array
*/
public function getShares($resourceId) {
@@ -153,9 +157,10 @@ class Backend {
$shares = [];
while($row = $result->fetch()) {
+ $p = $this->principalBackend->getPrincipalByPath($row['principaluri']);
$shares[]= [
'href' => "principal:${row['principaluri']}",
-// 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '',
+ 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '',
'status' => 1,
'readOnly' => ($row['access'] == self::ACCESS_READ),
'{'.\OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD.'}principal' => $row['principaluri']
diff --git a/apps/dav/lib/migration/calendaradapter.php b/apps/dav/lib/migration/calendaradapter.php
new file mode 100644
index 00000000000..39faf2cec37
--- /dev/null
+++ b/apps/dav/lib/migration/calendaradapter.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace OCA\Dav\Migration;
+
+use OCP\IDBConnection;
+
+class CalendarAdapter {
+
+ /** @var \OCP\IDBConnection */
+ protected $dbConnection;
+
+ /** @var string */
+ private $sourceCalendarTable;
+
+ /** @var string */
+ private $sourceCalObjTable;
+
+ /**
+ * @param IDBConnection $dbConnection
+ * @param string $sourceCalendarTable
+ * @param string $sourceCalObjTable
+ */
+ function __construct(IDBConnection $dbConnection,
+ $sourceCalendarTable = 'clndr_calendars',
+ $sourceCalObjTable = 'clndr_objects') {
+ $this->dbConnection = $dbConnection;
+ $this->sourceCalendarTable = $sourceCalendarTable;
+ $this->sourceCalObjTable = $sourceCalObjTable;
+ }
+
+ /**
+ * @param string $user
+ * @param \Closure $callBack
+ */
+ public function foreachCalendar($user, \Closure $callBack) {
+ // get all calendars of that user
+ $query = $this->dbConnection->getQueryBuilder();
+ $stmt = $query->select('*')->from($this->sourceCalendarTable)
+ ->where($query->expr()->eq('userid', $query->createNamedParameter($user)))
+ ->execute();
+
+ while($row = $stmt->fetch()) {
+ $callBack($row);
+ }
+ }
+
+ public function setup() {
+ if (!$this->dbConnection->tableExists($this->sourceCalendarTable)) {
+ throw new \DomainException('Calendar tables are missing. Nothing to do.');
+ }
+ }
+
+ /**
+ * @param int $calendarId
+ * @param \Closure $callBack
+ */
+ public function foreachCalendarObject($calendarId, \Closure $callBack) {
+ $query = $this->dbConnection->getQueryBuilder();
+ $stmt = $query->select('*')->from($this->sourceCalObjTable)
+ ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
+ ->execute();
+
+ while($row = $stmt->fetch()) {
+ $callBack($row);
+ }
+ }
+
+ /**
+ * @param int $addressBookId
+ * @return array
+ */
+ public function getShares($addressBookId) {
+ $query = $this->dbConnection->getQueryBuilder();
+ $shares = $query->select('*')->from('share')
+ ->where($query->expr()->eq('item_source', $query->createNamedParameter($addressBookId)))
+ ->andWhere($query->expr()->eq('item_type', $query->expr()->literal('calendar')))
+ ->andWhere($query->expr()->in('share_type', [ $query->expr()->literal(0), $query->expr()->literal(1)]))
+ ->execute()
+ ->fetchAll();
+
+ return $shares;
+ }
+}
diff --git a/apps/dav/lib/migration/migratecalendars.php b/apps/dav/lib/migration/migratecalendars.php
new file mode 100644
index 00000000000..33f8a105180
--- /dev/null
+++ b/apps/dav/lib/migration/migratecalendars.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace OCA\Dav\Migration;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\CalDAV\Calendar;
+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 MigrateCalendars {
+
+ /** @var CalendarAdapter */
+ protected $adapter;
+
+ /** @var CalDavBackend */
+ private $backend;
+
+ /**
+ * @param CalendarAdapter $adapter
+ * @param CalDavBackend $backend
+ */
+ function __construct(CalendarAdapter $adapter,
+ CalDavBackend $backend
+ ) {
+ $this->adapter = $adapter;
+ $this->backend = $backend;
+ }
+
+ /**
+ * @param string $user
+ */
+ public function migrateForUser($user) {
+
+ $this->adapter->foreachCalendar($user, function($calendar) use ($user) {
+ $principal = "principals/users/$user";
+ $calendarByUri = $this->backend->getCalendarByUri($principal, $calendar['uri']);
+ if (!is_null($calendarByUri)) {
+ return;
+ }
+
+ $newId = $this->backend->createCalendar($principal, $calendar['uri'], [
+ '{DAV:}displayname' => $calendar['displayname'],
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => $calendar['displayname'],
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => $calendar['timezone'],
+ '{http://apple.com/ns/ical/}calendar-order' => $calendar['calendarorder'],
+ '{http://apple.com/ns/ical/}calendar-color' => $calendar['calendarcolor'],
+ ]);
+
+ $this->migrateCalendar($calendar['id'], $newId);
+ $this->migrateShares($calendar['id'], $newId);
+ });
+ }
+
+ public function setup() {
+ $this->adapter->setup();
+ }
+
+ /**
+ * @param int $calendarId
+ * @param int $newCalendarId
+ */
+ private function migrateCalendar($calendarId, $newCalendarId) {
+ $this->adapter->foreachCalendarObject($calendarId, function($calObject) use ($newCalendarId) {
+ $this->backend->createCalendarObject($newCalendarId, $calObject['uri'], $calObject['calendardata']);
+ });
+ }
+
+ /**
+ * @param int $calendarId
+ * @param int $newCalendarId
+ */
+ private function migrateShares($calendarId, $newCalendarId) {
+ $shares =$this->adapter->getShares($calendarId);
+ if (empty($shares)) {
+ return;
+ }
+
+ $add = array_map(function($s) {
+ $prefix = 'principal:principals/users/';
+ if ($s['share_type'] === 1) {
+ $prefix = 'principal:principals/groups/';
+ }
+ return [
+ 'href' => $prefix . $s['share_with']
+ ];
+ }, $shares);
+
+ $newCalendar = $this->backend->getCalendarById($newCalendarId);
+ $calendar = new Calendar($this->backend, $newCalendar);
+ $this->backend->updateShares($calendar, $add, []);
+ }
+}
diff --git a/apps/dav/tests/unit/comments/commentsplugin.php b/apps/dav/tests/unit/comments/commentsplugin.php
index bd0b56fc650..9822137bbea 100644
--- a/apps/dav/tests/unit/comments/commentsplugin.php
+++ b/apps/dav/tests/unit/comments/commentsplugin.php
@@ -92,6 +92,10 @@ class CommentsPlugin extends \Test\TestCase {
->method('getId')
->will($this->returnValue('42'));
+ $node->expects($this->once())
+ ->method('setReadMarker')
+ ->with(null);
+
$this->commentsManager->expects($this->once())
->method('create')
->with('users', 'alice', 'files', '42')
diff --git a/apps/dav/tests/unit/connector/sabre/filesreportplugin.php b/apps/dav/tests/unit/connector/sabre/filesreportplugin.php
new file mode 100644
index 00000000000..853e52f5039
--- /dev/null
+++ b/apps/dav/tests/unit/connector/sabre/filesreportplugin.php
@@ -0,0 +1,519 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Tests\Unit\Sabre\Connector;
+
+use OCA\DAV\Connector\Sabre\FilesReportPlugin as FilesReportPluginImplementation;
+use Sabre\DAV\Exception\NotFound;
+use OCP\SystemTag\ISystemTagObjectMapper;
+use OC\Files\View;
+use OCP\Files\Folder;
+use OCP\IGroupManager;
+use OCP\SystemTag\ISystemTagManager;
+
+class FilesReportPlugin extends \Test\TestCase {
+ /** @var \Sabre\DAV\Server */
+ private $server;
+
+ /** @var \Sabre\DAV\Tree */
+ private $tree;
+
+ /** @var ISystemTagObjectMapper */
+ private $tagMapper;
+
+ /** @var ISystemTagManager */
+ private $tagManager;
+
+ /** @var \OCP\IUserSession */
+ private $userSession;
+
+ /** @var FilesReportPluginImplementation */
+ private $plugin;
+
+ /** @var View **/
+ private $view;
+
+ /** @var IGroupManager **/
+ private $groupManager;
+
+ /** @var Folder **/
+ private $userFolder;
+
+ public function setUp() {
+ parent::setUp();
+ $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->view = $this->getMockBuilder('\OC\Files\View')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->server = $this->getMockBuilder('\Sabre\DAV\Server')
+ ->setConstructorArgs([$this->tree])
+ ->setMethods(['getRequestUri'])
+ ->getMock();
+
+ $this->groupManager = $this->getMockBuilder('\OCP\IGroupManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->userFolder = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper');
+ $this->userSession = $this->getMock('\OCP\IUserSession');
+
+ $user = $this->getMock('\OCP\IUser');
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('testuser'));
+ $this->userSession->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+
+ $this->plugin = new FilesReportPluginImplementation(
+ $this->tree,
+ $this->view,
+ $this->tagManager,
+ $this->tagMapper,
+ $this->userSession,
+ $this->groupManager,
+ $this->userFolder
+ );
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\ReportNotSupported
+ */
+ public function testOnReportInvalidNode() {
+ $path = 'totally/unrelated/13';
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/' . $path)
+ ->will($this->returnValue($this->getMock('\Sabre\DAV\INode')));
+
+ $this->server->expects($this->any())
+ ->method('getRequestUri')
+ ->will($this->returnValue($path));
+ $this->plugin->initialize($this->server);
+
+ $this->plugin->onReport(FilesReportPluginImplementation::REPORT_NAME, [], '/' . $path);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\ReportNotSupported
+ */
+ public function testOnReportInvalidReportName() {
+ $path = 'test';
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/' . $path)
+ ->will($this->returnValue($this->getMock('\Sabre\DAV\INode')));
+
+ $this->server->expects($this->any())
+ ->method('getRequestUri')
+ ->will($this->returnValue($path));
+ $this->plugin->initialize($this->server);
+
+ $this->plugin->onReport('{whoever}whatever', [], '/' . $path);
+ }
+
+ public function testOnReport() {
+ $path = 'test';
+
+ $parameters = [
+ [
+ 'name' => '{DAV:}prop',
+ 'value' => [
+ ['name' => '{DAV:}getcontentlength', 'value' => ''],
+ ['name' => '{http://owncloud.org/ns}size', 'value' => ''],
+ ],
+ ],
+ [
+ 'name' => '{http://owncloud.org/ns}filter-rules',
+ 'value' => [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ],
+ ],
+ ];
+
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->at(0))
+ ->method('getObjectIdsForTags')
+ ->with('123', 'files')
+ ->will($this->returnValue(['111', '222']));
+ $this->tagMapper->expects($this->at(1))
+ ->method('getObjectIdsForTags')
+ ->with('456', 'files')
+ ->will($this->returnValue(['111', '222', '333']));
+
+ $reportTargetNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $response->expects($this->once())
+ ->method('setHeader')
+ ->with('Content-Type', 'application/xml; charset=utf-8');
+
+ $response->expects($this->once())
+ ->method('setStatus')
+ ->with(207);
+
+ $response->expects($this->once())
+ ->method('setBody');
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/' . $path)
+ ->will($this->returnValue($reportTargetNode));
+
+ $filesNode1 = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode2 = $this->getMockBuilder('\OCP\Files\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->userFolder->expects($this->at(0))
+ ->method('getById')
+ ->with('111')
+ ->will($this->returnValue([$filesNode1]));
+ $this->userFolder->expects($this->at(1))
+ ->method('getById')
+ ->with('222')
+ ->will($this->returnValue([$filesNode2]));
+
+ $this->server->expects($this->any())
+ ->method('getRequestUri')
+ ->will($this->returnValue($path));
+ $this->server->httpResponse = $response;
+ $this->plugin->initialize($this->server);
+
+ $this->plugin->onReport(FilesReportPluginImplementation::REPORT_NAME, $parameters, '/' . $path);
+ }
+
+ public function testFindNodesByFileIdsRoot() {
+ $filesNode1 = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode1->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('first node'));
+
+ $filesNode2 = $this->getMockBuilder('\OCP\Files\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode2->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('second node'));
+
+ $reportTargetNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $reportTargetNode->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/'));
+
+ $this->userFolder->expects($this->at(0))
+ ->method('getById')
+ ->with('111')
+ ->will($this->returnValue([$filesNode1]));
+ $this->userFolder->expects($this->at(1))
+ ->method('getById')
+ ->with('222')
+ ->will($this->returnValue([$filesNode2]));
+
+ $result = $this->plugin->findNodesByFileIds($reportTargetNode, ['111', '222']);
+
+ $this->assertCount(2, $result);
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\Directory', $result[0]);
+ $this->assertEquals('first node', $result[0]->getName());
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\File', $result[1]);
+ $this->assertEquals('second node', $result[1]->getName());
+ }
+
+ public function testFindNodesByFileIdsSubDir() {
+ $filesNode1 = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode1->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('first node'));
+
+ $filesNode2 = $this->getMockBuilder('\OCP\Files\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode2->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('second node'));
+
+ $reportTargetNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $reportTargetNode->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/sub1/sub2'));
+
+
+ $subNode = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->userFolder->expects($this->at(0))
+ ->method('get')
+ ->with('/sub1/sub2')
+ ->will($this->returnValue($subNode));
+
+ $subNode->expects($this->at(0))
+ ->method('getById')
+ ->with('111')
+ ->will($this->returnValue([$filesNode1]));
+ $subNode->expects($this->at(1))
+ ->method('getById')
+ ->with('222')
+ ->will($this->returnValue([$filesNode2]));
+
+ $result = $this->plugin->findNodesByFileIds($reportTargetNode, ['111', '222']);
+
+ $this->assertCount(2, $result);
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\Directory', $result[0]);
+ $this->assertEquals('first node', $result[0]->getName());
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\File', $result[1]);
+ $this->assertEquals('second node', $result[1]->getName());
+ }
+
+ public function testPrepareResponses() {
+ $requestedProps = ['{DAV:}getcontentlength', '{http://owncloud.org/ns}fileid', '{DAV:}resourcetype'];
+
+ $node1 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node2 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $node1->expects($this->once())
+ ->method('getInternalFileId')
+ ->will($this->returnValue('111'));
+ $node2->expects($this->once())
+ ->method('getInternalFileId')
+ ->will($this->returnValue('222'));
+ $node2->expects($this->once())
+ ->method('getSize')
+ ->will($this->returnValue(1024));
+
+ $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view));
+ $this->plugin->initialize($this->server);
+ $responses = $this->plugin->prepareResponses($requestedProps, [$node1, $node2]);
+
+ $this->assertCount(2, $responses);
+
+ $this->assertEquals(200, $responses[0]->getHttpStatus());
+ $this->assertEquals(200, $responses[1]->getHttpStatus());
+
+ $props1 = $responses[0]->getResponseProperties();
+ $this->assertEquals('111', $props1[200]['{http://owncloud.org/ns}fileid']);
+ $this->assertNull($props1[404]['{DAV:}getcontentlength']);
+ $this->assertInstanceOf('\Sabre\DAV\Xml\Property\ResourceType', $props1[200]['{DAV:}resourcetype']);
+ $resourceType1 = $props1[200]['{DAV:}resourcetype']->getValue();
+ $this->assertEquals('{DAV:}collection', $resourceType1[0]);
+
+ $props2 = $responses[1]->getResponseProperties();
+ $this->assertEquals('1024', $props2[200]['{DAV:}getcontentlength']);
+ $this->assertEquals('222', $props2[200]['{http://owncloud.org/ns}fileid']);
+ $this->assertInstanceOf('\Sabre\DAV\Xml\Property\ResourceType', $props2[200]['{DAV:}resourcetype']);
+ $this->assertCount(0, $props2[200]['{DAV:}resourcetype']->getValue());
+ }
+
+ public function testProcessFilterRulesSingle() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->once())
+ ->method('getObjectIdsForTags')
+ ->with('123')
+ ->will($this->returnValue(['111', '222']));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ];
+
+ $this->assertEquals(['111', '222'], $this->plugin->processFilterRules($rules));
+ }
+
+ public function testProcessFilterRulesAndCondition() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->at(0))
+ ->method('getObjectIdsForTags')
+ ->with('123')
+ ->will($this->returnValue(['111', '222']));
+ $this->tagMapper->expects($this->at(1))
+ ->method('getObjectIdsForTags')
+ ->with('456')
+ ->will($this->returnValue(['222', '333']));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals(['222'], array_values($this->plugin->processFilterRules($rules)));
+ }
+
+ public function testProcessFilterRulesInvisibleTagAsAdmin() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $tag1 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag1->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $tag2 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag2->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(false));
+
+ // no need to fetch tags to check permissions
+ $this->tagManager->expects($this->never())
+ ->method('getTagsByIds');
+
+ $this->tagMapper->expects($this->at(0))
+ ->method('getObjectIdsForTags')
+ ->with('123')
+ ->will($this->returnValue(['111', '222']));
+ $this->tagMapper->expects($this->at(1))
+ ->method('getObjectIdsForTags')
+ ->with('456')
+ ->will($this->returnValue(['222', '333']));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals(['222'], array_values($this->plugin->processFilterRules($rules)));
+ }
+
+ /**
+ * @expectedException \OCP\SystemTag\TagNotFoundException
+ */
+ public function testProcessFilterRulesInvisibleTagAsUser() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(false));
+
+ $tag1 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag1->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $tag2 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag2->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(false)); // invisible
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123', '456'])
+ ->will($this->returnValue([$tag1, $tag2]));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->plugin->processFilterRules($rules);
+ }
+
+ public function testProcessFilterRulesVisibleTagAsUser() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(false));
+
+ $tag1 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag1->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $tag2 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag2->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123', '456'])
+ ->will($this->returnValue([$tag1, $tag2]));
+
+ $this->tagMapper->expects($this->at(0))
+ ->method('getObjectIdsForTags')
+ ->with('123')
+ ->will($this->returnValue(['111', '222']));
+ $this->tagMapper->expects($this->at(1))
+ ->method('getObjectIdsForTags')
+ ->with('456')
+ ->will($this->returnValue(['222', '333']));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals(['222'], array_values($this->plugin->processFilterRules($rules)));
+ }
+}
diff --git a/apps/dav/tests/unit/connector/sabre/principal.php b/apps/dav/tests/unit/connector/sabre/principal.php
index d6bc7cd405f..07bfd5d263b 100644
--- a/apps/dav/tests/unit/connector/sabre/principal.php
+++ b/apps/dav/tests/unit/connector/sabre/principal.php
@@ -211,10 +211,7 @@ class Principal extends TestCase {
->method('getUserGroups')
->willReturn([]);
- $expectedResponse = [
- 'principals/users/foo/calendar-proxy-read',
- 'principals/users/foo/calendar-proxy-write'
- ];
+ $expectedResponse = [];
$response = $this->connector->getGroupMembership('principals/users/foo');
$this->assertSame($expectedResponse, $response);
}
diff --git a/apps/dav/tests/unit/migration/calendar_schema.xml b/apps/dav/tests/unit/migration/calendar_schema.xml
new file mode 100644
index 00000000000..6c88b596a3f
--- /dev/null
+++ b/apps/dav/tests/unit/migration/calendar_schema.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<database>
+
+ <name>*dbname*</name>
+ <create>true</create>
+ <overwrite>false</overwrite>
+
+ <charset>utf8</charset>
+
+ <table>
+
+ <name>*dbprefix*clndr_objects</name>
+
+ <declaration>
+
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>calendarid</name>
+ <type>integer</type>
+ <default></default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>objecttype</name>
+ <type>text</type>
+ <default></default>
+ <notnull>true</notnull>
+ <length>40</length>
+ </field>
+
+ <field>
+ <name>startdate</name>
+ <type>timestamp</type>
+ <default>1970-01-01 00:00:00</default>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>enddate</name>
+ <type>timestamp</type>
+ <default>1970-01-01 00:00:00</default>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>repeating</name>
+ <type>integer</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>summary</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>calendardata</name>
+ <type>clob</type>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>lastmodified</name>
+ <type>integer</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>4</length>
+ </field>
+
+ </declaration>
+
+ </table>
+
+ <table>
+
+ <name>*dbprefix*clndr_calendars</name>
+
+ <declaration>
+
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>userid</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>displayname</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>100</length>
+ </field>
+
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>active</name>
+ <type>integer</type>
+ <default>1</default>
+ <notnull>true</notnull>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>ctag</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>calendarorder</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>calendarcolor</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>10</length>
+ </field>
+
+ <field>
+ <name>timezone</name>
+ <type>clob</type>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>components</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>100</length>
+ </field>
+
+ </declaration>
+
+ </table>
+
+</database>
diff --git a/apps/dav/tests/unit/migration/calendaradaptertest.php b/apps/dav/tests/unit/migration/calendaradaptertest.php
new file mode 100644
index 00000000000..f92774ef6ad
--- /dev/null
+++ b/apps/dav/tests/unit/migration/calendaradaptertest.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OCA\DAV\Tests\Unit\Migration;
+
+use DomainException;
+use OCA\Dav\Migration\AddressBookAdapter;
+use OCA\Dav\Migration\CalendarAdapter;
+use OCP\IDBConnection;
+use Test\TestCase;
+
+/**
+ * Class CalendarAdapterTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\Migration
+ */
+class CalendarAdapterTest extends TestCase {
+
+ /** @var IDBConnection */
+ private $db;
+ /** @var CalendarAdapter */
+ private $adapter;
+ /** @var array */
+ private $cals = [];
+ /** @var array */
+ private $calObjs = [];
+
+ public function setUp() {
+ parent::setUp();
+ $this->db = \OC::$server->getDatabaseConnection();
+
+ $manager = new \OC\DB\MDB2SchemaManager($this->db);
+ $manager->createDbFromStructure(__DIR__ . '/calendar_schema.xml');
+
+ $this->adapter = new CalendarAdapter($this->db);
+ }
+
+ public function tearDown() {
+ $this->db->dropTable('clndr_calendars');
+ $this->db->dropTable('clndr_objects');
+ parent::tearDown();
+ }
+
+ /**
+ * @expectedException DomainException
+ */
+ public function testOldTablesDoNotExist() {
+ $adapter = new AddressBookAdapter(\OC::$server->getDatabaseConnection(), 'crazy_table_that_does_no_exist');
+ $adapter->setup();
+ }
+
+ public function test() {
+
+ // insert test data
+ $builder = $this->db->getQueryBuilder();
+ $builder->insert('clndr_calendars')
+ ->values([
+ 'userid' => $builder->createNamedParameter('test-user-666'),
+ 'displayname' => $builder->createNamedParameter('Display Name'),
+ 'uri' => $builder->createNamedParameter('events'),
+ 'ctag' => $builder->createNamedParameter('112233'),
+ 'active' => $builder->createNamedParameter('1')
+ ])
+ ->execute();
+ $builder = $this->db->getQueryBuilder();
+ $builder->insert('clndr_objects')
+ ->values([
+ 'calendarid' => $builder->createNamedParameter(6666),
+ 'objecttype' => $builder->createNamedParameter('VEVENT'),
+ 'startdate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
+ 'enddate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
+ 'repeating' => $builder->createNamedParameter(0),
+ 'summary' => $builder->createNamedParameter('Something crazy will happen'),
+ 'uri' => $builder->createNamedParameter('event.ics'),
+ 'lastmodified' => $builder->createNamedParameter('112233'),
+ ])
+ ->execute();
+ $builder = $this->db->getQueryBuilder();
+ $builder->insert('share')
+ ->values([
+ 'share_type' => $builder->createNamedParameter(1),
+ 'share_with' => $builder->createNamedParameter('user01'),
+ 'uid_owner' => $builder->createNamedParameter('user02'),
+ 'item_type' => $builder->createNamedParameter('calendar'),
+ 'item_source' => $builder->createNamedParameter(6666),
+ 'item_target' => $builder->createNamedParameter('Contacts (user02)'),
+ ])
+ ->execute();
+
+ // test the adapter
+ $this->adapter->foreachCalendar('test-user-666', function($row) {
+ $this->cals[] = $row;
+ });
+ $this->assertArrayHasKey('id', $this->cals[0]);
+ $this->assertEquals('test-user-666', $this->cals[0]['userid']);
+ $this->assertEquals('Display Name', $this->cals[0]['displayname']);
+ $this->assertEquals('events', $this->cals[0]['uri']);
+ $this->assertEquals('112233', $this->cals[0]['ctag']);
+
+ $this->adapter->foreachCalendarObject(6666, function($row) {
+ $this->calObjs[]= $row;
+ });
+ $this->assertArrayHasKey('id', $this->calObjs[0]);
+ $this->assertEquals(6666, $this->calObjs[0]['calendarid']);
+
+ // test getShares
+ $shares = $this->adapter->getShares(6666);
+ $this->assertEquals(1, count($shares));
+
+ }
+
+}
diff --git a/apps/dav/tests/unit/migration/migratecalendartest.php b/apps/dav/tests/unit/migration/migratecalendartest.php
new file mode 100644
index 00000000000..1058773ffff
--- /dev/null
+++ b/apps/dav/tests/unit/migration/migratecalendartest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OCA\DAV\Tests\Unit\Migration;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\Dav\Migration\CalendarAdapter;
+use Test\TestCase;
+
+class MigrateCalendarTest extends TestCase {
+
+ public function testMigration() {
+ /** @var CalendarAdapter | \PHPUnit_Framework_MockObject_MockObject $adapter */
+ $adapter = $this->mockAdapter();
+
+ /** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cardDav */
+ $cardDav = $this->getMockBuilder('\OCA\Dav\CalDAV\CalDAVBackend')->disableOriginalConstructor()->getMock();
+ $cardDav->method('createCalendar')->willReturn(666);
+ $cardDav->expects($this->once())->method('createCalendar')->with('principals/users/test01', 'test_contacts');
+ $cardDav->expects($this->once())->method('createCalendarObject')->with(666, '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics', 'BEGIN:VCARD');
+
+ $m = new \OCA\Dav\Migration\MigrateCalendars($adapter, $cardDav);
+ $m->migrateForUser('test01');
+ }
+
+ /**
+ * @return \PHPUnit_Framework_MockObject_MockObject
+ */
+ private function mockAdapter($shares = []) {
+ $adapter = $this->getMockBuilder('\OCA\Dav\Migration\CalendarAdapter')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $adapter->method('foreachCalendar')->willReturnCallback(function ($user, \Closure $callBack) {
+ $callBack([
+ // calendarorder | calendarcolor | timezone | components
+ 'id' => 0,
+ 'userid' => $user,
+ 'displayname' => 'Test Contacts',
+ 'uri' => 'test_contacts',
+ 'ctag' => 1234567890,
+ 'active' => 1,
+ 'calendarorder' => '0',
+ 'calendarcolor' => '#b3dc6c',
+ 'timezone' => null,
+ 'components' => 'VEVENT,VTODO,VJOURNAL'
+ ]);
+ });
+ $adapter->method('foreachCalendarObject')->willReturnCallback(function ($addressBookId, \Closure $callBack) {
+ $callBack([
+ 'userid' => $addressBookId,
+ 'uri' => '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics',
+ 'calendardata' => 'BEGIN:VCARD'
+ ]);
+ });
+ $adapter->method('getShares')->willReturn($shares);
+ return $adapter;
+ }
+
+}
diff --git a/apps/federatedfilesharing/appinfo/app.php b/apps/federatedfilesharing/appinfo/app.php
new file mode 100644
index 00000000000..804ab69759c
--- /dev/null
+++ b/apps/federatedfilesharing/appinfo/app.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\FederatedFileSharing\AppInfo;
+
+use OCP\AppFramework\App;
+
+new App('federatedfilesharing');
+
diff --git a/apps/federatedfilesharing/appinfo/info.xml b/apps/federatedfilesharing/appinfo/info.xml
new file mode 100644
index 00000000000..d88ea2640e1
--- /dev/null
+++ b/apps/federatedfilesharing/appinfo/info.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<info>
+ <id>federatedfilesharing</id>
+ <name>Federated File Sharing</name>
+ <description>Provide federated file sharing across ownCloud servers</description>
+ <licence>AGPL</licence>
+ <author>Bjoern Schiessle, Roeland Jago Douma</author>
+ <version>0.1.0</version>
+ <namespace>FederatedFileSharing</namespace>
+ <category>other</category>
+ <dependencies>
+ <owncloud min-version="9.0" max-version="9.0" />
+ </dependencies>
+</info>
diff --git a/apps/federatedfilesharing/lib/addresshandler.php b/apps/federatedfilesharing/lib/addresshandler.php
new file mode 100644
index 00000000000..92768f11b95
--- /dev/null
+++ b/apps/federatedfilesharing/lib/addresshandler.php
@@ -0,0 +1,184 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\FederatedFileSharing;
+use OC\HintException;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+
+/**
+ * Class AddressHandler - parse, modify and construct federated sharing addresses
+ *
+ * @package OCA\FederatedFileSharing
+ */
+class AddressHandler {
+
+ /** @var IL10N */
+ private $l;
+
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ /**
+ * AddressHandler constructor.
+ *
+ * @param IURLGenerator $urlGenerator
+ * @param IL10N $il10n
+ */
+ public function __construct(
+ IURLGenerator $urlGenerator,
+ IL10N $il10n
+ ) {
+ $this->l = $il10n;
+ $this->urlGenerator = $urlGenerator;
+ }
+
+ /**
+ * split user and remote from federated cloud id
+ *
+ * @param string $address federated share address
+ * @return array [user, remoteURL]
+ * @throws HintException
+ */
+ public function splitUserRemote($address) {
+ if (strpos($address, '@') === false) {
+ $hint = $this->l->t('Invalid Federated Cloud ID');
+ throw new HintException('Invalid Federated Cloud ID', $hint);
+ }
+
+ // Find the first character that is not allowed in user names
+ $id = str_replace('\\', '/', $address);
+ $posSlash = strpos($id, '/');
+ $posColon = strpos($id, ':');
+
+ if ($posSlash === false && $posColon === false) {
+ $invalidPos = strlen($id);
+ } else if ($posSlash === false) {
+ $invalidPos = $posColon;
+ } else if ($posColon === false) {
+ $invalidPos = $posSlash;
+ } else {
+ $invalidPos = min($posSlash, $posColon);
+ }
+
+ // Find the last @ before $invalidPos
+ $pos = $lastAtPos = 0;
+ while ($lastAtPos !== false && $lastAtPos <= $invalidPos) {
+ $pos = $lastAtPos;
+ $lastAtPos = strpos($id, '@', $pos + 1);
+ }
+
+ if ($pos !== false) {
+ $user = substr($id, 0, $pos);
+ $remote = substr($id, $pos + 1);
+ $remote = $this->fixRemoteURL($remote);
+ if (!empty($user) && !empty($remote)) {
+ return array($user, $remote);
+ }
+ }
+
+ $hint = $this->l->t('Invalid Federated Cloud ID');
+ throw new HintException('Invalid Federated Cloud ID', $hint);
+ }
+
+ /**
+ * generate remote URL part of federated ID
+ *
+ * @return string url of the current server
+ */
+ public function generateRemoteURL() {
+ $url = $this->urlGenerator->getAbsoluteURL('/');
+ return $url;
+ }
+
+ /**
+ * check if two federated cloud IDs refer to the same user
+ *
+ * @param string $user1
+ * @param string $server1
+ * @param string $user2
+ * @param string $server2
+ * @return bool true if both users and servers are the same
+ */
+ public function compareAddresses($user1, $server1, $user2, $server2) {
+ $normalizedServer1 = strtolower($this->removeProtocolFromUrl($server1));
+ $normalizedServer2 = strtolower($this->removeProtocolFromUrl($server2));
+
+ if (rtrim($normalizedServer1, '/') === rtrim($normalizedServer2, '/')) {
+ // FIXME this should be a method in the user management instead
+ \OCP\Util::emitHook(
+ '\OCA\Files_Sharing\API\Server2Server',
+ 'preLoginNameUsedAsUserName',
+ array('uid' => &$user1)
+ );
+ \OCP\Util::emitHook(
+ '\OCA\Files_Sharing\API\Server2Server',
+ 'preLoginNameUsedAsUserName',
+ array('uid' => &$user2)
+ );
+
+ if ($user1 === $user2) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * remove protocol from URL
+ *
+ * @param string $url
+ * @return string
+ */
+ public function removeProtocolFromUrl($url) {
+ if (strpos($url, 'https://') === 0) {
+ return substr($url, strlen('https://'));
+ } else if (strpos($url, 'http://') === 0) {
+ return substr($url, strlen('http://'));
+ }
+
+ return $url;
+ }
+
+ /**
+ * Strips away a potential file names and trailing slashes:
+ * - http://localhost
+ * - http://localhost/
+ * - http://localhost/index.php
+ * - http://localhost/index.php/s/{shareToken}
+ *
+ * all return: http://localhost
+ *
+ * @param string $remote
+ * @return string
+ */
+ protected function fixRemoteURL($remote) {
+ $remote = str_replace('\\', '/', $remote);
+ if ($fileNamePosition = strpos($remote, '/index.php')) {
+ $remote = substr($remote, 0, $fileNamePosition);
+ }
+ $remote = rtrim($remote, '/');
+
+ return $remote;
+ }
+
+}
diff --git a/apps/federatedfilesharing/lib/federatedshareprovider.php b/apps/federatedfilesharing/lib/federatedshareprovider.php
new file mode 100644
index 00000000000..0825a0e69bc
--- /dev/null
+++ b/apps/federatedfilesharing/lib/federatedshareprovider.php
@@ -0,0 +1,562 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\FederatedFileSharing;
+
+use OC\Share20\Share;
+use OCP\Files\IRootFolder;
+use OCP\IL10N;
+use OCP\ILogger;
+use OCP\Share\IShare;
+use OCP\Share\IShareProvider;
+use OC\Share20\Exception\InvalidShare;
+use OCP\Share\Exceptions\ShareNotFound;
+use OCP\Files\NotFoundException;
+use OCP\IDBConnection;
+use OCP\Files\Node;
+
+/**
+ * Class FederatedShareProvider
+ *
+ * @package OCA\FederatedFileSharing
+ */
+class FederatedShareProvider implements IShareProvider {
+
+ const SHARE_TYPE_REMOTE = 6;
+
+ /** @var IDBConnection */
+ private $dbConnection;
+
+ /** @var AddressHandler */
+ private $addressHandler;
+
+ /** @var Notifications */
+ private $notifications;
+
+ /** @var TokenHandler */
+ private $tokenHandler;
+
+ /** @var IL10N */
+ private $l;
+
+ /** @var ILogger */
+ private $logger;
+
+ /** @var IRootFolder */
+ private $rootFolder;
+
+ /**
+ * DefaultShareProvider constructor.
+ *
+ * @param IDBConnection $connection
+ * @param AddressHandler $addressHandler
+ * @param Notifications $notifications
+ * @param TokenHandler $tokenHandler
+ * @param IL10N $l10n
+ * @param ILogger $logger
+ * @param IRootFolder $rootFolder
+ */
+ public function __construct(
+ IDBConnection $connection,
+ AddressHandler $addressHandler,
+ Notifications $notifications,
+ TokenHandler $tokenHandler,
+ IL10N $l10n,
+ ILogger $logger,
+ IRootFolder $rootFolder
+ ) {
+ $this->dbConnection = $connection;
+ $this->addressHandler = $addressHandler;
+ $this->notifications = $notifications;
+ $this->tokenHandler = $tokenHandler;
+ $this->l = $l10n;
+ $this->logger = $logger;
+ $this->rootFolder = $rootFolder;
+ }
+
+ /**
+ * Return the identifier of this provider.
+ *
+ * @return string Containing only [a-zA-Z0-9]
+ */
+ public function identifier() {
+ return 'ocFederatedSharing';
+ }
+
+ /**
+ * Share a path
+ *
+ * @param IShare $share
+ * @return IShare The share object
+ * @throws ShareNotFound
+ * @throws \Exception
+ */
+ public function create(IShare $share) {
+
+ $shareWith = $share->getSharedWith();
+ $itemSource = $share->getNodeId();
+ $itemType = $share->getNodeType();
+ $uidOwner = $share->getShareOwner();
+ $permissions = $share->getPermissions();
+ $sharedBy = $share->getSharedBy();
+
+ /*
+ * Check if file is not already shared with the remote user
+ */
+ $alreadyShared = $this->getSharedWith($shareWith, self::SHARE_TYPE_REMOTE, $share->getNode(), 1, 0);
+ if (!empty($alreadyShared)) {
+ $message = 'Sharing %s failed, because this item is already shared with %s';
+ $message_t = $this->l->t('Sharing %s failed, because this item is already shared with %s', array($share->getNode()->getName(), $shareWith));
+ $this->logger->debug(sprintf($message, $share->getNode()->getName(), $shareWith), ['app' => 'Federated File Sharing']);
+ throw new \Exception($message_t);
+ }
+
+
+ // don't allow federated shares if source and target server are the same
+ list($user, $remote) = $this->addressHandler->splitUserRemote($shareWith);
+ $currentServer = $this->addressHandler->generateRemoteURL();
+ $currentUser = $sharedBy;
+ if ($this->addressHandler->compareAddresses($user, $remote, $currentUser, $currentServer)) {
+ $message = 'Not allowed to create a federated share with the same user.';
+ $message_t = $this->l->t('Not allowed to create a federated share with the same user');
+ $this->logger->debug($message, ['app' => 'Federated File Sharing']);
+ throw new \Exception($message_t);
+ }
+
+ $token = $this->tokenHandler->generateToken();
+
+ $shareWith = $user . '@' . $remote;
+
+ $shareId = $this->addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
+
+ $send = $this->notifications->sendRemoteShare(
+ $token,
+ $shareWith,
+ $share->getNode()->getName(),
+ $shareId,
+ $share->getSharedBy()
+ );
+
+ $data = $this->getRawShare($shareId);
+ $share = $this->createShare($data);
+
+ if ($send === false) {
+ $this->delete($share);
+ $message_t = $this->l->t('Sharing %s failed, could not find %s, maybe the server is currently unreachable.',
+ [$share->getNode()->getName(), $shareWith]);
+ throw new \Exception($message_t);
+ }
+
+ return $share;
+ }
+
+ /**
+ * add share to the database and return the ID
+ *
+ * @param int $itemSource
+ * @param string $itemType
+ * @param string $shareWith
+ * @param string $sharedBy
+ * @param string $uidOwner
+ * @param int $permissions
+ * @param string $token
+ * @return int
+ */
+ private function addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $uidOwner, $permissions, $token) {
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->insert('share')
+ ->setValue('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE))
+ ->setValue('item_type', $qb->createNamedParameter($itemType))
+ ->setValue('item_source', $qb->createNamedParameter($itemSource))
+ ->setValue('file_source', $qb->createNamedParameter($itemSource))
+ ->setValue('share_with', $qb->createNamedParameter($shareWith))
+ ->setValue('uid_owner', $qb->createNamedParameter($uidOwner))
+ ->setValue('uid_initiator', $qb->createNamedParameter($sharedBy))
+ ->setValue('permissions', $qb->createNamedParameter($permissions))
+ ->setValue('token', $qb->createNamedParameter($token))
+ ->setValue('stime', $qb->createNamedParameter(time()));
+
+ /*
+ * Added to fix https://github.com/owncloud/core/issues/22215
+ * Can be removed once we get rid of ajax/share.php
+ */
+ $qb->setValue('file_target', $qb->createNamedParameter(''));
+
+ $qb->execute();
+ $id = $qb->getLastInsertId();
+
+ return (int)$id;
+ }
+
+ /**
+ * Update a share
+ *
+ * @param IShare $share
+ * @return IShare The share object
+ */
+ public function update(IShare $share) {
+ /*
+ * We allow updating the permissions of federated shares
+ */
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->update('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
+ ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
+ ->execute();
+
+ return $share;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function move(IShare $share, $recipient) {
+ /*
+ * This function does nothing yet as it is just for outgoing
+ * federated shares.
+ */
+ return $share;
+ }
+
+ /**
+ * Get all children of this share
+ *
+ * @param IShare $parent
+ * @return IShare[]
+ */
+ public function getChildren(IShare $parent) {
+ $children = [];
+
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('parent', $qb->createNamedParameter($parent->getId())))
+ ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)))
+ ->orderBy('id');
+
+ $cursor = $qb->execute();
+ while($data = $cursor->fetch()) {
+ $children[] = $this->createShare($data);
+ }
+ $cursor->closeCursor();
+
+ return $children;
+ }
+
+ /**
+ * Delete a share
+ *
+ * @param IShare $share
+ */
+ public function delete(IShare $share) {
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->delete('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())));
+ $qb->execute();
+
+ list(, $remote) = $this->addressHandler->splitUserRemote($share->getSharedWith());
+ $this->notifications->sendRemoteUnShare($remote, $share->getId(), $share->getToken());
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function deleteFromSelf(IShare $share, $recipient) {
+ // nothing to do here. Technically deleteFromSelf in the context of federated
+ // shares is a umount of a external storage. This is handled here
+ // apps/files_sharing/lib/external/manager.php
+ // TODO move this code over to this app
+ return;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset) {
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->select('*')
+ ->from('share');
+
+ $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)));
+
+ /**
+ * Reshares for this user are shares where they are the owner.
+ */
+ if ($reshares === false) {
+ //Special case for old shares created via the web UI
+ $or1 = $qb->expr()->andX(
+ $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
+ $qb->expr()->isNull('uid_initiator')
+ );
+
+ $qb->andWhere(
+ $qb->expr()->orX(
+ $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)),
+ $or1
+ )
+ );
+ } else {
+ $qb->andWhere(
+ $qb->expr()->orX(
+ $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
+ $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
+ )
+ );
+ }
+
+ if ($node !== null) {
+ $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
+ }
+
+ if ($limit !== -1) {
+ $qb->setMaxResults($limit);
+ }
+
+ $qb->setFirstResult($offset);
+ $qb->orderBy('id');
+
+ $cursor = $qb->execute();
+ $shares = [];
+ while($data = $cursor->fetch()) {
+ $shares[] = $this->createShare($data);
+ }
+ $cursor->closeCursor();
+
+ return $shares;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getShareById($id, $recipientId = null) {
+ $qb = $this->dbConnection->getQueryBuilder();
+
+ $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
+ ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)));
+
+ $cursor = $qb->execute();
+ $data = $cursor->fetch();
+ $cursor->closeCursor();
+
+ if ($data === false) {
+ throw new ShareNotFound();
+ }
+
+ try {
+ $share = $this->createShare($data);
+ } catch (InvalidShare $e) {
+ throw new ShareNotFound();
+ }
+
+ return $share;
+ }
+
+ /**
+ * Get shares for a given path
+ *
+ * @param \OCP\Files\Node $path
+ * @return IShare[]
+ */
+ public function getSharesByPath(Node $path) {
+ $qb = $this->dbConnection->getQueryBuilder();
+
+ $cursor = $qb->select('*')
+ ->from('share')
+ ->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
+ ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)))
+ ->execute();
+
+ $shares = [];
+ while($data = $cursor->fetch()) {
+ $shares[] = $this->createShare($data);
+ }
+ $cursor->closeCursor();
+
+ return $shares;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
+ /** @var IShare[] $shares */
+ $shares = [];
+
+ //Get shares directly with this user
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->select('*')
+ ->from('share');
+
+ // Order by id
+ $qb->orderBy('id');
+
+ // Set limit and offset
+ if ($limit !== -1) {
+ $qb->setMaxResults($limit);
+ }
+ $qb->setFirstResult($offset);
+
+ $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)));
+ $qb->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)));
+
+ // Filter by node if provided
+ if ($node !== null) {
+ $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
+ }
+
+ $cursor = $qb->execute();
+
+ while($data = $cursor->fetch()) {
+ $shares[] = $this->createShare($data);
+ }
+ $cursor->closeCursor();
+
+
+ return $shares;
+ }
+
+ /**
+ * Get a share by token
+ *
+ * @param string $token
+ * @return IShare
+ * @throws ShareNotFound
+ */
+ public function getShareByToken($token) {
+ $qb = $this->dbConnection->getQueryBuilder();
+
+ $cursor = $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)))
+ ->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
+ ->execute();
+
+ $data = $cursor->fetch();
+
+ if ($data === false) {
+ throw new ShareNotFound();
+ }
+
+ try {
+ $share = $this->createShare($data);
+ } catch (InvalidShare $e) {
+ throw new ShareNotFound();
+ }
+
+ return $share;
+ }
+
+ /**
+ * get database row of a give share
+ *
+ * @param $id
+ * @return array
+ * @throws ShareNotFound
+ */
+ private function getRawShare($id) {
+
+ // Now fetch the inserted share and create a complete share object
+ $qb = $this->dbConnection->getQueryBuilder();
+ $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
+
+ $cursor = $qb->execute();
+ $data = $cursor->fetch();
+ $cursor->closeCursor();
+
+ if ($data === false) {
+ throw new ShareNotFound;
+ }
+
+ return $data;
+ }
+
+ /**
+ * Create a share object from an database row
+ *
+ * @param array $data
+ * @return IShare
+ * @throws InvalidShare
+ * @throws ShareNotFound
+ */
+ private function createShare($data) {
+
+ $share = new Share($this->rootFolder);
+ $share->setId((int)$data['id'])
+ ->setShareType((int)$data['share_type'])
+ ->setPermissions((int)$data['permissions'])
+ ->setTarget($data['file_target'])
+ ->setMailSend((bool)$data['mail_send'])
+ ->setToken($data['token']);
+
+ $shareTime = new \DateTime();
+ $shareTime->setTimestamp((int)$data['stime']);
+ $share->setShareTime($shareTime);
+ $share->setSharedWith($data['share_with']);
+
+ if ($data['uid_initiator'] !== null) {
+ $share->setShareOwner($data['uid_owner']);
+ $share->setSharedBy($data['uid_initiator']);
+ } else {
+ //OLD SHARE
+ $share->setSharedBy($data['uid_owner']);
+ $path = $this->getNode($share->getSharedBy(), (int)$data['file_source']);
+
+ $owner = $path->getOwner();
+ $share->setShareOwner($owner->getUID());
+ }
+
+ $share->setNodeId((int)$data['file_source']);
+ $share->setNodeType($data['item_type']);
+
+ $share->setProviderId($this->identifier());
+
+ return $share;
+ }
+
+ /**
+ * Get the node with file $id for $user
+ *
+ * @param string $userId
+ * @param int $id
+ * @return \OCP\Files\File|\OCP\Files\Folder
+ * @throws InvalidShare
+ */
+ private function getNode($userId, $id) {
+ try {
+ $userFolder = $this->rootFolder->getUserFolder($userId);
+ } catch (NotFoundException $e) {
+ throw new InvalidShare();
+ }
+
+ $nodes = $userFolder->getById($id);
+
+ if (empty($nodes)) {
+ throw new InvalidShare();
+ }
+
+ return $nodes[0];
+ }
+
+}
diff --git a/apps/federatedfilesharing/lib/notifications.php b/apps/federatedfilesharing/lib/notifications.php
new file mode 100644
index 00000000000..d778ac87828
--- /dev/null
+++ b/apps/federatedfilesharing/lib/notifications.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\FederatedFileSharing;
+
+
+use OCP\Http\Client\IClientService;
+
+class Notifications {
+
+ const BASE_PATH_TO_SHARE_API = '/ocs/v1.php/cloud/shares';
+ const RESPONSE_FORMAT = 'json'; // default response format for ocs calls
+
+ /** @var AddressHandler */
+ private $addressHandler;
+
+ /** @var IClientService */
+ private $httpClientService;
+
+ /**
+ * Notifications constructor.
+ *
+ * @param AddressHandler $addressHandler
+ * @param IClientService $httpClientService
+ */
+ public function __construct(
+ AddressHandler $addressHandler,
+ IClientService $httpClientService
+ ) {
+ $this->addressHandler = $addressHandler;
+ $this->httpClientService = $httpClientService;
+ }
+
+ /**
+ * send server-to-server share to remote server
+ *
+ * @param string $token
+ * @param string $shareWith
+ * @param string $name
+ * @param int $remote_id
+ * @param string $owner
+ * @return bool
+ */
+ public function sendRemoteShare($token, $shareWith, $name, $remote_id, $owner) {
+
+ list($user, $remote) = $this->addressHandler->splitUserRemote($shareWith);
+
+ if ($user && $remote) {
+ $url = $remote . self::BASE_PATH_TO_SHARE_API . '?format=' . self::RESPONSE_FORMAT;
+ $local = $this->addressHandler->generateRemoteURL();
+
+ $fields = array(
+ 'shareWith' => $user,
+ 'token' => $token,
+ 'name' => $name,
+ 'remoteId' => $remote_id,
+ 'owner' => $owner,
+ 'remote' => $local,
+ );
+
+ $url = $this->addressHandler->removeProtocolFromUrl($url);
+ $result = $this->tryHttpPost($url, $fields);
+ $status = json_decode($result['result'], true);
+
+ if ($result['success'] && $status['ocs']['meta']['statuscode'] === 100) {
+ \OC_Hook::emit('OCP\Share', 'federated_share_added', ['server' => $remote]);
+ return true;
+ }
+
+ }
+
+ return false;
+ }
+
+ /**
+ * send server-to-server unshare to remote server
+ *
+ * @param string $remote url
+ * @param int $id share id
+ * @param string $token
+ * @return bool
+ */
+ public function sendRemoteUnShare($remote, $id, $token) {
+ $url = rtrim($remote, '/') . self::BASE_PATH_TO_SHARE_API . '/' . $id . '/unshare?format=' . self::RESPONSE_FORMAT;
+ $fields = array('token' => $token, 'format' => 'json');
+ $url = $this->addressHandler->removeProtocolFromUrl($url);
+ $result = $this->tryHttpPost($url, $fields);
+ $status = json_decode($result['result'], true);
+
+ return ($result['success'] && $status['ocs']['meta']['statuscode'] === 100);
+ }
+
+ /**
+ * try http post first with https and then with http as a fallback
+ *
+ * @param string $url
+ * @param array $fields post parameters
+ * @return array
+ */
+ private function tryHttpPost($url, array $fields) {
+ $client = $this->httpClientService->newClient();
+ $protocol = 'https://';
+ $result = [
+ 'success' => false,
+ 'result' => '',
+ ];
+ $try = 0;
+ while ($result['success'] === false && $try < 2) {
+ try {
+ $response = $client->post($protocol . $url, [
+ 'body' => $fields
+ ]);
+ $result['result'] = $response->getBody();
+ $result['success'] = true;
+ break;
+ } catch (\Exception $e) {
+ $try++;
+ $protocol = 'http://';
+ }
+ }
+
+ return $result;
+ }
+
+}
diff --git a/apps/federatedfilesharing/lib/tokenhandler.php b/apps/federatedfilesharing/lib/tokenhandler.php
new file mode 100644
index 00000000000..ec5f73127d6
--- /dev/null
+++ b/apps/federatedfilesharing/lib/tokenhandler.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\FederatedFileSharing;
+
+
+use OCP\Security\ISecureRandom;
+
+/**
+ * Class TokenHandler
+ *
+ * @package OCA\FederatedFileSharing
+ */
+class TokenHandler {
+
+ const TOKEN_LENGTH = 15;
+
+ /** @var ISecureRandom */
+ private $secureRandom;
+
+ /**
+ * TokenHandler constructor.
+ *
+ * @param ISecureRandom $secureRandom
+ */
+ public function __construct(ISecureRandom $secureRandom) {
+ $this->secureRandom = $secureRandom;
+ }
+
+ /**
+ * generate to token used to authenticate federated shares
+ *
+ * @return string
+ */
+ public function generateToken() {
+ $token = $this->secureRandom->generate(
+ self::TOKEN_LENGTH,
+ ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS);
+ return $token;
+ }
+
+}
diff --git a/apps/federatedfilesharing/tests/addresshandlertest.php b/apps/federatedfilesharing/tests/addresshandlertest.php
new file mode 100644
index 00000000000..b1c23dc75bf
--- /dev/null
+++ b/apps/federatedfilesharing/tests/addresshandlertest.php
@@ -0,0 +1,198 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\FederatedFileSharing\Tests;
+
+
+use OCA\FederatedFileSharing\AddressHandler;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use Test\TestCase;
+
+class AddressHandlerTest extends TestCase {
+
+ /** @var AddressHandler */
+ private $addressHandler;
+
+ /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */
+ private $urlGenerator;
+
+ /** @var IL10N | \PHPUnit_Framework_MockObject_MockObject */
+ private $il10n;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->urlGenerator = $this->getMock('OCP\IURLGenerator');
+ $this->il10n = $this->getMock('OCP\IL10N');
+
+ $this->addressHandler = new AddressHandler($this->urlGenerator, $this->il10n);
+ }
+
+ public function dataTestSplitUserRemote() {
+ $userPrefix = ['user@name', 'username'];
+ $protocols = ['', 'http://', 'https://'];
+ $remotes = [
+ 'localhost',
+ 'local.host',
+ 'dev.local.host',
+ 'dev.local.host/path',
+ 'dev.local.host/at@inpath',
+ '127.0.0.1',
+ '::1',
+ '::192.0.2.128',
+ '::192.0.2.128/at@inpath',
+ ];
+
+ $testCases = [];
+ foreach ($userPrefix as $user) {
+ foreach ($remotes as $remote) {
+ foreach ($protocols as $protocol) {
+ $baseUrl = $user . '@' . $protocol . $remote;
+
+ $testCases[] = [$baseUrl, $user, $protocol . $remote];
+ $testCases[] = [$baseUrl . '/', $user, $protocol . $remote];
+ $testCases[] = [$baseUrl . '/index.php', $user, $protocol . $remote];
+ $testCases[] = [$baseUrl . '/index.php/s/token', $user, $protocol . $remote];
+ }
+ }
+ }
+ return $testCases;
+ }
+
+ /**
+ * @dataProvider dataTestSplitUserRemote
+ *
+ * @param string $remote
+ * @param string $expectedUser
+ * @param string $expectedUrl
+ */
+ public function testSplitUserRemote($remote, $expectedUser, $expectedUrl) {
+ list($remoteUser, $remoteUrl) = $this->addressHandler->splitUserRemote($remote);
+ $this->assertSame($expectedUser, $remoteUser);
+ $this->assertSame($expectedUrl, $remoteUrl);
+ }
+
+ public function dataTestSplitUserRemoteError() {
+ return array(
+ // Invalid path
+ array('user@'),
+
+ // Invalid user
+ array('@server'),
+ array('us/er@server'),
+ array('us:er@server'),
+
+ // Invalid splitting
+ array('user'),
+ array(''),
+ array('us/erserver'),
+ array('us:erserver'),
+ );
+ }
+
+ /**
+ * @dataProvider dataTestSplitUserRemoteError
+ *
+ * @param string $id
+ * @expectedException \OC\HintException
+ */
+ public function testSplitUserRemoteError($id) {
+ $this->addressHandler->splitUserRemote($id);
+ }
+
+ /**
+ * @dataProvider dataTestCompareAddresses
+ *
+ * @param string $user1
+ * @param string $server1
+ * @param string $user2
+ * @param string $server2
+ * @param bool $expected
+ */
+ public function testCompareAddresses($user1, $server1, $user2, $server2, $expected) {
+ $this->assertSame($expected,
+ $this->addressHandler->compareAddresses($user1, $server1, $user2, $server2)
+ );
+ }
+
+ public function dataTestCompareAddresses() {
+ return [
+ ['user1', 'http://server1', 'user1', 'http://server1', true],
+ ['user1', 'https://server1', 'user1', 'http://server1', true],
+ ['user1', 'http://serVer1', 'user1', 'http://server1', true],
+ ['user1', 'http://server1/', 'user1', 'http://server1', true],
+ ['user1', 'server1', 'user1', 'http://server1', true],
+ ['user1', 'http://server1', 'user1', 'http://server2', false],
+ ['user1', 'https://server1', 'user1', 'http://server2', false],
+ ['user1', 'http://serVer1', 'user1', 'http://serer2', false],
+ ['user1', 'http://server1/', 'user1', 'http://server2', false],
+ ['user1', 'server1', 'user1', 'http://server2', false],
+ ['user1', 'http://server1', 'user2', 'http://server1', false],
+ ['user1', 'https://server1', 'user2', 'http://server1', false],
+ ['user1', 'http://serVer1', 'user2', 'http://server1', false],
+ ['user1', 'http://server1/', 'user2', 'http://server1', false],
+ ['user1', 'server1', 'user2', 'http://server1', false],
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestRemoveProtocolFromUrl
+ *
+ * @param string $url
+ * @param string $expectedResult
+ */
+ public function testRemoveProtocolFromUrl($url, $expectedResult) {
+ $result = $this->addressHandler->removeProtocolFromUrl($url);
+ $this->assertSame($expectedResult, $result);
+ }
+
+ public function dataTestRemoveProtocolFromUrl() {
+ return [
+ ['http://owncloud.org', 'owncloud.org'],
+ ['https://owncloud.org', 'owncloud.org'],
+ ['owncloud.org', 'owncloud.org'],
+ ];
+ }
+
+ /**
+ * @dataProvider dataTestFixRemoteUrl
+ *
+ * @param string $url
+ * @param string $expected
+ */
+ public function testFixRemoteUrl($url, $expected) {
+ $this->assertSame($expected,
+ $this->invokePrivate($this->addressHandler, 'fixRemoteURL', [$url])
+ );
+ }
+
+ public function dataTestFixRemoteUrl() {
+ return [
+ ['http://localhost', 'http://localhost'],
+ ['http://localhost/', 'http://localhost'],
+ ['http://localhost/index.php', 'http://localhost'],
+ ['http://localhost/index.php/s/AShareToken', 'http://localhost'],
+ ];
+ }
+
+}
diff --git a/apps/federatedfilesharing/tests/federatedshareprovidertest.php b/apps/federatedfilesharing/tests/federatedshareprovidertest.php
new file mode 100644
index 00000000000..a7ff02e7697
--- /dev/null
+++ b/apps/federatedfilesharing/tests/federatedshareprovidertest.php
@@ -0,0 +1,447 @@
+<?php
+
+namespace OCA\FederatedFileSharing\Tests;
+
+
+use OCA\FederatedFileSharing\AddressHandler;
+use OCA\FederatedFileSharing\FederatedShareProvider;
+use OCA\FederatedFileSharing\Notifications;
+use OCA\FederatedFileSharing\TokenHandler;
+use OCP\Files\IRootFolder;
+use OCP\IDBConnection;
+use OCP\IL10N;
+use OCP\ILogger;
+use OCP\Share\IManager;
+use Test\TestCase;
+
+/**
+ * Class FederatedShareProviderTest
+ *
+ * @package OCA\FederatedFileSharing\Tests
+ * @group DB
+ */
+class FederatedShareProviderTest extends TestCase {
+
+ /** @var IDBConnection */
+ protected $connection;
+ /** @var AddressHandler | \PHPUnit_Framework_MockObject_MockObject */
+ protected $addressHandler;
+ /** @var Notifications | \PHPUnit_Framework_MockObject_MockObject */
+ protected $notifications;
+ /** @var TokenHandler */
+ protected $tokenHandler;
+ /** @var IL10N */
+ protected $l;
+ /** @var ILogger */
+ protected $logger;
+ /** @var IRootFolder | \PHPUnit_Framework_MockObject_MockObject */
+ protected $rootFolder;
+
+ /** @var IManager */
+ protected $shareManager;
+ /** @var FederatedShareProvider */
+ protected $provider;
+
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->connection = \OC::$server->getDatabaseConnection();
+ $this->notifications = $this->getMockBuilder('OCA\FederatedFileSharing\Notifications')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->tokenHandler = $this->getMockBuilder('OCA\FederatedFileSharing\TokenHandler')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->l = $this->getMock('OCP\IL10N');
+ $this->l->method('t')
+ ->will($this->returnCallback(function($text, $parameters = []) {
+ return vsprintf($text, $parameters);
+ }));
+ $this->logger = $this->getMock('OCP\ILogger');
+ $this->rootFolder = $this->getMock('OCP\Files\IRootFolder');
+ $this->addressHandler = new AddressHandler(\OC::$server->getURLGenerator(), $this->l);
+
+ $this->provider = new FederatedShareProvider(
+ $this->connection,
+ $this->addressHandler,
+ $this->notifications,
+ $this->tokenHandler,
+ $this->l,
+ $this->logger,
+ $this->rootFolder
+ );
+
+ $this->shareManager = \OC::$server->getShareManager();
+ }
+
+ public function tearDown() {
+ $this->connection->getQueryBuilder()->delete('share')->execute();
+
+ return parent::tearDown();
+ }
+
+ public function testCreate() {
+ $share = $this->shareManager->newShare();
+
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+
+ $this->notifications->expects($this->once())
+ ->method('sendRemoteShare')
+ ->with(
+ $this->equalTo('token'),
+ $this->equalTo('user@server.com'),
+ $this->equalTo('myFile'),
+ $this->anything(),
+ 'sharedBy'
+ )->willReturn(true);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ $share = $this->provider->create($share);
+
+ $qb = $this->connection->getQueryBuilder();
+ $stmt = $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
+ ->execute();
+
+ $data = $stmt->fetch();
+ $stmt->closeCursor();
+
+ $expected = [
+ 'share_type' => \OCP\Share::SHARE_TYPE_REMOTE,
+ 'share_with' => 'user@server.com',
+ 'uid_owner' => 'shareOwner',
+ 'uid_initiator' => 'sharedBy',
+ 'item_type' => 'file',
+ 'item_source' => 42,
+ 'file_source' => 42,
+ 'permissions' => 19,
+ 'accepted' => 0,
+ 'token' => 'token',
+ ];
+ $this->assertArraySubset($expected, $data);
+
+ $this->assertEquals($data['id'], $share->getId());
+ $this->assertEquals(\OCP\Share::SHARE_TYPE_REMOTE, $share->getShareType());
+ $this->assertEquals('user@server.com', $share->getSharedWith());
+ $this->assertEquals('sharedBy', $share->getSharedBy());
+ $this->assertEquals('shareOwner', $share->getShareOwner());
+ $this->assertEquals('file', $share->getNodeType());
+ $this->assertEquals(42, $share->getNodeId());
+ $this->assertEquals(19, $share->getPermissions());
+ $this->assertEquals('token', $share->getToken());
+ }
+
+ public function testCreateCouldNotFindServer() {
+ $share = $this->shareManager->newShare();
+
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+
+ $this->notifications->expects($this->once())
+ ->method('sendRemoteShare')
+ ->with(
+ $this->equalTo('token'),
+ $this->equalTo('user@server.com'),
+ $this->equalTo('myFile'),
+ $this->anything(),
+ 'sharedBy'
+ )->willReturn(false);
+
+ $this->rootFolder->expects($this->once())
+ ->method('getUserFolder')
+ ->with('shareOwner')
+ ->will($this->returnSelf());
+ $this->rootFolder->method('getById')
+ ->with('42')
+ ->willReturn([$node]);
+
+ try {
+ $share = $this->provider->create($share);
+ $this->fail();
+ } catch (\Exception $e) {
+ $this->assertEquals('Sharing myFile failed, could not find user@server.com, maybe the server is currently unreachable.', $e->getMessage());
+ }
+
+ $qb = $this->connection->getQueryBuilder();
+ $stmt = $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
+ ->execute();
+
+ $data = $stmt->fetch();
+ $stmt->closeCursor();
+
+ $this->assertFalse($data);
+ }
+
+ public function testCreateShareWithSelf() {
+ $share = $this->shareManager->newShare();
+
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $shareWith = 'sharedBy@' . $this->addressHandler->generateRemoteURL();
+
+ $share->setSharedWith($shareWith)
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ try {
+ $share = $this->provider->create($share);
+ $this->fail();
+ } catch (\Exception $e) {
+ $this->assertEquals('Not allowed to create a federated share with the same user', $e->getMessage());
+ }
+
+ $qb = $this->connection->getQueryBuilder();
+ $stmt = $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
+ ->execute();
+
+ $data = $stmt->fetch();
+ $stmt->closeCursor();
+
+ $this->assertFalse($data);
+ }
+
+ public function testCreateAlreadyShared() {
+ $share = $this->shareManager->newShare();
+
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+
+ $this->notifications->expects($this->once())
+ ->method('sendRemoteShare')
+ ->with(
+ $this->equalTo('token'),
+ $this->equalTo('user@server.com'),
+ $this->equalTo('myFile'),
+ $this->anything(),
+ 'sharedBy'
+ )->willReturn(true);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ $this->provider->create($share);
+
+ try {
+ $this->provider->create($share);
+ } catch (\Exception $e) {
+ $this->assertEquals('Sharing myFile failed, because this item is already shared with user@server.com', $e->getMessage());
+ }
+ }
+
+ public function testUpdate() {
+ $share = $this->shareManager->newShare();
+
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+
+ $this->notifications->expects($this->once())
+ ->method('sendRemoteShare')
+ ->with(
+ $this->equalTo('token'),
+ $this->equalTo('user@server.com'),
+ $this->equalTo('myFile'),
+ $this->anything(),
+ 'sharedBy'
+ )->willReturn(true);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ $share = $this->provider->create($share);
+
+ $share->setPermissions(1);
+ $this->provider->update($share);
+
+ $share = $this->provider->getShareById($share->getId());
+
+ $this->assertEquals(1, $share->getPermissions());
+ }
+
+ public function testGetSharedBy() {
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+ $this->notifications
+ ->method('sendRemoteShare')
+ ->willReturn(true);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ $share = $this->shareManager->newShare();
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+ $this->provider->create($share);
+
+ $share2 = $this->shareManager->newShare();
+ $share2->setSharedWith('user2@server.com')
+ ->setSharedBy('sharedBy2')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+ $this->provider->create($share2);
+
+ $shares = $this->provider->getSharesBy('sharedBy', \OCP\Share::SHARE_TYPE_REMOTE, null, false, -1, 0);
+
+ $this->assertCount(1, $shares);
+ $this->assertEquals('user@server.com', $shares[0]->getSharedWith());
+ $this->assertEquals('sharedBy', $shares[0]->getSharedBy());
+ }
+
+ public function testGetSharedByWithNode() {
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+ $this->notifications
+ ->method('sendRemoteShare')
+ ->willReturn(true);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ $share = $this->shareManager->newShare();
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+ $this->provider->create($share);
+
+ $node2 = $this->getMock('\OCP\Files\File');
+ $node2->method('getId')->willReturn(43);
+ $node2->method('getName')->willReturn('myOtherFile');
+
+ $share2 = $this->shareManager->newShare();
+ $share2->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node2);
+ $this->provider->create($share2);
+
+ $shares = $this->provider->getSharesBy('sharedBy', \OCP\Share::SHARE_TYPE_REMOTE, $node2, false, -1, 0);
+
+ $this->assertCount(1, $shares);
+ $this->assertEquals(43, $shares[0]->getNodeId());
+ }
+
+ public function testGetSharedByWithReshares() {
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+ $this->notifications
+ ->method('sendRemoteShare')
+ ->willReturn(true);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ $share = $this->shareManager->newShare();
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('shareOwner')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+ $this->provider->create($share);
+
+ $share2 = $this->shareManager->newShare();
+ $share2->setSharedWith('user2@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+ $this->provider->create($share2);
+
+ $shares = $this->provider->getSharesBy('shareOwner', \OCP\Share::SHARE_TYPE_REMOTE, null, true, -1, 0);
+
+ $this->assertCount(2, $shares);
+ }
+
+ public function testGetSharedByWithLimit() {
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(42);
+ $node->method('getName')->willReturn('myFile');
+
+ $this->tokenHandler->method('generateToken')->willReturn('token');
+ $this->notifications
+ ->method('sendRemoteShare')
+ ->willReturn(true);
+
+ $this->rootFolder->expects($this->never())->method($this->anything());
+
+ $share = $this->shareManager->newShare();
+ $share->setSharedWith('user@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+ $this->provider->create($share);
+
+ $share2 = $this->shareManager->newShare();
+ $share2->setSharedWith('user2@server.com')
+ ->setSharedBy('sharedBy')
+ ->setShareOwner('shareOwner')
+ ->setPermissions(19)
+ ->setNode($node);
+ $this->provider->create($share2);
+
+ $shares = $this->provider->getSharesBy('shareOwner', \OCP\Share::SHARE_TYPE_REMOTE, null, true, 1, 1);
+
+ $this->assertCount(1, $shares);
+ $this->assertEquals('user2@server.com', $shares[0]->getSharedWith());
+ }
+}
diff --git a/apps/federatedfilesharing/tests/tokenhandlertest.php b/apps/federatedfilesharing/tests/tokenhandlertest.php
new file mode 100644
index 00000000000..4ff428d4a46
--- /dev/null
+++ b/apps/federatedfilesharing/tests/tokenhandlertest.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\FederatedFileSharing\Tests;
+
+
+use OCA\FederatedFileSharing\TokenHandler;
+use OCP\Security\ISecureRandom;
+use Test\TestCase;
+
+class TokenHandlerTest extends TestCase {
+
+ /** @var TokenHandler */
+ private $tokenHandler;
+
+ /** @var ISecureRandom | \PHPUnit_Framework_MockObject_MockObject */
+ private $secureRandom;
+
+ /** @var int */
+ private $expectedTokenLength = 15;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->secureRandom = $this->getMock('OCP\Security\ISecureRandom');
+
+ $this->tokenHandler = new TokenHandler($this->secureRandom);
+ }
+
+ public function testGenerateToken() {
+
+ $this->secureRandom->expects($this->once())->method('generate')
+ ->with(
+ $this->expectedTokenLength,
+ ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_DIGITS
+ )
+ ->willReturn(true);
+
+ $this->assertTrue($this->tokenHandler->generateToken());
+
+ }
+
+}
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index 136baa2ed07..b31232b799a 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -6,7 +6,7 @@
<licence>AGPL</licence>
<author>Robin Appelman, Vincent Petry</author>
<default_enable/>
- <version>1.4.2</version>
+ <version>1.4.3</version>
<types>
<filesystem/>
</types>
diff --git a/apps/files/appinfo/install.php b/apps/files/appinfo/install.php
index b9a893d1ee8..ae08e21a22e 100644
--- a/apps/files/appinfo/install.php
+++ b/apps/files/appinfo/install.php
@@ -21,4 +21,4 @@
// Cron job for scanning user storages
\OC::$server->getJobList()->add('OCA\Files\BackgroundJob\ScanFiles');
-\OC::$server->getJobList()->add('OCA\Files\BackgroundJob\DeleteOrphanedTagsJob');
+\OC::$server->getJobList()->add('OCA\Files\BackgroundJob\DeleteOrphanedItems');
diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php
index 003f6916ac5..cb682cbc426 100644
--- a/apps/files/appinfo/update.php
+++ b/apps/files/appinfo/update.php
@@ -99,4 +99,4 @@ if ($installedVersion === '1.1.9' && (
// Add cron job for scanning user storages
\OC::$server->getJobList()->add('OCA\Files\BackgroundJob\ScanFiles');
-\OC::$server->getJobList()->add('OCA\Files\BackgroundJob\DeleteOrphanedTagsJob');
+\OC::$server->getJobList()->add('OCA\Files\BackgroundJob\DeleteOrphanedItems');
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 4929039f837..389b7fae806 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -530,8 +530,8 @@ html.ie8 #fileList tr.selected td.filename>.selectCheckBox {
}
a.action > img {
- max-height: 16px;
- max-width: 16px;
+ height: 16px;
+ width: 16px;
vertical-align: text-bottom;
}
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 35999b5d0ee..1a6f38d3d7c 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -815,6 +815,10 @@
if (mountType) {
data.mountType = mountType;
}
+ var path = $el.attr('data-path');
+ if (path) {
+ data.path = path;
+ }
return data;
},
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index 960edf5b718..2314b29ace9 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -101,6 +101,8 @@ OC.L10N.register(
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
"Save" : "Speichern",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.",
+ "Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Deine Dateien zuzugreifen</a>",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 3d1e061781e..111a5e11a1e 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -99,6 +99,8 @@
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
"Save" : "Speichern",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.",
+ "Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Deine Dateien zuzugreifen</a>",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index ce8a9132a0c..e0a3744a378 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -46,6 +46,7 @@ OC.L10N.register(
"Could not move \"{file}\"" : "Die Datei konnte nicht verschoben werden \"{file}\"",
"{newName} already exists" : "{newName} existiert bereits",
"Could not rename \"{fileName}\", it does not exist any more" : "Die Datei konnte nicht umbennant werden \"{fileName}\", da die Datei nicht mehr existiert",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name „{targetName}“ wird bereits im Ordner „{dir}“ benutzt. Bitte wählen Sie einen anderen Namen.",
"Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
"Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da diese bereits existiert",
@@ -100,6 +101,7 @@ OC.L10N.register(
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
"Save" : "Speichern",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Bei PHP-FPM kann es 5 Minuten dauern, bis Änderungen angewendet sind.",
"Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index f6a3abc9891..cdac7613678 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -44,6 +44,7 @@
"Could not move \"{file}\"" : "Die Datei konnte nicht verschoben werden \"{file}\"",
"{newName} already exists" : "{newName} existiert bereits",
"Could not rename \"{fileName}\", it does not exist any more" : "Die Datei konnte nicht umbennant werden \"{fileName}\", da die Datei nicht mehr existiert",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name „{targetName}“ wird bereits im Ordner „{dir}“ benutzt. Bitte wählen Sie einen anderen Namen.",
"Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
"Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da diese bereits existiert",
@@ -98,6 +99,7 @@
"Maximum upload size" : "Maximale Upload-Größe",
"max. possible: " : "maximal möglich:",
"Save" : "Speichern",
+ "With PHP-FPM it might take 5 minutes for changes to be applied." : "Bei PHP-FPM kann es 5 Minuten dauern, bis Änderungen angewendet sind.",
"Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
"WebDAV" : "WebDAV",
diff --git a/apps/files/lib/backgroundjob/deleteorphanedtagsjob.php b/apps/files/lib/backgroundjob/deleteorphaneditems.php
index 33f455b5b40..cefa1d655de 100644
--- a/apps/files/lib/backgroundjob/deleteorphanedtagsjob.php
+++ b/apps/files/lib/backgroundjob/deleteorphaneditems.php
@@ -22,11 +22,12 @@
namespace OCA\Files\BackgroundJob;
use OC\BackgroundJob\TimedJob;
+use OCP\DB\QueryBuilder\IQueryBuilder;
/**
* Delete all share entries that have no matching entries in the file cache table.
*/
-class DeleteOrphanedTagsJob extends TimedJob {
+class DeleteOrphanedItems extends TimedJob {
/** @var \OCP\IDBConnection */
protected $connection;
@@ -58,6 +59,8 @@ class DeleteOrphanedTagsJob extends TimedJob {
public function run($argument) {
$this->cleanSystemTags();
$this->cleanUserTags();
+ $this->cleanComments();
+ $this->cleanCommentMarkers();
}
/**
@@ -65,19 +68,29 @@ class DeleteOrphanedTagsJob extends TimedJob {
*
* @return int Number of deleted entries
*/
- protected function cleanSystemTags() {
+ protected function cleanUp($table, $idCol, $typeCol) {
$subQuery = $this->connection->getQueryBuilder();
$subQuery->select($subQuery->expr()->literal('1'))
->from('filecache', 'f')
- ->where($subQuery->expr()->eq('objectid', 'f.fileid'));
+ ->where($subQuery->expr()->eq($idCol, 'f.fileid'));
$query = $this->connection->getQueryBuilder();
- $deletedEntries = $query->delete('systemtag_object_mapping')
- ->where($query->expr()->eq('objecttype', $query->expr()->literal('files')))
+ $deletedEntries = $query->delete($table)
+ ->where($query->expr()->eq($typeCol, $query->expr()->literal('files')))
->andWhere($query->expr()->isNull($query->createFunction('(' . $subQuery->getSql() . ')')))
->execute();
- $this->logger->debug("$deletedEntries orphaned system tag relations deleted", ['app' => 'DeleteOrphanedTagsJob']);
+ return $deletedEntries;
+ }
+
+ /**
+ * Deleting orphaned system tag mappings
+ *
+ * @return int Number of deleted entries
+ */
+ protected function cleanSystemTags() {
+ $deletedEntries = $this->cleanUp('systemtag_object_mapping', 'objectid', 'objecttype');
+ $this->logger->debug("$deletedEntries orphaned system tag relations deleted", ['app' => 'DeleteOrphanedItems']);
return $deletedEntries;
}
@@ -87,18 +100,32 @@ class DeleteOrphanedTagsJob extends TimedJob {
* @return int Number of deleted entries
*/
protected function cleanUserTags() {
- $subQuery = $this->connection->getQueryBuilder();
- $subQuery->select($subQuery->expr()->literal('1'))
- ->from('filecache', 'f')
- ->where($subQuery->expr()->eq('objid', 'f.fileid'));
+ $deletedEntries = $this->cleanUp('vcategory_to_object', 'objid', 'type');
+ $this->logger->debug("$deletedEntries orphaned user tag relations deleted", ['app' => 'DeleteOrphanedItems']);
+ return $deletedEntries;
+ }
- $query = $this->connection->getQueryBuilder();
- $deletedEntries = $query->delete('vcategory_to_object')
- ->where($query->expr()->eq('type', $query->expr()->literal('files')))
- ->andWhere($query->expr()->isNull($query->createFunction('(' . $subQuery->getSql() . ')')))
- ->execute();
+ /**
+ * Deleting orphaned comments
+ *
+ * @return int Number of deleted entries
+ */
+ protected function cleanComments() {
+ $qb = $this->connection->getQueryBuilder();
+ $deletedEntries = $this->cleanUp('comments', $qb->expr()->castColumn('object_id', IQueryBuilder::PARAM_INT), 'object_type');
+ $this->logger->debug("$deletedEntries orphaned comments deleted", ['app' => 'DeleteOrphanedItems']);
+ return $deletedEntries;
+ }
- $this->logger->debug("$deletedEntries orphaned user tag relations deleted", ['app' => 'DeleteOrphanedTagsJob']);
+ /**
+ * Deleting orphaned comment read markers
+ *
+ * @return int Number of deleted entries
+ */
+ protected function cleanCommentMarkers() {
+ $qb = $this->connection->getQueryBuilder();
+ $deletedEntries = $this->cleanUp('comments_read_markers', $qb->expr()->castColumn('object_id', IQueryBuilder::PARAM_INT), 'object_type');
+ $this->logger->debug("$deletedEntries orphaned comment read marks deleted", ['app' => 'DeleteOrphanedItems']);
return $deletedEntries;
}
diff --git a/apps/files/tests/backgroundjob/DeleteOrphanedTagsJobTest.php b/apps/files/tests/backgroundjob/DeleteOrphanedItemsJobTest.php
index d2e9d77cb20..8d8e5d3be52 100644
--- a/apps/files/tests/backgroundjob/DeleteOrphanedTagsJobTest.php
+++ b/apps/files/tests/backgroundjob/DeleteOrphanedItemsJobTest.php
@@ -21,17 +21,17 @@
namespace OCA\Files\Tests\BackgroundJob;
-use OCA\Files\BackgroundJob\DeleteOrphanedTagsJob;
+use OCA\Files\BackgroundJob\DeleteOrphanedItems;
use OCP\DB\QueryBuilder\IQueryBuilder;
/**
- * Class DeleteOrphanedTagsJobTest
+ * Class DeleteOrphanedItemsJobTest
*
* @group DB
*
* @package Test\BackgroundJob
*/
-class DeleteOrphanedTagsJobTest extends \Test\TestCase {
+class DeleteOrphanedItemsJobTest extends \Test\TestCase {
/** @var \OCP\IDBConnection */
protected $connection;
@@ -93,7 +93,7 @@ class DeleteOrphanedTagsJobTest extends \Test\TestCase {
$mapping = $this->getMappings('systemtag_object_mapping');
$this->assertCount(2, $mapping);
- $job = new DeleteOrphanedTagsJob();
+ $job = new DeleteOrphanedItems();
$this->invokePrivate($job, 'cleanSystemTags');
$mapping = $this->getMappings('systemtag_object_mapping');
@@ -142,7 +142,7 @@ class DeleteOrphanedTagsJobTest extends \Test\TestCase {
$mapping = $this->getMappings('vcategory_to_object');
$this->assertCount(2, $mapping);
- $job = new DeleteOrphanedTagsJob();
+ $job = new DeleteOrphanedItems();
$this->invokePrivate($job, 'cleanUserTags');
$mapping = $this->getMappings('vcategory_to_object');
@@ -155,4 +155,104 @@ class DeleteOrphanedTagsJobTest extends \Test\TestCase {
$this->cleanMapping('vcategory_to_object');
}
+ /**
+ * Test clearing orphaned system tag mappings
+ */
+ public function testClearComments() {
+ $this->cleanMapping('comments');
+
+ $query = $this->connection->getQueryBuilder();
+ $query->insert('filecache')
+ ->values([
+ 'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
+ 'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'),
+ 'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')),
+ ])->execute();
+ $fileId = $query->getLastInsertId();
+
+ // Existing file
+ $query = $this->connection->getQueryBuilder();
+ $query->insert('comments')
+ ->values([
+ 'object_id' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT),
+ 'object_type' => $query->createNamedParameter('files'),
+ 'actor_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
+ 'actor_type' => $query->createNamedParameter('users'),
+ ])->execute();
+
+ // Non-existing file
+ $query = $this->connection->getQueryBuilder();
+ $query->insert('comments')
+ ->values([
+ 'object_id' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT),
+ 'object_type' => $query->createNamedParameter('files'),
+ 'actor_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
+ 'actor_type' => $query->createNamedParameter('users'),
+ ])->execute();
+
+ $mapping = $this->getMappings('comments');
+ $this->assertCount(2, $mapping);
+
+ $job = new DeleteOrphanedItems();
+ $this->invokePrivate($job, 'cleanComments');
+
+ $mapping = $this->getMappings('comments');
+ $this->assertCount(1, $mapping);
+
+ $query = $this->connection->getQueryBuilder();
+ $query->delete('filecache')
+ ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
+ ->execute();
+ $this->cleanMapping('comments');
+ }
+
+ /**
+ * Test clearing orphaned system tag mappings
+ */
+ public function testClearCommentReadMarks() {
+ $this->cleanMapping('comments_read_markers');
+
+ $query = $this->connection->getQueryBuilder();
+ $query->insert('filecache')
+ ->values([
+ 'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT),
+ 'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'),
+ 'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')),
+ ])->execute();
+ $fileId = $query->getLastInsertId();
+
+ // Existing file
+ $query = $this->connection->getQueryBuilder();
+ $query->insert('comments_read_markers')
+ ->values([
+ 'object_id' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT),
+ 'object_type' => $query->createNamedParameter('files'),
+ 'user_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
+ ])->execute();
+
+ // Non-existing file
+ $query = $this->connection->getQueryBuilder();
+ $query->insert('comments_read_markers')
+ ->values([
+ 'object_id' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT),
+ 'object_type' => $query->createNamedParameter('files'),
+ 'user_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT),
+ ])->execute();
+
+ $mapping = $this->getMappings('comments_read_markers');
+ $this->assertCount(2, $mapping);
+
+ $job = new DeleteOrphanedItems();
+ $this->invokePrivate($job, 'cleanCommentMarkers');
+
+ $mapping = $this->getMappings('comments_read_markers');
+ $this->assertCount(1, $mapping);
+
+ $query = $this->connection->getQueryBuilder();
+ $query->delete('filecache')
+ ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
+ ->execute();
+ $this->cleanMapping('comments_read_markers');
+ }
+
}
diff --git a/apps/files/tests/controller/ViewControllerTest.php b/apps/files/tests/controller/ViewControllerTest.php
index b5df3cfc904..28e2f0c2c9a 100644
--- a/apps/files/tests/controller/ViewControllerTest.php
+++ b/apps/files/tests/controller/ViewControllerTest.php
@@ -168,6 +168,15 @@ class ViewControllerTest extends TestCase {
'icon' => '',
],
2 => [
+ 'id' => 'systemtagsfilter',
+ 'appname' => 'systemtags',
+ 'script' => 'list.php',
+ 'order' => 9,
+ 'name' => new \OC_L10N_String(new \OC_L10N('systemtags'), 'Tags', []),
+ 'active' => false,
+ 'icon' => '',
+ ],
+ 3 => [
'id' => 'sharingin',
'appname' => 'files_sharing',
'script' => 'list.php',
@@ -176,7 +185,7 @@ class ViewControllerTest extends TestCase {
'active' => false,
'icon' => '',
],
- 3 => [
+ 4 => [
'id' => 'sharingout',
'appname' => 'files_sharing',
'script' => 'list.php',
@@ -185,7 +194,7 @@ class ViewControllerTest extends TestCase {
'active' => false,
'icon' => '',
],
- 4 => [
+ 5 => [
'id' => 'sharinglinks',
'appname' => 'files_sharing',
'script' => 'list.php',
@@ -194,7 +203,7 @@ class ViewControllerTest extends TestCase {
'active' => false,
'icon' => '',
],
- 5 => [
+ 6 => [
'id' => 'trashbin',
'appname' => 'files_trashbin',
'script' => 'list.php',
@@ -227,18 +236,22 @@ class ViewControllerTest extends TestCase {
'content' => null,
],
2 => [
- 'id' => 'sharingin',
+ 'id' => 'systemtagsfilter',
'content' => null,
],
3 => [
- 'id' => 'sharingout',
+ 'id' => 'sharingin',
'content' => null,
],
4 => [
- 'id' => 'sharinglinks',
+ 'id' => 'sharingout',
'content' => null,
],
5 => [
+ 'id' => 'sharinglinks',
+ 'content' => null,
+ ],
+ 6 => [
'id' => 'trashbin',
'content' => null,
],
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 1b2dd12213b..0091a9ee6e4 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -2521,6 +2521,12 @@ describe('OCA.Files.FileList tests', function() {
expect(fileInfo.size).toEqual(12);
expect(fileInfo.mimetype).toEqual('text/plain');
expect(fileInfo.type).toEqual('file');
+ expect(fileInfo.path).not.toBeDefined();
+ });
+ it('adds path attribute if available', function() {
+ $tr.attr('data-path', '/subdir');
+ var fileInfo = fileList.elementToFile($tr);
+ expect(fileInfo.path).toEqual('/subdir');
});
});
describe('new file menu', function() {
diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php
index 1bf258c48b4..d6552fa680c 100644
--- a/apps/files_external/appinfo/application.php
+++ b/apps/files_external/appinfo/application.php
@@ -110,6 +110,7 @@ class Application extends App {
$container->query('OCA\Files_External\Lib\Auth\Password\SessionCredentials'),
$container->query('OCA\Files_External\Lib\Auth\Password\LoginCredentials'),
$container->query('OCA\Files_External\Lib\Auth\Password\UserProvided'),
+ $container->query('OCA\Files_External\Lib\Auth\Password\GlobalAuth'),
// AuthMechanism::SCHEME_OAUTH1 mechanisms
$container->query('OCA\Files_External\Lib\Auth\OAuth1\OAuth1'),
diff --git a/apps/files_external/appinfo/register_command.php b/apps/files_external/appinfo/register_command.php
index 929becce77a..927ce9869f9 100644
--- a/apps/files_external/appinfo/register_command.php
+++ b/apps/files_external/appinfo/register_command.php
@@ -27,6 +27,9 @@ use OCA\Files_External\Command\Applicable;
use OCA\Files_External\Command\Import;
use OCA\Files_External\Command\Export;
use OCA\Files_External\Command\Delete;
+use OCA\Files_External\Command\Create;
+use OCA\Files_External\Command\Backends;
+use OCA\Files_External\Command\Verify;
$userManager = OC::$server->getUserManager();
$userSession = OC::$server->getUserSession();
@@ -47,3 +50,6 @@ $application->add(new Applicable($globalStorageService, $userManager, $groupMana
$application->add(new Import($globalStorageService, $userStorageService, $userSession, $userManager, $importLegacyStorageService, $backendService));
$application->add(new Export($globalStorageService, $userStorageService, $userSession, $userManager));
$application->add(new Delete($globalStorageService, $userStorageService, $userSession, $userManager));
+$application->add(new Create($globalStorageService, $userStorageService, $userManager, $userSession, $backendService));
+$application->add(new Backends($backendService));
+$application->add(new Verify($globalStorageService));
diff --git a/apps/files_external/appinfo/routes.php b/apps/files_external/appinfo/routes.php
index c3149a300cf..d5b927c0227 100644
--- a/apps/files_external/appinfo/routes.php
+++ b/apps/files_external/appinfo/routes.php
@@ -44,7 +44,12 @@ namespace OCA\Files_External\AppInfo;
'url' => '/ajax/public_key.php',
'verb' => 'POST',
'requirements' => array()
- )
+ ),
+ [
+ 'name' => 'Ajax#saveGlobalCredentials',
+ 'url' => '/globalcredentials',
+ 'verb' => 'POST'
+ ]
)
)
);
diff --git a/apps/files_external/command/backends.php b/apps/files_external/command/backends.php
new file mode 100644
index 00000000000..fd11c36ec40
--- /dev/null
+++ b/apps/files_external/command/backends.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * @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/>
+ *
+ */
+
+namespace OCA\Files_External\Command;
+
+use OC\Core\Command\Base;
+use OCA\Files_External\Lib\Auth\AuthMechanism;
+use OCA\Files_External\Lib\Backend\Backend;
+use OCA\Files_External\Lib\DefinitionParameter;
+use OCA\Files_External\Service\BackendService;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Helper\TableHelper;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\Input;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Backends extends Base {
+ /** @var BackendService */
+ private $backendService;
+
+ function __construct(BackendService $backendService
+ ) {
+ parent::__construct();
+
+ $this->backendService = $backendService;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('files_external:backends')
+ ->setDescription('Show available authentication and storage backends')
+ ->addArgument(
+ 'type',
+ InputArgument::OPTIONAL,
+ 'only show backends of a certain type. Possible values are "authentication" or "storage"'
+ )->addArgument(
+ 'backend',
+ InputArgument::OPTIONAL,
+ 'only show information of a specific backend'
+ );
+ parent::configure();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $authBackends = $this->backendService->getAuthMechanisms();
+ $storageBackends = $this->backendService->getBackends();
+
+ $data = [
+ 'authentication' => array_map([$this, 'serializeAuthBackend'], $authBackends),
+ 'storage' => array_map([$this, 'serializeAuthBackend'], $storageBackends)
+ ];
+
+ $type = $input->getArgument('type');
+ $backend = $input->getArgument('backend');
+ if ($type) {
+ if (!isset($data[$type])) {
+ $output->writeln('<error>Invalid type "' . $type . '". Possible values are "authentication" or "storage"</error>');
+ return 1;
+ }
+ $data = $data[$type];
+
+ if ($backend) {
+ if (!isset($data[$backend])) {
+ $output->writeln('<error>Unknown backend "' . $backend . '" of type "' . $type . '"</error>');
+ return 1;
+ }
+ $data = $data[$backend];
+ }
+ }
+
+ $this->writeArrayInOutputFormat($input, $output, $data);
+ }
+
+ private function serializeAuthBackend(\JsonSerializable $backend) {
+ $data = $backend->jsonSerialize();
+ $result = [
+ 'name' => $data['name'],
+ 'identifier' => $data['identifier'],
+ 'configuration' => array_map(function (DefinitionParameter $parameter) {
+ return $parameter->getTypeName();
+ }, $data['configuration'])
+ ];
+ if ($backend instanceof Backend) {
+ $result['storage_class'] = $backend->getStorageClass();
+ $authBackends = $this->backendService->getAuthMechanismsByScheme(array_keys($backend->getAuthSchemes()));
+ $result['supported_authentication_backends'] = array_keys($authBackends);
+ }
+ return $result;
+ }
+}
diff --git a/apps/files_external/command/create.php b/apps/files_external/command/create.php
new file mode 100644
index 00000000000..4b0ef99ff3a
--- /dev/null
+++ b/apps/files_external/command/create.php
@@ -0,0 +1,226 @@
+<?php
+/**
+ * @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/>
+ *
+ */
+
+namespace OCA\Files_External\Command;
+
+use OC\Core\Command\Base;
+use OC\Files\Filesystem;
+use OC\User\NoUserException;
+use OCA\Files_External\Lib\Auth\AuthMechanism;
+use OCA\Files_External\Lib\Backend\Backend;
+use OCA\Files_External\Lib\DefinitionParameter;
+use OCA\Files_external\Lib\StorageConfig;
+use OCA\Files_External\Service\BackendService;
+use OCA\Files_external\Service\GlobalStoragesService;
+use OCA\Files_external\Service\ImportLegacyStoragesService;
+use OCA\Files_external\Service\UserStoragesService;
+use OCP\IUserManager;
+use OCP\IUserSession;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Helper\TableHelper;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\Input;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Create extends Base {
+ /**
+ * @var GlobalStoragesService
+ */
+ private $globalService;
+
+ /**
+ * @var UserStoragesService
+ */
+ private $userService;
+
+ /**
+ * @var IUserManager
+ */
+ private $userManager;
+
+ /** @var BackendService */
+ private $backendService;
+
+ /** @var IUserSession */
+ private $userSession;
+
+ function __construct(GlobalStoragesService $globalService,
+ UserStoragesService $userService,
+ IUserManager $userManager,
+ IUserSession $userSession,
+ BackendService $backendService
+ ) {
+ parent::__construct();
+ $this->globalService = $globalService;
+ $this->userService = $userService;
+ $this->userManager = $userManager;
+ $this->userSession = $userSession;
+ $this->backendService = $backendService;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('files_external:create')
+ ->setDescription('Create a new mount configuration')
+ ->addOption(
+ 'user',
+ null,
+ InputOption::VALUE_OPTIONAL,
+ 'user to add the mount configuration for, if not set the mount will be added as system mount'
+ )
+ ->addArgument(
+ 'mount_point',
+ InputArgument::REQUIRED,
+ 'mount point for the new mount'
+ )
+ ->addArgument(
+ 'storage_backend',
+ InputArgument::REQUIRED,
+ 'storage backend identifier for the new mount, see `occ files_external:backends` for possible values'
+ )
+ ->addArgument(
+ 'authentication_backend',
+ InputArgument::REQUIRED,
+ 'authentication backend identifier for the new mount, see `occ files_external:backends` for possible values'
+ )
+ ->addOption(
+ 'config',
+ 'c',
+ InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
+ 'Mount configuration option in key=value format'
+ )
+ ->addOption(
+ 'dry',
+ null,
+ InputOption::VALUE_NONE,
+ 'Don\'t save the created mount, only list the new mount'
+ );
+ parent::configure();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $user = $input->getOption('user');
+ $mountPoint = $input->getArgument('mount_point');
+ $storageIdentifier = $input->getArgument('storage_backend');
+ $authIdentifier = $input->getArgument('authentication_backend');
+ $configInput = $input->getOption('config');
+
+ $storageBackend = $this->backendService->getBackend($storageIdentifier);
+ $authBackend = $this->backendService->getAuthMechanism($authIdentifier);
+
+ if (!Filesystem::isValidPath($mountPoint)) {
+ $output->writeln('<error>Invalid mountpoint "' . $mountPoint . '"</error>');
+ return 1;
+ }
+ if (is_null($storageBackend)) {
+ $output->writeln('<error>Storage backend with identifier "' . $storageIdentifier . '" not found (see `occ files_external:backends` for possible values)</error>');
+ return 404;
+ }
+ if (is_null($authBackend)) {
+ $output->writeln('<error>Authentication backend with identifier "' . $authIdentifier . '" not found (see `occ files_external:backends` for possible values)</error>');
+ return 404;
+ }
+ $supportedSchemes = array_keys($storageBackend->getAuthSchemes());
+ if (!in_array($authBackend->getScheme(), $supportedSchemes)) {
+ $output->writeln('<error>Authentication backend "' . $authIdentifier . '" not valid for storage backend "' . $storageIdentifier . '" (see `occ files_external:backends storage ' . $storageIdentifier . '` for possible values)</error>');
+ return 1;
+ }
+
+ $config = [];
+ foreach ($configInput as $configOption) {
+ if (!strpos($configOption, '=')) {
+ $output->writeln('<error>Invalid mount configuration option "' . $configOption . '"</error>');
+ return 1;
+ }
+ list($key, $value) = explode('=', $configOption, 2);
+ if (!$this->validateParam($key, $value, $storageBackend, $authBackend)) {
+ $output->writeln('<error>Unknown configuration for backends "' . $key . '"</error>');
+ return 1;
+ }
+ $config[$key] = $value;
+ }
+
+ $mount = new StorageConfig();
+ $mount->setMountPoint($mountPoint);
+ $mount->setBackend($storageBackend);
+ $mount->setAuthMechanism($authBackend);
+ $mount->setBackendOptions($config);
+
+ if ($user) {
+ if (!$this->userManager->userExists($user)) {
+ $output->writeln('<error>User "' . $user . '" not found</error>');
+ return 1;
+ }
+ $mount->setApplicableUsers([$user]);
+ }
+
+ if ($input->getOption('dry')) {
+ $this->showMount($user, $mount, $input, $output);
+ } else {
+ $this->getStorageService($user)->addStorage($mount);
+ if ($input->getOption('output') === self::OUTPUT_FORMAT_PLAIN) {
+ $output->writeln('<info>Storage created with id ' . $mount->getId() . '</info>');
+ } else {
+ $output->writeln($mount->getId());
+ }
+ }
+ return 0;
+ }
+
+ private function validateParam($key, &$value, Backend $storageBackend, AuthMechanism $authBackend) {
+ $params = array_merge($storageBackend->getParameters(), $authBackend->getParameters());
+ foreach ($params as $param) {
+ /** @var DefinitionParameter $param */
+ if ($param->getName() === $key) {
+ if ($param->getType() === DefinitionParameter::VALUE_BOOLEAN) {
+ $value = ($value === 'true');
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private function showMount($user, StorageConfig $mount, InputInterface $input, OutputInterface $output) {
+ $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager);
+ $listInput = new ArrayInput([], $listCommand->getDefinition());
+ $listInput->setOption('output', $input->getOption('output'));
+ $listInput->setOption('show-password', true);
+ $listCommand->listMounts($user, [$mount], $listInput, $output);
+ }
+
+ protected function getStorageService($userId) {
+ if (!empty($userId)) {
+ $user = $this->userManager->get($userId);
+ if (is_null($user)) {
+ throw new NoUserException("user $userId not found");
+ }
+ $this->userSession->setUser($user);
+ return $this->userService;
+ } else {
+ return $this->globalService;
+ }
+ }
+}
diff --git a/apps/files_external/command/verify.php b/apps/files_external/command/verify.php
new file mode 100644
index 00000000000..f985cb401af
--- /dev/null
+++ b/apps/files_external/command/verify.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External\Command;
+
+use OC\Core\Command\Base;
+use OCA\Files_External\Lib\Auth\AuthMechanism;
+use OCA\Files_External\Lib\Backend\Backend;
+use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
+use OCA\Files_external\Lib\StorageConfig;
+use OCA\Files_external\NotFoundException;
+use OCA\Files_external\Service\GlobalStoragesService;
+use OCP\Files\StorageNotAvailableException;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\Table;
+use Symfony\Component\Console\Helper\TableHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Verify extends Base {
+ /**
+ * @var GlobalStoragesService
+ */
+ protected $globalService;
+
+ function __construct(GlobalStoragesService $globalService) {
+ parent::__construct();
+ $this->globalService = $globalService;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('files_external:verify')
+ ->setDescription('Verify mount configuration')
+ ->addArgument(
+ 'mount_id',
+ InputArgument::REQUIRED,
+ 'The id of the mount to check'
+ )->addOption(
+ 'config',
+ 'c',
+ InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
+ 'Additional config option to set before checking in key=value pairs, required for certain auth backends such as login credentails'
+ );
+ parent::configure();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $mountId = $input->getArgument('mount_id');
+ $configInput = $input->getOption('config');
+
+ try {
+ $mount = $this->globalService->getStorage($mountId);
+ } catch (NotFoundException $e) {
+ $output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts"</error>');
+ return 404;
+ }
+
+ $this->updateStorageStatus($mount, $configInput, $output);
+
+ $this->writeArrayInOutputFormat($input, $output, [
+ 'status' => StorageNotAvailableException::getStateCodeName($mount->getStatus()),
+ 'code' => $mount->getStatus(),
+ 'message' => $mount->getStatusMessage()
+ ]);
+ }
+
+ private function manipulateStorageConfig(StorageConfig $storage) {
+ /** @var AuthMechanism */
+ $authMechanism = $storage->getAuthMechanism();
+ $authMechanism->manipulateStorageConfig($storage);
+ /** @var Backend */
+ $backend = $storage->getBackend();
+ $backend->manipulateStorageConfig($storage);
+ }
+
+ private function updateStorageStatus(StorageConfig &$storage, $configInput, OutputInterface $output) {
+ try {
+ try {
+ $this->manipulateStorageConfig($storage);
+ } catch (InsufficientDataForMeaningfulAnswerException $e) {
+ if (count($configInput) === 0) { // extra config options might solve the error
+ throw $e;
+ }
+ }
+
+ foreach ($configInput as $configOption) {
+ if (!strpos($configOption, '=')) {
+ $output->writeln('<error>Invalid mount configuration option "' . $configOption . '"</error>');
+ return;
+ }
+ list($key, $value) = explode('=', $configOption, 2);
+ $storage->setBackendOption($key, $value);
+ }
+
+ /** @var Backend */
+ $backend = $storage->getBackend();
+ // update status (can be time-consuming)
+ $storage->setStatus(
+ \OC_Mount_Config::getBackendStatus(
+ $backend->getStorageClass(),
+ $storage->getBackendOptions(),
+ false
+ )
+ );
+ } catch (InsufficientDataForMeaningfulAnswerException $e) {
+ $status = $e->getCode() ? $e->getCode() : StorageNotAvailableException::STATUS_INDETERMINATE;
+ $storage->setStatus(
+ $status,
+ $e->getMessage()
+ );
+ } catch (StorageNotAvailableException $e) {
+ $storage->setStatus(
+ $e->getCode(),
+ $e->getMessage()
+ );
+ } catch (\Exception $e) {
+ // FIXME: convert storage exceptions to StorageNotAvailableException
+ $storage->setStatus(
+ StorageNotAvailableException::STATUS_ERROR,
+ get_class($e) . ': ' . $e->getMessage()
+ );
+ }
+ }
+}
diff --git a/apps/files_external/controller/ajaxcontroller.php b/apps/files_external/controller/ajaxcontroller.php
index cfccacb03ea..86c1b657c91 100644
--- a/apps/files_external/controller/ajaxcontroller.php
+++ b/apps/files_external/controller/ajaxcontroller.php
@@ -23,6 +23,7 @@
namespace OCA\Files_External\Controller;
+use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
use OCP\AppFramework\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\JSONResponse;
@@ -31,10 +32,13 @@ use OCA\Files_External\Lib\Auth\PublicKey\RSA;
class AjaxController extends Controller {
/** @var RSA */
private $rsaMechanism;
+ /** @var GlobalAuth */
+ private $globalAuth;
- public function __construct($appName, IRequest $request, RSA $rsaMechanism) {
+ public function __construct($appName, IRequest $request, RSA $rsaMechanism, GlobalAuth $globalAuth) {
parent::__construct($appName, $request);
$this->rsaMechanism = $rsaMechanism;
+ $this->globalAuth = $globalAuth;
}
private function generateSshKeys() {
@@ -61,4 +65,8 @@ class AjaxController extends Controller {
));
}
+ public function saveGlobalCredentials($uid, $user, $password) {
+ $this->globalAuth->saveAuth($uid, $user, $password);
+ return true;
+ }
}
diff --git a/apps/files_external/controller/storagescontroller.php b/apps/files_external/controller/storagescontroller.php
index db1cdeb23b9..65ceba21454 100644
--- a/apps/files_external/controller/storagescontroller.php
+++ b/apps/files_external/controller/storagescontroller.php
@@ -255,8 +255,9 @@ abstract class StoragesController extends Controller {
)
);
} catch (InsufficientDataForMeaningfulAnswerException $e) {
+ $status = $e->getCode() ? $e->getCode() : StorageNotAvailableException::STATUS_INDETERMINATE;
$storage->setStatus(
- StorageNotAvailableException::STATUS_INDETERMINATE,
+ $status,
$this->l10n->t('Insufficient data: %s', [$e->getMessage()])
);
} catch (StorageNotAvailableException $e) {
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index 26df203091e..0837555f534 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -1338,6 +1338,33 @@ $(document).ready(function() {
}
});
+ $('#global_credentials').on('submit', function() {
+ var $form = $(this);
+ var uid = $form.find('[name=uid]').val();
+ var user = $form.find('[name=username]').val();
+ var password = $form.find('[name=password]').val();
+ var $submit = $form.find('[type=submit]');
+ $submit.val(t('files_external', 'Saving...'));
+ $.ajax({
+ type: 'POST',
+ contentType: 'application/json',
+ data: JSON.stringify({
+ uid: uid,
+ user: user,
+ password: password
+ }),
+ url: OC.generateUrl('apps/files_external/globalcredentials'),
+ dataType: 'json',
+ success: function() {
+ $submit.val(t('files_external', 'Saved'));
+ setTimeout(function(){
+ $submit.val(t('files_external', 'Save'));
+ }, 2500);
+ }
+ });
+ return false;
+ });
+
// global instance
OCA.External.Settings.mountConfig = mountConfigListView;
diff --git a/apps/files_external/js/statusmanager.js b/apps/files_external/js/statusmanager.js
index 27635d2f1df..33d2ea104be 100644
--- a/apps/files_external/js/statusmanager.js
+++ b/apps/files_external/js/statusmanager.js
@@ -22,15 +22,15 @@ if (!OCA.External.StatusManager) {
OCA.External.StatusManager = {
- mountStatus : null,
- mountPointList : null,
+ mountStatus: null,
+ mountPointList: null,
/**
* Function
* @param {callback} afterCallback
*/
- getMountStatus : function(afterCallback) {
+ getMountStatus: function (afterCallback) {
var self = this;
if (typeof afterCallback !== 'function' || self.isGetMountStatusRunning) {
return;
@@ -46,9 +46,9 @@ OCA.External.StatusManager = {
* @param {string} mount_point
*/
- getMountPointListElement : function(mount_point) {
+ getMountPointListElement: function (mount_point) {
var element;
- $.each(this.mountPointList, function(key, value){
+ $.each(this.mountPointList, function (key, value) {
if (value.mount_point === mount_point) {
element = value;
return false;
@@ -63,7 +63,7 @@ OCA.External.StatusManager = {
* @param {string} mount_point
*/
- getMountStatusForMount : function(mountData, afterCallback) {
+ getMountStatusForMount: function (mountData, afterCallback) {
var self = this;
if (typeof afterCallback !== 'function' || self.isGetMountStatusRunning) {
return $.Deferred().resolve();
@@ -72,41 +72,46 @@ OCA.External.StatusManager = {
var defObj;
if (self.mountStatus[mountData.mount_point]) {
defObj = $.Deferred();
- afterCallback(mountData, self.mountStatus[mountData.mount_point]);
+ afterCallback(mountData, self.mountStatus[mountData.mount_point]);
defObj.resolve(); // not really useful, but it'll keep the same behaviour
} else {
defObj = $.ajax({
- type : 'GET',
+ type: 'GET',
url: OC.webroot + '/index.php/apps/files_external/' + ((mountData.type === 'personal') ? 'userstorages' : 'userglobalstorages') + '/' + mountData.id,
- success : function(response) {
+ success: function (response) {
if (response && response.status === 0) {
self.mountStatus[mountData.mount_point] = response;
} else {
- if (response && response.statusMessage) {
- // failure response with error message
- self.mountStatus[mountData.mount_point] = { type: mountData.type,
- status: 1,
- error: response.statusMessage};
- } else {
- self.mountStatus[mountData.mount_point] = { type: mountData.type,
- status: 1,
- error: t('files_external', 'Empty response from the server')};
- }
+ var statusCode = response.status ? response.status : 1;
+ var statusMessage = response.statusMessage ? response.statusMessage : t('files_external', 'Empty response from the server')
+ // failure response with error message
+ self.mountStatus[mountData.mount_point] = {
+ type: mountData.type,
+ status: statusCode,
+ id: mountData.id,
+ error: statusMessage,
+ userProvided: response.userProvided
+ };
}
afterCallback(mountData, self.mountStatus[mountData.mount_point]);
},
- error : function(jqxhr, state, error) {
+ error: function (jqxhr, state, error) {
var message;
- if(mountData.location === 3){
+ if (mountData.location === 3) {
// In this case the error is because mount point use Login credentials and don't exist in the session
message = t('files_external', 'Couldn\'t access. Please logout and login to activate this mount point');
} else {
- message = t('files_external', 'Couldn\'t get the information from the ownCloud server: {code} {type}', {code: jqxhr.status, type: error});
+ message = t('files_external', 'Couldn\'t get the information from the ownCloud server: {code} {type}', {
+ code: jqxhr.status,
+ type: error
+ });
}
- self.mountStatus[mountData.mount_point] = { type: mountData.type,
- status: 1,
- location: mountData.location,
- error: message};
+ self.mountStatus[mountData.mount_point] = {
+ type: mountData.type,
+ status: 1,
+ location: mountData.location,
+ error: message
+ };
afterCallback(mountData, self.mountStatus[mountData.mount_point]);
}
});
@@ -119,7 +124,7 @@ OCA.External.StatusManager = {
* @param {function} afterCallback function to be executed
*/
- getMountPointList : function(afterCallback) {
+ getMountPointList: function (afterCallback) {
var self = this;
if (typeof afterCallback !== 'function' || self.isGetMountPointListRunning) {
return;
@@ -130,11 +135,11 @@ OCA.External.StatusManager = {
} else {
self.isGetMountPointListRunning = true;
$.ajax({
- type : 'GET',
- url : OC.linkToOCS('apps/files_external/api/v1') + 'mounts?format=json',
- success : function(response) {
+ type: 'GET',
+ url: OC.linkToOCS('apps/files_external/api/v1') + 'mounts?format=json',
+ success: function (response) {
self.mountPointList = [];
- _.each(response.ocs.data, function(mount){
+ _.each(response.ocs.data, function (mount) {
var element = {};
element.mount_point = mount.name;
element.type = mount.scope;
@@ -147,11 +152,11 @@ OCA.External.StatusManager = {
});
afterCallback(self.mountPointList);
},
- error : function(jqxhr, state, error) {
+ error: function (jqxhr, state, error) {
self.mountPointList = [];
- OC.Notification.showTemporary(t('files_external', 'Couldn\'t get the list of external mount points: {type}', {type : error}));
+ OC.Notification.showTemporary(t('files_external', 'Couldn\'t get the list of external mount points: {type}', {type: error}));
},
- complete : function() {
+ complete: function () {
self.isGetMountPointListRunning = false;
}
});
@@ -163,21 +168,25 @@ OCA.External.StatusManager = {
* @param {string} name MountPoint Name
*/
- manageMountPointError : function(name) {
- var self = this;
- this.getMountStatus($.proxy(function(allMountStatus) {
- if (typeof allMountStatus[name] !== 'undefined' || allMountStatus[name].status === 1) {
+ manageMountPointError: function (name) {
+ this.getMountStatus($.proxy(function (allMountStatus) {
+ if (allMountStatus.hasOwnProperty(name) && allMountStatus[name].status > 0 && allMountStatus[name].status < 7) {
var mountData = allMountStatus[name];
if (mountData.type === "system") {
- OC.dialogs.confirm(t('files_external', 'There was an error with message: ') + mountData.error + '. Do you want to review mount point config in admin settings page?', t('files_external', 'External mount error'), function(e){
- if(e === true) {
- window.location.href = OC.generateUrl('/settings/admin#files_external');
- }
- });
+ if (mountData.userProvided) {
+ // personal mount whit credentials problems
+ this.showCredentialsDialog(name, mountData);
+ } else {
+ OC.dialogs.confirm(t('files_external', 'There was an error with message: ') + mountData.error + '. Do you want to review mount point config in admin settings page?', t('files_external', 'External mount error'), function (e) {
+ if (e === true) {
+ OC.redirect(OC.generateUrl('/settings/admin#files_external'));
+ }
+ });
+ }
} else {
- OC.dialogs.confirm(t('files_external', 'There was an error with message: ') + mountData.error + '. Do you want to review mount point config in personal settings page?', t('files_external', 'External mount error'), function(e){
- if(e === true) {
- window.location.href = OC.generateUrl('/settings/personal#external-storage');
+ OC.dialogs.confirm(t('files_external', 'There was an error with message: ') + mountData.error + '. Do you want to review mount point config in personal settings page?', t('files_external', 'External mount error'), function (e) {
+ if (e === true) {
+ OC.redirect(OC.generateUrl('/settings/personal#' + t('files_external', 'external-storage')));
}
});
}
@@ -191,13 +200,13 @@ OCA.External.StatusManager = {
* @param {object} mountStatus
*/
- processMountStatusIndividual : function(mountData, mountStatus) {
+ processMountStatusIndividual: function (mountData, mountStatus) {
var mountPoint = mountData.mount_point;
- if (mountStatus.status === 1) {
+ if (mountStatus.status > 0) {
var trElement = FileList.findFileEl(OCA.External.StatusManager.Utils.jqSelEscape(mountPoint));
- route = OCA.External.StatusManager.Utils.getIconRoute(trElement) + '-error';
+ var route = OCA.External.StatusManager.Utils.getIconRoute(trElement) + '-error';
if (OCA.External.StatusManager.Utils.isCorrectViewAndRootFolder()) {
OCA.External.StatusManager.Utils.showIconError(mountPoint, $.proxy(OCA.External.StatusManager.manageMountPointError, OCA.External.StatusManager), route);
@@ -218,9 +227,9 @@ OCA.External.StatusManager = {
* @param {object} mountStatus
*/
- processMountList : function(mountList) {
+ processMountList: function (mountList) {
var elementList = null;
- $.each(mountList, function(name, value){
+ $.each(mountList, function (name, value) {
var trElement = $('#fileList tr[data-file=\"' + OCA.External.StatusManager.Utils.jqSelEscape(value.mount_point) + '\"]'); //FileList.findFileEl(OCA.External.StatusManager.Utils.jqSelEscape(value.mount_point));
trElement.attr('data-external-backend', value.backend);
if (elementList) {
@@ -247,9 +256,9 @@ OCA.External.StatusManager = {
* Function to process the whole mount point list in relation with their status (Async queue)
*/
- launchFullConnectivityCheckOneByOne : function() {
+ launchFullConnectivityCheckOneByOne: function () {
var self = this;
- this.getMountPointList(function(list){
+ this.getMountPointList(function (list) {
// check if we have a list first
if (list === undefined && !self.emptyWarningShown) {
self.emptyWarningShown = true;
@@ -264,17 +273,19 @@ OCA.External.StatusManager = {
}
var ajaxQueue = [];
- $.each(list, function(key, value){
- var queueElement = {funcName: $.proxy(self.getMountStatusForMount, self),
- funcArgs: [value,
- $.proxy(self.processMountStatusIndividual, self)]};
+ $.each(list, function (key, value) {
+ var queueElement = {
+ funcName: $.proxy(self.getMountStatusForMount, self),
+ funcArgs: [value,
+ $.proxy(self.processMountStatusIndividual, self)]
+ };
ajaxQueue.push(queueElement);
});
- var rolQueue = new OCA.External.StatusManager.RollingQueue(ajaxQueue, 4, function(){
+ var rolQueue = new OCA.External.StatusManager.RollingQueue(ajaxQueue, 4, function () {
if (!self.notificationHasShown) {
var showNotification = false;
- $.each(self.mountStatus, function(key, value){
+ $.each(self.mountStatus, function (key, value) {
if (value.status === 1) {
self.notificationHasShown = true;
showNotification = true;
@@ -297,20 +308,22 @@ OCA.External.StatusManager = {
* @param {boolean} recheck delete cached info and force api call to check mount point status
*/
- launchPartialConnectivityCheck : function(mountListData, recheck) {
+ launchPartialConnectivityCheck: function (mountListData, recheck) {
if (mountListData.length === 0) {
return;
}
var self = this;
var ajaxQueue = [];
- $.each(mountListData, function(key, value){
+ $.each(mountListData, function (key, value) {
if (recheck && value.mount_point in self.mountStatus) {
delete self.mountStatus[value.mount_point];
}
- var queueElement = {funcName: $.proxy(self.getMountStatusForMount, self),
- funcArgs: [value,
- $.proxy(self.processMountStatusIndividual, self)]};
+ var queueElement = {
+ funcName: $.proxy(self.getMountStatusForMount, self),
+ funcArgs: [value,
+ $.proxy(self.processMountStatusIndividual, self)]
+ };
ajaxQueue.push(queueElement);
});
new OCA.External.StatusManager.RollingQueue(ajaxQueue, 4).runQueue();
@@ -323,21 +336,19 @@ OCA.External.StatusManager = {
* @param {boolean} recheck delete cached info and force api call to check mount point status
*/
- recheckConnectivityForMount : function(mountListNames, recheck) {
+ recheckConnectivityForMount: function (mountListNames, recheck) {
if (mountListNames.length === 0) {
return;
}
var self = this;
var mountListData = [];
- var recheckPersonalGlobal = false;
- var recheckAdminGlobal = false;
if (!self.mountStatus) {
self.mountStatus = {};
}
- $.each(mountListNames, function(key, value){
+ $.each(mountListNames, function (key, value) {
var mountData = self.getMountPointListElement(value);
if (mountData) {
mountListData.push(mountData);
@@ -346,7 +357,7 @@ OCA.External.StatusManager = {
// for all mounts in the list, delete the cached status values
if (recheck) {
- $.each(mountListData, function(key, value){
+ $.each(mountListData, function (key, value) {
if (value.mount_point in self.mountStatus) {
delete self.mountStatus[value.mount_point];
}
@@ -355,12 +366,96 @@ OCA.External.StatusManager = {
self.processMountList(mountListData);
self.launchPartialConnectivityCheck(mountListData, recheck);
+ },
+
+ credentialsDialogTemplate:
+ '<div id="files_external_div_form"><div>' +
+ '<div>{{credentials_text}}</div>' +
+ '<form>' +
+ '<input type="text" name="username" placeholder="{{placeholder_username}}"/>' +
+ '<input type="password" name="password" placeholder="{{placeholder_password}}"/>' +
+ '</form>' +
+ '</div></div>',
+
+ /**
+ * Function to display custom dialog to enter credentials
+ * @param mountPoint
+ * @param mountData
+ */
+ showCredentialsDialog: function (mountPoint, mountData) {
+ var template = Handlebars.compile(OCA.External.StatusManager.credentialsDialogTemplate);
+ var dialog = $(template({
+ credentials_text: t('files_external', 'Please enter the credentials for the {mount} mount', {
+ 'mount': mountPoint
+ }),
+ placeholder_username: t('files_external', 'Username'),
+ placeholder_password: t('files_external', 'Password')
+ }));
+
+ $('body').append(dialog);
+
+ var apply = function () {
+ var username = dialog.find('[name=username]').val();
+ var password = dialog.find('[name=password]').val();
+ var endpoint = OC.generateUrl('apps/files_external/userglobalstorages/{id}', {
+ id: mountData.id
+ });
+ $('.oc-dialog-close').hide();
+ $.ajax({
+ type: 'PUT',
+ url: endpoint,
+ data: {
+ backendOptions: {
+ user: username,
+ password: password
+ }
+ },
+ success: function (data) {
+ OC.Notification.showTemporary(t('files_external', 'Credentials saved'));
+ dialog.ocdialog('close');
+ /* Trigger status check again */
+ OCA.External.StatusManager.recheckConnectivityForMount([OC.basename(data.mountPoint)], true);
+ },
+ error: function () {
+ $('.oc-dialog-close').show();
+ OC.Notification.showTemporary(t('files_external', 'Credentials saving failed'));
+ }
+ });
+ return false;
+ };
+
+ var ocdialogParams = {
+ modal: true,
+ title: t('files_external', 'Credentials required'),
+ buttons: [{
+ text: t('files_external', 'Save'),
+ click: apply,
+ closeOnEscape: true
+ }],
+ closeOnExcape: true
+ };
+
+ dialog.ocdialog(ocdialogParams)
+ .bind('ocdialogclose', function () {
+ dialog.ocdialog('destroy').remove();
+ });
+
+ dialog.find('form').on('submit', apply);
+ dialog.find('form input:first').focus();
+ dialog.find('form input').keyup(function (e) {
+ if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
+ $(e.target).closest('form').submit();
+ return false;
+ } else {
+ return true;
+ }
+ });
}
};
OCA.External.StatusManager.Utils = {
- showIconError: function(folder, clickAction, errorImageUrl) {
+ showIconError: function (folder, clickAction, errorImageUrl) {
var imageUrl = "url(" + errorImageUrl + ")";
var trFolder = $('#fileList tr[data-file=\"' + OCA.External.StatusManager.Utils.jqSelEscape(folder) + '\"]'); //FileList.findFileEl(OCA.External.StatusManager.Utils.jqSelEscape(folder));
this.changeFolderIcon(folder, imageUrl);
@@ -371,14 +466,14 @@ OCA.External.StatusManager.Utils = {
/**
* @param folder string with the folder or jQuery element pointing to the tr element
*/
- storeDefaultFolderIconAndBgcolor: function(folder) {
+ storeDefaultFolderIconAndBgcolor: function (folder) {
var trFolder;
if (folder instanceof $) {
trFolder = folder;
} else {
trFolder = $('#fileList tr[data-file=\"' + OCA.External.StatusManager.Utils.jqSelEscape(folder) + '\"]'); //FileList.findFileEl(OCA.External.StatusManager.Utils.jqSelEscape(folder)); //$('#fileList tr[data-file=\"' + OCA.External.StatusManager.Utils.jqSelEscape(folder) + '\"]');
}
- trFolder.each(function(){
+ trFolder.each(function () {
var thisElement = $(this);
if (thisElement.data('oldbgcolor') === undefined) {
thisElement.data('oldbgcolor', thisElement.css('background-color'));
@@ -386,7 +481,7 @@ OCA.External.StatusManager.Utils = {
});
var icon = trFolder.find('td:first-child div.thumbnail');
- icon.each(function(){
+ icon.each(function () {
var thisElement = $(this);
if (thisElement.data('oldImage') === undefined) {
thisElement.data('oldImage', thisElement.css('background-image'));
@@ -397,7 +492,7 @@ OCA.External.StatusManager.Utils = {
/**
* @param folder string with the folder or jQuery element pointing to the tr element
*/
- restoreFolder: function(folder) {
+ restoreFolder: function (folder) {
var trFolder;
if (folder instanceof $) {
trFolder = folder;
@@ -407,7 +502,7 @@ OCA.External.StatusManager.Utils = {
}
trFolder.removeClass('externalErroredRow').removeClass('externalDisabledRow');
tdChilds = trFolder.find("td:first-child div.thumbnail");
- tdChilds.each(function(){
+ tdChilds.each(function () {
var thisElement = $(this);
thisElement.css('background-image', thisElement.data('oldImage'));
});
@@ -417,12 +512,12 @@ OCA.External.StatusManager.Utils = {
* @param folder string with the folder or jQuery element pointing to the first td element
* of the tr matching the folder name
*/
- changeFolderIcon: function(filename) {
+ changeFolderIcon: function (filename) {
var file;
var route;
if (filename instanceof $) {
//trElementList
- $.each(filename, function(index){
+ $.each(filename, function (index) {
route = OCA.External.StatusManager.Utils.getIconRoute($(this));
$(this).attr("data-icon", route);
$(this).find('td:first-child div.thumbnail').css('background-image', "url(" + route + ")").css('display', 'none').css('display', 'inline');
@@ -440,7 +535,7 @@ OCA.External.StatusManager.Utils = {
* @param backend string with the name of the external storage backend
* of the tr matching the folder name
*/
- getIconRoute: function(tr) {
+ getIconRoute: function (tr) {
var icon = OC.imagePath('core', 'filetypes/folder-external');
var backend = null;
@@ -460,7 +555,7 @@ OCA.External.StatusManager.Utils = {
return icon;
},
- toggleLink: function(filename, active, action) {
+ toggleLink: function (filename, active, action) {
var link;
if (filename instanceof $) {
link = filename;
@@ -473,7 +568,7 @@ OCA.External.StatusManager.Utils = {
} else {
link.find('.fileactions, .nametext .action').remove(); // from files/js/fileactions (display)
link.off('click.connectivity');
- link.on('click.connectivity', function(e){
+ link.on('click.connectivity', function (e) {
if (action && $.isFunction(action)) {
action(filename);
}
@@ -483,7 +578,7 @@ OCA.External.StatusManager.Utils = {
}
},
- isCorrectViewAndRootFolder: function() {
+ isCorrectViewAndRootFolder: function () {
// correct views = files & extstoragemounts
if (OCA.Files.App.getActiveView() === 'files' || OCA.Files.App.getActiveView() === 'extstoragemounts') {
return OCA.Files.App.getCurrentAppContainer().find('#dir').val() === '/';
@@ -492,15 +587,15 @@ OCA.External.StatusManager.Utils = {
},
/* escape a selector expression for jQuery */
- jqSelEscape: function(expression) {
- if(expression){
+ jqSelEscape: function (expression) {
+ if (expression) {
return expression.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
}
return null;
},
/* Copied from http://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key */
- checkNested: function(cobj /*, level1, level2, ... levelN*/) {
+ checkNested: function (cobj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments),
obj = args.shift();
diff --git a/apps/files_external/l10n/af_ZA.js b/apps/files_external/l10n/af_ZA.js
index d28e14d67ce..25117ae0ea7 100644
--- a/apps/files_external/l10n/af_ZA.js
+++ b/apps/files_external/l10n/af_ZA.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_external",
{
"Personal" : "Persoonlik",
+ "Saving..." : "Stoor...",
"Username" : "Gebruikersnaam",
"Password" : "Wagwoord",
"Share" : "Deel"
diff --git a/apps/files_external/l10n/af_ZA.json b/apps/files_external/l10n/af_ZA.json
index 53622f796ff..f55ea5fd515 100644
--- a/apps/files_external/l10n/af_ZA.json
+++ b/apps/files_external/l10n/af_ZA.json
@@ -1,5 +1,6 @@
{ "translations": {
"Personal" : "Persoonlik",
+ "Saving..." : "Stoor...",
"Username" : "Gebruikersnaam",
"Password" : "Wagwoord",
"Share" : "Deel"
diff --git a/apps/files_external/l10n/ar.js b/apps/files_external/l10n/ar.js
index 3e7438796f4..5317a463fd5 100644
--- a/apps/files_external/l10n/ar.js
+++ b/apps/files_external/l10n/ar.js
@@ -5,11 +5,13 @@ OC.L10N.register(
"System" : "النظام",
"Never" : "أبدا",
"Saved" : "حفظ",
+ "Saving..." : "جاري الحفظ...",
+ "Save" : "حفظ",
+ "Username" : "إسم المستخدم",
+ "Password" : "كلمة السر",
"None" : "لا شيء",
"App key" : "مفتاح التطبيق",
"App secret" : "التطبيق السري",
- "Username" : "إسم المستخدم",
- "Password" : "كلمة السر",
"Bucket" : "الحزمة",
"Hostname" : "إسم الإستضافة",
"Port" : "المنفذ",
diff --git a/apps/files_external/l10n/ar.json b/apps/files_external/l10n/ar.json
index 29423a07906..35573c98be5 100644
--- a/apps/files_external/l10n/ar.json
+++ b/apps/files_external/l10n/ar.json
@@ -3,11 +3,13 @@
"System" : "النظام",
"Never" : "أبدا",
"Saved" : "حفظ",
+ "Saving..." : "جاري الحفظ...",
+ "Save" : "حفظ",
+ "Username" : "إسم المستخدم",
+ "Password" : "كلمة السر",
"None" : "لا شيء",
"App key" : "مفتاح التطبيق",
"App secret" : "التطبيق السري",
- "Username" : "إسم المستخدم",
- "Password" : "كلمة السر",
"Bucket" : "الحزمة",
"Hostname" : "إسم الإستضافة",
"Port" : "المنفذ",
diff --git a/apps/files_external/l10n/ast.js b/apps/files_external/l10n/ast.js
index f67309631e8..e39088432a3 100644
--- a/apps/files_external/l10n/ast.js
+++ b/apps/files_external/l10n/ast.js
@@ -11,13 +11,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Tolos usuarios. Escribe pa seleccionar usuariu o grupu.",
"(group)" : "(grupu)",
"Saved" : "Guardáu",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
+ "Username" : "Nome d'usuariu",
+ "Password" : "Contraseña",
"None" : "Dengún",
"App key" : "App principal",
"App secret" : "App secreta",
"Client ID" : "ID de veceru",
"Client secret" : "Veceru secretu",
- "Username" : "Nome d'usuariu",
- "Password" : "Contraseña",
"API key" : "clave API",
"Public key" : "Clave pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/ast.json b/apps/files_external/l10n/ast.json
index b4bc4355bc4..66b7beff665 100644
--- a/apps/files_external/l10n/ast.json
+++ b/apps/files_external/l10n/ast.json
@@ -9,13 +9,15 @@
"All users. Type to select user or group." : "Tolos usuarios. Escribe pa seleccionar usuariu o grupu.",
"(group)" : "(grupu)",
"Saved" : "Guardáu",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
+ "Username" : "Nome d'usuariu",
+ "Password" : "Contraseña",
"None" : "Dengún",
"App key" : "App principal",
"App secret" : "App secreta",
"Client ID" : "ID de veceru",
"Client secret" : "Veceru secretu",
- "Username" : "Nome d'usuariu",
- "Password" : "Contraseña",
"API key" : "clave API",
"Public key" : "Clave pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/az.js b/apps/files_external/l10n/az.js
index 42c9a496185..409d5e52425 100644
--- a/apps/files_external/l10n/az.js
+++ b/apps/files_external/l10n/az.js
@@ -16,13 +16,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Sistem istifadəçiləri. Daxil edin ki, istifadəçi və ya qrupu seçəsiniz.",
"(group)" : "(qrup)",
"Saved" : "Saxlanıldı",
+ "Saving..." : "Saxlama...",
+ "Save" : "Saxla",
+ "Username" : "İstifadəçi adı",
+ "Password" : "Şifrə",
"None" : "Heç bir",
"App key" : "Proqram açarı",
"App secret" : "Proqram sirri",
"Client ID" : "Müştəri İD-s",
"Client secret" : "Müxtəri sirri",
- "Username" : "İstifadəçi adı",
- "Password" : "Şifrə",
"Public key" : "İctimai açar",
"Amazon S3" : "Amazon S3",
"Bucket" : "Vedrə",
diff --git a/apps/files_external/l10n/az.json b/apps/files_external/l10n/az.json
index 4e01cdf954c..cb8e6bdbfd8 100644
--- a/apps/files_external/l10n/az.json
+++ b/apps/files_external/l10n/az.json
@@ -14,13 +14,15 @@
"All users. Type to select user or group." : "Sistem istifadəçiləri. Daxil edin ki, istifadəçi və ya qrupu seçəsiniz.",
"(group)" : "(qrup)",
"Saved" : "Saxlanıldı",
+ "Saving..." : "Saxlama...",
+ "Save" : "Saxla",
+ "Username" : "İstifadəçi adı",
+ "Password" : "Şifrə",
"None" : "Heç bir",
"App key" : "Proqram açarı",
"App secret" : "Proqram sirri",
"Client ID" : "Müştəri İD-s",
"Client secret" : "Müxtəri sirri",
- "Username" : "İstifadəçi adı",
- "Password" : "Şifrə",
"Public key" : "İctimai açar",
"Amazon S3" : "Amazon S3",
"Bucket" : "Vedrə",
diff --git a/apps/files_external/l10n/bg_BG.js b/apps/files_external/l10n/bg_BG.js
index cc52682f956..c3c608449f4 100644
--- a/apps/files_external/l10n/bg_BG.js
+++ b/apps/files_external/l10n/bg_BG.js
@@ -15,13 +15,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Всички потребители. Пиши, за да избереш потребител или група.",
"(group)" : "(група)",
"Saved" : "Запазено",
+ "Saving..." : "Запазване...",
+ "Save" : "Запазване",
+ "Username" : "Потребителско Име",
+ "Password" : "Парола",
"None" : "Няма",
"App key" : "App key",
"App secret" : "App secret",
"Client ID" : "Client ID",
"Client secret" : "Client secret",
- "Username" : "Потребителско Име",
- "Password" : "Парола",
"API key" : "API ключ",
"Public key" : "Публичен ключ",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/bg_BG.json b/apps/files_external/l10n/bg_BG.json
index df3fe1c20e8..d2495ea1e90 100644
--- a/apps/files_external/l10n/bg_BG.json
+++ b/apps/files_external/l10n/bg_BG.json
@@ -13,13 +13,15 @@
"All users. Type to select user or group." : "Всички потребители. Пиши, за да избереш потребител или група.",
"(group)" : "(група)",
"Saved" : "Запазено",
+ "Saving..." : "Запазване...",
+ "Save" : "Запазване",
+ "Username" : "Потребителско Име",
+ "Password" : "Парола",
"None" : "Няма",
"App key" : "App key",
"App secret" : "App secret",
"Client ID" : "Client ID",
"Client secret" : "Client secret",
- "Username" : "Потребителско Име",
- "Password" : "Парола",
"API key" : "API ключ",
"Public key" : "Публичен ключ",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/bn_BD.js b/apps/files_external/l10n/bn_BD.js
index 32d40f3fb8a..6236acedb4d 100644
--- a/apps/files_external/l10n/bn_BD.js
+++ b/apps/files_external/l10n/bn_BD.js
@@ -8,12 +8,14 @@ OC.L10N.register(
"Access granted" : "অধিগমনের অনুমতি প্রদান করা হলো",
"(group)" : "(গোষ্ঠি)",
"Saved" : "সংরক্ষণ করা হলো",
+ "Saving..." : "সংরক্ষণ করা হচ্ছে..",
+ "Save" : "সংরক্ষণ",
+ "Username" : "ব্যবহারকারী",
+ "Password" : "কূটশব্দ",
"None" : "কোনটিই নয়",
"App key" : "অ্যাপ কি",
"App secret" : "অ্যাপ সিক্রেট",
"Client ID" : "ক্লায়েন্ট পরিচিতি",
- "Username" : "ব্যবহারকারী",
- "Password" : "কূটশব্দ",
"Amazon S3" : "আমাজন S3",
"Bucket" : "বালতি",
"Hostname" : "হোস্টনেম",
diff --git a/apps/files_external/l10n/bn_BD.json b/apps/files_external/l10n/bn_BD.json
index 3a2d8d4f2af..0ffdadc6c00 100644
--- a/apps/files_external/l10n/bn_BD.json
+++ b/apps/files_external/l10n/bn_BD.json
@@ -6,12 +6,14 @@
"Access granted" : "অধিগমনের অনুমতি প্রদান করা হলো",
"(group)" : "(গোষ্ঠি)",
"Saved" : "সংরক্ষণ করা হলো",
+ "Saving..." : "সংরক্ষণ করা হচ্ছে..",
+ "Save" : "সংরক্ষণ",
+ "Username" : "ব্যবহারকারী",
+ "Password" : "কূটশব্দ",
"None" : "কোনটিই নয়",
"App key" : "অ্যাপ কি",
"App secret" : "অ্যাপ সিক্রেট",
"Client ID" : "ক্লায়েন্ট পরিচিতি",
- "Username" : "ব্যবহারকারী",
- "Password" : "কূটশব্দ",
"Amazon S3" : "আমাজন S3",
"Bucket" : "বালতি",
"Hostname" : "হোস্টনেম",
diff --git a/apps/files_external/l10n/bn_IN.js b/apps/files_external/l10n/bn_IN.js
index 31f903204aa..68b491e3ff5 100644
--- a/apps/files_external/l10n/bn_IN.js
+++ b/apps/files_external/l10n/bn_IN.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"files_external",
{
"Saved" : "সংরক্ষিত",
+ "Saving..." : "সংরক্ষণ করা হচ্ছে ...",
+ "Save" : "সেভ",
"Username" : "ইউজারনেম",
"URL" : "URL",
"Host" : "হোস্ট",
diff --git a/apps/files_external/l10n/bn_IN.json b/apps/files_external/l10n/bn_IN.json
index be89b6f43ea..c34e1711140 100644
--- a/apps/files_external/l10n/bn_IN.json
+++ b/apps/files_external/l10n/bn_IN.json
@@ -1,5 +1,7 @@
{ "translations": {
"Saved" : "সংরক্ষিত",
+ "Saving..." : "সংরক্ষণ করা হচ্ছে ...",
+ "Save" : "সেভ",
"Username" : "ইউজারনেম",
"URL" : "URL",
"Host" : "হোস্ট",
diff --git a/apps/files_external/l10n/bs.js b/apps/files_external/l10n/bs.js
index 2cd3cf47509..26ad4915e96 100644
--- a/apps/files_external/l10n/bs.js
+++ b/apps/files_external/l10n/bs.js
@@ -3,9 +3,11 @@ OC.L10N.register(
{
"Personal" : "Osobno",
"Saved" : "Spremljeno",
- "None" : "Ništa",
+ "Saving..." : "Spremanje...",
+ "Save" : "Spremi",
"Username" : "Korisničko ime",
"Password" : "Lozinka",
+ "None" : "Ništa",
"Port" : "Priključak",
"WebDAV" : "WebDAV",
"Local" : "Lokalno",
diff --git a/apps/files_external/l10n/bs.json b/apps/files_external/l10n/bs.json
index e2d76555f08..94edcb1ea59 100644
--- a/apps/files_external/l10n/bs.json
+++ b/apps/files_external/l10n/bs.json
@@ -1,9 +1,11 @@
{ "translations": {
"Personal" : "Osobno",
"Saved" : "Spremljeno",
- "None" : "Ništa",
+ "Saving..." : "Spremanje...",
+ "Save" : "Spremi",
"Username" : "Korisničko ime",
"Password" : "Lozinka",
+ "None" : "Ništa",
"Port" : "Priključak",
"WebDAV" : "WebDAV",
"Local" : "Lokalno",
diff --git a/apps/files_external/l10n/ca.js b/apps/files_external/l10n/ca.js
index ff11ac0228b..72f8bb62c9b 100644
--- a/apps/files_external/l10n/ca.js
+++ b/apps/files_external/l10n/ca.js
@@ -21,13 +21,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Tots els usuaris. Escriu per seleccionar un usuari o grup.",
"(group)" : "(grup)",
"Saved" : "Desat",
+ "Saving..." : "Desant...",
+ "Save" : "Desa",
+ "Username" : "Nom d'usuari",
+ "Password" : "Contrasenya",
"None" : "Cap",
"App key" : "Clau de l'aplicació",
"App secret" : "Secret de l'aplicació",
"Client ID" : "Client ID",
"Client secret" : "Secret del client",
- "Username" : "Nom d'usuari",
- "Password" : "Contrasenya",
"API key" : "codi API",
"Public key" : "Clau pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/ca.json b/apps/files_external/l10n/ca.json
index a64721a4bf5..647d2ea27b8 100644
--- a/apps/files_external/l10n/ca.json
+++ b/apps/files_external/l10n/ca.json
@@ -19,13 +19,15 @@
"All users. Type to select user or group." : "Tots els usuaris. Escriu per seleccionar un usuari o grup.",
"(group)" : "(grup)",
"Saved" : "Desat",
+ "Saving..." : "Desant...",
+ "Save" : "Desa",
+ "Username" : "Nom d'usuari",
+ "Password" : "Contrasenya",
"None" : "Cap",
"App key" : "Clau de l'aplicació",
"App secret" : "Secret de l'aplicació",
"Client ID" : "Client ID",
"Client secret" : "Secret del client",
- "Username" : "Nom d'usuari",
- "Password" : "Contrasenya",
"API key" : "codi API",
"Public key" : "Clau pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js
index 56a8147fd99..73c1e1df66f 100644
--- a/apps/files_external/l10n/cs_CZ.js
+++ b/apps/files_external/l10n/cs_CZ.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "Chyba při vytváření páru klíčů",
"Enable encryption" : "Povolit šifrování",
"Enable previews" : "Povolit náhledy",
+ "Enable sharing" : "Povolit sdílení",
"Check for changes" : "Zkontrolovat změny",
"Never" : "Nikdy",
"Once every direct access" : "Jednou pro každý přímý přístup",
@@ -36,6 +37,8 @@ OC.L10N.register(
"(group)" : "(skupina)",
"Admin defined" : "Nastaveno administrátorem",
"Saved" : "Uloženo",
+ "Saving..." : "Ukládám...",
+ "Save" : "Uložit",
"Empty response from the server" : "Prázdná odpověď serveru",
"Couldn't access. Please logout and login to activate this mount point" : "Nelze připojit. Pro aktivaci tohoto přípojného bodu se prosím odhlašte a znovu přihlašte",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Nelze obdržet informaci z ownCloud serveru: {code} {type}",
@@ -44,6 +47,12 @@ OC.L10N.register(
"External mount error" : "Chyba vzdáleného úložiště",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Nelze obdržet seznam síťových úložišť systému Windows: prázdná odpověď serveru",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Některá z nastavených vzdálených úložišť nejsou připojena. Pro více informací prosím klikněte na červenou šipku(y)",
+ "Please enter the credentials for the {mount} mount" : "Zadejte prosím přihlašovací údaje k přípojnému bodu {mount}",
+ "Username" : "Uživatelské jméno",
+ "Password" : "Heslo",
+ "Credentials saved" : "Přihlašovací údaje uloženy",
+ "Credentials saving failed" : "Uložení přihlašovacích údajů selhalo",
+ "Credentials required" : "Vyžadovány přihlašovací údaje",
"Access key" : "Přístupový klíč",
"Secret key" : "Tajný klíč",
"Builtin" : "Zabudované",
@@ -55,13 +64,15 @@ OC.L10N.register(
"Client ID" : "Klientské ID",
"Client secret" : "Klientské tajemství",
"OpenStack" : "OpenStack",
- "Username" : "Uživatelské jméno",
- "Password" : "Heslo",
"Tenant name" : "Jméno vlastníka",
"Identity endpoint URL" : "Identifikační koncový bod URL",
"Rackspace" : "Rackspace",
"API key" : "Klíč API",
+ "Global Credentails" : "Globální přihlašovací údaje",
+ "Log-in credentials, save in database" : "Přihlašovací údaje, ukládat do databáze",
"Username and password" : "Uživatelské jméno a heslo",
+ "Log-in credentials, save in session" : "Přihlašovací údaje, ukládat v sezení",
+ "User entered, store in database" : "Zadané uživatelem, ukládat v databázi",
"RSA public key" : "RSA veřejný klíč",
"Public key" : "Veřejný klíč",
"Amazon S3" : "Amazon S3",
@@ -104,6 +115,7 @@ OC.L10N.register(
"Storage type" : "Typ úložiště",
"Scope" : "Rozsah",
"External Storage" : "Externí úložiště",
+ "Global Credentials" : "Globální přihlašovací údaje",
"Folder name" : "Název složky",
"Authentication" : "Ověření",
"Configuration" : "Nastavení",
diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json
index f22bbc25e35..1dc14a07af4 100644
--- a/apps/files_external/l10n/cs_CZ.json
+++ b/apps/files_external/l10n/cs_CZ.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "Chyba při vytváření páru klíčů",
"Enable encryption" : "Povolit šifrování",
"Enable previews" : "Povolit náhledy",
+ "Enable sharing" : "Povolit sdílení",
"Check for changes" : "Zkontrolovat změny",
"Never" : "Nikdy",
"Once every direct access" : "Jednou pro každý přímý přístup",
@@ -34,6 +35,8 @@
"(group)" : "(skupina)",
"Admin defined" : "Nastaveno administrátorem",
"Saved" : "Uloženo",
+ "Saving..." : "Ukládám...",
+ "Save" : "Uložit",
"Empty response from the server" : "Prázdná odpověď serveru",
"Couldn't access. Please logout and login to activate this mount point" : "Nelze připojit. Pro aktivaci tohoto přípojného bodu se prosím odhlašte a znovu přihlašte",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Nelze obdržet informaci z ownCloud serveru: {code} {type}",
@@ -42,6 +45,12 @@
"External mount error" : "Chyba vzdáleného úložiště",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Nelze obdržet seznam síťových úložišť systému Windows: prázdná odpověď serveru",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Některá z nastavených vzdálených úložišť nejsou připojena. Pro více informací prosím klikněte na červenou šipku(y)",
+ "Please enter the credentials for the {mount} mount" : "Zadejte prosím přihlašovací údaje k přípojnému bodu {mount}",
+ "Username" : "Uživatelské jméno",
+ "Password" : "Heslo",
+ "Credentials saved" : "Přihlašovací údaje uloženy",
+ "Credentials saving failed" : "Uložení přihlašovacích údajů selhalo",
+ "Credentials required" : "Vyžadovány přihlašovací údaje",
"Access key" : "Přístupový klíč",
"Secret key" : "Tajný klíč",
"Builtin" : "Zabudované",
@@ -53,13 +62,15 @@
"Client ID" : "Klientské ID",
"Client secret" : "Klientské tajemství",
"OpenStack" : "OpenStack",
- "Username" : "Uživatelské jméno",
- "Password" : "Heslo",
"Tenant name" : "Jméno vlastníka",
"Identity endpoint URL" : "Identifikační koncový bod URL",
"Rackspace" : "Rackspace",
"API key" : "Klíč API",
+ "Global Credentails" : "Globální přihlašovací údaje",
+ "Log-in credentials, save in database" : "Přihlašovací údaje, ukládat do databáze",
"Username and password" : "Uživatelské jméno a heslo",
+ "Log-in credentials, save in session" : "Přihlašovací údaje, ukládat v sezení",
+ "User entered, store in database" : "Zadané uživatelem, ukládat v databázi",
"RSA public key" : "RSA veřejný klíč",
"Public key" : "Veřejný klíč",
"Amazon S3" : "Amazon S3",
@@ -102,6 +113,7 @@
"Storage type" : "Typ úložiště",
"Scope" : "Rozsah",
"External Storage" : "Externí úložiště",
+ "Global Credentials" : "Globální přihlašovací údaje",
"Folder name" : "Název složky",
"Authentication" : "Ověření",
"Configuration" : "Nastavení",
diff --git a/apps/files_external/l10n/cy_GB.js b/apps/files_external/l10n/cy_GB.js
index 4364445be0c..50aaaad0ec9 100644
--- a/apps/files_external/l10n/cy_GB.js
+++ b/apps/files_external/l10n/cy_GB.js
@@ -2,9 +2,11 @@ OC.L10N.register(
"files_external",
{
"Personal" : "Personol",
- "None" : "Dim",
+ "Saving..." : "Yn cadw...",
+ "Save" : "Cadw",
"Username" : "Enw defnyddiwr",
"Password" : "Cyfrinair",
+ "None" : "Dim",
"URL" : "URL",
"Location" : "Lleoliad",
"ownCloud" : "ownCloud",
diff --git a/apps/files_external/l10n/cy_GB.json b/apps/files_external/l10n/cy_GB.json
index 4916cb270ab..258d72b5b6f 100644
--- a/apps/files_external/l10n/cy_GB.json
+++ b/apps/files_external/l10n/cy_GB.json
@@ -1,8 +1,10 @@
{ "translations": {
"Personal" : "Personol",
- "None" : "Dim",
+ "Saving..." : "Yn cadw...",
+ "Save" : "Cadw",
"Username" : "Enw defnyddiwr",
"Password" : "Cyfrinair",
+ "None" : "Dim",
"URL" : "URL",
"Location" : "Lleoliad",
"ownCloud" : "ownCloud",
diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js
index 70f43819496..d3c6c895d96 100644
--- a/apps/files_external/l10n/da.js
+++ b/apps/files_external/l10n/da.js
@@ -32,6 +32,10 @@ OC.L10N.register(
"All users. Type to select user or group." : "Alle brugere. Indtast for at vælge bruger eller gruppe.",
"(group)" : "(gruppe)",
"Saved" : "Gemt",
+ "Saving..." : "Gemmer...",
+ "Save" : "Gem",
+ "Username" : "Brugernavn",
+ "Password" : "Kodeord",
"Access key" : "Adgangsnøgle",
"Secret key" : "Hemmelig nøgle",
"Builtin" : "Indbygget",
@@ -43,8 +47,6 @@ OC.L10N.register(
"Client ID" : "Klient-ID",
"Client secret" : "Klient hemmelighed",
"OpenStack" : "OpenStack",
- "Username" : "Brugernavn",
- "Password" : "Kodeord",
"Tenant name" : "Lejernavn",
"Identity endpoint URL" : "Identificer afslutnings URL",
"Rackspace" : "Hyldeplads",
diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json
index aaeaaa58ae0..513533dd49e 100644
--- a/apps/files_external/l10n/da.json
+++ b/apps/files_external/l10n/da.json
@@ -30,6 +30,10 @@
"All users. Type to select user or group." : "Alle brugere. Indtast for at vælge bruger eller gruppe.",
"(group)" : "(gruppe)",
"Saved" : "Gemt",
+ "Saving..." : "Gemmer...",
+ "Save" : "Gem",
+ "Username" : "Brugernavn",
+ "Password" : "Kodeord",
"Access key" : "Adgangsnøgle",
"Secret key" : "Hemmelig nøgle",
"Builtin" : "Indbygget",
@@ -41,8 +45,6 @@
"Client ID" : "Klient-ID",
"Client secret" : "Klient hemmelighed",
"OpenStack" : "OpenStack",
- "Username" : "Brugernavn",
- "Password" : "Kodeord",
"Tenant name" : "Lejernavn",
"Identity endpoint URL" : "Identificer afslutnings URL",
"Rackspace" : "Hyldeplads",
diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js
index 41b86dbeb48..1a8f6f28394 100644
--- a/apps/files_external/l10n/de.js
+++ b/apps/files_external/l10n/de.js
@@ -28,7 +28,15 @@ OC.L10N.register(
"(group)" : "(group)",
"Admin defined" : "Administrator festlegen",
"Saved" : "Gespeichert",
+ "Saving..." : "Speichern…",
+ "Save" : "Speichern",
"There was an error with message: " : "Es ist ein Fehler mit folgender Meldung aufgetreten:",
+ "external-storage" : "Externer Speicher",
+ "Username" : "Benutzername",
+ "Password" : "Passwort",
+ "Credentials saved" : "Anmeldeinformationen gespeichert",
+ "Credentials saving failed" : "speichern der Anmeldeinformationen fehlgeschlagen",
+ "Credentials required" : "Anmeldeinformationen benötigt",
"Access key" : "Zugangsschlüssel",
"Secret key" : "Geheimer Schlüssel",
"None" : "Keine",
@@ -39,11 +47,10 @@ OC.L10N.register(
"Client ID" : "Client-ID",
"Client secret" : "Geheime Zeichenkette des Client",
"OpenStack" : "OpenStack",
- "Username" : "Benutzername",
- "Password" : "Passwort",
"Tenant name" : "Name des Mieters",
"Rackspace" : "Rackspace",
"API key" : "API-Schlüssel",
+ "Global Credentails" : "Globale Anmeldeinformtionen",
"Username and password" : "Benutzername und Passwort",
"RSA public key" : "RSA öffentlicher Schlüssel",
"Public key" : "Öffentlicher Schlüssel",
@@ -76,6 +83,7 @@ OC.L10N.register(
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
"Service name" : "Service Name",
+ "Request timeout (seconds)" : "Anfrage -Timeout ( Sekunden)",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich zur Installation an Deinen Systemadministrator.",
"<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>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.",
@@ -86,6 +94,7 @@ OC.L10N.register(
"Storage type" : "Du hast noch keinen externen Speicher",
"Scope" : "Anwendungsbereich",
"External Storage" : "Externer Speicher",
+ "Global Credentials" : "Globale Anmeldeinformationen",
"Folder name" : "Ordnername",
"Authentication" : "Authentifizierung",
"Configuration" : "Konfiguration",
diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json
index 2b50a822507..c6517f40fc0 100644
--- a/apps/files_external/l10n/de.json
+++ b/apps/files_external/l10n/de.json
@@ -26,7 +26,15 @@
"(group)" : "(group)",
"Admin defined" : "Administrator festlegen",
"Saved" : "Gespeichert",
+ "Saving..." : "Speichern…",
+ "Save" : "Speichern",
"There was an error with message: " : "Es ist ein Fehler mit folgender Meldung aufgetreten:",
+ "external-storage" : "Externer Speicher",
+ "Username" : "Benutzername",
+ "Password" : "Passwort",
+ "Credentials saved" : "Anmeldeinformationen gespeichert",
+ "Credentials saving failed" : "speichern der Anmeldeinformationen fehlgeschlagen",
+ "Credentials required" : "Anmeldeinformationen benötigt",
"Access key" : "Zugangsschlüssel",
"Secret key" : "Geheimer Schlüssel",
"None" : "Keine",
@@ -37,11 +45,10 @@
"Client ID" : "Client-ID",
"Client secret" : "Geheime Zeichenkette des Client",
"OpenStack" : "OpenStack",
- "Username" : "Benutzername",
- "Password" : "Passwort",
"Tenant name" : "Name des Mieters",
"Rackspace" : "Rackspace",
"API key" : "API-Schlüssel",
+ "Global Credentails" : "Globale Anmeldeinformtionen",
"Username and password" : "Benutzername und Passwort",
"RSA public key" : "RSA öffentlicher Schlüssel",
"Public key" : "Öffentlicher Schlüssel",
@@ -74,6 +81,7 @@
"Username as share" : "Benutzername als Freigabe",
"OpenStack Object Storage" : "Openstack-Objektspeicher",
"Service name" : "Service Name",
+ "Request timeout (seconds)" : "Anfrage -Timeout ( Sekunden)",
"<b>Note:</b> " : "<b>Hinweis:</b> ",
"<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich zur Installation an Deinen Systemadministrator.",
"<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>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.",
@@ -84,6 +92,7 @@
"Storage type" : "Du hast noch keinen externen Speicher",
"Scope" : "Anwendungsbereich",
"External Storage" : "Externer Speicher",
+ "Global Credentials" : "Globale Anmeldeinformationen",
"Folder name" : "Ordnername",
"Authentication" : "Authentifizierung",
"Configuration" : "Konfiguration",
diff --git a/apps/files_external/l10n/de_AT.js b/apps/files_external/l10n/de_AT.js
index 6c71c45f217..962fbf116f0 100644
--- a/apps/files_external/l10n/de_AT.js
+++ b/apps/files_external/l10n/de_AT.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_external",
{
"Personal" : "Persönlich",
+ "Save" : "Speichern",
"Username" : "Benutzername",
"Password" : "Passwort",
"Port" : "Port",
diff --git a/apps/files_external/l10n/de_AT.json b/apps/files_external/l10n/de_AT.json
index 0d956dc81c6..48154b4f189 100644
--- a/apps/files_external/l10n/de_AT.json
+++ b/apps/files_external/l10n/de_AT.json
@@ -1,5 +1,6 @@
{ "translations": {
"Personal" : "Persönlich",
+ "Save" : "Speichern",
"Username" : "Benutzername",
"Password" : "Passwort",
"Port" : "Port",
diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js
index ef860918474..514a9dcd8ab 100644
--- a/apps/files_external/l10n/de_DE.js
+++ b/apps/files_external/l10n/de_DE.js
@@ -23,13 +23,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Alle Benutzer. Benutzer oder Gruppe zur Auswahl eingeben.",
"(group)" : "(group)",
"Saved" : "Gespeichert",
+ "Saving..." : "Speichervorgang…",
+ "Save" : "Speichern",
+ "Username" : "Benutzername",
+ "Password" : "Passwort",
"None" : "Keine",
"App key" : "App-Schlüssel",
"App secret" : "Geheime Zeichenkette der App",
"Client ID" : "Client-ID",
"Client secret" : "Geheime Zeichenkette des Client",
- "Username" : "Benutzername",
- "Password" : "Passwort",
"API key" : "API-Schlüssel",
"Username and password" : "Benutzername und Passwort",
"Public key" : "Öffentlicher Schlüssel",
diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json
index 75a84334764..2c8af227c3b 100644
--- a/apps/files_external/l10n/de_DE.json
+++ b/apps/files_external/l10n/de_DE.json
@@ -21,13 +21,15 @@
"All users. Type to select user or group." : "Alle Benutzer. Benutzer oder Gruppe zur Auswahl eingeben.",
"(group)" : "(group)",
"Saved" : "Gespeichert",
+ "Saving..." : "Speichervorgang…",
+ "Save" : "Speichern",
+ "Username" : "Benutzername",
+ "Password" : "Passwort",
"None" : "Keine",
"App key" : "App-Schlüssel",
"App secret" : "Geheime Zeichenkette der App",
"Client ID" : "Client-ID",
"Client secret" : "Geheime Zeichenkette des Client",
- "Username" : "Benutzername",
- "Password" : "Passwort",
"API key" : "API-Schlüssel",
"Username and password" : "Benutzername und Passwort",
"Public key" : "Öffentlicher Schlüssel",
diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js
index c04d3d015d3..c807978e7a2 100644
--- a/apps/files_external/l10n/el.js
+++ b/apps/files_external/l10n/el.js
@@ -34,6 +34,10 @@ OC.L10N.register(
"All users. Type to select user or group." : "Όλοι οι χρήστες. Πληκτρολογήστε για να επιλέξετε χρήστη ή ομάδα.",
"(group)" : "(ομάδα)",
"Saved" : "Αποθηκεύτηκαν",
+ "Saving..." : "Γίνεται αποθήκευση...",
+ "Save" : "Αποθήκευση",
+ "Username" : "Όνομα χρήστη",
+ "Password" : "Κωδικός πρόσβασης",
"Access key" : "Κλειδί πρόσβασης",
"Secret key" : "Μυστικό κλειδί",
"Builtin" : "Builtin",
@@ -45,8 +49,6 @@ OC.L10N.register(
"Client ID" : "ID πελάτη",
"Client secret" : "Μυστικό πελάτη",
"OpenStack" : "OpenStack",
- "Username" : "Όνομα χρήστη",
- "Password" : "Κωδικός πρόσβασης",
"Tenant name" : "Όνομα \"ένοικου\"",
"Identity endpoint URL" : "URL τελικού σημείου ταυτοποίησης",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json
index 98a6d18bfc3..44c41265093 100644
--- a/apps/files_external/l10n/el.json
+++ b/apps/files_external/l10n/el.json
@@ -32,6 +32,10 @@
"All users. Type to select user or group." : "Όλοι οι χρήστες. Πληκτρολογήστε για να επιλέξετε χρήστη ή ομάδα.",
"(group)" : "(ομάδα)",
"Saved" : "Αποθηκεύτηκαν",
+ "Saving..." : "Γίνεται αποθήκευση...",
+ "Save" : "Αποθήκευση",
+ "Username" : "Όνομα χρήστη",
+ "Password" : "Κωδικός πρόσβασης",
"Access key" : "Κλειδί πρόσβασης",
"Secret key" : "Μυστικό κλειδί",
"Builtin" : "Builtin",
@@ -43,8 +47,6 @@
"Client ID" : "ID πελάτη",
"Client secret" : "Μυστικό πελάτη",
"OpenStack" : "OpenStack",
- "Username" : "Όνομα χρήστη",
- "Password" : "Κωδικός πρόσβασης",
"Tenant name" : "Όνομα \"ένοικου\"",
"Identity endpoint URL" : "URL τελικού σημείου ταυτοποίησης",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/en_GB.js b/apps/files_external/l10n/en_GB.js
index adba5abf88c..6390b2ffe7e 100644
--- a/apps/files_external/l10n/en_GB.js
+++ b/apps/files_external/l10n/en_GB.js
@@ -21,13 +21,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "All users. Type to select user or group.",
"(group)" : "(group)",
"Saved" : "Saved",
+ "Saving..." : "Saving...",
+ "Save" : "Save",
+ "Username" : "Username",
+ "Password" : "Password",
"None" : "None",
"App key" : "App key",
"App secret" : "App secret",
"Client ID" : "Client ID",
"Client secret" : "Client secret",
- "Username" : "Username",
- "Password" : "Password",
"API key" : "API key",
"Public key" : "Public key",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/en_GB.json b/apps/files_external/l10n/en_GB.json
index 04d43cf4854..ab3cd25c571 100644
--- a/apps/files_external/l10n/en_GB.json
+++ b/apps/files_external/l10n/en_GB.json
@@ -19,13 +19,15 @@
"All users. Type to select user or group." : "All users. Type to select user or group.",
"(group)" : "(group)",
"Saved" : "Saved",
+ "Saving..." : "Saving...",
+ "Save" : "Save",
+ "Username" : "Username",
+ "Password" : "Password",
"None" : "None",
"App key" : "App key",
"App secret" : "App secret",
"Client ID" : "Client ID",
"Client secret" : "Client secret",
- "Username" : "Username",
- "Password" : "Password",
"API key" : "API key",
"Public key" : "Public key",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/eo.js b/apps/files_external/l10n/eo.js
index ddab2360a6d..556287de7b5 100644
--- a/apps/files_external/l10n/eo.js
+++ b/apps/files_external/l10n/eo.js
@@ -6,13 +6,15 @@ OC.L10N.register(
"Grant access" : "Doni alirpermeson",
"Access granted" : "Alirpermeso donita",
"Saved" : "Konservita",
+ "Saving..." : "Konservante...",
+ "Save" : "Konservi",
+ "Username" : "Uzantonomo",
+ "Password" : "Pasvorto",
"None" : "Nenio",
"App key" : "Aplikaĵoklavo",
"App secret" : "Aplikaĵosekreto",
"Client ID" : "Klientidentigilo",
"Client secret" : "Klientosekreto",
- "Username" : "Uzantonomo",
- "Password" : "Pasvorto",
"API key" : "API-klavo",
"Public key" : "Publika ŝlosilo",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/eo.json b/apps/files_external/l10n/eo.json
index ec91f40abac..aa944f959f7 100644
--- a/apps/files_external/l10n/eo.json
+++ b/apps/files_external/l10n/eo.json
@@ -4,13 +4,15 @@
"Grant access" : "Doni alirpermeson",
"Access granted" : "Alirpermeso donita",
"Saved" : "Konservita",
+ "Saving..." : "Konservante...",
+ "Save" : "Konservi",
+ "Username" : "Uzantonomo",
+ "Password" : "Pasvorto",
"None" : "Nenio",
"App key" : "Aplikaĵoklavo",
"App secret" : "Aplikaĵosekreto",
"Client ID" : "Klientidentigilo",
"Client secret" : "Klientosekreto",
- "Username" : "Uzantonomo",
- "Password" : "Pasvorto",
"API key" : "API-klavo",
"Public key" : "Publika ŝlosilo",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js
index 8a49dd4ec05..42695f85a4b 100644
--- a/apps/files_external/l10n/es.js
+++ b/apps/files_external/l10n/es.js
@@ -35,6 +35,8 @@ OC.L10N.register(
"(group)" : "(grupo)",
"Admin defined" : "Admin definido",
"Saved" : "Guardado",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
"Empty response from the server" : "Respuesta vacía desde el servidor",
"Couldn't access. Please logout and login to activate this mount point" : "No se puede acceder. Por favor cierra sesión e iníciala de nuevo para activar este punto de montaje",
"Couldn't get the information from the ownCloud server: {code} {type}" : "No se puede obtener información acerca del servidor de OwnCloud: {code} {type}",
@@ -43,6 +45,8 @@ OC.L10N.register(
"External mount error" : "Error de montaje externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "No se puede obtener la lista de unidades de red y sus puntos de montaje de Windows: respuesta vacía desde el servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Algunos de los puntos de montaje externos configurados no están conectados. Por favor, haga clic en la fila roja (s) para obtener más información",
+ "Username" : "Nombre de usuario",
+ "Password" : "Contraseña",
"Access key" : "Clave de acceso",
"Secret key" : "Clave secreta",
"Builtin" : "Incorporado",
@@ -54,8 +58,6 @@ OC.L10N.register(
"Client ID" : "ID de Cliente",
"Client secret" : "Cliente secreto",
"OpenStack" : "OpenStack",
- "Username" : "Nombre de usuario",
- "Password" : "Contraseña",
"Tenant name" : "Nombre del inquilino",
"Identity endpoint URL" : "Identidad de punto final URL",
"Rackspace" : "Espacio de Rack",
diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json
index c3b81338776..24110d3f4a1 100644
--- a/apps/files_external/l10n/es.json
+++ b/apps/files_external/l10n/es.json
@@ -33,6 +33,8 @@
"(group)" : "(grupo)",
"Admin defined" : "Admin definido",
"Saved" : "Guardado",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
"Empty response from the server" : "Respuesta vacía desde el servidor",
"Couldn't access. Please logout and login to activate this mount point" : "No se puede acceder. Por favor cierra sesión e iníciala de nuevo para activar este punto de montaje",
"Couldn't get the information from the ownCloud server: {code} {type}" : "No se puede obtener información acerca del servidor de OwnCloud: {code} {type}",
@@ -41,6 +43,8 @@
"External mount error" : "Error de montaje externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "No se puede obtener la lista de unidades de red y sus puntos de montaje de Windows: respuesta vacía desde el servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Algunos de los puntos de montaje externos configurados no están conectados. Por favor, haga clic en la fila roja (s) para obtener más información",
+ "Username" : "Nombre de usuario",
+ "Password" : "Contraseña",
"Access key" : "Clave de acceso",
"Secret key" : "Clave secreta",
"Builtin" : "Incorporado",
@@ -52,8 +56,6 @@
"Client ID" : "ID de Cliente",
"Client secret" : "Cliente secreto",
"OpenStack" : "OpenStack",
- "Username" : "Nombre de usuario",
- "Password" : "Contraseña",
"Tenant name" : "Nombre del inquilino",
"Identity endpoint URL" : "Identidad de punto final URL",
"Rackspace" : "Espacio de Rack",
diff --git a/apps/files_external/l10n/es_AR.js b/apps/files_external/l10n/es_AR.js
index 7fb87f1a1d3..6204947c3d3 100644
--- a/apps/files_external/l10n/es_AR.js
+++ b/apps/files_external/l10n/es_AR.js
@@ -6,9 +6,11 @@ OC.L10N.register(
"Grant access" : "Permitir acceso",
"Access granted" : "Acceso permitido",
"Saved" : "Guardado",
- "None" : "Ninguno",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
+ "None" : "Ninguno",
"API key" : "clave API",
"Port" : "Puerto",
"Region" : "Provincia",
diff --git a/apps/files_external/l10n/es_AR.json b/apps/files_external/l10n/es_AR.json
index 9fb735f7a3a..e651ce0ec46 100644
--- a/apps/files_external/l10n/es_AR.json
+++ b/apps/files_external/l10n/es_AR.json
@@ -4,9 +4,11 @@
"Grant access" : "Permitir acceso",
"Access granted" : "Acceso permitido",
"Saved" : "Guardado",
- "None" : "Ninguno",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
+ "None" : "Ninguno",
"API key" : "clave API",
"Port" : "Puerto",
"Region" : "Provincia",
diff --git a/apps/files_external/l10n/es_MX.js b/apps/files_external/l10n/es_MX.js
index c805ce16662..ca094579742 100644
--- a/apps/files_external/l10n/es_MX.js
+++ b/apps/files_external/l10n/es_MX.js
@@ -6,9 +6,11 @@ OC.L10N.register(
"Grant access" : "Conceder acceso",
"Access granted" : "Acceso concedido",
"Saved" : "Guardado",
- "None" : "Ninguno",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
+ "None" : "Ninguno",
"API key" : "clave API",
"Public key" : "Llave pública",
"Port" : "Puerto",
diff --git a/apps/files_external/l10n/es_MX.json b/apps/files_external/l10n/es_MX.json
index 1df9bf70436..e120c71f62f 100644
--- a/apps/files_external/l10n/es_MX.json
+++ b/apps/files_external/l10n/es_MX.json
@@ -4,9 +4,11 @@
"Grant access" : "Conceder acceso",
"Access granted" : "Acceso concedido",
"Saved" : "Guardado",
- "None" : "Ninguno",
+ "Saving..." : "Guardando...",
+ "Save" : "Guardar",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
+ "None" : "Ninguno",
"API key" : "clave API",
"Public key" : "Llave pública",
"Port" : "Puerto",
diff --git a/apps/files_external/l10n/et_EE.js b/apps/files_external/l10n/et_EE.js
index 989ff604952..35c77c8ca07 100644
--- a/apps/files_external/l10n/et_EE.js
+++ b/apps/files_external/l10n/et_EE.js
@@ -26,9 +26,13 @@ OC.L10N.register(
"(group)" : "(grupp)",
"Admin defined" : "Admini poolt määratud",
"Saved" : "Salvestatud",
+ "Saving..." : "Salvestamine...",
+ "Save" : "Salvesta",
"Couldn't get the list of external mount points: {type}" : "Välise ühenduspunkti hankimine ebaõnnestus: {type}",
"There was an error with message: " : "Sõnumiga tekkis tõrge:",
"External mount error" : "Välise seostamise tõrge",
+ "Username" : "Kasutajanimi",
+ "Password" : "Parool",
"Access key" : "Ligipääsuvõti",
"Secret key" : "Salavõti",
"Builtin" : "Sisseehitatud",
@@ -40,8 +44,6 @@ OC.L10N.register(
"Client ID" : "Kliendi ID",
"Client secret" : "Kliendi salasõna",
"OpenStack" : "OpenStack",
- "Username" : "Kasutajanimi",
- "Password" : "Parool",
"API key" : "API võti",
"RSA public key" : "RSA avalik võti",
"Public key" : "Avalik võti",
diff --git a/apps/files_external/l10n/et_EE.json b/apps/files_external/l10n/et_EE.json
index ad8e87e55f9..5577f556844 100644
--- a/apps/files_external/l10n/et_EE.json
+++ b/apps/files_external/l10n/et_EE.json
@@ -24,9 +24,13 @@
"(group)" : "(grupp)",
"Admin defined" : "Admini poolt määratud",
"Saved" : "Salvestatud",
+ "Saving..." : "Salvestamine...",
+ "Save" : "Salvesta",
"Couldn't get the list of external mount points: {type}" : "Välise ühenduspunkti hankimine ebaõnnestus: {type}",
"There was an error with message: " : "Sõnumiga tekkis tõrge:",
"External mount error" : "Välise seostamise tõrge",
+ "Username" : "Kasutajanimi",
+ "Password" : "Parool",
"Access key" : "Ligipääsuvõti",
"Secret key" : "Salavõti",
"Builtin" : "Sisseehitatud",
@@ -38,8 +42,6 @@
"Client ID" : "Kliendi ID",
"Client secret" : "Kliendi salasõna",
"OpenStack" : "OpenStack",
- "Username" : "Kasutajanimi",
- "Password" : "Parool",
"API key" : "API võti",
"RSA public key" : "RSA avalik võti",
"Public key" : "Avalik võti",
diff --git a/apps/files_external/l10n/eu.js b/apps/files_external/l10n/eu.js
index 58742552e76..b80e05f2c40 100644
--- a/apps/files_external/l10n/eu.js
+++ b/apps/files_external/l10n/eu.js
@@ -11,13 +11,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Erabiltzaile guztiak. Idatzi erabiltzaile edo taldea hautatzeko.",
"(group)" : "(taldea)",
"Saved" : "Gordeta",
+ "Saving..." : "Gordetzen...",
+ "Save" : "Gorde",
+ "Username" : "Erabiltzaile izena",
+ "Password" : "Pasahitza",
"None" : "Ezer",
"App key" : "Aplikazio gakoa",
"App secret" : "App sekretua",
"Client ID" : "Bezero ID",
"Client secret" : "Bezeroaren Sekretua",
- "Username" : "Erabiltzaile izena",
- "Password" : "Pasahitza",
"API key" : "APIaren gakoa",
"Public key" : "Gako publikoa",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/eu.json b/apps/files_external/l10n/eu.json
index f039441b464..d6dac29bba7 100644
--- a/apps/files_external/l10n/eu.json
+++ b/apps/files_external/l10n/eu.json
@@ -9,13 +9,15 @@
"All users. Type to select user or group." : "Erabiltzaile guztiak. Idatzi erabiltzaile edo taldea hautatzeko.",
"(group)" : "(taldea)",
"Saved" : "Gordeta",
+ "Saving..." : "Gordetzen...",
+ "Save" : "Gorde",
+ "Username" : "Erabiltzaile izena",
+ "Password" : "Pasahitza",
"None" : "Ezer",
"App key" : "Aplikazio gakoa",
"App secret" : "App sekretua",
"Client ID" : "Bezero ID",
"Client secret" : "Bezeroaren Sekretua",
- "Username" : "Erabiltzaile izena",
- "Password" : "Pasahitza",
"API key" : "APIaren gakoa",
"Public key" : "Gako publikoa",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/fa.js b/apps/files_external/l10n/fa.js
index 0c1076fc994..f9e67ddb0af 100644
--- a/apps/files_external/l10n/fa.js
+++ b/apps/files_external/l10n/fa.js
@@ -18,6 +18,10 @@ OC.L10N.register(
"Never" : "هرگز",
"(group)" : "(گروه)",
"Saved" : "ذخیره شد",
+ "Saving..." : "در حال ذخیره سازی...",
+ "Save" : "ذخیره",
+ "Username" : "نام کاربری",
+ "Password" : "گذرواژه",
"Access key" : "کلید دسترسی",
"Secret key" : "کلید مخفی",
"None" : "هیچ‌کدام",
@@ -25,8 +29,6 @@ OC.L10N.register(
"App secret" : "کد برنامه",
"OAuth2" : "OAuth2",
"OpenStack" : "OpenStack",
- "Username" : "نام کاربری",
- "Password" : "گذرواژه",
"API key" : "کلید API ",
"Username and password" : "نام کاربری و رمز عبور",
"Public key" : "کلید عمومی",
diff --git a/apps/files_external/l10n/fa.json b/apps/files_external/l10n/fa.json
index 056bad259a6..e5292902c47 100644
--- a/apps/files_external/l10n/fa.json
+++ b/apps/files_external/l10n/fa.json
@@ -16,6 +16,10 @@
"Never" : "هرگز",
"(group)" : "(گروه)",
"Saved" : "ذخیره شد",
+ "Saving..." : "در حال ذخیره سازی...",
+ "Save" : "ذخیره",
+ "Username" : "نام کاربری",
+ "Password" : "گذرواژه",
"Access key" : "کلید دسترسی",
"Secret key" : "کلید مخفی",
"None" : "هیچ‌کدام",
@@ -23,8 +27,6 @@
"App secret" : "کد برنامه",
"OAuth2" : "OAuth2",
"OpenStack" : "OpenStack",
- "Username" : "نام کاربری",
- "Password" : "گذرواژه",
"API key" : "کلید API ",
"Username and password" : "نام کاربری و رمز عبور",
"Public key" : "کلید عمومی",
diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js
index ec969586d6d..ec2c7d7a52c 100644
--- a/apps/files_external/l10n/fi_FI.js
+++ b/apps/files_external/l10n/fi_FI.js
@@ -17,6 +17,7 @@ OC.L10N.register(
"Error generating key pair" : "Virhe luotaessa avainparia",
"Enable encryption" : "Käytä salausta",
"Enable previews" : "Käytä esikatseluja",
+ "Enable sharing" : "Käytä jakamista",
"Check for changes" : "Tarkista muutokset",
"Never" : "Ei koskaan",
"Once every direct access" : "Kerran aina suoran käytön yhteydessä",
@@ -24,6 +25,8 @@ OC.L10N.register(
"(group)" : "(ryhmä)",
"Admin defined" : "Ylläpitäjän määrittämä",
"Saved" : "Tallennettu",
+ "Saving..." : "Tallennetaan...",
+ "Save" : "Tallenna",
"Empty response from the server" : "Tyhjä vastaus palvelimelta",
"Couldn't access. Please logout and login to activate this mount point" : "Käyttö epäonnistui. Kirjaudu ulos ja takaisin sisään aktivoidaksesi tämän liitospisteen",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Tietojen saaminen ownCloud-palvelimelta epäonnistui: {code} {type}",
@@ -32,6 +35,12 @@ OC.L10N.register(
"External mount error" : "Ulkoinen liitosvirhe",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows-verkkoasemien liitospisteiden listauksen noutaminen epäonnistui: tyhjä vastaus palvelimelta",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Jotkin määritetyt erilliset liitospisteet eivät ole yhdistettynä. Napsauta punaisia rivejä saadaksesi lisätietoja",
+ "Please enter the credentials for the {mount} mount" : "Anna kirjautumistiedot liitokselle {mount}",
+ "Username" : "Käyttäjätunnus",
+ "Password" : "Salasana",
+ "Credentials saved" : "Kirjautumistiedot tallennettu",
+ "Credentials saving failed" : "Kirjautumistietojen tallentaminen epäonnistui",
+ "Credentials required" : "Kirjautumistiedot vaaditaan",
"Builtin" : "Sisäänrakennettu",
"None" : "Ei mitään",
"OAuth1" : "OAuth1",
@@ -41,8 +50,6 @@ OC.L10N.register(
"Client ID" : "Asiakkaan tunniste",
"Client secret" : "Asiakassalaisuus",
"OpenStack" : "OpenStack",
- "Username" : "Käyttäjätunnus",
- "Password" : "Salasana",
"Rackspace" : "Rackspace",
"API key" : "API-avain",
"Log-in credentials, save in database" : "Kirjautumistiedot, tallenna tietokantaan",
@@ -85,6 +92,7 @@ OC.L10N.register(
"Name" : "Nimi",
"Storage type" : "Tallennustilan tyyppi",
"External Storage" : "Erillinen tallennusväline",
+ "Global Credentials" : "Globaalit kirjautumistiedot",
"Folder name" : "Kansion nimi",
"Authentication" : "Tunnistautuminen",
"Configuration" : "Asetukset",
diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json
index 8c39acff034..e74582f1962 100644
--- a/apps/files_external/l10n/fi_FI.json
+++ b/apps/files_external/l10n/fi_FI.json
@@ -15,6 +15,7 @@
"Error generating key pair" : "Virhe luotaessa avainparia",
"Enable encryption" : "Käytä salausta",
"Enable previews" : "Käytä esikatseluja",
+ "Enable sharing" : "Käytä jakamista",
"Check for changes" : "Tarkista muutokset",
"Never" : "Ei koskaan",
"Once every direct access" : "Kerran aina suoran käytön yhteydessä",
@@ -22,6 +23,8 @@
"(group)" : "(ryhmä)",
"Admin defined" : "Ylläpitäjän määrittämä",
"Saved" : "Tallennettu",
+ "Saving..." : "Tallennetaan...",
+ "Save" : "Tallenna",
"Empty response from the server" : "Tyhjä vastaus palvelimelta",
"Couldn't access. Please logout and login to activate this mount point" : "Käyttö epäonnistui. Kirjaudu ulos ja takaisin sisään aktivoidaksesi tämän liitospisteen",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Tietojen saaminen ownCloud-palvelimelta epäonnistui: {code} {type}",
@@ -30,6 +33,12 @@
"External mount error" : "Ulkoinen liitosvirhe",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows-verkkoasemien liitospisteiden listauksen noutaminen epäonnistui: tyhjä vastaus palvelimelta",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Jotkin määritetyt erilliset liitospisteet eivät ole yhdistettynä. Napsauta punaisia rivejä saadaksesi lisätietoja",
+ "Please enter the credentials for the {mount} mount" : "Anna kirjautumistiedot liitokselle {mount}",
+ "Username" : "Käyttäjätunnus",
+ "Password" : "Salasana",
+ "Credentials saved" : "Kirjautumistiedot tallennettu",
+ "Credentials saving failed" : "Kirjautumistietojen tallentaminen epäonnistui",
+ "Credentials required" : "Kirjautumistiedot vaaditaan",
"Builtin" : "Sisäänrakennettu",
"None" : "Ei mitään",
"OAuth1" : "OAuth1",
@@ -39,8 +48,6 @@
"Client ID" : "Asiakkaan tunniste",
"Client secret" : "Asiakassalaisuus",
"OpenStack" : "OpenStack",
- "Username" : "Käyttäjätunnus",
- "Password" : "Salasana",
"Rackspace" : "Rackspace",
"API key" : "API-avain",
"Log-in credentials, save in database" : "Kirjautumistiedot, tallenna tietokantaan",
@@ -83,6 +90,7 @@
"Name" : "Nimi",
"Storage type" : "Tallennustilan tyyppi",
"External Storage" : "Erillinen tallennusväline",
+ "Global Credentials" : "Globaalit kirjautumistiedot",
"Folder name" : "Kansion nimi",
"Authentication" : "Tunnistautuminen",
"Configuration" : "Asetukset",
diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js
index cc1c1bc693c..ae780704b80 100644
--- a/apps/files_external/l10n/fr.js
+++ b/apps/files_external/l10n/fr.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "Erreur lors de la génération des clés",
"Enable encryption" : "Activer le chiffrement",
"Enable previews" : "Activer les prévisualisations",
+ "Enable sharing" : "Permettre le partage",
"Check for changes" : "Rechercher les modifications",
"Never" : "Jamais",
"Once every direct access" : "Une fois à chaque accès direct",
@@ -36,14 +37,23 @@ OC.L10N.register(
"(group)" : "(groupe)",
"Admin defined" : "Défini par l'administrateur",
"Saved" : "Sauvegardé",
+ "Saving..." : "Enregistrement...",
+ "Save" : "Enregistrer",
"Empty response from the server" : "Réponse vide du serveur",
"Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Impossible d'obtenir l'information depuis le serveur ownCloud : {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}",
"There was an error with message: " : "Il y a eu une erreur avec le message :",
"External mount error" : "Erreur de point de montage externe",
+ "external-storage" : "external-storage",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossible d'obtenir la liste des points de montage des disques réseaux Windows : Réponse vide du serveur",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Certains points de montage externes configurés ne sont pas connectés. Veuillez cliquer sur la(les) ligne(s) rouge(s) pour plus d'informations",
+ "Please enter the credentials for the {mount} mount" : "Veuillez entrer les identifiants pour le montage {mount}",
+ "Username" : "Nom d'utilisateur",
+ "Password" : "Mot de passe",
+ "Credentials saved" : "Identifiants sauvegardés",
+ "Credentials saving failed" : "La sauvegarde des identifiants a échoué",
+ "Credentials required" : "Des informations d'identification sont requises",
"Access key" : "Clé d'accès",
"Secret key" : "Clé secrète",
"Builtin" : "Intégré",
@@ -55,13 +65,15 @@ OC.L10N.register(
"Client ID" : "ID Client",
"Client secret" : "Secret client",
"OpenStack" : "OpenStack",
- "Username" : "Nom d'utilisateur",
- "Password" : "Mot de passe",
"Tenant name" : "Tenant name",
"Identity endpoint URL" : "Identity endpoint URL",
"Rackspace" : "Rackspace",
"API key" : "Clé API",
+ "Global Credentails" : "Identifiants globaux",
+ "Log-in credentials, save in database" : "Identifiants de connexion, sauvegardés dans la base de données",
"Username and password" : "Nom d'utilisateur et mot de passe",
+ "Log-in credentials, save in session" : "Identifiants de connexion, sauvegardés pour la session",
+ "User entered, store in database" : "Fourni par l'utilisateur, enregistré dans la base de données",
"RSA public key" : "Clé publique RSA",
"Public key" : "Clef publique",
"Amazon S3" : "Amazon S3",
@@ -104,6 +116,7 @@ OC.L10N.register(
"Storage type" : "Type de stockage",
"Scope" : "Portée",
"External Storage" : "Stockage externe",
+ "Global Credentials" : "Identifiants Globaux",
"Folder name" : "Nom du dossier",
"Authentication" : "Authentification",
"Configuration" : "Configuration",
diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json
index 47a70fcd12a..53438506bb3 100644
--- a/apps/files_external/l10n/fr.json
+++ b/apps/files_external/l10n/fr.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "Erreur lors de la génération des clés",
"Enable encryption" : "Activer le chiffrement",
"Enable previews" : "Activer les prévisualisations",
+ "Enable sharing" : "Permettre le partage",
"Check for changes" : "Rechercher les modifications",
"Never" : "Jamais",
"Once every direct access" : "Une fois à chaque accès direct",
@@ -34,14 +35,23 @@
"(group)" : "(groupe)",
"Admin defined" : "Défini par l'administrateur",
"Saved" : "Sauvegardé",
+ "Saving..." : "Enregistrement...",
+ "Save" : "Enregistrer",
"Empty response from the server" : "Réponse vide du serveur",
"Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Impossible d'obtenir l'information depuis le serveur ownCloud : {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}",
"There was an error with message: " : "Il y a eu une erreur avec le message :",
"External mount error" : "Erreur de point de montage externe",
+ "external-storage" : "external-storage",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossible d'obtenir la liste des points de montage des disques réseaux Windows : Réponse vide du serveur",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Certains points de montage externes configurés ne sont pas connectés. Veuillez cliquer sur la(les) ligne(s) rouge(s) pour plus d'informations",
+ "Please enter the credentials for the {mount} mount" : "Veuillez entrer les identifiants pour le montage {mount}",
+ "Username" : "Nom d'utilisateur",
+ "Password" : "Mot de passe",
+ "Credentials saved" : "Identifiants sauvegardés",
+ "Credentials saving failed" : "La sauvegarde des identifiants a échoué",
+ "Credentials required" : "Des informations d'identification sont requises",
"Access key" : "Clé d'accès",
"Secret key" : "Clé secrète",
"Builtin" : "Intégré",
@@ -53,13 +63,15 @@
"Client ID" : "ID Client",
"Client secret" : "Secret client",
"OpenStack" : "OpenStack",
- "Username" : "Nom d'utilisateur",
- "Password" : "Mot de passe",
"Tenant name" : "Tenant name",
"Identity endpoint URL" : "Identity endpoint URL",
"Rackspace" : "Rackspace",
"API key" : "Clé API",
+ "Global Credentails" : "Identifiants globaux",
+ "Log-in credentials, save in database" : "Identifiants de connexion, sauvegardés dans la base de données",
"Username and password" : "Nom d'utilisateur et mot de passe",
+ "Log-in credentials, save in session" : "Identifiants de connexion, sauvegardés pour la session",
+ "User entered, store in database" : "Fourni par l'utilisateur, enregistré dans la base de données",
"RSA public key" : "Clé publique RSA",
"Public key" : "Clef publique",
"Amazon S3" : "Amazon S3",
@@ -102,6 +114,7 @@
"Storage type" : "Type de stockage",
"Scope" : "Portée",
"External Storage" : "Stockage externe",
+ "Global Credentials" : "Identifiants Globaux",
"Folder name" : "Nom du dossier",
"Authentication" : "Authentification",
"Configuration" : "Configuration",
diff --git a/apps/files_external/l10n/gl.js b/apps/files_external/l10n/gl.js
index 26e54ee7453..21298c9f542 100644
--- a/apps/files_external/l10n/gl.js
+++ b/apps/files_external/l10n/gl.js
@@ -21,13 +21,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Todos os usuarios. Escriba para seleccionar usuario ou grupo.",
"(group)" : "(grupo)",
"Saved" : "Gardado",
+ "Saving..." : "Gardando...",
+ "Save" : "Gardar",
+ "Username" : "Nome de usuario",
+ "Password" : "Contrasinal",
"None" : "Ningún",
"App key" : "Clave da API",
"App secret" : "Secreto da aplicación",
"Client ID" : "ID do cliente",
"Client secret" : "Secreto do cliente",
- "Username" : "Nome de usuario",
- "Password" : "Contrasinal",
"API key" : "Chave da API",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/gl.json b/apps/files_external/l10n/gl.json
index e9be28bfa18..da3ad490acd 100644
--- a/apps/files_external/l10n/gl.json
+++ b/apps/files_external/l10n/gl.json
@@ -19,13 +19,15 @@
"All users. Type to select user or group." : "Todos os usuarios. Escriba para seleccionar usuario ou grupo.",
"(group)" : "(grupo)",
"Saved" : "Gardado",
+ "Saving..." : "Gardando...",
+ "Save" : "Gardar",
+ "Username" : "Nome de usuario",
+ "Password" : "Contrasinal",
"None" : "Ningún",
"App key" : "Clave da API",
"App secret" : "Secreto da aplicación",
"Client ID" : "ID do cliente",
"Client secret" : "Secreto do cliente",
- "Username" : "Nome de usuario",
- "Password" : "Contrasinal",
"API key" : "Chave da API",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/he.js b/apps/files_external/l10n/he.js
index d963d796428..e748676589a 100644
--- a/apps/files_external/l10n/he.js
+++ b/apps/files_external/l10n/he.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "שגיאה ביצירת זוג מפתחות",
"Enable encryption" : "אפשר הצפנה",
"Enable previews" : "מאפשר תצוגות מקדימות",
+ "Enable sharing" : "הפעלת שיתוף",
"Check for changes" : "בדיקה אחר שינויים",
"Never" : "לעולם לא",
"Once every direct access" : "פעם אחת כל כניסה ישירה",
@@ -36,6 +37,8 @@ OC.L10N.register(
"(group)" : "(קבוצה)",
"Admin defined" : "הוגדר מנהל",
"Saved" : "נשמר",
+ "Saving..." : "שמירה…",
+ "Save" : "שמירה",
"Empty response from the server" : "תגובה ריקה מהשרת",
"Couldn't access. Please logout and login to activate this mount point" : "לא ניתן להכנס. יש להתנתק ולהתחבר כדי להפעיל את נקודת העיגון הזו",
"Couldn't get the information from the ownCloud server: {code} {type}" : "לא ניתן היה לקבל את המידע משרת ה- ownCloud: {code} {type}",
@@ -44,6 +47,8 @@ OC.L10N.register(
"External mount error" : "שגיאת עגינה חיצונית",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "לא ניתן היה לקבל את רשימת נקודות העיגון של כונן הרשת של Window: תגובה ריקה מהשרת",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "חלק מנקודות העיגון החיצוניות שהוגדרו אינן מחוברות. יש ללחוץ על השורה/ות האדומה/ות למידע נוסף",
+ "Username" : "שם משתמש",
+ "Password" : "סיסמא",
"Access key" : "מפתח כניסה",
"Secret key" : "מפתח סודי",
"Builtin" : "מובנה",
@@ -55,12 +60,11 @@ OC.L10N.register(
"Client ID" : "זיהוי לקוח",
"Client secret" : "סוד לקוח",
"OpenStack" : "OpenStack",
- "Username" : "שם משתמש",
- "Password" : "סיסמא",
"Tenant name" : "שם דייר",
"Identity endpoint URL" : "זהות נתיב נקודת קצה",
"Rackspace" : "חץ אחורה",
"API key" : "מפתח API",
+ "Global Credentails" : "אישורי אימות גלובלים",
"Log-in credentials, save in database" : "אישורי התחברות, נשמרים במסד הנתונים",
"Username and password" : "שם משתמש וסיסמא",
"Log-in credentials, save in session" : "אישורי התחברות, נשמרים במידע שיחה - סשן",
@@ -107,6 +111,7 @@ OC.L10N.register(
"Storage type" : "סוג אחסון",
"Scope" : "היקף",
"External Storage" : "אחסון חיצוני",
+ "Global Credentials" : "אישורי אימות גלובלים",
"Folder name" : "שם התיקייה",
"Authentication" : "אימות",
"Configuration" : "הגדרות",
diff --git a/apps/files_external/l10n/he.json b/apps/files_external/l10n/he.json
index fbdcc287495..539534b3121 100644
--- a/apps/files_external/l10n/he.json
+++ b/apps/files_external/l10n/he.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "שגיאה ביצירת זוג מפתחות",
"Enable encryption" : "אפשר הצפנה",
"Enable previews" : "מאפשר תצוגות מקדימות",
+ "Enable sharing" : "הפעלת שיתוף",
"Check for changes" : "בדיקה אחר שינויים",
"Never" : "לעולם לא",
"Once every direct access" : "פעם אחת כל כניסה ישירה",
@@ -34,6 +35,8 @@
"(group)" : "(קבוצה)",
"Admin defined" : "הוגדר מנהל",
"Saved" : "נשמר",
+ "Saving..." : "שמירה…",
+ "Save" : "שמירה",
"Empty response from the server" : "תגובה ריקה מהשרת",
"Couldn't access. Please logout and login to activate this mount point" : "לא ניתן להכנס. יש להתנתק ולהתחבר כדי להפעיל את נקודת העיגון הזו",
"Couldn't get the information from the ownCloud server: {code} {type}" : "לא ניתן היה לקבל את המידע משרת ה- ownCloud: {code} {type}",
@@ -42,6 +45,8 @@
"External mount error" : "שגיאת עגינה חיצונית",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "לא ניתן היה לקבל את רשימת נקודות העיגון של כונן הרשת של Window: תגובה ריקה מהשרת",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "חלק מנקודות העיגון החיצוניות שהוגדרו אינן מחוברות. יש ללחוץ על השורה/ות האדומה/ות למידע נוסף",
+ "Username" : "שם משתמש",
+ "Password" : "סיסמא",
"Access key" : "מפתח כניסה",
"Secret key" : "מפתח סודי",
"Builtin" : "מובנה",
@@ -53,12 +58,11 @@
"Client ID" : "זיהוי לקוח",
"Client secret" : "סוד לקוח",
"OpenStack" : "OpenStack",
- "Username" : "שם משתמש",
- "Password" : "סיסמא",
"Tenant name" : "שם דייר",
"Identity endpoint URL" : "זהות נתיב נקודת קצה",
"Rackspace" : "חץ אחורה",
"API key" : "מפתח API",
+ "Global Credentails" : "אישורי אימות גלובלים",
"Log-in credentials, save in database" : "אישורי התחברות, נשמרים במסד הנתונים",
"Username and password" : "שם משתמש וסיסמא",
"Log-in credentials, save in session" : "אישורי התחברות, נשמרים במידע שיחה - סשן",
@@ -105,6 +109,7 @@
"Storage type" : "סוג אחסון",
"Scope" : "היקף",
"External Storage" : "אחסון חיצוני",
+ "Global Credentials" : "אישורי אימות גלובלים",
"Folder name" : "שם התיקייה",
"Authentication" : "אימות",
"Configuration" : "הגדרות",
diff --git a/apps/files_external/l10n/hi.js b/apps/files_external/l10n/hi.js
index 3d3b750ebd8..43b29acaddc 100644
--- a/apps/files_external/l10n/hi.js
+++ b/apps/files_external/l10n/hi.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"files_external",
{
"Personal" : "यक्तिगत",
+ "Saving..." : "सहेज रहे हैं...",
+ "Save" : "सहेजें",
"Username" : "प्रयोक्ता का नाम",
"Password" : "पासवर्ड",
"Share" : "साझा करें"
diff --git a/apps/files_external/l10n/hi.json b/apps/files_external/l10n/hi.json
index 6e1117f610e..c3b1ad8623b 100644
--- a/apps/files_external/l10n/hi.json
+++ b/apps/files_external/l10n/hi.json
@@ -1,5 +1,7 @@
{ "translations": {
"Personal" : "यक्तिगत",
+ "Saving..." : "सहेज रहे हैं...",
+ "Save" : "सहेजें",
"Username" : "प्रयोक्ता का नाम",
"Password" : "पासवर्ड",
"Share" : "साझा करें"
diff --git a/apps/files_external/l10n/hr.js b/apps/files_external/l10n/hr.js
index 8c632eba518..53a9c598c6d 100644
--- a/apps/files_external/l10n/hr.js
+++ b/apps/files_external/l10n/hr.js
@@ -11,13 +11,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Svi korisnici. Započnite unos za izbor korisnika ili grupe.",
"(group)" : "(grupa)",
"Saved" : "Spremljeno",
+ "Saving..." : "Spremanje...",
+ "Save" : "Spremi",
+ "Username" : "Korisničko ime",
+ "Password" : "Lozinka",
"None" : "Ništa",
"App key" : "Ključ za aplikacije",
"App secret" : "Tajna aplikacije",
"Client ID" : "ID klijenta",
"Client secret" : "Klijentski tajni ključ",
- "Username" : "Korisničko ime",
- "Password" : "Lozinka",
"Amazon S3" : "Amazon S3",
"Bucket" : "Kantica",
"Hostname" : "Naziv poslužitelja",
diff --git a/apps/files_external/l10n/hr.json b/apps/files_external/l10n/hr.json
index 610a42d46e2..cbb11276c24 100644
--- a/apps/files_external/l10n/hr.json
+++ b/apps/files_external/l10n/hr.json
@@ -9,13 +9,15 @@
"All users. Type to select user or group." : "Svi korisnici. Započnite unos za izbor korisnika ili grupe.",
"(group)" : "(grupa)",
"Saved" : "Spremljeno",
+ "Saving..." : "Spremanje...",
+ "Save" : "Spremi",
+ "Username" : "Korisničko ime",
+ "Password" : "Lozinka",
"None" : "Ništa",
"App key" : "Ključ za aplikacije",
"App secret" : "Tajna aplikacije",
"Client ID" : "ID klijenta",
"Client secret" : "Klijentski tajni ključ",
- "Username" : "Korisničko ime",
- "Password" : "Lozinka",
"Amazon S3" : "Amazon S3",
"Bucket" : "Kantica",
"Hostname" : "Naziv poslužitelja",
diff --git a/apps/files_external/l10n/hu_HU.js b/apps/files_external/l10n/hu_HU.js
index 4eb93dab872..4e8ceef7a4c 100644
--- a/apps/files_external/l10n/hu_HU.js
+++ b/apps/files_external/l10n/hu_HU.js
@@ -18,19 +18,21 @@ OC.L10N.register(
"(group)" : "(csoport)",
"Admin defined" : "Adminisztrátor definiálva",
"Saved" : "Elmentve",
+ "Saving..." : "Mentés...",
+ "Save" : "Mentés",
"Empty response from the server" : "Üres válasz a szervertől",
"Couldn't access. Please logout and login to activate this mount point" : "Nem férhető hozzá. Kérjük próbálj meg ki- és bejelentkezni a csatolási pont aktiválásához.",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Nem sikerült lekérdezni az információkat az ownCloud szerverről: {code} {type}",
"There was an error with message: " : "Hiba történt ezzel az üzenettel:",
"External mount error" : "Külső csatolási hiba",
+ "Username" : "Felhasználónév",
+ "Password" : "Jelszó",
"Access key" : "Hozzáférési kulcs",
"Secret key" : "Titkos kulcs",
"None" : "Egyik sem",
"App key" : "App kulcs",
"App secret" : "App titkos kulcs",
"Client secret" : "Kliens titkos",
- "Username" : "Felhasználónév",
- "Password" : "Jelszó",
"API key" : "API kulcs",
"Username and password" : "Felhasználónév és jelszó",
"RSA public key" : "RSA publikus kulcs",
diff --git a/apps/files_external/l10n/hu_HU.json b/apps/files_external/l10n/hu_HU.json
index bc50176e5a3..6966c5720ab 100644
--- a/apps/files_external/l10n/hu_HU.json
+++ b/apps/files_external/l10n/hu_HU.json
@@ -16,19 +16,21 @@
"(group)" : "(csoport)",
"Admin defined" : "Adminisztrátor definiálva",
"Saved" : "Elmentve",
+ "Saving..." : "Mentés...",
+ "Save" : "Mentés",
"Empty response from the server" : "Üres válasz a szervertől",
"Couldn't access. Please logout and login to activate this mount point" : "Nem férhető hozzá. Kérjük próbálj meg ki- és bejelentkezni a csatolási pont aktiválásához.",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Nem sikerült lekérdezni az információkat az ownCloud szerverről: {code} {type}",
"There was an error with message: " : "Hiba történt ezzel az üzenettel:",
"External mount error" : "Külső csatolási hiba",
+ "Username" : "Felhasználónév",
+ "Password" : "Jelszó",
"Access key" : "Hozzáférési kulcs",
"Secret key" : "Titkos kulcs",
"None" : "Egyik sem",
"App key" : "App kulcs",
"App secret" : "App titkos kulcs",
"Client secret" : "Kliens titkos",
- "Username" : "Felhasználónév",
- "Password" : "Jelszó",
"API key" : "API kulcs",
"Username and password" : "Felhasználónév és jelszó",
"RSA public key" : "RSA publikus kulcs",
diff --git a/apps/files_external/l10n/hy.js b/apps/files_external/l10n/hy.js
index 1092d48d575..ad4caac8057 100644
--- a/apps/files_external/l10n/hy.js
+++ b/apps/files_external/l10n/hy.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Personal" : "Անձնական",
"Never" : "Երբեք",
+ "Save" : "Պահպանել",
"Username" : "Օգտանուն",
"Password" : "Գաղտնաբառ",
"URL" : "URL",
diff --git a/apps/files_external/l10n/hy.json b/apps/files_external/l10n/hy.json
index 1fecd4f3da1..87c69207ad3 100644
--- a/apps/files_external/l10n/hy.json
+++ b/apps/files_external/l10n/hy.json
@@ -1,6 +1,7 @@
{ "translations": {
"Personal" : "Անձնական",
"Never" : "Երբեք",
+ "Save" : "Պահպանել",
"Username" : "Օգտանուն",
"Password" : "Գաղտնաբառ",
"URL" : "URL",
diff --git a/apps/files_external/l10n/ia.js b/apps/files_external/l10n/ia.js
index d13ee4ac10f..9e0c7cb322b 100644
--- a/apps/files_external/l10n/ia.js
+++ b/apps/files_external/l10n/ia.js
@@ -3,6 +3,8 @@ OC.L10N.register(
{
"Personal" : "Personal",
"Saved" : "Salveguardate",
+ "Saving..." : "Salveguardante...",
+ "Save" : "Salveguardar",
"Username" : "Nomine de usator",
"Password" : "Contrasigno",
"Region" : "Region",
diff --git a/apps/files_external/l10n/ia.json b/apps/files_external/l10n/ia.json
index 43562ce9e5b..a626ccda34f 100644
--- a/apps/files_external/l10n/ia.json
+++ b/apps/files_external/l10n/ia.json
@@ -1,6 +1,8 @@
{ "translations": {
"Personal" : "Personal",
"Saved" : "Salveguardate",
+ "Saving..." : "Salveguardante...",
+ "Save" : "Salveguardar",
"Username" : "Nomine de usator",
"Password" : "Contrasigno",
"Region" : "Region",
diff --git a/apps/files_external/l10n/id.js b/apps/files_external/l10n/id.js
index 15f33571ee6..5610025a9f6 100644
--- a/apps/files_external/l10n/id.js
+++ b/apps/files_external/l10n/id.js
@@ -32,6 +32,10 @@ OC.L10N.register(
"All users. Type to select user or group." : "Semua pengguna. Ketik untuk memilih pengguna atau grup.",
"(group)" : "(grup)",
"Saved" : "Disimpan",
+ "Saving..." : "Menyimpan...",
+ "Save" : "Simpan",
+ "Username" : "Nama Pengguna",
+ "Password" : "Sandi",
"Access key" : "Kunci akses",
"Secret key" : "Kunci rahasia",
"Builtin" : "Internal",
@@ -43,8 +47,6 @@ OC.L10N.register(
"Client ID" : "ID Klien",
"Client secret" : "Rahasia klien",
"OpenStack" : "OpenStack",
- "Username" : "Nama Pengguna",
- "Password" : "Sandi",
"Tenant name" : "Nama tenant",
"Identity endpoint URL" : "Identitas URL akhir",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/id.json b/apps/files_external/l10n/id.json
index 00f78599006..5722287c42c 100644
--- a/apps/files_external/l10n/id.json
+++ b/apps/files_external/l10n/id.json
@@ -30,6 +30,10 @@
"All users. Type to select user or group." : "Semua pengguna. Ketik untuk memilih pengguna atau grup.",
"(group)" : "(grup)",
"Saved" : "Disimpan",
+ "Saving..." : "Menyimpan...",
+ "Save" : "Simpan",
+ "Username" : "Nama Pengguna",
+ "Password" : "Sandi",
"Access key" : "Kunci akses",
"Secret key" : "Kunci rahasia",
"Builtin" : "Internal",
@@ -41,8 +45,6 @@
"Client ID" : "ID Klien",
"Client secret" : "Rahasia klien",
"OpenStack" : "OpenStack",
- "Username" : "Nama Pengguna",
- "Password" : "Sandi",
"Tenant name" : "Nama tenant",
"Identity endpoint URL" : "Identitas URL akhir",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/is.js b/apps/files_external/l10n/is.js
index a1edd11fc1c..0f60a1e3af3 100644
--- a/apps/files_external/l10n/is.js
+++ b/apps/files_external/l10n/is.js
@@ -5,9 +5,11 @@ OC.L10N.register(
"Grant access" : "Veita aðgengi",
"Access granted" : "Aðgengi veitt",
"Saved" : "Vistað",
- "None" : "Ekkert",
+ "Saving..." : "Er að vista ...",
+ "Save" : "Vista",
"Username" : "Notendanafn",
"Password" : "Lykilorð",
+ "None" : "Ekkert",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Host" : "Netþjónn",
diff --git a/apps/files_external/l10n/is.json b/apps/files_external/l10n/is.json
index 6d52ed3a896..0a700436b7f 100644
--- a/apps/files_external/l10n/is.json
+++ b/apps/files_external/l10n/is.json
@@ -3,9 +3,11 @@
"Grant access" : "Veita aðgengi",
"Access granted" : "Aðgengi veitt",
"Saved" : "Vistað",
- "None" : "Ekkert",
+ "Saving..." : "Er að vista ...",
+ "Save" : "Vista",
"Username" : "Notendanafn",
"Password" : "Lykilorð",
+ "None" : "Ekkert",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Host" : "Netþjónn",
diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js
index b6fad31111d..5b07891a8f4 100644
--- a/apps/files_external/l10n/it.js
+++ b/apps/files_external/l10n/it.js
@@ -37,14 +37,23 @@ OC.L10N.register(
"(group)" : "(gruppo)",
"Admin defined" : "Definito dall'amministratore",
"Saved" : "Salvato",
+ "Saving..." : "Salvataggio in corso...",
+ "Save" : "Salva",
"Empty response from the server" : "Risposta vuota dal server",
"Couldn't access. Please logout and login to activate this mount point" : "Impossibile accedere. Chiudi la sessione e accedi nuovamente per attivare questo punto di mount",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Impossibile ottenere le informazioni dal server ownCloud: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Impossibile ottenere l'elenco dei punti di mount esterni: {type}",
"There was an error with message: " : "Si è verificato un errore con il messaggio:",
"External mount error" : "Errore di mount esterno",
+ "external-storage" : "archiviazione-esterna",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossibile ottenere l'elenco dei punti di mount delle unità di rete Windows: risposta vuota dal server",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alcuni dei punti di mount esterni configurati non sono connessi. Fai clic sulle righe rosse per ulteriori informazioni",
+ "Please enter the credentials for the {mount} mount" : "Digita le credenziali per montare {mount}",
+ "Username" : "Nome utente",
+ "Password" : "Password",
+ "Credentials saved" : "Credenziali salvate",
+ "Credentials saving failed" : "Salvataggio delle credenziali non riuscito",
+ "Credentials required" : "Credenziali richieste",
"Access key" : "Chiave di accesso",
"Secret key" : "Chiave segreta",
"Builtin" : "Integrata",
@@ -56,12 +65,11 @@ OC.L10N.register(
"Client ID" : "ID client",
"Client secret" : "Segreto del client",
"OpenStack" : "OpenStack",
- "Username" : "Nome utente",
- "Password" : "Password",
"Tenant name" : "Nome tenant",
"Identity endpoint URL" : "URL endpoint delle identità",
"Rackspace" : "Rackspace",
"API key" : "Chiave API",
+ "Global Credentails" : "Credenziali globali",
"Log-in credentials, save in database" : "Credenziali di accesso, salva nel database",
"Username and password" : "Nome utente e password",
"Log-in credentials, save in session" : "Credenziali di accesso, salva nella sessione",
@@ -108,6 +116,7 @@ OC.L10N.register(
"Storage type" : "Tipo di archiviazione",
"Scope" : "Ambito",
"External Storage" : "Archiviazione esterna",
+ "Global Credentials" : "Credenziali globali",
"Folder name" : "Nome della cartella",
"Authentication" : "Autenticazione",
"Configuration" : "Configurazione",
diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json
index e253c22b6b1..8257027e0f3 100644
--- a/apps/files_external/l10n/it.json
+++ b/apps/files_external/l10n/it.json
@@ -35,14 +35,23 @@
"(group)" : "(gruppo)",
"Admin defined" : "Definito dall'amministratore",
"Saved" : "Salvato",
+ "Saving..." : "Salvataggio in corso...",
+ "Save" : "Salva",
"Empty response from the server" : "Risposta vuota dal server",
"Couldn't access. Please logout and login to activate this mount point" : "Impossibile accedere. Chiudi la sessione e accedi nuovamente per attivare questo punto di mount",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Impossibile ottenere le informazioni dal server ownCloud: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Impossibile ottenere l'elenco dei punti di mount esterni: {type}",
"There was an error with message: " : "Si è verificato un errore con il messaggio:",
"External mount error" : "Errore di mount esterno",
+ "external-storage" : "archiviazione-esterna",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossibile ottenere l'elenco dei punti di mount delle unità di rete Windows: risposta vuota dal server",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alcuni dei punti di mount esterni configurati non sono connessi. Fai clic sulle righe rosse per ulteriori informazioni",
+ "Please enter the credentials for the {mount} mount" : "Digita le credenziali per montare {mount}",
+ "Username" : "Nome utente",
+ "Password" : "Password",
+ "Credentials saved" : "Credenziali salvate",
+ "Credentials saving failed" : "Salvataggio delle credenziali non riuscito",
+ "Credentials required" : "Credenziali richieste",
"Access key" : "Chiave di accesso",
"Secret key" : "Chiave segreta",
"Builtin" : "Integrata",
@@ -54,12 +63,11 @@
"Client ID" : "ID client",
"Client secret" : "Segreto del client",
"OpenStack" : "OpenStack",
- "Username" : "Nome utente",
- "Password" : "Password",
"Tenant name" : "Nome tenant",
"Identity endpoint URL" : "URL endpoint delle identità",
"Rackspace" : "Rackspace",
"API key" : "Chiave API",
+ "Global Credentails" : "Credenziali globali",
"Log-in credentials, save in database" : "Credenziali di accesso, salva nel database",
"Username and password" : "Nome utente e password",
"Log-in credentials, save in session" : "Credenziali di accesso, salva nella sessione",
@@ -106,6 +114,7 @@
"Storage type" : "Tipo di archiviazione",
"Scope" : "Ambito",
"External Storage" : "Archiviazione esterna",
+ "Global Credentials" : "Credenziali globali",
"Folder name" : "Nome della cartella",
"Authentication" : "Autenticazione",
"Configuration" : "Configurazione",
diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js
index f14c07808ca..6e49805c03e 100644
--- a/apps/files_external/l10n/ja.js
+++ b/apps/files_external/l10n/ja.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "キーペアの生成エラー",
"Enable encryption" : "暗号化を有効に",
"Enable previews" : "プレビューを有効に",
+ "Enable sharing" : "共有の有効化",
"Check for changes" : "変更点を確認",
"Never" : "更新無",
"Once every direct access" : "直指定時のみ",
@@ -36,14 +37,23 @@ OC.L10N.register(
"(group)" : "(グループ)",
"Admin defined" : "管理者設定済",
"Saved" : "保存されました",
+ "Saving..." : "保存中...",
+ "Save" : "保存",
"Empty response from the server" : "サーバーから空の応答がありました",
"Couldn't access. Please logout and login to activate this mount point" : "アクセス出来ませんでした。このマウントポイントを有効にするには一度ログアウトしてからログインしてください。",
"Couldn't get the information from the ownCloud server: {code} {type}" : "ownCloud サーバーから情報を取得出来ませんでした。: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "外部マウントポイントのリストを取得出来ませんでした。: {type}",
"There was an error with message: " : "メッセージ付きのエラーが発生しました:",
"External mount error" : "外部マウントエラー",
+ "external-storage" : "外部ストレージ",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows ネットワークドライブのマウントポイントリストを取得出来ませんでした:サーバーから空の応答がありました",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "いくつかの設定済み外部マウントポイントに接続できませんでした。詳細情報は赤い行をクリックしてください",
+ "Please enter the credentials for the {mount} mount" : " {mount} のマウントのために必要な資格情報を入力してください",
+ "Username" : "ユーザー名",
+ "Password" : "パスワード",
+ "Credentials saved" : "資格情報を保存しました",
+ "Credentials saving failed" : "資格情報の保存に失敗しました",
+ "Credentials required" : "資格情報が必要です",
"Access key" : "アクセスキー",
"Secret key" : "シークレットキー",
"Builtin" : "ビルトイン",
@@ -55,8 +65,6 @@ OC.L10N.register(
"Client ID" : "クライアントID",
"Client secret" : "クライアント秘密キー",
"OpenStack" : "OpenStack",
- "Username" : "ユーザー名",
- "Password" : "パスワード",
"Tenant name" : "テナント名",
"Identity endpoint URL" : "認証エンドポイントURL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json
index df6f7f44618..82e2970fd86 100644
--- a/apps/files_external/l10n/ja.json
+++ b/apps/files_external/l10n/ja.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "キーペアの生成エラー",
"Enable encryption" : "暗号化を有効に",
"Enable previews" : "プレビューを有効に",
+ "Enable sharing" : "共有の有効化",
"Check for changes" : "変更点を確認",
"Never" : "更新無",
"Once every direct access" : "直指定時のみ",
@@ -34,14 +35,23 @@
"(group)" : "(グループ)",
"Admin defined" : "管理者設定済",
"Saved" : "保存されました",
+ "Saving..." : "保存中...",
+ "Save" : "保存",
"Empty response from the server" : "サーバーから空の応答がありました",
"Couldn't access. Please logout and login to activate this mount point" : "アクセス出来ませんでした。このマウントポイントを有効にするには一度ログアウトしてからログインしてください。",
"Couldn't get the information from the ownCloud server: {code} {type}" : "ownCloud サーバーから情報を取得出来ませんでした。: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "外部マウントポイントのリストを取得出来ませんでした。: {type}",
"There was an error with message: " : "メッセージ付きのエラーが発生しました:",
"External mount error" : "外部マウントエラー",
+ "external-storage" : "外部ストレージ",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows ネットワークドライブのマウントポイントリストを取得出来ませんでした:サーバーから空の応答がありました",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "いくつかの設定済み外部マウントポイントに接続できませんでした。詳細情報は赤い行をクリックしてください",
+ "Please enter the credentials for the {mount} mount" : " {mount} のマウントのために必要な資格情報を入力してください",
+ "Username" : "ユーザー名",
+ "Password" : "パスワード",
+ "Credentials saved" : "資格情報を保存しました",
+ "Credentials saving failed" : "資格情報の保存に失敗しました",
+ "Credentials required" : "資格情報が必要です",
"Access key" : "アクセスキー",
"Secret key" : "シークレットキー",
"Builtin" : "ビルトイン",
@@ -53,8 +63,6 @@
"Client ID" : "クライアントID",
"Client secret" : "クライアント秘密キー",
"OpenStack" : "OpenStack",
- "Username" : "ユーザー名",
- "Password" : "パスワード",
"Tenant name" : "テナント名",
"Identity endpoint URL" : "認証エンドポイントURL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/ka_GE.js b/apps/files_external/l10n/ka_GE.js
index e82c778862e..f6f98b1b5dd 100644
--- a/apps/files_external/l10n/ka_GE.js
+++ b/apps/files_external/l10n/ka_GE.js
@@ -5,9 +5,11 @@ OC.L10N.register(
"Personal" : "პირადი",
"Grant access" : "დაშვების მინიჭება",
"Access granted" : "დაშვება მინიჭებულია",
- "None" : "არა",
+ "Saving..." : "შენახვა...",
+ "Save" : "შენახვა",
"Username" : "მომხმარებლის სახელი",
"Password" : "პაროლი",
+ "None" : "არა",
"API key" : "API გასაღები",
"Port" : "პორტი",
"Region" : "რეგიონი",
diff --git a/apps/files_external/l10n/ka_GE.json b/apps/files_external/l10n/ka_GE.json
index a706d42225b..3ffba305a95 100644
--- a/apps/files_external/l10n/ka_GE.json
+++ b/apps/files_external/l10n/ka_GE.json
@@ -3,9 +3,11 @@
"Personal" : "პირადი",
"Grant access" : "დაშვების მინიჭება",
"Access granted" : "დაშვება მინიჭებულია",
- "None" : "არა",
+ "Saving..." : "შენახვა...",
+ "Save" : "შენახვა",
"Username" : "მომხმარებლის სახელი",
"Password" : "პაროლი",
+ "None" : "არა",
"API key" : "API გასაღები",
"Port" : "პორტი",
"Region" : "რეგიონი",
diff --git a/apps/files_external/l10n/km.js b/apps/files_external/l10n/km.js
index e5aad9697ae..2c7b69e872b 100644
--- a/apps/files_external/l10n/km.js
+++ b/apps/files_external/l10n/km.js
@@ -6,9 +6,11 @@ OC.L10N.register(
"Grant access" : "ទទួល​សិទ្ធិ​ចូល",
"Access granted" : "បាន​ទទួល​សិទ្ធិ​ចូល",
"Saved" : "បាន​រក្សាទុក",
- "None" : "គ្មាន",
+ "Saving..." : "កំពុង​រក្សាទុក",
+ "Save" : "រក្សាទុក",
"Username" : "ឈ្មោះ​អ្នកប្រើ",
"Password" : "ពាក្យសម្ងាត់",
+ "None" : "គ្មាន",
"Port" : "ច្រក",
"WebDAV" : "WebDAV",
"URL" : "URL",
diff --git a/apps/files_external/l10n/km.json b/apps/files_external/l10n/km.json
index 71213394d53..518d4ff260a 100644
--- a/apps/files_external/l10n/km.json
+++ b/apps/files_external/l10n/km.json
@@ -4,9 +4,11 @@
"Grant access" : "ទទួល​សិទ្ធិ​ចូល",
"Access granted" : "បាន​ទទួល​សិទ្ធិ​ចូល",
"Saved" : "បាន​រក្សាទុក",
- "None" : "គ្មាន",
+ "Saving..." : "កំពុង​រក្សាទុក",
+ "Save" : "រក្សាទុក",
"Username" : "ឈ្មោះ​អ្នកប្រើ",
"Password" : "ពាក្យសម្ងាត់",
+ "None" : "គ្មាន",
"Port" : "ច្រក",
"WebDAV" : "WebDAV",
"URL" : "URL",
diff --git a/apps/files_external/l10n/kn.js b/apps/files_external/l10n/kn.js
index 9d01033e356..b92c9382cd4 100644
--- a/apps/files_external/l10n/kn.js
+++ b/apps/files_external/l10n/kn.js
@@ -3,9 +3,11 @@ OC.L10N.register(
{
"Personal" : "ವೈಯಕ್ತಿಕ",
"Saved" : "ಉಳಿಸಿದ",
- "None" : "ಯಾವುದೂ ಇಲ್ಲ",
+ "Saving..." : "ಉಳಿಸಲಾಗುತ್ತಿದೆ ...",
+ "Save" : "ಉಳಿಸಿ",
"Username" : "ಬಳಕೆಯ ಹೆಸರು",
"Password" : "ಗುಪ್ತ ಪದ",
+ "None" : "ಯಾವುದೂ ಇಲ್ಲ",
"Port" : "ರೇವು",
"WebDAV" : "WebDAV",
"URL" : "ಜಾಲದ ಕೊಂಡಿ",
diff --git a/apps/files_external/l10n/kn.json b/apps/files_external/l10n/kn.json
index 0380f431d1e..9841df0ae93 100644
--- a/apps/files_external/l10n/kn.json
+++ b/apps/files_external/l10n/kn.json
@@ -1,9 +1,11 @@
{ "translations": {
"Personal" : "ವೈಯಕ್ತಿಕ",
"Saved" : "ಉಳಿಸಿದ",
- "None" : "ಯಾವುದೂ ಇಲ್ಲ",
+ "Saving..." : "ಉಳಿಸಲಾಗುತ್ತಿದೆ ...",
+ "Save" : "ಉಳಿಸಿ",
"Username" : "ಬಳಕೆಯ ಹೆಸರು",
"Password" : "ಗುಪ್ತ ಪದ",
+ "None" : "ಯಾವುದೂ ಇಲ್ಲ",
"Port" : "ರೇವು",
"WebDAV" : "WebDAV",
"URL" : "ಜಾಲದ ಕೊಂಡಿ",
diff --git a/apps/files_external/l10n/ko.js b/apps/files_external/l10n/ko.js
index df30d86ca13..4ce4907cbd0 100644
--- a/apps/files_external/l10n/ko.js
+++ b/apps/files_external/l10n/ko.js
@@ -33,6 +33,10 @@ OC.L10N.register(
"All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오",
"(group)" : "(그룹)",
"Saved" : "저장됨",
+ "Saving..." : "저장 중...",
+ "Save" : "저장",
+ "Username" : "사용자 이름",
+ "Password" : "암호",
"Access key" : "접근 키",
"Secret key" : "비밀 키",
"Builtin" : "내장",
@@ -44,8 +48,6 @@ OC.L10N.register(
"Client ID" : "클라이언트 ID",
"Client secret" : "클라이언트 비밀 값",
"OpenStack" : "OpenStack",
- "Username" : "사용자 이름",
- "Password" : "암호",
"Tenant name" : "테넌트 이름",
"Identity endpoint URL" : "아이덴티티 끝점(Endpoint) URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/ko.json b/apps/files_external/l10n/ko.json
index a5f4b4946ca..a55e4f6da6d 100644
--- a/apps/files_external/l10n/ko.json
+++ b/apps/files_external/l10n/ko.json
@@ -31,6 +31,10 @@
"All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오",
"(group)" : "(그룹)",
"Saved" : "저장됨",
+ "Saving..." : "저장 중...",
+ "Save" : "저장",
+ "Username" : "사용자 이름",
+ "Password" : "암호",
"Access key" : "접근 키",
"Secret key" : "비밀 키",
"Builtin" : "내장",
@@ -42,8 +46,6 @@
"Client ID" : "클라이언트 ID",
"Client secret" : "클라이언트 비밀 값",
"OpenStack" : "OpenStack",
- "Username" : "사용자 이름",
- "Password" : "암호",
"Tenant name" : "테넌트 이름",
"Identity endpoint URL" : "아이덴티티 끝점(Endpoint) URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/ku_IQ.js b/apps/files_external/l10n/ku_IQ.js
index 72c1e8313be..49211f62ef6 100644
--- a/apps/files_external/l10n/ku_IQ.js
+++ b/apps/files_external/l10n/ku_IQ.js
@@ -1,9 +1,11 @@
OC.L10N.register(
"files_external",
{
- "None" : "هیچ",
+ "Saving..." : "پاشکه‌وتده‌کات...",
+ "Save" : "پاشکه‌وتکردن",
"Username" : "ناوی به‌کارهێنه‌ر",
"Password" : "وشەی تێپەربو",
+ "None" : "هیچ",
"URL" : "ناونیشانی به‌سته‌ر",
"Location" : "شوێن",
"Share" : "هاوبەشی کردن",
diff --git a/apps/files_external/l10n/ku_IQ.json b/apps/files_external/l10n/ku_IQ.json
index 9ef5a71e818..cb73bd6b8b6 100644
--- a/apps/files_external/l10n/ku_IQ.json
+++ b/apps/files_external/l10n/ku_IQ.json
@@ -1,7 +1,9 @@
{ "translations": {
- "None" : "هیچ",
+ "Saving..." : "پاشکه‌وتده‌کات...",
+ "Save" : "پاشکه‌وتکردن",
"Username" : "ناوی به‌کارهێنه‌ر",
"Password" : "وشەی تێپەربو",
+ "None" : "هیچ",
"URL" : "ناونیشانی به‌سته‌ر",
"Location" : "شوێن",
"Share" : "هاوبەشی کردن",
diff --git a/apps/files_external/l10n/lb.js b/apps/files_external/l10n/lb.js
index 7e03d3b1b99..67558b46275 100644
--- a/apps/files_external/l10n/lb.js
+++ b/apps/files_external/l10n/lb.js
@@ -3,6 +3,8 @@ OC.L10N.register(
{
"Personal" : "Perséinlech",
"Saved" : "Gespäichert",
+ "Saving..." : "Speicheren...",
+ "Save" : "Späicheren",
"Username" : "Benotzernumm",
"Password" : "Passwuert",
"Port" : "Port",
diff --git a/apps/files_external/l10n/lb.json b/apps/files_external/l10n/lb.json
index 5c6797533b5..8d570532dd1 100644
--- a/apps/files_external/l10n/lb.json
+++ b/apps/files_external/l10n/lb.json
@@ -1,6 +1,8 @@
{ "translations": {
"Personal" : "Perséinlech",
"Saved" : "Gespäichert",
+ "Saving..." : "Speicheren...",
+ "Save" : "Späicheren",
"Username" : "Benotzernumm",
"Password" : "Passwuert",
"Port" : "Port",
diff --git a/apps/files_external/l10n/lt_LT.js b/apps/files_external/l10n/lt_LT.js
index 3a871070f45..c08e6d60781 100644
--- a/apps/files_external/l10n/lt_LT.js
+++ b/apps/files_external/l10n/lt_LT.js
@@ -9,9 +9,11 @@ OC.L10N.register(
"Grant access" : "Suteikti priėjimą",
"Access granted" : "Priėjimas suteiktas",
"Saved" : "Išsaugoti",
- "None" : "Nieko",
+ "Saving..." : "Saugoma...",
+ "Save" : "Išsaugoti",
"Username" : "Prisijungimo vardas",
"Password" : "Slaptažodis",
+ "None" : "Nieko",
"API key" : "API raktas",
"Port" : "Prievadas",
"Region" : "Regionas",
diff --git a/apps/files_external/l10n/lt_LT.json b/apps/files_external/l10n/lt_LT.json
index 854f753acaf..4fcc86df00b 100644
--- a/apps/files_external/l10n/lt_LT.json
+++ b/apps/files_external/l10n/lt_LT.json
@@ -7,9 +7,11 @@
"Grant access" : "Suteikti priėjimą",
"Access granted" : "Priėjimas suteiktas",
"Saved" : "Išsaugoti",
- "None" : "Nieko",
+ "Saving..." : "Saugoma...",
+ "Save" : "Išsaugoti",
"Username" : "Prisijungimo vardas",
"Password" : "Slaptažodis",
+ "None" : "Nieko",
"API key" : "API raktas",
"Port" : "Prievadas",
"Region" : "Regionas",
diff --git a/apps/files_external/l10n/lv.js b/apps/files_external/l10n/lv.js
index d6733a1d9c0..c3ae3cb2fce 100644
--- a/apps/files_external/l10n/lv.js
+++ b/apps/files_external/l10n/lv.js
@@ -7,9 +7,11 @@ OC.L10N.register(
"Access granted" : "Piešķirta pieeja",
"Enable encryption" : "Ieslēgt šifrēšanu",
"Saved" : "Saglabāts",
- "None" : "Nav",
+ "Saving..." : "Saglabā...",
+ "Save" : "Saglabāt",
"Username" : "Lietotājvārds",
"Password" : "Parole",
+ "None" : "Nav",
"Port" : "Ports",
"WebDAV" : "WebDAV",
"URL" : "URL",
diff --git a/apps/files_external/l10n/lv.json b/apps/files_external/l10n/lv.json
index 57fe7cbc048..61dfeffa0e1 100644
--- a/apps/files_external/l10n/lv.json
+++ b/apps/files_external/l10n/lv.json
@@ -5,9 +5,11 @@
"Access granted" : "Piešķirta pieeja",
"Enable encryption" : "Ieslēgt šifrēšanu",
"Saved" : "Saglabāts",
- "None" : "Nav",
+ "Saving..." : "Saglabā...",
+ "Save" : "Saglabāt",
"Username" : "Lietotājvārds",
"Password" : "Parole",
+ "None" : "Nav",
"Port" : "Ports",
"WebDAV" : "WebDAV",
"URL" : "URL",
diff --git a/apps/files_external/l10n/mk.js b/apps/files_external/l10n/mk.js
index e75f1afa620..a2826d5caea 100644
--- a/apps/files_external/l10n/mk.js
+++ b/apps/files_external/l10n/mk.js
@@ -5,9 +5,11 @@ OC.L10N.register(
"Grant access" : "Дозволи пристап",
"Access granted" : "Пристапот е дозволен",
"Saved" : "Снимено",
- "None" : "Ништо",
+ "Saving..." : "Снимам...",
+ "Save" : "Сними",
"Username" : "Корисничко име",
"Password" : "Лозинка",
+ "None" : "Ништо",
"API key" : "API key",
"Port" : "Порта",
"Region" : "Регион",
diff --git a/apps/files_external/l10n/mk.json b/apps/files_external/l10n/mk.json
index ae095b46310..e41cb7d4ae0 100644
--- a/apps/files_external/l10n/mk.json
+++ b/apps/files_external/l10n/mk.json
@@ -3,9 +3,11 @@
"Grant access" : "Дозволи пристап",
"Access granted" : "Пристапот е дозволен",
"Saved" : "Снимено",
- "None" : "Ништо",
+ "Saving..." : "Снимам...",
+ "Save" : "Сними",
"Username" : "Корисничко име",
"Password" : "Лозинка",
+ "None" : "Ништо",
"API key" : "API key",
"Port" : "Порта",
"Region" : "Регион",
diff --git a/apps/files_external/l10n/mn.js b/apps/files_external/l10n/mn.js
index a83f8310862..c451e4d7588 100644
--- a/apps/files_external/l10n/mn.js
+++ b/apps/files_external/l10n/mn.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"files_external",
{
+ "Save" : "Хадгалах",
"Username" : "Хэрэглэгчийн нэр",
"Password" : "Нууц үг",
"Share" : "Түгээх"
diff --git a/apps/files_external/l10n/mn.json b/apps/files_external/l10n/mn.json
index e28fa6e52ad..2296b74bf50 100644
--- a/apps/files_external/l10n/mn.json
+++ b/apps/files_external/l10n/mn.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Save" : "Хадгалах",
"Username" : "Хэрэглэгчийн нэр",
"Password" : "Нууц үг",
"Share" : "Түгээх"
diff --git a/apps/files_external/l10n/ms_MY.js b/apps/files_external/l10n/ms_MY.js
index 1b28ef4226a..0736bcbd436 100644
--- a/apps/files_external/l10n/ms_MY.js
+++ b/apps/files_external/l10n/ms_MY.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"files_external",
{
"Personal" : "Peribadi",
+ "Saving..." : "Sedang menyimpan...",
+ "Save" : "Simpan",
"Username" : "Nama pengguna",
"Password" : "Kata laluan",
"Region" : "Wilayah",
diff --git a/apps/files_external/l10n/ms_MY.json b/apps/files_external/l10n/ms_MY.json
index 79293106272..d84f5859451 100644
--- a/apps/files_external/l10n/ms_MY.json
+++ b/apps/files_external/l10n/ms_MY.json
@@ -1,5 +1,7 @@
{ "translations": {
"Personal" : "Peribadi",
+ "Saving..." : "Sedang menyimpan...",
+ "Save" : "Simpan",
"Username" : "Nama pengguna",
"Password" : "Kata laluan",
"Region" : "Wilayah",
diff --git a/apps/files_external/l10n/nb_NO.js b/apps/files_external/l10n/nb_NO.js
index fc791fe60ab..dcb9da4ac1f 100644
--- a/apps/files_external/l10n/nb_NO.js
+++ b/apps/files_external/l10n/nb_NO.js
@@ -35,6 +35,8 @@ OC.L10N.register(
"(group)" : "(gruppe)",
"Admin defined" : "Admin-definert",
"Saved" : "Lagret",
+ "Saving..." : "Lagrer...",
+ "Save" : "Lagre",
"Empty response from the server" : "Tomt svar fra serveren",
"Couldn't access. Please logout and login to activate this mount point" : "Fikk ikke tilgang. Vennligst logg ut og inn igjen for å aktivere dette oppkoblingspunktet.",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Klarte ikke å hente informasjon fra ownCloud-serveren: {code} {type}",
@@ -43,6 +45,8 @@ OC.L10N.register(
"External mount error" : "Ekstern oppkoblingsfeil",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Klarte ikke å hente listen over oppkoblingspunkter for Windows nettverk-disker: tomt svar fra serveren",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Noen av de konfigurerte eksterne oppkoblingspunktene er ikke tilkoblet. Klikk på de røde raden(e) for mer informasjon.",
+ "Username" : "Brukernavn",
+ "Password" : "Passord",
"Access key" : "Tilgangsnøkkel",
"Secret key" : "Hemmelig nøkkel",
"Builtin" : "Innebygget",
@@ -54,8 +58,6 @@ OC.L10N.register(
"Client ID" : "Client ID",
"Client secret" : "Client secret",
"OpenStack" : "OpenStack",
- "Username" : "Brukernavn",
- "Password" : "Passord",
"Tenant name" : "Prosjektnavn",
"Identity endpoint URL" : "URL for identitets-endepunkt",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/nb_NO.json b/apps/files_external/l10n/nb_NO.json
index 0e956952948..c7f56d21534 100644
--- a/apps/files_external/l10n/nb_NO.json
+++ b/apps/files_external/l10n/nb_NO.json
@@ -33,6 +33,8 @@
"(group)" : "(gruppe)",
"Admin defined" : "Admin-definert",
"Saved" : "Lagret",
+ "Saving..." : "Lagrer...",
+ "Save" : "Lagre",
"Empty response from the server" : "Tomt svar fra serveren",
"Couldn't access. Please logout and login to activate this mount point" : "Fikk ikke tilgang. Vennligst logg ut og inn igjen for å aktivere dette oppkoblingspunktet.",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Klarte ikke å hente informasjon fra ownCloud-serveren: {code} {type}",
@@ -41,6 +43,8 @@
"External mount error" : "Ekstern oppkoblingsfeil",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Klarte ikke å hente listen over oppkoblingspunkter for Windows nettverk-disker: tomt svar fra serveren",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Noen av de konfigurerte eksterne oppkoblingspunktene er ikke tilkoblet. Klikk på de røde raden(e) for mer informasjon.",
+ "Username" : "Brukernavn",
+ "Password" : "Passord",
"Access key" : "Tilgangsnøkkel",
"Secret key" : "Hemmelig nøkkel",
"Builtin" : "Innebygget",
@@ -52,8 +56,6 @@
"Client ID" : "Client ID",
"Client secret" : "Client secret",
"OpenStack" : "OpenStack",
- "Username" : "Brukernavn",
- "Password" : "Passord",
"Tenant name" : "Prosjektnavn",
"Identity endpoint URL" : "URL for identitets-endepunkt",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/nds.js b/apps/files_external/l10n/nds.js
index b4649fe681a..f86bc638795 100644
--- a/apps/files_external/l10n/nds.js
+++ b/apps/files_external/l10n/nds.js
@@ -32,6 +32,9 @@ OC.L10N.register(
"All users. Type to select user or group." : "Alle Benutzer. Tippe, um eine Benutzergruppe auszuwählen.",
"(group)" : "(Gruppe)",
"Saved" : "Gespeichert",
+ "Saving..." : "Speichern...",
+ "Username" : "Benutzername",
+ "Password" : "Passwort",
"Access key" : "Schlüssel für Zugriff",
"Secret key" : "Geheimer Schlüssel",
"Builtin" : "Eingebaut",
@@ -43,8 +46,6 @@ OC.L10N.register(
"Client ID" : "Client ID",
"Client secret" : "Client Geheimnis",
"OpenStack" : "OpenStack",
- "Username" : "Benutzername",
- "Password" : "Passwort",
"API key" : "API Schlüssel",
"Username and password" : "Benutzername und Passwort",
"RSA public key" : "Öffentlicher RSA Schlüssel",
diff --git a/apps/files_external/l10n/nds.json b/apps/files_external/l10n/nds.json
index 75e36016384..c22b072cdf5 100644
--- a/apps/files_external/l10n/nds.json
+++ b/apps/files_external/l10n/nds.json
@@ -30,6 +30,9 @@
"All users. Type to select user or group." : "Alle Benutzer. Tippe, um eine Benutzergruppe auszuwählen.",
"(group)" : "(Gruppe)",
"Saved" : "Gespeichert",
+ "Saving..." : "Speichern...",
+ "Username" : "Benutzername",
+ "Password" : "Passwort",
"Access key" : "Schlüssel für Zugriff",
"Secret key" : "Geheimer Schlüssel",
"Builtin" : "Eingebaut",
@@ -41,8 +44,6 @@
"Client ID" : "Client ID",
"Client secret" : "Client Geheimnis",
"OpenStack" : "OpenStack",
- "Username" : "Benutzername",
- "Password" : "Passwort",
"API key" : "API Schlüssel",
"Username and password" : "Benutzername und Passwort",
"RSA public key" : "Öffentlicher RSA Schlüssel",
diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js
index a3f3ca9a566..243dde9a6c3 100644
--- a/apps/files_external/l10n/nl.js
+++ b/apps/files_external/l10n/nl.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "Fout bij genereren sleutelpaar",
"Enable encryption" : "Versleuteling inschakelen",
"Enable previews" : "Activeren voorbeelden",
+ "Enable sharing" : "Activeren delen",
"Check for changes" : "Controleren op wijzigingen",
"Never" : "Nooit",
"Once every direct access" : "Een keer bij elke directe toegang",
@@ -36,14 +37,23 @@ OC.L10N.register(
"(group)" : "(groep)",
"Admin defined" : "Beheerder gedefinieerd",
"Saved" : "Bewaard",
+ "Saving..." : "Opslaan",
+ "Save" : "Bewaren",
"Empty response from the server" : "Lege reactie van de server",
"Couldn't access. Please logout and login to activate this mount point" : "Geen toegang. Log uit en opnieuw in om dit koppelpunt te activeren",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Kon geen informatie van de ownCloud server krijgen: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Kon geen overzicht met externe koppelpunten krijgen: {type}",
"There was an error with message: " : "Er was een fout met de volgende melding:",
"External mount error" : "Extern koppelpunt fout",
+ "external-storage" : "externe opslag",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Kon geen overzicht met Windows netwerk koppelpunten krijgen: lege reactie van de server",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sommige van de geconfigureerde koppelpunten zijn niet verbonden. Klok op de rode rij(en) voor meer informatie",
+ "Please enter the credentials for the {mount} mount" : "Geef de inloggegeven sop voor de {mount} mount",
+ "Username" : "Gebruikersnaam",
+ "Password" : "Wachtwoord",
+ "Credentials saved" : "Inloggegevens opgeslagen",
+ "Credentials saving failed" : "Opslaan inloggegevens mislukt",
+ "Credentials required" : "Inloggegevens vereist",
"Access key" : "Access Key",
"Secret key" : "Geheime sleutel",
"Builtin" : "Ingebouwd",
@@ -55,13 +65,15 @@ OC.L10N.register(
"Client ID" : "Client ID",
"Client secret" : "Client secret",
"OpenStack" : "OpenStack",
- "Username" : "Gebruikersnaam",
- "Password" : "Wachtwoord",
"Tenant name" : "Naam tenant",
"Identity endpoint URL" : "Identiteiten endpoint URL",
"Rackspace" : "Rackspace",
"API key" : "API sleutel",
+ "Global Credentails" : "Globale inloggegevens",
+ "Log-in credentials, save in database" : "Inloggegevens, opslaan in database",
"Username and password" : "Gebruikersnaam en wachtwoord",
+ "Log-in credentials, save in session" : "Inloggegevens, opslaan in sessie",
+ "User entered, store in database" : "Gebruiker opgegeven, opslaan in database",
"RSA public key" : "RSA publieke sleutel",
"Public key" : "Publieke sleutel",
"Amazon S3" : "Amazon S3",
@@ -104,6 +116,7 @@ OC.L10N.register(
"Storage type" : "Opslagtype",
"Scope" : "Scope",
"External Storage" : "Externe opslag",
+ "Global Credentials" : "Globale inloggegevens",
"Folder name" : "Mapnaam",
"Authentication" : "Authenticatie",
"Configuration" : "Configuratie",
diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json
index 8654cdc662d..bcc9149945b 100644
--- a/apps/files_external/l10n/nl.json
+++ b/apps/files_external/l10n/nl.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "Fout bij genereren sleutelpaar",
"Enable encryption" : "Versleuteling inschakelen",
"Enable previews" : "Activeren voorbeelden",
+ "Enable sharing" : "Activeren delen",
"Check for changes" : "Controleren op wijzigingen",
"Never" : "Nooit",
"Once every direct access" : "Een keer bij elke directe toegang",
@@ -34,14 +35,23 @@
"(group)" : "(groep)",
"Admin defined" : "Beheerder gedefinieerd",
"Saved" : "Bewaard",
+ "Saving..." : "Opslaan",
+ "Save" : "Bewaren",
"Empty response from the server" : "Lege reactie van de server",
"Couldn't access. Please logout and login to activate this mount point" : "Geen toegang. Log uit en opnieuw in om dit koppelpunt te activeren",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Kon geen informatie van de ownCloud server krijgen: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Kon geen overzicht met externe koppelpunten krijgen: {type}",
"There was an error with message: " : "Er was een fout met de volgende melding:",
"External mount error" : "Extern koppelpunt fout",
+ "external-storage" : "externe opslag",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Kon geen overzicht met Windows netwerk koppelpunten krijgen: lege reactie van de server",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sommige van de geconfigureerde koppelpunten zijn niet verbonden. Klok op de rode rij(en) voor meer informatie",
+ "Please enter the credentials for the {mount} mount" : "Geef de inloggegeven sop voor de {mount} mount",
+ "Username" : "Gebruikersnaam",
+ "Password" : "Wachtwoord",
+ "Credentials saved" : "Inloggegevens opgeslagen",
+ "Credentials saving failed" : "Opslaan inloggegevens mislukt",
+ "Credentials required" : "Inloggegevens vereist",
"Access key" : "Access Key",
"Secret key" : "Geheime sleutel",
"Builtin" : "Ingebouwd",
@@ -53,13 +63,15 @@
"Client ID" : "Client ID",
"Client secret" : "Client secret",
"OpenStack" : "OpenStack",
- "Username" : "Gebruikersnaam",
- "Password" : "Wachtwoord",
"Tenant name" : "Naam tenant",
"Identity endpoint URL" : "Identiteiten endpoint URL",
"Rackspace" : "Rackspace",
"API key" : "API sleutel",
+ "Global Credentails" : "Globale inloggegevens",
+ "Log-in credentials, save in database" : "Inloggegevens, opslaan in database",
"Username and password" : "Gebruikersnaam en wachtwoord",
+ "Log-in credentials, save in session" : "Inloggegevens, opslaan in sessie",
+ "User entered, store in database" : "Gebruiker opgegeven, opslaan in database",
"RSA public key" : "RSA publieke sleutel",
"Public key" : "Publieke sleutel",
"Amazon S3" : "Amazon S3",
@@ -102,6 +114,7 @@
"Storage type" : "Opslagtype",
"Scope" : "Scope",
"External Storage" : "Externe opslag",
+ "Global Credentials" : "Globale inloggegevens",
"Folder name" : "Mapnaam",
"Authentication" : "Authenticatie",
"Configuration" : "Configuratie",
diff --git a/apps/files_external/l10n/nn_NO.js b/apps/files_external/l10n/nn_NO.js
index 325a8a57528..7d07e956688 100644
--- a/apps/files_external/l10n/nn_NO.js
+++ b/apps/files_external/l10n/nn_NO.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"files_external",
{
"Personal" : "Personleg",
+ "Saving..." : "Lagrar …",
+ "Save" : "Lagra",
"Username" : "Brukarnamn",
"Password" : "Passord",
"Region" : "Region/fylke",
diff --git a/apps/files_external/l10n/nn_NO.json b/apps/files_external/l10n/nn_NO.json
index 26e6c02d806..46c27c8197f 100644
--- a/apps/files_external/l10n/nn_NO.json
+++ b/apps/files_external/l10n/nn_NO.json
@@ -1,5 +1,7 @@
{ "translations": {
"Personal" : "Personleg",
+ "Saving..." : "Lagrar …",
+ "Save" : "Lagra",
"Username" : "Brukarnamn",
"Password" : "Passord",
"Region" : "Region/fylke",
diff --git a/apps/files_external/l10n/oc.js b/apps/files_external/l10n/oc.js
index 716326f1cae..a11b664fe5e 100644
--- a/apps/files_external/l10n/oc.js
+++ b/apps/files_external/l10n/oc.js
@@ -33,6 +33,10 @@ OC.L10N.register(
"All users. Type to select user or group." : "Totes los utilizaires. Clicatz aicí per restrénher.",
"(group)" : "(grop)",
"Saved" : "Enregistrat",
+ "Saving..." : "Enregistrament...",
+ "Save" : "Enregistrar",
+ "Username" : "Nom d'utilizaire",
+ "Password" : "Senhal",
"Access key" : "Clau d'accès",
"Secret key" : "Clau secreta",
"Builtin" : "Integrat",
@@ -44,8 +48,6 @@ OC.L10N.register(
"Client ID" : "ID Client",
"Client secret" : "Secret client",
"OpenStack" : "OpenStack",
- "Username" : "Nom d'utilizaire",
- "Password" : "Senhal",
"Tenant name" : "Tenant name",
"Identity endpoint URL" : "Identity endpoint URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/oc.json b/apps/files_external/l10n/oc.json
index bc882de1456..09c99f60adb 100644
--- a/apps/files_external/l10n/oc.json
+++ b/apps/files_external/l10n/oc.json
@@ -31,6 +31,10 @@
"All users. Type to select user or group." : "Totes los utilizaires. Clicatz aicí per restrénher.",
"(group)" : "(grop)",
"Saved" : "Enregistrat",
+ "Saving..." : "Enregistrament...",
+ "Save" : "Enregistrar",
+ "Username" : "Nom d'utilizaire",
+ "Password" : "Senhal",
"Access key" : "Clau d'accès",
"Secret key" : "Clau secreta",
"Builtin" : "Integrat",
@@ -42,8 +46,6 @@
"Client ID" : "ID Client",
"Client secret" : "Secret client",
"OpenStack" : "OpenStack",
- "Username" : "Nom d'utilizaire",
- "Password" : "Senhal",
"Tenant name" : "Tenant name",
"Identity endpoint URL" : "Identity endpoint URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/pa.js b/apps/files_external/l10n/pa.js
index ff376198ae4..5a2de008d1e 100644
--- a/apps/files_external/l10n/pa.js
+++ b/apps/files_external/l10n/pa.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"files_external",
{
+ "Saving..." : "...ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ",
"Username" : "ਯੂਜ਼ਰ-ਨਾਂ",
"Password" : "ਪਾਸਵਰ",
"ownCloud" : "ਓਵਨਕਲਾਉਡ",
diff --git a/apps/files_external/l10n/pa.json b/apps/files_external/l10n/pa.json
index a2ba80af130..4814737ab5a 100644
--- a/apps/files_external/l10n/pa.json
+++ b/apps/files_external/l10n/pa.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Saving..." : "...ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ",
"Username" : "ਯੂਜ਼ਰ-ਨਾਂ",
"Password" : "ਪਾਸਵਰ",
"ownCloud" : "ਓਵਨਕਲਾਉਡ",
diff --git a/apps/files_external/l10n/pl.js b/apps/files_external/l10n/pl.js
index 523a913d1f2..bf1bf642be2 100644
--- a/apps/files_external/l10n/pl.js
+++ b/apps/files_external/l10n/pl.js
@@ -21,13 +21,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Wszyscy użytkownicy. Zacznij pisać, aby wybrać użytkownika lub grupę.",
"(group)" : "(grupa)",
"Saved" : "Zapisano",
+ "Saving..." : "Zapisywanie...",
+ "Save" : "Zapisz",
+ "Username" : "Nazwa użytkownika",
+ "Password" : "Hasło",
"None" : "Nic",
"App key" : "Klucz aplikacji",
"App secret" : "Hasło aplikacji",
"Client ID" : "ID klienta",
"Client secret" : "Hasło klienta",
- "Username" : "Nazwa użytkownika",
- "Password" : "Hasło",
"API key" : "Klucz API",
"Public key" : "Klucz publiczny",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/pl.json b/apps/files_external/l10n/pl.json
index 25d379cc730..2d77bdca9ee 100644
--- a/apps/files_external/l10n/pl.json
+++ b/apps/files_external/l10n/pl.json
@@ -19,13 +19,15 @@
"All users. Type to select user or group." : "Wszyscy użytkownicy. Zacznij pisać, aby wybrać użytkownika lub grupę.",
"(group)" : "(grupa)",
"Saved" : "Zapisano",
+ "Saving..." : "Zapisywanie...",
+ "Save" : "Zapisz",
+ "Username" : "Nazwa użytkownika",
+ "Password" : "Hasło",
"None" : "Nic",
"App key" : "Klucz aplikacji",
"App secret" : "Hasło aplikacji",
"Client ID" : "ID klienta",
"Client secret" : "Hasło klienta",
- "Username" : "Nazwa użytkownika",
- "Password" : "Hasło",
"API key" : "Klucz API",
"Public key" : "Klucz publiczny",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js
index 283b9478577..484550ad109 100644
--- a/apps/files_external/l10n/pt_BR.js
+++ b/apps/files_external/l10n/pt_BR.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "Erro ao gerar um par de chaves",
"Enable encryption" : "Ativar criptografia",
"Enable previews" : "Habilitar visualizações prévias",
+ "Enable sharing" : "Habilitar compartilhamento",
"Check for changes" : "Verifique se há alterações",
"Never" : "Nunca",
"Once every direct access" : "Uma vez a cada acesso direto",
@@ -36,14 +37,23 @@ OC.L10N.register(
"(group)" : "(grupo)",
"Admin defined" : "Definido pelo administrador",
"Saved" : "Salvo",
+ "Saving..." : "Salvando...",
+ "Save" : "Salvar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
"Couldn't access. Please logout and login to activate this mount point" : "Não foi possível acessar. Por favor, desconectar e conectar novamente para ativar este ponto de montagem",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Não foi possível obter as informações do servidor ownCloud: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível obter a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
+ "external-storage" : "armazenamento-externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível obter a lista unidades de pontos de montagem da rede do Windows: resposta vazia a partir do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor clique na linha vermelha(s) para mais informações",
+ "Please enter the credentials for the {mount} mount" : "Por favor, insira as credenciais para montar {mount}",
+ "Username" : "Nome de Usuário",
+ "Password" : "Senha",
+ "Credentials saved" : "Credenciais salvas",
+ "Credentials saving failed" : "A gravação das credenciais falhou",
+ "Credentials required" : "Credenciais são exigidas",
"Access key" : "Chave da acesso",
"Secret key" : "Chave secreta",
"Builtin" : "Construídas em",
@@ -55,13 +65,15 @@ OC.L10N.register(
"Client ID" : "ID do Cliente",
"Client secret" : "Segredo do cliente",
"OpenStack" : "OpenStack",
- "Username" : "Nome de Usuário",
- "Password" : "Senha",
"Tenant name" : "Nome do inquilino",
"Identity endpoint URL" : "Identidade pontofinal URL",
"Rackspace" : "Espaço em rack",
"API key" : "Chave API",
+ "Global Credentails" : "Credenciais Globais",
+ "Log-in credentials, save in database" : "Credenciais de login, salvos no banco de dados",
"Username and password" : "Nome de Usuário e senha",
+ "Log-in credentials, save in session" : "Credenciais de login, guardados em sessão",
+ "User entered, store in database" : "Usuário digitou, armazenar em banco de dados",
"RSA public key" : "Chave pública RSA",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
@@ -104,6 +116,7 @@ OC.L10N.register(
"Storage type" : "Tipo de armazenamento",
"Scope" : "Escopo",
"External Storage" : "Armazenamento Externo",
+ "Global Credentials" : "Credenciais Globais",
"Folder name" : "Nome da pasta",
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json
index f1d97e6cf4a..70bb4422730 100644
--- a/apps/files_external/l10n/pt_BR.json
+++ b/apps/files_external/l10n/pt_BR.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "Erro ao gerar um par de chaves",
"Enable encryption" : "Ativar criptografia",
"Enable previews" : "Habilitar visualizações prévias",
+ "Enable sharing" : "Habilitar compartilhamento",
"Check for changes" : "Verifique se há alterações",
"Never" : "Nunca",
"Once every direct access" : "Uma vez a cada acesso direto",
@@ -34,14 +35,23 @@
"(group)" : "(grupo)",
"Admin defined" : "Definido pelo administrador",
"Saved" : "Salvo",
+ "Saving..." : "Salvando...",
+ "Save" : "Salvar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
"Couldn't access. Please logout and login to activate this mount point" : "Não foi possível acessar. Por favor, desconectar e conectar novamente para ativar este ponto de montagem",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Não foi possível obter as informações do servidor ownCloud: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível obter a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
+ "external-storage" : "armazenamento-externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível obter a lista unidades de pontos de montagem da rede do Windows: resposta vazia a partir do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor clique na linha vermelha(s) para mais informações",
+ "Please enter the credentials for the {mount} mount" : "Por favor, insira as credenciais para montar {mount}",
+ "Username" : "Nome de Usuário",
+ "Password" : "Senha",
+ "Credentials saved" : "Credenciais salvas",
+ "Credentials saving failed" : "A gravação das credenciais falhou",
+ "Credentials required" : "Credenciais são exigidas",
"Access key" : "Chave da acesso",
"Secret key" : "Chave secreta",
"Builtin" : "Construídas em",
@@ -53,13 +63,15 @@
"Client ID" : "ID do Cliente",
"Client secret" : "Segredo do cliente",
"OpenStack" : "OpenStack",
- "Username" : "Nome de Usuário",
- "Password" : "Senha",
"Tenant name" : "Nome do inquilino",
"Identity endpoint URL" : "Identidade pontofinal URL",
"Rackspace" : "Espaço em rack",
"API key" : "Chave API",
+ "Global Credentails" : "Credenciais Globais",
+ "Log-in credentials, save in database" : "Credenciais de login, salvos no banco de dados",
"Username and password" : "Nome de Usuário e senha",
+ "Log-in credentials, save in session" : "Credenciais de login, guardados em sessão",
+ "User entered, store in database" : "Usuário digitou, armazenar em banco de dados",
"RSA public key" : "Chave pública RSA",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
@@ -102,6 +114,7 @@
"Storage type" : "Tipo de armazenamento",
"Scope" : "Escopo",
"External Storage" : "Armazenamento Externo",
+ "Global Credentials" : "Credenciais Globais",
"Folder name" : "Nome da pasta",
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js
index ef75f504bcf..5a549eb04c1 100644
--- a/apps/files_external/l10n/pt_PT.js
+++ b/apps/files_external/l10n/pt_PT.js
@@ -37,14 +37,23 @@ OC.L10N.register(
"(group)" : "(grupo)",
"Admin defined" : "Administrador definido",
"Saved" : "Guardado",
+ "Saving..." : "A guardar...",
+ "Save" : "Guardar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
"Couldn't access. Please logout and login to activate this mount point" : "Não foi possível aceder. Por favor, faça logout e login para ativar este ponto de montagem",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Não foi possível recolher a informação do servidor ownCloud: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
+ "external-storage" : "Armazenamento Externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação",
+ "Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}",
+ "Username" : "Nome de utilizador",
+ "Password" : "Palavra-passe",
+ "Credentials saved" : "Credenciais guardadas",
+ "Credentials saving failed" : "Falha ao salvar credenciais",
+ "Credentials required" : "Credenciais necessárias",
"Access key" : "Código de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
@@ -56,12 +65,11 @@ OC.L10N.register(
"Client ID" : "Id. do Cliente",
"Client secret" : "Segredo do cliente\\\\",
"OpenStack" : "OpenStack",
- "Username" : "Nome de utilizador",
- "Password" : "Palavra-passe",
"Tenant name" : "Nome do locatário",
"Identity endpoint URL" : "Identidade URL endpoint",
"Rackspace" : "Rackspace",
"API key" : "Chave API",
+ "Global Credentails" : "Credenciais Gerais",
"Log-in credentials, save in database" : "Credenciais de login, guardar na base de dados",
"Username and password" : "Nome de utilizador e palavra-passe",
"Log-in credentials, save in session" : "Credenciais de login, guardar na sessão",
@@ -108,6 +116,7 @@ OC.L10N.register(
"Storage type" : "Tipo de Armazenamento",
"Scope" : "Âmbito",
"External Storage" : "Armazenamento Externo",
+ "Global Credentials" : "Credenciais Gerais",
"Folder name" : "Nome da pasta",
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json
index 686802379ee..98eac2442e5 100644
--- a/apps/files_external/l10n/pt_PT.json
+++ b/apps/files_external/l10n/pt_PT.json
@@ -35,14 +35,23 @@
"(group)" : "(grupo)",
"Admin defined" : "Administrador definido",
"Saved" : "Guardado",
+ "Saving..." : "A guardar...",
+ "Save" : "Guardar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
"Couldn't access. Please logout and login to activate this mount point" : "Não foi possível aceder. Por favor, faça logout e login para ativar este ponto de montagem",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Não foi possível recolher a informação do servidor ownCloud: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
+ "external-storage" : "Armazenamento Externo",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação",
+ "Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}",
+ "Username" : "Nome de utilizador",
+ "Password" : "Palavra-passe",
+ "Credentials saved" : "Credenciais guardadas",
+ "Credentials saving failed" : "Falha ao salvar credenciais",
+ "Credentials required" : "Credenciais necessárias",
"Access key" : "Código de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
@@ -54,12 +63,11 @@
"Client ID" : "Id. do Cliente",
"Client secret" : "Segredo do cliente\\\\",
"OpenStack" : "OpenStack",
- "Username" : "Nome de utilizador",
- "Password" : "Palavra-passe",
"Tenant name" : "Nome do locatário",
"Identity endpoint URL" : "Identidade URL endpoint",
"Rackspace" : "Rackspace",
"API key" : "Chave API",
+ "Global Credentails" : "Credenciais Gerais",
"Log-in credentials, save in database" : "Credenciais de login, guardar na base de dados",
"Username and password" : "Nome de utilizador e palavra-passe",
"Log-in credentials, save in session" : "Credenciais de login, guardar na sessão",
@@ -106,6 +114,7 @@
"Storage type" : "Tipo de Armazenamento",
"Scope" : "Âmbito",
"External Storage" : "Armazenamento Externo",
+ "Global Credentials" : "Credenciais Gerais",
"Folder name" : "Nome da pasta",
"Authentication" : "Autenticação",
"Configuration" : "Configuração",
diff --git a/apps/files_external/l10n/ro.js b/apps/files_external/l10n/ro.js
index cc3a065a21d..636ba958cb5 100644
--- a/apps/files_external/l10n/ro.js
+++ b/apps/files_external/l10n/ro.js
@@ -6,9 +6,11 @@ OC.L10N.register(
"Grant access" : "Permite accesul",
"Access granted" : "Acces permis",
"Saved" : "Salvat",
- "None" : "Niciuna",
+ "Saving..." : "Se salvează...",
+ "Save" : "Salvează",
"Username" : "Nume utilizator",
"Password" : "Parolă",
+ "None" : "Niciuna",
"API key" : "Cheie API",
"Public key" : "Cheie publică",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/ro.json b/apps/files_external/l10n/ro.json
index 2f1f8e32883..7cff0ef5521 100644
--- a/apps/files_external/l10n/ro.json
+++ b/apps/files_external/l10n/ro.json
@@ -4,9 +4,11 @@
"Grant access" : "Permite accesul",
"Access granted" : "Acces permis",
"Saved" : "Salvat",
- "None" : "Niciuna",
+ "Saving..." : "Se salvează...",
+ "Save" : "Salvează",
"Username" : "Nume utilizator",
"Password" : "Parolă",
+ "None" : "Niciuna",
"API key" : "Cheie API",
"Public key" : "Cheie publică",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js
index ceae42c7942..e0f55115d97 100644
--- a/apps/files_external/l10n/ru.js
+++ b/apps/files_external/l10n/ru.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "Ошибка создания ключевой пары",
"Enable encryption" : "Включить шифрование",
"Enable previews" : "Включить предпросмотр",
+ "Enable sharing" : "Включить общий доступ",
"Check for changes" : "Проверять изменения",
"Never" : "Никогда",
"Once every direct access" : "Один раз при прямом доступе",
@@ -36,6 +37,8 @@ OC.L10N.register(
"(group)" : "(группа)",
"Admin defined" : "Админ определен",
"Saved" : "Сохранено",
+ "Saving..." : "Сохранение...",
+ "Save" : "Сохранить",
"Empty response from the server" : "Пустой ответ от сервера",
"Couldn't access. Please logout and login to activate this mount point" : "Не удалось получить доступ. Пожалуйста, выйти и войдите чтобы активировать эту точку монтирования",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Не удалось получить информацию от сервера OwnCloud: {code} {type}",
@@ -44,6 +47,8 @@ OC.L10N.register(
"External mount error" : "Ошибка внешнего монтажа",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Не удалось получить список окон сетевого диска точки монтирования: пустой ответ от сервера",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Некоторые из настроенных внешних точек монтирования не подключены. Для получения дополнительной информации, пожалуйста нажмите на красную строку (ы)",
+ "Username" : "Имя пользователя",
+ "Password" : "Пароль",
"Access key" : "Ключ доступа",
"Secret key" : "Секретный ключ",
"Builtin" : "Встроенный",
@@ -55,8 +60,6 @@ OC.L10N.register(
"Client ID" : "Идентификатор клиента",
"Client secret" : "Клиентский ключ ",
"OpenStack" : "OpenStack",
- "Username" : "Имя пользователя",
- "Password" : "Пароль",
"Tenant name" : "Имя арендатора",
"Identity endpoint URL" : "Удостоверение конечной точки URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json
index d0dab706ea9..eda8da90aca 100644
--- a/apps/files_external/l10n/ru.json
+++ b/apps/files_external/l10n/ru.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "Ошибка создания ключевой пары",
"Enable encryption" : "Включить шифрование",
"Enable previews" : "Включить предпросмотр",
+ "Enable sharing" : "Включить общий доступ",
"Check for changes" : "Проверять изменения",
"Never" : "Никогда",
"Once every direct access" : "Один раз при прямом доступе",
@@ -34,6 +35,8 @@
"(group)" : "(группа)",
"Admin defined" : "Админ определен",
"Saved" : "Сохранено",
+ "Saving..." : "Сохранение...",
+ "Save" : "Сохранить",
"Empty response from the server" : "Пустой ответ от сервера",
"Couldn't access. Please logout and login to activate this mount point" : "Не удалось получить доступ. Пожалуйста, выйти и войдите чтобы активировать эту точку монтирования",
"Couldn't get the information from the ownCloud server: {code} {type}" : "Не удалось получить информацию от сервера OwnCloud: {code} {type}",
@@ -42,6 +45,8 @@
"External mount error" : "Ошибка внешнего монтажа",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "Не удалось получить список окон сетевого диска точки монтирования: пустой ответ от сервера",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Некоторые из настроенных внешних точек монтирования не подключены. Для получения дополнительной информации, пожалуйста нажмите на красную строку (ы)",
+ "Username" : "Имя пользователя",
+ "Password" : "Пароль",
"Access key" : "Ключ доступа",
"Secret key" : "Секретный ключ",
"Builtin" : "Встроенный",
@@ -53,8 +58,6 @@
"Client ID" : "Идентификатор клиента",
"Client secret" : "Клиентский ключ ",
"OpenStack" : "OpenStack",
- "Username" : "Имя пользователя",
- "Password" : "Пароль",
"Tenant name" : "Имя арендатора",
"Identity endpoint URL" : "Удостоверение конечной точки URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/si_LK.js b/apps/files_external/l10n/si_LK.js
index 82b68af82eb..0cfb795d78c 100644
--- a/apps/files_external/l10n/si_LK.js
+++ b/apps/files_external/l10n/si_LK.js
@@ -4,9 +4,11 @@ OC.L10N.register(
"Personal" : "පෞද්ගලික",
"Grant access" : "පිවිසුම ලබාදෙන්න",
"Access granted" : "පිවිසීමට හැක",
- "None" : "කිසිවක් නැත",
+ "Saving..." : "සුරැකෙමින් පවතී...",
+ "Save" : "සුරකින්න",
"Username" : "පරිශීලක නම",
"Password" : "මුර පදය",
+ "None" : "කිසිවක් නැත",
"Port" : "තොට",
"Region" : "කළාපය",
"URL" : "URL",
diff --git a/apps/files_external/l10n/si_LK.json b/apps/files_external/l10n/si_LK.json
index 2150ac0f9b2..d93df685e77 100644
--- a/apps/files_external/l10n/si_LK.json
+++ b/apps/files_external/l10n/si_LK.json
@@ -2,9 +2,11 @@
"Personal" : "පෞද්ගලික",
"Grant access" : "පිවිසුම ලබාදෙන්න",
"Access granted" : "පිවිසීමට හැක",
- "None" : "කිසිවක් නැත",
+ "Saving..." : "සුරැකෙමින් පවතී...",
+ "Save" : "සුරකින්න",
"Username" : "පරිශීලක නම",
"Password" : "මුර පදය",
+ "None" : "කිසිවක් නැත",
"Port" : "තොට",
"Region" : "කළාපය",
"URL" : "URL",
diff --git a/apps/files_external/l10n/sk_SK.js b/apps/files_external/l10n/sk_SK.js
index 72fb57a1e0b..af390cf579f 100644
--- a/apps/files_external/l10n/sk_SK.js
+++ b/apps/files_external/l10n/sk_SK.js
@@ -32,6 +32,10 @@ OC.L10N.register(
"All users. Type to select user or group." : "Všetci používatelia. Začnite písať pre výber používateľa alebo skupinu.",
"(group)" : "(skupina)",
"Saved" : "Uložené",
+ "Saving..." : "Ukladám...",
+ "Save" : "Uložiť",
+ "Username" : "Používateľské meno",
+ "Password" : "Heslo",
"Access key" : "Prístupový kľúč",
"Secret key" : "Tajný kľúč",
"Builtin" : "Vstavaný",
@@ -43,8 +47,6 @@ OC.L10N.register(
"Client ID" : "Client ID",
"Client secret" : "Heslo klienta",
"OpenStack" : "OpenStack",
- "Username" : "Používateľské meno",
- "Password" : "Heslo",
"Tenant name" : "Meno nájomcu",
"Identity endpoint URL" : "Endpoint URL identita",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/sk_SK.json b/apps/files_external/l10n/sk_SK.json
index 267eb5b48b9..ff677233a9f 100644
--- a/apps/files_external/l10n/sk_SK.json
+++ b/apps/files_external/l10n/sk_SK.json
@@ -30,6 +30,10 @@
"All users. Type to select user or group." : "Všetci používatelia. Začnite písať pre výber používateľa alebo skupinu.",
"(group)" : "(skupina)",
"Saved" : "Uložené",
+ "Saving..." : "Ukladám...",
+ "Save" : "Uložiť",
+ "Username" : "Používateľské meno",
+ "Password" : "Heslo",
"Access key" : "Prístupový kľúč",
"Secret key" : "Tajný kľúč",
"Builtin" : "Vstavaný",
@@ -41,8 +45,6 @@
"Client ID" : "Client ID",
"Client secret" : "Heslo klienta",
"OpenStack" : "OpenStack",
- "Username" : "Používateľské meno",
- "Password" : "Heslo",
"Tenant name" : "Meno nájomcu",
"Identity endpoint URL" : "Endpoint URL identita",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/sl.js b/apps/files_external/l10n/sl.js
index 62b35ffab5e..807c6c82693 100644
--- a/apps/files_external/l10n/sl.js
+++ b/apps/files_external/l10n/sl.js
@@ -25,7 +25,11 @@ OC.L10N.register(
"All users. Type to select user or group." : "Vsi uporabniki. Skupino ali uporabnika je mogoče tudi izbrati.",
"(group)" : "(skupina)",
"Saved" : "Shranjeno",
+ "Saving..." : "Poteka shranjevanje ...",
+ "Save" : "Shrani",
"External mount error" : "Notranja napaka priklopa",
+ "Username" : "Uporabniško ime",
+ "Password" : "Geslo",
"Access key" : "Ključ za dostop",
"Secret key" : "Skriti ključ",
"Builtin" : "Vgrajeno",
@@ -37,8 +41,6 @@ OC.L10N.register(
"Client ID" : "ID odjemalca",
"Client secret" : "Skrivni ključ odjemalca",
"OpenStack" : "OpenStack",
- "Username" : "Uporabniško ime",
- "Password" : "Geslo",
"Tenant name" : "Ime uporabnika",
"API key" : "Ključ API",
"Username and password" : "Uporabniško ime in geslo",
diff --git a/apps/files_external/l10n/sl.json b/apps/files_external/l10n/sl.json
index 3a806fbd25b..42739bc315c 100644
--- a/apps/files_external/l10n/sl.json
+++ b/apps/files_external/l10n/sl.json
@@ -23,7 +23,11 @@
"All users. Type to select user or group." : "Vsi uporabniki. Skupino ali uporabnika je mogoče tudi izbrati.",
"(group)" : "(skupina)",
"Saved" : "Shranjeno",
+ "Saving..." : "Poteka shranjevanje ...",
+ "Save" : "Shrani",
"External mount error" : "Notranja napaka priklopa",
+ "Username" : "Uporabniško ime",
+ "Password" : "Geslo",
"Access key" : "Ključ za dostop",
"Secret key" : "Skriti ključ",
"Builtin" : "Vgrajeno",
@@ -35,8 +39,6 @@
"Client ID" : "ID odjemalca",
"Client secret" : "Skrivni ključ odjemalca",
"OpenStack" : "OpenStack",
- "Username" : "Uporabniško ime",
- "Password" : "Geslo",
"Tenant name" : "Ime uporabnika",
"API key" : "Ključ API",
"Username and password" : "Uporabniško ime in geslo",
diff --git a/apps/files_external/l10n/sq.js b/apps/files_external/l10n/sq.js
index 5549657c448..bab6a24df7f 100644
--- a/apps/files_external/l10n/sq.js
+++ b/apps/files_external/l10n/sq.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "Gabim gjatë prodhimit të çiftit të kyçeve",
"Enable encryption" : "Aktivizoni fshehtëzim",
"Enable previews" : "Aktivizoni paraparje",
+ "Enable sharing" : "Aktivizo ndarjet",
"Check for changes" : "Kontrollo për ndryshime",
"Never" : "Kurrë",
"Once every direct access" : "Çdo herë pas hyrjesh të drejtpërdrejta",
@@ -36,6 +37,8 @@ OC.L10N.register(
"(group)" : "(grup)",
"Admin defined" : "Përcaktuar nga përgjegjësi",
"Saved" : "U ruajt",
+ "Saving..." : "Po ruhet …",
+ "Save" : "Ruaje",
"Empty response from the server" : "Përgjigje e zbrazët prej shërbyesit",
"Couldn't access. Please logout and login to activate this mount point" : "S’fut dot. Ju lutemi, dilni dhe hyni që të aktivizohet kjo pikë montimi",
"Couldn't get the information from the ownCloud server: {code} {type}" : "S’u morën dot të dhëna nga shërbyesi ownCloud: {code} {type}",
@@ -44,6 +47,12 @@ OC.L10N.register(
"External mount error" : "Gabim i jashtëm montimi",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "S’u mor dot lista e pikave të montimit Windows network drive: përgjigje e zbrazët nga shërbyesi",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Disa nga pikat e jashtme të formësuara të montimit s’janë të lidhura. Ju lutemi, klikoni në shigjetën(at) e kuqe për më tepër të dhëna",
+ "Please enter the credentials for the {mount} mount" : "Ju lutemi, jepni kredencialet për pikën e montimit {mount}",
+ "Username" : "Emër përdoruesi",
+ "Password" : "Fjalëkalim",
+ "Credentials saved" : "Kredencialet u ruajtën",
+ "Credentials saving failed" : "Ruajtja e kredencialeve dështoi",
+ "Credentials required" : "Lypsen kredenciale",
"Access key" : "Kyç hyrjesh",
"Secret key" : "Kyç i fshehtë",
"Builtin" : "I brendshëm",
@@ -55,12 +64,14 @@ OC.L10N.register(
"Client ID" : "ID klienti",
"Client secret" : "E fshehtë klienti",
"OpenStack" : "OpenStack",
- "Username" : "Emër përdoruesi",
- "Password" : "Fjalëkalim",
"Tenant name" : "Emër qiraxhiu",
"Rackspace" : "Rackspace",
"API key" : "Kyç API",
+ "Global Credentails" : "Kredenciale Globale",
+ "Log-in credentials, save in database" : "Kredenciale hyrjesh, ruaje në bazën e të dhënave",
"Username and password" : "Emër përdoruesi dhe fjalëkalim",
+ "Log-in credentials, save in session" : "Kredenciale hyrjesh, ruaje në sesion",
+ "User entered, store in database" : "Përdoruesi u dha, ruajeni në bazën e të dhënave",
"RSA public key" : "Kyç publik RSA ",
"Public key" : "Kyç publik",
"Amazon S3" : "Amazon S3",
@@ -103,6 +114,7 @@ OC.L10N.register(
"Storage type" : "Lloj depozite",
"Scope" : "Shtrirje",
"External Storage" : "Depozitë e Jashtme",
+ "Global Credentials" : "Kredenciale Globale",
"Folder name" : "Emër dosjeje",
"Authentication" : "Mirëfilltësim",
"Configuration" : "Formësim",
diff --git a/apps/files_external/l10n/sq.json b/apps/files_external/l10n/sq.json
index 5176c5ded27..7c132ddd855 100644
--- a/apps/files_external/l10n/sq.json
+++ b/apps/files_external/l10n/sq.json
@@ -27,6 +27,7 @@
"Error generating key pair" : "Gabim gjatë prodhimit të çiftit të kyçeve",
"Enable encryption" : "Aktivizoni fshehtëzim",
"Enable previews" : "Aktivizoni paraparje",
+ "Enable sharing" : "Aktivizo ndarjet",
"Check for changes" : "Kontrollo për ndryshime",
"Never" : "Kurrë",
"Once every direct access" : "Çdo herë pas hyrjesh të drejtpërdrejta",
@@ -34,6 +35,8 @@
"(group)" : "(grup)",
"Admin defined" : "Përcaktuar nga përgjegjësi",
"Saved" : "U ruajt",
+ "Saving..." : "Po ruhet …",
+ "Save" : "Ruaje",
"Empty response from the server" : "Përgjigje e zbrazët prej shërbyesit",
"Couldn't access. Please logout and login to activate this mount point" : "S’fut dot. Ju lutemi, dilni dhe hyni që të aktivizohet kjo pikë montimi",
"Couldn't get the information from the ownCloud server: {code} {type}" : "S’u morën dot të dhëna nga shërbyesi ownCloud: {code} {type}",
@@ -42,6 +45,12 @@
"External mount error" : "Gabim i jashtëm montimi",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "S’u mor dot lista e pikave të montimit Windows network drive: përgjigje e zbrazët nga shërbyesi",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Disa nga pikat e jashtme të formësuara të montimit s’janë të lidhura. Ju lutemi, klikoni në shigjetën(at) e kuqe për më tepër të dhëna",
+ "Please enter the credentials for the {mount} mount" : "Ju lutemi, jepni kredencialet për pikën e montimit {mount}",
+ "Username" : "Emër përdoruesi",
+ "Password" : "Fjalëkalim",
+ "Credentials saved" : "Kredencialet u ruajtën",
+ "Credentials saving failed" : "Ruajtja e kredencialeve dështoi",
+ "Credentials required" : "Lypsen kredenciale",
"Access key" : "Kyç hyrjesh",
"Secret key" : "Kyç i fshehtë",
"Builtin" : "I brendshëm",
@@ -53,12 +62,14 @@
"Client ID" : "ID klienti",
"Client secret" : "E fshehtë klienti",
"OpenStack" : "OpenStack",
- "Username" : "Emër përdoruesi",
- "Password" : "Fjalëkalim",
"Tenant name" : "Emër qiraxhiu",
"Rackspace" : "Rackspace",
"API key" : "Kyç API",
+ "Global Credentails" : "Kredenciale Globale",
+ "Log-in credentials, save in database" : "Kredenciale hyrjesh, ruaje në bazën e të dhënave",
"Username and password" : "Emër përdoruesi dhe fjalëkalim",
+ "Log-in credentials, save in session" : "Kredenciale hyrjesh, ruaje në sesion",
+ "User entered, store in database" : "Përdoruesi u dha, ruajeni në bazën e të dhënave",
"RSA public key" : "Kyç publik RSA ",
"Public key" : "Kyç publik",
"Amazon S3" : "Amazon S3",
@@ -101,6 +112,7 @@
"Storage type" : "Lloj depozite",
"Scope" : "Shtrirje",
"External Storage" : "Depozitë e Jashtme",
+ "Global Credentials" : "Kredenciale Globale",
"Folder name" : "Emër dosjeje",
"Authentication" : "Mirëfilltësim",
"Configuration" : "Formësim",
diff --git a/apps/files_external/l10n/sr.js b/apps/files_external/l10n/sr.js
index a90d36b586f..0600f747509 100644
--- a/apps/files_external/l10n/sr.js
+++ b/apps/files_external/l10n/sr.js
@@ -21,13 +21,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Сви корисници. Куцајте за избор корисника или групе.",
"(group)" : "(група)",
"Saved" : "Сачувано",
+ "Saving..." : "Уписујем...",
+ "Save" : "Сачувај",
+ "Username" : "Корисничко име",
+ "Password" : "Лозинка",
"None" : "Ништа",
"App key" : "Кључ апликације",
"App secret" : "Тајна апликације",
"Client ID" : "ИД клијента",
"Client secret" : "Тајна клијента",
- "Username" : "Корисничко име",
- "Password" : "Лозинка",
"API key" : "API кључ",
"Public key" : "Јавни кључ",
"Amazon S3" : "Амазон С3",
diff --git a/apps/files_external/l10n/sr.json b/apps/files_external/l10n/sr.json
index 6c938e8a14c..aa8471447df 100644
--- a/apps/files_external/l10n/sr.json
+++ b/apps/files_external/l10n/sr.json
@@ -19,13 +19,15 @@
"All users. Type to select user or group." : "Сви корисници. Куцајте за избор корисника или групе.",
"(group)" : "(група)",
"Saved" : "Сачувано",
+ "Saving..." : "Уписујем...",
+ "Save" : "Сачувај",
+ "Username" : "Корисничко име",
+ "Password" : "Лозинка",
"None" : "Ништа",
"App key" : "Кључ апликације",
"App secret" : "Тајна апликације",
"Client ID" : "ИД клијента",
"Client secret" : "Тајна клијента",
- "Username" : "Корисничко име",
- "Password" : "Лозинка",
"API key" : "API кључ",
"Public key" : "Јавни кључ",
"Amazon S3" : "Амазон С3",
diff --git a/apps/files_external/l10n/sr@latin.js b/apps/files_external/l10n/sr@latin.js
index 0420189571c..3f73fd420ed 100644
--- a/apps/files_external/l10n/sr@latin.js
+++ b/apps/files_external/l10n/sr@latin.js
@@ -11,12 +11,14 @@ OC.L10N.register(
"All users. Type to select user or group." : "Svi korisnici. Kucajte da biste izabrali korisnika ili grupu.",
"(group)" : "(grupa)",
"Saved" : "Sačuvano",
+ "Saving..." : "Upisujem...",
+ "Save" : "Sačuvaj",
+ "Username" : "Korisničko ime",
+ "Password" : "Lozinka",
"App key" : "Ključ Aplikacije",
"App secret" : "Tajna lozinka Aplikacije",
"Client ID" : "Identifikator klijenta",
"Client secret" : "Tajna lozinka klijenta",
- "Username" : "Korisničko ime",
- "Password" : "Lozinka",
"Amazon S3" : "Amazon S3",
"Bucket" : "Korpa",
"Hostname" : "Ime računara",
diff --git a/apps/files_external/l10n/sr@latin.json b/apps/files_external/l10n/sr@latin.json
index 3320ab2c863..92df9c7146b 100644
--- a/apps/files_external/l10n/sr@latin.json
+++ b/apps/files_external/l10n/sr@latin.json
@@ -9,12 +9,14 @@
"All users. Type to select user or group." : "Svi korisnici. Kucajte da biste izabrali korisnika ili grupu.",
"(group)" : "(grupa)",
"Saved" : "Sačuvano",
+ "Saving..." : "Upisujem...",
+ "Save" : "Sačuvaj",
+ "Username" : "Korisničko ime",
+ "Password" : "Lozinka",
"App key" : "Ključ Aplikacije",
"App secret" : "Tajna lozinka Aplikacije",
"Client ID" : "Identifikator klijenta",
"Client secret" : "Tajna lozinka klijenta",
- "Username" : "Korisničko ime",
- "Password" : "Lozinka",
"Amazon S3" : "Amazon S3",
"Bucket" : "Korpa",
"Hostname" : "Ime računara",
diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js
index f20b96caed8..76da77967db 100644
--- a/apps/files_external/l10n/sv.js
+++ b/apps/files_external/l10n/sv.js
@@ -11,13 +11,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Alla användare. Skriv för att välja användare eller grupp.",
"(group)" : "(grupp)",
"Saved" : "Sparad",
+ "Saving..." : "Sparar...",
+ "Save" : "Spara",
+ "Username" : "Användarnamn",
+ "Password" : "Lösenord",
"None" : "Ingen",
"App key" : "App-nyckel",
"App secret" : "App-hemlighet",
"Client ID" : "Klient ID",
"Client secret" : "klient secret",
- "Username" : "Användarnamn",
- "Password" : "Lösenord",
"API key" : "API-nyckel",
"Public key" : "Publik nyckel",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json
index cd3dc13296d..6f5d4dfe3aa 100644
--- a/apps/files_external/l10n/sv.json
+++ b/apps/files_external/l10n/sv.json
@@ -9,13 +9,15 @@
"All users. Type to select user or group." : "Alla användare. Skriv för att välja användare eller grupp.",
"(group)" : "(grupp)",
"Saved" : "Sparad",
+ "Saving..." : "Sparar...",
+ "Save" : "Spara",
+ "Username" : "Användarnamn",
+ "Password" : "Lösenord",
"None" : "Ingen",
"App key" : "App-nyckel",
"App secret" : "App-hemlighet",
"Client ID" : "Klient ID",
"Client secret" : "klient secret",
- "Username" : "Användarnamn",
- "Password" : "Lösenord",
"API key" : "API-nyckel",
"Public key" : "Publik nyckel",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/ta_LK.js b/apps/files_external/l10n/ta_LK.js
index 8ab0f6d513c..87f2dabd7ce 100644
--- a/apps/files_external/l10n/ta_LK.js
+++ b/apps/files_external/l10n/ta_LK.js
@@ -4,9 +4,11 @@ OC.L10N.register(
"Personal" : "தனிப்பட்ட",
"Grant access" : "அனுமதியை வழங்கல்",
"Access granted" : "அனுமதி வழங்கப்பட்டது",
- "None" : "ஒன்றுமில்லை",
+ "Saving..." : "சேமிக்கப்படுகிறது...",
+ "Save" : "சேமிக்க ",
"Username" : "பயனாளர் பெயர்",
"Password" : "கடவுச்சொல்",
+ "None" : "ஒன்றுமில்லை",
"Port" : "துறை ",
"Region" : "பிரதேசம்",
"URL" : "URL",
diff --git a/apps/files_external/l10n/ta_LK.json b/apps/files_external/l10n/ta_LK.json
index dd1c1003728..00959a601b1 100644
--- a/apps/files_external/l10n/ta_LK.json
+++ b/apps/files_external/l10n/ta_LK.json
@@ -2,9 +2,11 @@
"Personal" : "தனிப்பட்ட",
"Grant access" : "அனுமதியை வழங்கல்",
"Access granted" : "அனுமதி வழங்கப்பட்டது",
- "None" : "ஒன்றுமில்லை",
+ "Saving..." : "சேமிக்கப்படுகிறது...",
+ "Save" : "சேமிக்க ",
"Username" : "பயனாளர் பெயர்",
"Password" : "கடவுச்சொல்",
+ "None" : "ஒன்றுமில்லை",
"Port" : "துறை ",
"Region" : "பிரதேசம்",
"URL" : "URL",
diff --git a/apps/files_external/l10n/te.js b/apps/files_external/l10n/te.js
index 155676d9a8f..4c05e915da4 100644
--- a/apps/files_external/l10n/te.js
+++ b/apps/files_external/l10n/te.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_external",
{
"Personal" : "వ్యక్తిగతం",
+ "Save" : "భద్రపరచు",
"Username" : "వాడుకరి పేరు",
"Password" : "సంకేతపదం",
"Name" : "పేరు",
diff --git a/apps/files_external/l10n/te.json b/apps/files_external/l10n/te.json
index 5a55f60376a..493efe033f7 100644
--- a/apps/files_external/l10n/te.json
+++ b/apps/files_external/l10n/te.json
@@ -1,5 +1,6 @@
{ "translations": {
"Personal" : "వ్యక్తిగతం",
+ "Save" : "భద్రపరచు",
"Username" : "వాడుకరి పేరు",
"Password" : "సంకేతపదం",
"Name" : "పేరు",
diff --git a/apps/files_external/l10n/th_TH.js b/apps/files_external/l10n/th_TH.js
index 31993619cae..e8f3aa3aaec 100644
--- a/apps/files_external/l10n/th_TH.js
+++ b/apps/files_external/l10n/th_TH.js
@@ -18,6 +18,7 @@ OC.L10N.register(
"Unsatisfied authentication mechanism parameters" : "การรับรองความถูกต้องไม่เพียงพอ",
"Insufficient data: %s" : "ข้อมูลไม่เพียงพอ: %s",
"%s" : "%s",
+ "Storage with id \"%i\" is not user editable" : "พื้นที่เก็บข้อมูล รหัส \"%i\" ไม่อนุญาตให้ผู้ใช้แก้ไขข้อมูลได้",
"Personal" : "ส่วนตัว",
"System" : "ระบบ",
"Grant access" : "อนุญาตให้เข้าถึงได้",
@@ -28,6 +29,7 @@ OC.L10N.register(
"Error generating key pair" : "ข้อผิดพลาดในการสร้างคีย์แบบเป็นคู่",
"Enable encryption" : "เปิดใช้งานการเข้ารหัส",
"Enable previews" : "เปิดใช้งานการแสดงตัวอย่าง",
+ "Enable sharing" : "เปิดให้สามารถแชร์ได้",
"Check for changes" : "ตรวจสอบการเปลี่ยนแปลง",
"Never" : "ไม่เคย",
"Once every direct access" : "เมื่อทุกคนเข้าถึงโดยตรง",
@@ -35,6 +37,8 @@ OC.L10N.register(
"(group)" : "(กลุ่ม)",
"Admin defined" : "ถูกกำหนดโดยผู้ดูแลระบบ",
"Saved" : "บันทึกแล้ว",
+ "Saving..." : "กำลังบันทึกข้อมูล...",
+ "Save" : "บันทึก",
"Empty response from the server" : "ไม่มีการตอบสนองจากเซิร์ฟเวอร์",
"Couldn't access. Please logout and login to activate this mount point" : "ไม่สามารถเข้าถึง กรุณออกจากระบบและาเข้าสู่ระบบใหม่เพื่อเปิดใช้งานจุดเชื่อมต่อนี้",
"Couldn't get the information from the ownCloud server: {code} {type}" : "ไม่สามารถรับข้อมูลจากเซิร์ฟเวอร์ ownCloud: {code} {type}",
@@ -43,6 +47,8 @@ OC.L10N.register(
"External mount error" : "การติดจากตั้งภายนอกเกิดข้อผิดพลาด",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "ไม่สามารถรับรายชื่อไดรฟ์เครือข่ายของวินโดว์ส จุดที่ติดตั้ง: ไม่มีการตอบสนองจากเซิร์ฟเวอร์",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "การกำหนดค่าบางส่วนของจุดเชื่อมต่อภายนอกไม่ถูกเชื่อมต่อ กรุณาคลิกที่ตรงสีแดงสำหรับข้อมูลเพิ่มเติม",
+ "Username" : "ชื่อผู้ใช้งาน",
+ "Password" : "รหัสผ่าน",
"Access key" : "คีย์การเข้าถึง",
"Secret key" : "คีย์ลับ",
"Builtin" : "ในตัว",
@@ -54,13 +60,14 @@ OC.L10N.register(
"Client ID" : "Client ID",
"Client secret" : "Client secret",
"OpenStack" : "OpenStack",
- "Username" : "ชื่อผู้ใช้งาน",
- "Password" : "รหัสผ่าน",
"Tenant name" : "ชื่อผู้เช่า",
"Identity endpoint URL" : "ตัวตนของ URL ปลายทาง",
"Rackspace" : "Rackspace",
"API key" : "รหัส API",
+ "Log-in credentials, save in database" : "ข้อมูลประจำตัวสำหรับเข้าสู่ระบบ, บันทึกลงในฐานข้อมูล",
"Username and password" : "ชื่อผู้ใช้และรหัสผ่าน",
+ "Log-in credentials, save in session" : "ข้อมูลประจำตัวสำหรับเข้าสู่ระบบ, บันทึกลงในช่วงเวลาเข้าใช้งาน",
+ "User entered, store in database" : "เมื่อผู้ใช้กรอก, เก็บข้อมูลไว้ในฐานข้อมูล",
"RSA public key" : "RSA คีย์สาธารณะ",
"Public key" : "คีย์สาธารณะ",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/th_TH.json b/apps/files_external/l10n/th_TH.json
index 07424cc1d23..5cdfd95411f 100644
--- a/apps/files_external/l10n/th_TH.json
+++ b/apps/files_external/l10n/th_TH.json
@@ -16,6 +16,7 @@
"Unsatisfied authentication mechanism parameters" : "การรับรองความถูกต้องไม่เพียงพอ",
"Insufficient data: %s" : "ข้อมูลไม่เพียงพอ: %s",
"%s" : "%s",
+ "Storage with id \"%i\" is not user editable" : "พื้นที่เก็บข้อมูล รหัส \"%i\" ไม่อนุญาตให้ผู้ใช้แก้ไขข้อมูลได้",
"Personal" : "ส่วนตัว",
"System" : "ระบบ",
"Grant access" : "อนุญาตให้เข้าถึงได้",
@@ -26,6 +27,7 @@
"Error generating key pair" : "ข้อผิดพลาดในการสร้างคีย์แบบเป็นคู่",
"Enable encryption" : "เปิดใช้งานการเข้ารหัส",
"Enable previews" : "เปิดใช้งานการแสดงตัวอย่าง",
+ "Enable sharing" : "เปิดให้สามารถแชร์ได้",
"Check for changes" : "ตรวจสอบการเปลี่ยนแปลง",
"Never" : "ไม่เคย",
"Once every direct access" : "เมื่อทุกคนเข้าถึงโดยตรง",
@@ -33,6 +35,8 @@
"(group)" : "(กลุ่ม)",
"Admin defined" : "ถูกกำหนดโดยผู้ดูแลระบบ",
"Saved" : "บันทึกแล้ว",
+ "Saving..." : "กำลังบันทึกข้อมูล...",
+ "Save" : "บันทึก",
"Empty response from the server" : "ไม่มีการตอบสนองจากเซิร์ฟเวอร์",
"Couldn't access. Please logout and login to activate this mount point" : "ไม่สามารถเข้าถึง กรุณออกจากระบบและาเข้าสู่ระบบใหม่เพื่อเปิดใช้งานจุดเชื่อมต่อนี้",
"Couldn't get the information from the ownCloud server: {code} {type}" : "ไม่สามารถรับข้อมูลจากเซิร์ฟเวอร์ ownCloud: {code} {type}",
@@ -41,6 +45,8 @@
"External mount error" : "การติดจากตั้งภายนอกเกิดข้อผิดพลาด",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "ไม่สามารถรับรายชื่อไดรฟ์เครือข่ายของวินโดว์ส จุดที่ติดตั้ง: ไม่มีการตอบสนองจากเซิร์ฟเวอร์",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "การกำหนดค่าบางส่วนของจุดเชื่อมต่อภายนอกไม่ถูกเชื่อมต่อ กรุณาคลิกที่ตรงสีแดงสำหรับข้อมูลเพิ่มเติม",
+ "Username" : "ชื่อผู้ใช้งาน",
+ "Password" : "รหัสผ่าน",
"Access key" : "คีย์การเข้าถึง",
"Secret key" : "คีย์ลับ",
"Builtin" : "ในตัว",
@@ -52,13 +58,14 @@
"Client ID" : "Client ID",
"Client secret" : "Client secret",
"OpenStack" : "OpenStack",
- "Username" : "ชื่อผู้ใช้งาน",
- "Password" : "รหัสผ่าน",
"Tenant name" : "ชื่อผู้เช่า",
"Identity endpoint URL" : "ตัวตนของ URL ปลายทาง",
"Rackspace" : "Rackspace",
"API key" : "รหัส API",
+ "Log-in credentials, save in database" : "ข้อมูลประจำตัวสำหรับเข้าสู่ระบบ, บันทึกลงในฐานข้อมูล",
"Username and password" : "ชื่อผู้ใช้และรหัสผ่าน",
+ "Log-in credentials, save in session" : "ข้อมูลประจำตัวสำหรับเข้าสู่ระบบ, บันทึกลงในช่วงเวลาเข้าใช้งาน",
+ "User entered, store in database" : "เมื่อผู้ใช้กรอก, เก็บข้อมูลไว้ในฐานข้อมูล",
"RSA public key" : "RSA คีย์สาธารณะ",
"Public key" : "คีย์สาธารณะ",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index cb506b24c1f..0473544da04 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -33,6 +33,10 @@ OC.L10N.register(
"All users. Type to select user or group." : "Tüm kullanıcılar. Kullanıcı veya grup seçmek için yazın.",
"(group)" : "(grup)",
"Saved" : "Kaydedildi",
+ "Saving..." : "Kaydediliyor...",
+ "Save" : "Kaydet",
+ "Username" : "Kullanıcı Adı",
+ "Password" : "Parola",
"Access key" : "Erişim anahtarı",
"Secret key" : "Gizli anahtar",
"Builtin" : "Yerleşik",
@@ -44,8 +48,6 @@ OC.L10N.register(
"Client ID" : "İstemci kimliği",
"Client secret" : "İstemci parolası",
"OpenStack" : "OpenStack",
- "Username" : "Kullanıcı Adı",
- "Password" : "Parola",
"Tenant name" : "Kiracı adı",
"Identity endpoint URL" : "Kimlik uç nokta URL'si",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index 1eeaafa433c..384bf0afe2f 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -31,6 +31,10 @@
"All users. Type to select user or group." : "Tüm kullanıcılar. Kullanıcı veya grup seçmek için yazın.",
"(group)" : "(grup)",
"Saved" : "Kaydedildi",
+ "Saving..." : "Kaydediliyor...",
+ "Save" : "Kaydet",
+ "Username" : "Kullanıcı Adı",
+ "Password" : "Parola",
"Access key" : "Erişim anahtarı",
"Secret key" : "Gizli anahtar",
"Builtin" : "Yerleşik",
@@ -42,8 +46,6 @@
"Client ID" : "İstemci kimliği",
"Client secret" : "İstemci parolası",
"OpenStack" : "OpenStack",
- "Username" : "Kullanıcı Adı",
- "Password" : "Parola",
"Tenant name" : "Kiracı adı",
"Identity endpoint URL" : "Kimlik uç nokta URL'si",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/ug.js b/apps/files_external/l10n/ug.js
index 37adb851973..a10cc344c4a 100644
--- a/apps/files_external/l10n/ug.js
+++ b/apps/files_external/l10n/ug.js
@@ -3,9 +3,11 @@ OC.L10N.register(
{
"External storage" : "سىرتقى ساقلىغۇچ",
"Personal" : "شەخسىي",
- "None" : "يوق",
+ "Saving..." : "ساقلاۋاتىدۇ…",
+ "Save" : "ساقلا",
"Username" : "ئىشلەتكۈچى ئاتى",
"Password" : "ئىم",
+ "None" : "يوق",
"Port" : "ئېغىز",
"WebDAV" : "WebDAV",
"URL" : "URL",
diff --git a/apps/files_external/l10n/ug.json b/apps/files_external/l10n/ug.json
index f7a072bfe38..db22e09ec11 100644
--- a/apps/files_external/l10n/ug.json
+++ b/apps/files_external/l10n/ug.json
@@ -1,9 +1,11 @@
{ "translations": {
"External storage" : "سىرتقى ساقلىغۇچ",
"Personal" : "شەخسىي",
- "None" : "يوق",
+ "Saving..." : "ساقلاۋاتىدۇ…",
+ "Save" : "ساقلا",
"Username" : "ئىشلەتكۈچى ئاتى",
"Password" : "ئىم",
+ "None" : "يوق",
"Port" : "ئېغىز",
"WebDAV" : "WebDAV",
"URL" : "URL",
diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js
index 702b3e328ce..0333998c9df 100644
--- a/apps/files_external/l10n/uk.js
+++ b/apps/files_external/l10n/uk.js
@@ -17,13 +17,15 @@ OC.L10N.register(
"All users. Type to select user or group." : "Всі користувачі. Введіть ім'я користувача або групи.",
"(group)" : "(група)",
"Saved" : "Збережено",
+ "Saving..." : "Збереження...",
+ "Save" : "Зберегти",
+ "Username" : "Ім'я користувача",
+ "Password" : "Пароль",
"None" : "Жоден",
"App key" : "Ключ додатку",
"App secret" : "Секретний ключ додатку",
"Client ID" : "Ідентифікатор клієнта",
"Client secret" : "Ключ клієнта",
- "Username" : "Ім'я користувача",
- "Password" : "Пароль",
"API key" : "ключ API",
"Public key" : "Відкритий ключ",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/uk.json b/apps/files_external/l10n/uk.json
index cddda62118f..f45274195ae 100644
--- a/apps/files_external/l10n/uk.json
+++ b/apps/files_external/l10n/uk.json
@@ -15,13 +15,15 @@
"All users. Type to select user or group." : "Всі користувачі. Введіть ім'я користувача або групи.",
"(group)" : "(група)",
"Saved" : "Збережено",
+ "Saving..." : "Збереження...",
+ "Save" : "Зберегти",
+ "Username" : "Ім'я користувача",
+ "Password" : "Пароль",
"None" : "Жоден",
"App key" : "Ключ додатку",
"App secret" : "Секретний ключ додатку",
"Client ID" : "Ідентифікатор клієнта",
"Client secret" : "Ключ клієнта",
- "Username" : "Ім'я користувача",
- "Password" : "Пароль",
"API key" : "ключ API",
"Public key" : "Відкритий ключ",
"Amazon S3" : "Amazon S3",
diff --git a/apps/files_external/l10n/ur_PK.js b/apps/files_external/l10n/ur_PK.js
index 55c8ee1f1bc..0a41084c07b 100644
--- a/apps/files_external/l10n/ur_PK.js
+++ b/apps/files_external/l10n/ur_PK.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"files_external",
{
"Personal" : "شخصی",
+ "Saving..." : "محفوظ ھو رہا ہے ...",
+ "Save" : "حفظ",
"Username" : "یوزر نیم",
"Password" : "پاسورڈ",
"URL" : "یو ار ایل",
diff --git a/apps/files_external/l10n/ur_PK.json b/apps/files_external/l10n/ur_PK.json
index e8b9c79e1f1..175d2e32414 100644
--- a/apps/files_external/l10n/ur_PK.json
+++ b/apps/files_external/l10n/ur_PK.json
@@ -1,5 +1,7 @@
{ "translations": {
"Personal" : "شخصی",
+ "Saving..." : "محفوظ ھو رہا ہے ...",
+ "Save" : "حفظ",
"Username" : "یوزر نیم",
"Password" : "پاسورڈ",
"URL" : "یو ار ایل",
diff --git a/apps/files_external/l10n/vi.js b/apps/files_external/l10n/vi.js
index 65b3d492429..642299b8941 100644
--- a/apps/files_external/l10n/vi.js
+++ b/apps/files_external/l10n/vi.js
@@ -6,9 +6,11 @@ OC.L10N.register(
"Grant access" : "Cấp quyền truy cập",
"Access granted" : "Đã cấp quyền truy cập",
"Saved" : "Đã lưu",
- "None" : "Không gì cả",
+ "Saving..." : "Đang lưu...",
+ "Save" : "Lưu",
"Username" : "Tên đăng nhập",
"Password" : "Mật khẩu",
+ "None" : "Không gì cả",
"Port" : "Cổng",
"Region" : "Vùng/miền",
"WebDAV" : "WebDAV",
diff --git a/apps/files_external/l10n/vi.json b/apps/files_external/l10n/vi.json
index 031dddee8e3..95cf65233d7 100644
--- a/apps/files_external/l10n/vi.json
+++ b/apps/files_external/l10n/vi.json
@@ -4,9 +4,11 @@
"Grant access" : "Cấp quyền truy cập",
"Access granted" : "Đã cấp quyền truy cập",
"Saved" : "Đã lưu",
- "None" : "Không gì cả",
+ "Saving..." : "Đang lưu...",
+ "Save" : "Lưu",
"Username" : "Tên đăng nhập",
"Password" : "Mật khẩu",
+ "None" : "Không gì cả",
"Port" : "Cổng",
"Region" : "Vùng/miền",
"WebDAV" : "WebDAV",
diff --git a/apps/files_external/l10n/zh_CN.js b/apps/files_external/l10n/zh_CN.js
index ca35a97bb53..989c31e915a 100644
--- a/apps/files_external/l10n/zh_CN.js
+++ b/apps/files_external/l10n/zh_CN.js
@@ -10,9 +10,11 @@ OC.L10N.register(
"Access granted" : "权限已授予。",
"Enable encryption" : "启用加密",
"Saved" : "已保存",
- "None" : "无",
+ "Saving..." : "保存中...",
+ "Save" : "保存",
"Username" : "用户名",
"Password" : "密码",
+ "None" : "无",
"API key" : "API密匙",
"Amazon S3" : "Amazon S3",
"Port" : "端口",
diff --git a/apps/files_external/l10n/zh_CN.json b/apps/files_external/l10n/zh_CN.json
index 53c1df78899..dfc01a86c7b 100644
--- a/apps/files_external/l10n/zh_CN.json
+++ b/apps/files_external/l10n/zh_CN.json
@@ -8,9 +8,11 @@
"Access granted" : "权限已授予。",
"Enable encryption" : "启用加密",
"Saved" : "已保存",
- "None" : "无",
+ "Saving..." : "保存中...",
+ "Save" : "保存",
"Username" : "用户名",
"Password" : "密码",
+ "None" : "无",
"API key" : "API密匙",
"Amazon S3" : "Amazon S3",
"Port" : "端口",
diff --git a/apps/files_external/l10n/zh_HK.js b/apps/files_external/l10n/zh_HK.js
index 7a38dd7ffed..8a9eafeb906 100644
--- a/apps/files_external/l10n/zh_HK.js
+++ b/apps/files_external/l10n/zh_HK.js
@@ -3,9 +3,11 @@ OC.L10N.register(
{
"Personal" : "個人",
"Saved" : "已儲存",
- "None" : "空",
+ "Saving..." : "儲存中...",
+ "Save" : "儲存",
"Username" : "用戶名稱",
"Password" : "密碼",
+ "None" : "空",
"Port" : "連接埠",
"WebDAV" : "WebDAV",
"URL" : "網址",
diff --git a/apps/files_external/l10n/zh_HK.json b/apps/files_external/l10n/zh_HK.json
index befeede4bbe..d6dbd19c486 100644
--- a/apps/files_external/l10n/zh_HK.json
+++ b/apps/files_external/l10n/zh_HK.json
@@ -1,9 +1,11 @@
{ "translations": {
"Personal" : "個人",
"Saved" : "已儲存",
- "None" : "空",
+ "Saving..." : "儲存中...",
+ "Save" : "儲存",
"Username" : "用戶名稱",
"Password" : "密碼",
+ "None" : "空",
"Port" : "連接埠",
"WebDAV" : "WebDAV",
"URL" : "網址",
diff --git a/apps/files_external/l10n/zh_TW.js b/apps/files_external/l10n/zh_TW.js
index ff0857709e8..1d12fc25384 100644
--- a/apps/files_external/l10n/zh_TW.js
+++ b/apps/files_external/l10n/zh_TW.js
@@ -33,10 +33,14 @@ OC.L10N.register(
"All users. Type to select user or group." : "所有人都可以使用,或者選擇特定使用者、群組",
"(group)" : "(群組)",
"Saved" : "已儲存",
+ "Saving..." : "儲存中...",
+ "Save" : "儲存",
"Couldn't access. Please logout and login to activate this mount point" : "無法存取。請重新登出再登入啟動此掛載點。",
"Couldn't get the information from the ownCloud server: {code} {type}" : "無法從ownCloud伺服器得到資訊: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "無法得到外部掛載點的列表: {type}",
"External mount error" : "外部掛載錯誤",
+ "Username" : "使用者名稱",
+ "Password" : "密碼",
"Access key" : "存取金鑰",
"Secret key" : "私密金鑰",
"None" : "無",
@@ -45,8 +49,6 @@ OC.L10N.register(
"Client ID" : "客戶端ID",
"Client secret" : "客戶端密碼",
"OpenStack" : "OpenStack",
- "Username" : "使用者名稱",
- "Password" : "密碼",
"Tenant name" : "租戶/專案名稱",
"Identity endpoint URL" : "身份識別終端點 URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/l10n/zh_TW.json b/apps/files_external/l10n/zh_TW.json
index 4fd9424bc6f..4363e8ea347 100644
--- a/apps/files_external/l10n/zh_TW.json
+++ b/apps/files_external/l10n/zh_TW.json
@@ -31,10 +31,14 @@
"All users. Type to select user or group." : "所有人都可以使用,或者選擇特定使用者、群組",
"(group)" : "(群組)",
"Saved" : "已儲存",
+ "Saving..." : "儲存中...",
+ "Save" : "儲存",
"Couldn't access. Please logout and login to activate this mount point" : "無法存取。請重新登出再登入啟動此掛載點。",
"Couldn't get the information from the ownCloud server: {code} {type}" : "無法從ownCloud伺服器得到資訊: {code} {type}",
"Couldn't get the list of external mount points: {type}" : "無法得到外部掛載點的列表: {type}",
"External mount error" : "外部掛載錯誤",
+ "Username" : "使用者名稱",
+ "Password" : "密碼",
"Access key" : "存取金鑰",
"Secret key" : "私密金鑰",
"None" : "無",
@@ -43,8 +47,6 @@
"Client ID" : "客戶端ID",
"Client secret" : "客戶端密碼",
"OpenStack" : "OpenStack",
- "Username" : "使用者名稱",
- "Password" : "密碼",
"Tenant name" : "租戶/專案名稱",
"Identity endpoint URL" : "身份識別終端點 URL",
"Rackspace" : "Rackspace",
diff --git a/apps/files_external/lib/auth/password/globalauth.php b/apps/files_external/lib/auth/password/globalauth.php
new file mode 100644
index 00000000000..c6faee06109
--- /dev/null
+++ b/apps/files_external/lib/auth/password/globalauth.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * @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/>
+ *
+ */
+
+namespace OCA\Files_External\Lib\Auth\Password;
+
+use OCA\Files_External\Service\BackendService;
+use OCP\IL10N;
+use OCP\IUser;
+use OCA\Files_External\Lib\Auth\AuthMechanism;
+use OCA\Files_External\Lib\StorageConfig;
+use OCP\Security\ICredentialsManager;
+use OCP\Files\Storage;
+use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
+
+/**
+ * Global Username and Password
+ */
+class GlobalAuth extends AuthMechanism {
+
+ const CREDENTIALS_IDENTIFIER = 'password::global';
+
+ /** @var ICredentialsManager */
+ protected $credentialsManager;
+
+ public function __construct(IL10N $l, ICredentialsManager $credentialsManager) {
+ $this->credentialsManager = $credentialsManager;
+
+ $this
+ ->setIdentifier('password::global')
+ ->setVisibility(BackendService::VISIBILITY_DEFAULT)
+ ->setScheme(self::SCHEME_PASSWORD)
+ ->setText($l->t('Global Credentails'));
+ }
+
+ public function getAuth($uid) {
+ $auth = $this->credentialsManager->retrieve($uid, self::CREDENTIALS_IDENTIFIER);
+ if (!is_array($auth)) {
+ return [
+ 'user' => '',
+ 'password' => ''
+ ];
+ } else {
+ return $auth;
+ }
+ }
+
+ public function saveAuth($uid, $user, $password) {
+ $this->credentialsManager->store($uid, self::CREDENTIALS_IDENTIFIER, [
+ 'user' => $user,
+ 'password' => $password
+ ]);
+ }
+
+ public function manipulateStorageConfig(StorageConfig &$storage, IUser $user = null) {
+ if ($storage->getType() === StorageConfig::MOUNT_TYPE_ADMIN) {
+ $uid = '';
+ } elseif (is_null($user)) {
+ throw new InsufficientDataForMeaningfulAnswerException('No credentials saved');
+ } else {
+ $uid = $user->getUID();
+ }
+ $credentials = $this->credentialsManager->retrieve($uid, self::CREDENTIALS_IDENTIFIER);
+
+ if (is_array($credentials)) {
+ $storage->setBackendOption('user', $credentials['user']);
+ $storage->setBackendOption('password', $credentials['password']);
+ }
+ }
+
+}
diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php
index 2bf39bcaa4f..51c2debd726 100644
--- a/apps/files_external/lib/config/configadapter.php
+++ b/apps/files_external/lib/config/configadapter.php
@@ -130,6 +130,16 @@ class ConfigAdapter implements IMountProvider {
$impl = new FailedStorage(['exception' => $e]);
}
+ try {
+ $availability = $impl->getAvailability();
+ if (!$availability['available']) {
+ $impl = new FailedStorage(['exception' => null]);
+ }
+ } catch (\Exception $e) {
+ // propagate exception into filesystem
+ $impl = new FailedStorage(['exception' => $e]);
+ }
+
$mount = new MountPoint(
$impl,
'/' . $user->getUID() . '/files' . $storage->getMountPoint(),
diff --git a/apps/files_external/lib/definitionparameter.php b/apps/files_external/lib/definitionparameter.php
index 27c6af0fcda..4d4bb13bebd 100644
--- a/apps/files_external/lib/definitionparameter.php
+++ b/apps/files_external/lib/definitionparameter.php
@@ -93,6 +93,22 @@ class DefinitionParameter implements \JsonSerializable {
}
/**
+ * @return string
+ */
+ public function getTypeName() {
+ switch ($this->type) {
+ case self::VALUE_BOOLEAN:
+ return 'boolean';
+ case self::VALUE_TEXT:
+ return 'text';
+ case self::VALUE_PASSWORD:
+ return 'password';
+ default:
+ return 'unknown';
+ }
+ }
+
+ /**
* @return int
*/
public function getFlags() {
diff --git a/apps/files_external/lib/failedcache.php b/apps/files_external/lib/failedcache.php
index 9e24c12f4b5..0f59495e595 100644
--- a/apps/files_external/lib/failedcache.php
+++ b/apps/files_external/lib/failedcache.php
@@ -22,6 +22,7 @@
namespace OCA\Files_External\Lib;
use OC\Files\Cache\CacheEntry;
+use OCP\Constants;
use OCP\Files\Cache\ICache;
/**
@@ -40,7 +41,7 @@ class FailedCache implements ICache {
'size' => 0,
'mimetype' => 'httpd/unix-directory',
'mimepart' => 'httpd',
- 'permissions' => 0,
+ 'permissions' => Constants::PERMISSION_READ,
'mtime' => time()
]);
} else {
@@ -60,6 +61,10 @@ class FailedCache implements ICache {
return;
}
+ public function insert($file, array $data) {
+ return;
+ }
+
public function update($id, array $data) {
return;
}
diff --git a/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php b/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php
index 871301b9b51..22d83ef56f4 100644
--- a/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php
+++ b/apps/files_external/lib/insufficientdataformeaningfulanswerexception.php
@@ -27,4 +27,15 @@ use \OCP\Files\StorageNotAvailableException;
* Authentication mechanism or backend has insufficient data
*/
class InsufficientDataForMeaningfulAnswerException extends StorageNotAvailableException {
+ /**
+ * StorageNotAvailableException constructor.
+ *
+ * @param string $message
+ * @param int $code
+ * @param \Exception $previous
+ * @since 6.0.0
+ */
+ public function __construct($message = '', $code = self::STATUS_INDETERMINATE, \Exception $previous = null) {
+ parent::__construct($message, $code, $previous);
+ }
}
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index 9da21dc88e6..50bd56f28ad 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -314,4 +314,17 @@ class SMB extends Common {
|| Server::NativeAvailable()
) ? true : ['smbclient'];
}
+
+ /**
+ * Test a storage for availability
+ *
+ * @return bool
+ */
+ public function test() {
+ try {
+ return parent::test();
+ } catch (Exception $e) {
+ return false;
+ }
+ }
}
diff --git a/apps/files_external/lib/storageconfig.php b/apps/files_external/lib/storageconfig.php
index 7f716893842..6f44b25a2e6 100644
--- a/apps/files_external/lib/storageconfig.php
+++ b/apps/files_external/lib/storageconfig.php
@@ -24,6 +24,7 @@
namespace OCA\Files_external\Lib;
+use OCA\Files_External\Lib\Auth\IUserProvided;
use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
@@ -406,6 +407,7 @@ class StorageConfig implements \JsonSerializable {
if (!is_null($this->statusMessage)) {
$result['statusMessage'] = $this->statusMessage;
}
+ $result['userProvided'] = $this->authMechanism instanceof IUserProvided;
$result['type'] = ($this->getType() === self::MOUNT_TYPE_PERSONAl) ? 'personal': 'system';
return $result;
}
diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php
index 4d8f480ecc0..f180b7e8f5c 100644
--- a/apps/files_external/personal.php
+++ b/apps/files_external/personal.php
@@ -30,6 +30,7 @@ use \OCA\Files_External\Service\BackendService;
$appContainer = \OC_Mount_Config::$app->getContainer();
$backendService = $appContainer->query('OCA\Files_External\Service\BackendService');
$userStoragesService = $appContainer->query('OCA\Files_external\Service\UserStoragesService');
+$globalAuth = $appContainer->query('OCA\Files_External\Lib\Auth\Password\GlobalAuth');
$tmpl = new OCP\Template('files_external', 'settings');
$tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
@@ -38,4 +39,7 @@ $tmpl->assign('storages', $userStoragesService->getStorages());
$tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends()));
$tmpl->assign('backends', $backendService->getAvailableBackends());
$tmpl->assign('authMechanisms', $backendService->getAuthMechanisms());
+$uid = \OC::$server->getUserSession()->getUser()->getUID();
+$tmpl->assign('globalCredentials', $globalAuth->getAuth($uid));
+$tmpl->assign('globalCredentialsUid', $uid);
return $tmpl->fetchPage();
diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php
index 0d83d26ff97..a5265c500d9 100644
--- a/apps/files_external/settings.php
+++ b/apps/files_external/settings.php
@@ -32,6 +32,7 @@ use \OCA\Files_External\Service\BackendService;
$appContainer = \OC_Mount_Config::$app->getContainer();
$backendService = $appContainer->query('OCA\Files_External\Service\BackendService');
$globalStoragesService = $appContainer->query('OCA\Files_external\Service\GlobalStoragesService');
+$globalAuth = $appContainer->query('OCA\Files_External\Lib\Auth\Password\GlobalAuth');
\OC_Util::addVendorScript('select2/select2');
\OC_Util::addVendorStyle('select2/select2');
@@ -44,4 +45,7 @@ $tmpl->assign('backends', $backendService->getAvailableBackends());
$tmpl->assign('authMechanisms', $backendService->getAuthMechanisms());
$tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends()));
$tmpl->assign('allowUserMounting', $backendService->isUserMountingAllowed());
+$tmpl->assign('allowUserMounting', $backendService->isUserMountingAllowed());
+$tmpl->assign('globalCredentials', $globalAuth->getAuth(''));
+$tmpl->assign('globalCredentialsUid', '');
return $tmpl->fetchPage();
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index f7caf3d2caa..8b453fe77c3 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -68,8 +68,23 @@
}
}
?>
-<form id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
+<form autocomplete="false" class="section" action="#"
+ id="global_credentials">
<h2><?php p($l->t('External Storage')); ?></h2>
+ <p><?php p($l->t('Global Credentials')); ?></p>
+ <input type="text" name="username"
+ autocomplete="false"
+ value="<?php p($_['globalCredentials']['user']); ?>"
+ placeholder="<?php p($l->t('Username')) ?>"/>
+ <input type="password" name="password"
+ autocomplete="false"
+ value="<?php p($_['globalCredentials']['password']); ?>"
+ placeholder="<?php p($l->t('Password')) ?>"/>
+ <input type="hidden" name="uid"
+ value="<?php p($_['globalCredentialsUid']); ?>"/>
+ <input type="submit" value="<?php p($l->t('Save')) ?>"/>
+</form>
+<form id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
<?php if (isset($_['dependencies']) and ($_['dependencies']<>'')) print_unescaped(''.$_['dependencies'].''); ?>
<table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['visibilityType'] === BackendService::VISIBILITY_ADMIN)); ?>'>
<thead>
diff --git a/apps/files_external/tests/auth/password/globalauth.php b/apps/files_external/tests/auth/password/globalauth.php
new file mode 100644
index 00000000000..912bfd1574d
--- /dev/null
+++ b/apps/files_external/tests/auth/password/globalauth.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_External\Tests\Auth\Password;
+
+use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
+use OCA\Files_external\Lib\StorageConfig;
+use Test\TestCase;
+
+class GlobalAuthTest extends TestCase {
+ /**
+ * @var \OCP\IL10N|\PHPUnit_Framework_MockObject_MockObject
+ */
+ private $l10n;
+
+ /**
+ * @var \OCP\Security\ICredentialsManager|\PHPUnit_Framework_MockObject_MockObject
+ */
+ private $credentialsManager;
+
+ /**
+ * @var GlobalAuth
+ */
+ private $instance;
+
+ protected function setUp() {
+ parent::setUp();
+ $this->l10n = $this->getMock('\OCP\IL10N');
+ $this->credentialsManager = $this->getMock('\OCP\Security\ICredentialsManager');
+ $this->instance = new GlobalAuth($this->l10n, $this->credentialsManager);
+ }
+
+ private function getStorageConfig($type, $config = []) {
+ /** @var \OCA\Files_External\Lib\StorageConfig|\PHPUnit_Framework_MockObject_MockObject $storageConfig */
+ $storageConfig = $this->getMock('\OCA\Files_External\Lib\StorageConfig');
+ $storageConfig->expects($this->any())
+ ->method('getType')
+ ->will($this->returnValue($type));
+ $storageConfig->expects($this->any())
+ ->method('getBackendOptions')
+ ->will($this->returnCallback(function () use (&$config) {
+ return $config;
+ }));
+ $storageConfig->expects($this->any())
+ ->method('getBackendOption')
+ ->will($this->returnCallback(function ($key) use (&$config) {
+ return $config[$key];
+ }));
+ $storageConfig->expects($this->any())
+ ->method('setBackendOption')
+ ->will($this->returnCallback(function ($key, $value) use (&$config) {
+ $config[$key] = $value;
+ }));
+
+ return $storageConfig;
+ }
+
+ public function testNoCredentials() {
+ $this->credentialsManager->expects($this->once())
+ ->method('retrieve')
+ ->will($this->returnValue(null));
+
+ $storage = $this->getStorageConfig(StorageConfig::MOUNT_TYPE_ADMIN);
+
+ $this->instance->manipulateStorageConfig($storage);
+ $this->assertEquals([], $storage->getBackendOptions());
+ }
+
+ public function testSavedCredentials() {
+ $this->credentialsManager->expects($this->once())
+ ->method('retrieve')
+ ->will($this->returnValue([
+ 'user' => 'a',
+ 'password' => 'b'
+ ]));
+
+ $storage = $this->getStorageConfig(StorageConfig::MOUNT_TYPE_ADMIN);
+
+ $this->instance->manipulateStorageConfig($storage);
+ $this->assertEquals([
+ 'user' => 'a',
+ 'password' => 'b'
+ ], $storage->getBackendOptions());
+ }
+
+ /**
+ * @expectedException \OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException
+ */
+ public function testNoCredentialsPersonal() {
+ $this->credentialsManager->expects($this->never())
+ ->method('retrieve');
+
+ $storage = $this->getStorageConfig(StorageConfig::MOUNT_TYPE_PERSONAl);
+
+ $this->instance->manipulateStorageConfig($storage);
+ $this->assertEquals([], $storage->getBackendOptions());
+ }
+
+}
diff --git a/apps/files_sharing/api/share20ocs.php b/apps/files_sharing/api/share20ocs.php
index d7c5d004d9c..67a94aaf8aa 100644
--- a/apps/files_sharing/api/share20ocs.php
+++ b/apps/files_sharing/api/share20ocs.php
@@ -26,6 +26,7 @@ use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\Files\IRootFolder;
+use OCP\Share;
use OCP\Share\IManager;
use OCP\Share\Exceptions\ShareNotFound;
@@ -164,13 +165,20 @@ class Share20OCS {
}
if ($share === null) {
- //For now federated shares are handled by the old endpoint.
- return \OCA\Files_Sharing\API\Local::getShare(['id' => $id]);
+ if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
+
+ try {
+ $share = $this->shareManager->getShareById('ocFederatedSharing:' . $id);
+ } catch (ShareNotFound $e) {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
}
if ($this->canAccessShare($share)) {
$share = $this->formatShare($share);
- return new \OC_OCS_Result($share);
+ return new \OC_OCS_Result([$share]);
} else {
return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
}
@@ -195,7 +203,15 @@ class Share20OCS {
// Could not find the share as internal share... maybe it is a federated share
if ($share === null) {
- return \OCA\Files_Sharing\API\Local::deleteShare(['id' => $id]);
+ if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
+
+ try {
+ $share = $this->shareManager->getShareById('ocFederatedSharing:' . $id);
+ } catch (ShareNotFound $e) {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
}
if (!$this->canAccessShare($share)) {
@@ -313,8 +329,12 @@ class Share20OCS {
}
} else if ($shareType === \OCP\Share::SHARE_TYPE_REMOTE) {
- //fixme Remote shares are handled by old code path for now
- return \OCA\Files_Sharing\API\Local::createShare([]);
+ if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ return new \OC_OCS_Result(null, 403, 'Sharing '.$path.' failed, because the backend does not allow shares from type '.$shareType);
+ }
+
+ $share->setSharedWith($shareWith);
+ $share->setPermissions($permissions);
} else {
return new \OC_OCS_Result(null, 400, "unknown share type");
}
@@ -368,11 +388,12 @@ class Share20OCS {
/** @var \OCP\Share\IShare[] $shares */
$shares = [];
foreach ($nodes as $node) {
- $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_USER, $node, false, -1, 0));
+ $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_USER, $node, false, -1, 0));
$shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_GROUP, $node, false, -1, 0));
- $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_LINK, $node, false, -1, 0));
- //TODO: Add federated shares
-
+ $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_LINK, $node, false, -1, 0));
+ if ($this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_REMOTE, $node, false, -1, 0));
+ }
}
$formatted = [];
@@ -427,10 +448,14 @@ class Share20OCS {
$userShares = $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_USER, $path, $reshares, -1, 0);
$groupShares = $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_GROUP, $path, $reshares, -1, 0);
$linkShares = $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_LINK, $path, $reshares, -1, 0);
- //TODO: Add federated shares
-
$shares = array_merge($userShares, $groupShares, $linkShares);
+ if ($this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ $federatedShares = $this->shareManager->getSharesBy($this->currentUser->getUID(), \OCP\Share::SHARE_TYPE_REMOTE, $path, $reshares, -1, 0);
+ $shares = array_merge($shares, $federatedShares);
+ }
+
+
$formatted = [];
foreach ($shares as $share) {
$formatted[] = $this->formatShare($share);
@@ -456,7 +481,15 @@ class Share20OCS {
// Could not find the share as internal share... maybe it is a federated share
if ($share === null) {
- return \OCA\Files_Sharing\API\Local::updateShare(['id' => $id]);
+ if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
+
+ try {
+ $share = $this->shareManager->getShareById('ocFederatedSharing:' . $id);
+ } catch (ShareNotFound $e) {
+ return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ }
}
if (!$this->canAccessShare($share)) {
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml
index 17826be47b4..29ae15e4722 100644
--- a/apps/files_sharing/appinfo/info.xml
+++ b/apps/files_sharing/appinfo/info.xml
@@ -10,7 +10,7 @@ Turning the feature off removes shared files and folders on the server for all s
<licence>AGPL</licence>
<author>Michael Gapczynski, Bjoern Schiessle</author>
<default_enable/>
- <version>0.9.0</version>
+ <version>0.9.1</version>
<types>
<filesystem/>
</types>
diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php
index d754a95705c..ced227a107b 100644
--- a/apps/files_sharing/appinfo/update.php
+++ b/apps/files_sharing/appinfo/update.php
@@ -25,7 +25,7 @@ use OCA\Files_Sharing\Migration;
$installedVersion = \OC::$server->getConfig()->getAppValue('files_sharing', 'installed_version');
// Migration OC8.2 -> OC9
-if (version_compare($installedVersion, '0.9.0', '<')) {
+if (version_compare($installedVersion, '0.9.1', '<')) {
$m = new Migration(\OC::$server->getDatabaseConnection());
$m->removeReShares();
$m->updateInitiatorInfo();
diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php
index bbe68096b52..dae61a3537b 100644
--- a/apps/files_sharing/lib/controllers/sharecontroller.php
+++ b/apps/files_sharing/lib/controllers/sharecontroller.php
@@ -30,7 +30,6 @@
namespace OCA\Files_Sharing\Controllers;
use OC;
-use OC\Files\Filesystem;
use OC_Files;
use OC_Util;
use OCP;
@@ -71,7 +70,7 @@ class ShareController extends Controller {
protected $logger;
/** @var OCP\Activity\IManager */
protected $activityManager;
- /** @var OC\Share20\Manager */
+ /** @var OCP\Share\IManager */
protected $shareManager;
/** @var ISession */
protected $session;
@@ -88,7 +87,7 @@ class ShareController extends Controller {
* @param IUserManager $userManager
* @param ILogger $logger
* @param OCP\Activity\IManager $activityManager
- * @param \OC\Share20\Manager $shareManager
+ * @param \OCP\Share\IManager $shareManager
* @param ISession $session
* @param IPreview $previewManager
* @param IRootFolder $rootFolder
@@ -100,7 +99,7 @@ class ShareController extends Controller {
IUserManager $userManager,
ILogger $logger,
\OCP\Activity\IManager $activityManager,
- \OC\Share20\Manager $shareManager,
+ \OCP\Share\IManager $shareManager,
ISession $session,
IPreview $previewManager,
IRootFolder $rootFolder) {
@@ -177,6 +176,7 @@ class ShareController extends Controller {
if ($this->shareManager->checkPassword($share, $password)) {
$this->session->set('public_link_authenticated', (string)$share->getId());
} else {
+ $this->emitAccessShareHook($share, 403, 'Wrong password');
return false;
}
} else {
@@ -190,6 +190,44 @@ class ShareController extends Controller {
}
/**
+ * throws hooks when a share is attempted to be accessed
+ *
+ * @param \OCP\Share\IShare|string $share the Share instance if available,
+ * otherwise token
+ * @param int $errorCode
+ * @param string $errorMessage
+ * @throws OC\HintException
+ * @throws OC\ServerNotAvailableException
+ */
+ protected function emitAccessShareHook($share, $errorCode = 200, $errorMessage = '') {
+ $itemType = $itemSource = $uidOwner = '';
+ $token = $share;
+ $exception = null;
+ if($share instanceof \OCP\Share\IShare) {
+ try {
+ $token = $share->getToken();
+ $uidOwner = $share->getSharedBy();
+ $itemType = $share->getNodeType();
+ $itemSource = $share->getNodeId();
+ } catch (\Exception $e) {
+ // we log what we know and pass on the exception afterwards
+ $exception = $e;
+ }
+ }
+ \OC_Hook::emit('OCP\Share', 'share_link_access', [
+ 'itemType' => $itemType,
+ 'itemSource' => $itemSource,
+ 'uidOwner' => $uidOwner,
+ 'token' => $token,
+ 'errorCode' => $errorCode,
+ 'errorMessage' => $errorMessage,
+ ]);
+ if(!is_null($exception)) {
+ throw $exception;
+ }
+ }
+
+ /**
* @PublicPage
* @NoCSRFRequired
*
@@ -205,6 +243,7 @@ class ShareController extends Controller {
try {
$share = $this->shareManager->getShareByToken($token);
} catch (ShareNotFound $e) {
+ $this->emitAccessShareHook($token, 404, 'Share not found');
return new NotFoundResponse();
}
@@ -215,8 +254,14 @@ class ShareController extends Controller {
}
// We can't get the path of a file share
- if ($share->getNode() instanceof \OCP\Files\File && $path !== '') {
- throw new NotFoundException();
+ try {
+ if ($share->getNode() instanceof \OCP\Files\File && $path !== '') {
+ $this->emitAccessShareHook($share, 404, 'Share not found');
+ throw new NotFoundException();
+ }
+ } catch (\Exception $e) {
+ $this->emitAccessShareHook($share, 404, 'Share not found');
+ throw $e;
}
$rootFolder = null;
@@ -227,6 +272,7 @@ class ShareController extends Controller {
try {
$path = $rootFolder->get($path);
} catch (\OCP\Files\NotFoundException $e) {
+ $this->emitAccessShareHook($share, 404, 'Share not found');
throw new NotFoundException();
}
}
@@ -287,6 +333,8 @@ class ShareController extends Controller {
$response = new TemplateResponse($this->appName, 'public', $shareTmpl, 'base');
$response->setContentSecurityPolicy($csp);
+ $this->emitAccessShareHook($share);
+
return $response;
}
@@ -344,6 +392,7 @@ class ShareController extends Controller {
try {
$node = $node->get($path);
} catch (NotFoundException $e) {
+ $this->emitAccessShareHook($share, 404, 'Share not found');
return new NotFoundResponse();
}
}
@@ -409,6 +458,8 @@ class ShareController extends Controller {
setcookie('ocDownloadStarted', $downloadStartSecret, time() + 20, '/');
}
+ $this->emitAccessShareHook($share);
+
// download selected files
if (!is_null($files)) {
// FIXME: The exit is required here because otherwise the AppFramework is trying to add headers as well
diff --git a/apps/files_sharing/lib/migration.php b/apps/files_sharing/lib/migration.php
index 90e0dead480..e7346385510 100644
--- a/apps/files_sharing/lib/migration.php
+++ b/apps/files_sharing/lib/migration.php
@@ -142,7 +142,8 @@ class Migration {
[
\OCP\Share::SHARE_TYPE_USER,
\OCP\Share::SHARE_TYPE_GROUP,
- \OCP\Share::SHARE_TYPE_LINK
+ \OCP\Share::SHARE_TYPE_LINK,
+ \OCP\Share::SHARE_TYPE_REMOTE,
],
Connection::PARAM_INT_ARRAY
)
@@ -185,7 +186,8 @@ class Migration {
[
\OCP\Share::SHARE_TYPE_USER,
\OCP\Share::SHARE_TYPE_GROUP,
- \OCP\Share::SHARE_TYPE_LINK
+ \OCP\Share::SHARE_TYPE_LINK,
+ \OCP\Share::SHARE_TYPE_REMOTE,
],
Connection::PARAM_INT_ARRAY
)
diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php
index 9a1e554046b..10da2462807 100644
--- a/apps/files_sharing/lib/updater.php
+++ b/apps/files_sharing/lib/updater.php
@@ -73,6 +73,12 @@ class Shared_Updater {
*/
static private function moveShareToShare($path) {
$userFolder = \OC::$server->getUserFolder();
+
+ // If the user folder can't be constructed (e.g. link share) just return.
+ if ($userFolder === null) {
+ return;
+ }
+
$src = $userFolder->get($path);
$type = $src instanceof \OCP\Files\File ? 'file' : 'folder';
diff --git a/apps/files_sharing/templates/settings-personal.php b/apps/files_sharing/templates/settings-personal.php
index 1b93084e547..c318943712f 100644
--- a/apps/files_sharing/templates/settings-personal.php
+++ b/apps/files_sharing/templates/settings-personal.php
@@ -31,7 +31,7 @@ if ($_['showShareIT']) {
</button>
</div>
<button class="social-diaspora pop-up"
- data-url='http://sharetodiaspora.github.io/?title=<?php p($_['message_without_URL']); ?>&url=<?php p(urlencode($_['reference'])); ?>'>
+ data-url='https://sharetodiaspora.github.io/?title=<?php p($_['message_without_URL']); ?>&url=<?php p(urlencode($_['reference'])); ?>'>
Diaspora
</button>
<button class="social-twitter pop-up"
diff --git a/apps/files_sharing/tests/api/share20ocstest.php b/apps/files_sharing/tests/api/share20ocstest.php
index a93cd5f58ce..a1094ce4b22 100644
--- a/apps/files_sharing/tests/api/share20ocstest.php
+++ b/apps/files_sharing/tests/api/share20ocstest.php
@@ -97,10 +97,17 @@ class Share20OCSTest extends \Test\TestCase {
public function testDeleteShareShareNotFound() {
$this->shareManager
- ->expects($this->once())
+ ->expects($this->exactly(2))
->method('getShareById')
- ->with('ocinternal:42')
- ->will($this->throwException(new \OCP\Share\Exceptions\ShareNotFound()));
+ ->will($this->returnCallback(function($id) {
+ if ($id === 'ocinternal:42' || $id === 'ocFederatedSharing:42') {
+ throw new \OCP\Share\Exceptions\ShareNotFound();
+ } else {
+ throw new \Exception();
+ }
+ }));
+
+ $this->shareManager->method('outgoingServer2ServerSharesAllowed')->willReturn(true);
$expected = new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
$this->assertEquals($expected, $this->ocs->deleteShare(42));
@@ -387,7 +394,7 @@ class Share20OCSTest extends \Test\TestCase {
['group', $group],
]));
- $expected = new \OC_OCS_Result($result);
+ $expected = new \OC_OCS_Result([$result]);
$this->assertEquals($expected->getData(), $ocs->getShare($share->getId())->getData());
}
diff --git a/apps/files_sharing/tests/controller/sharecontroller.php b/apps/files_sharing/tests/controller/sharecontroller.php
index 22e15972cd6..11dc082390c 100644
--- a/apps/files_sharing/tests/controller/sharecontroller.php
+++ b/apps/files_sharing/tests/controller/sharecontroller.php
@@ -219,7 +219,11 @@ class ShareControllerTest extends \Test\TestCase {
public function testAuthenticateInvalidPassword() {
$share = \OC::$server->getShareManager()->newShare();
- $share->setId(42);
+ $share->setNodeId(100)
+ ->setNodeType('file')
+ ->setToken('token')
+ ->setSharedBy('initiator')
+ ->setId(42);
$this->shareManager
->expects($this->once())
@@ -237,6 +241,20 @@ class ShareControllerTest extends \Test\TestCase {
->expects($this->never())
->method('set');
+ $hookListner = $this->getMockBuilder('Dummy')->setMethods(['access'])->getMock();
+ \OCP\Util::connectHook('OCP\Share', 'share_link_access', $hookListner, 'access');
+
+ $hookListner->expects($this->once())
+ ->method('access')
+ ->with($this->callback(function(array $data) {
+ return $data['itemType'] === 'file' &&
+ $data['itemSource'] === 100 &&
+ $data['uidOwner'] === 'initiator' &&
+ $data['token'] === 'token' &&
+ $data['errorCode'] === 403 &&
+ $data['errorMessage'] === 'Wrong password';
+ }));
+
$response = $this->shareController->authenticate('token', 'invalidpassword');
$expectedResponse = new TemplateResponse($this->appName, 'authenticate', array('wrongpw' => true), 'guest');
$this->assertEquals($expectedResponse, $response);
diff --git a/apps/files_sharing/tests/migrationtest.php b/apps/files_sharing/tests/migrationtest.php
index e1c047e0342..8a40b76a642 100644
--- a/apps/files_sharing/tests/migrationtest.php
+++ b/apps/files_sharing/tests/migrationtest.php
@@ -209,6 +209,23 @@ class MigrationTest extends TestCase {
$this->assertSame(1,
$query->execute()
);
+ $parent = $query->getLastInsertId();
+ // third re-share, should be attached to the first user share after migration
+ $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_REMOTE)
+ ->setParameter('share_with', 'user@server.com')
+ ->setParameter('uid_owner', 'user3')
+ ->setParameter('uid_initiator', '')
+ ->setParameter('parent', $parent)
+ ->setParameter('item_type', 'file')
+ ->setParameter('item_source', '2')
+ ->setParameter('item_target', '/2')
+ ->setParameter('file_source', 2)
+ ->setParameter('file_target', '/foobar')
+ ->setParameter('permissions', 31)
+ ->setParameter('stime', time());
+ $this->assertSame(1,
+ $query->execute()
+ );
}
public function testRemoveReShares() {
@@ -221,7 +238,7 @@ class MigrationTest extends TestCase {
$query = $this->connection->getQueryBuilder();
$query->select('*')->from($this->table)->orderBy('id');
$result = $query->execute()->fetchAll();
- $this->assertSame(8, count($result));
+ $this->assertSame(9, count($result));
// shares which shouldn't be modified
for ($i = 0; $i < 4; $i++) {
@@ -238,7 +255,7 @@ class MigrationTest extends TestCase {
$this->assertEmpty($result[5]['uid_initiator']);
$this->assertNull($result[5]['parent']);
// flatted re-shares
- for($i = 6; $i < 8; $i++) {
+ for($i = 6; $i < 9; $i++) {
$this->assertSame('owner2', $result[$i]['uid_owner']);
$user = 'user' . ($i - 5);
$this->assertSame($user, $result[$i]['uid_initiator']);
diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php
index 35b3110928b..88a4126dabd 100644
--- a/apps/files_versions/lib/storage.php
+++ b/apps/files_versions/lib/storage.php
@@ -52,6 +52,10 @@ class Storage {
const DEFAULTMAXSIZE=50; // unit: percentage; 50% of available disk space/quota
const VERSIONS_ROOT = 'files_versions/';
+ const DELETE_TRIGGER_MASTER_REMOVED = 0;
+ const DELETE_TRIGGER_RETENTION_CONSTRAINT = 1;
+ const DELETE_TRIGGER_QUOTA_EXCEEDED = 2;
+
// files for which we can remove the versions after the delete operation was successful
private static $deletedFiles = array();
@@ -210,9 +214,9 @@ class Storage {
$versions = self::getVersions($uid, $filename);
if (!empty($versions)) {
foreach ($versions as $v) {
- \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $path . $v['version']));
+ \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $path . $v['version'], 'trigger' => self::DELETE_TRIGGER_MASTER_REMOVED));
self::deleteVersion($view, $filename . '.v' . $v['version']);
- \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $path . $v['version']));
+ \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $path . $v['version'], 'trigger' => self::DELETE_TRIGGER_MASTER_REMOVED));
}
}
}
@@ -309,6 +313,7 @@ class Storage {
Storage::scheduleExpire($uid, $file);
\OC_Hook::emit('\OCP\Versions', 'rollback', array(
'path' => $filename,
+ 'revision' => $revision,
));
return true;
} else if ($versionCreated) {
@@ -444,9 +449,9 @@ class Storage {
$view = new \OC\Files\View('/' . $uid . '/files_versions');
if (!empty($toDelete)) {
foreach ($toDelete as $version) {
- \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $version['path'].'.v'.$version['version']));
+ \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $version['path'].'.v'.$version['version'], 'trigger' => self::DELETE_TRIGGER_RETENTION_CONSTRAINT));
self::deleteVersion($view, $version['path'] . '.v' . $version['version']);
- \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $version['path'].'.v'.$version['version']));
+ \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $version['path'].'.v'.$version['version'], 'trigger' => self::DELETE_TRIGGER_RETENTION_CONSTRAINT));
}
}
}
@@ -705,9 +710,9 @@ class Storage {
}
foreach($toDelete as $key => $path) {
- \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $path));
+ \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $path, 'trigger' => self::DELETE_TRIGGER_QUOTA_EXCEEDED));
self::deleteVersion($versionsFileview, $path);
- \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $path));
+ \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $path, 'trigger' => self::DELETE_TRIGGER_QUOTA_EXCEEDED));
unset($allVersions[$key]); // update array with the versions we keep
\OCP\Util::writeLog('files_versions', "Expire: " . $path, \OCP\Util::DEBUG);
}
@@ -722,9 +727,9 @@ class Storage {
reset($allVersions);
while ($availableSpace < 0 && $i < $numOfVersions) {
$version = current($allVersions);
- \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $version['path'].'.v'.$version['version']));
+ \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $version['path'].'.v'.$version['version'], 'trigger' => self::DELETE_TRIGGER_QUOTA_EXCEEDED));
self::deleteVersion($versionsFileview, $version['path'] . '.v' . $version['version']);
- \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $version['path'].'.v'.$version['version']));
+ \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $version['path'].'.v'.$version['version'], 'trigger' => self::DELETE_TRIGGER_QUOTA_EXCEEDED));
\OCP\Util::writeLog('files_versions', 'running out of space! Delete oldest version: ' . $version['path'].'.v'.$version['version'] , \OCP\Util::DEBUG);
$versionsSize -= $version['size'];
$availableSpace += $version['size'];
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index b85877cebd3..d7d9c7a4fb4 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -652,7 +652,9 @@ class Test_Files_Versioning extends \Test\TestCase {
'path' => '/sub/test.txt',
);
- $this->assertEquals($expectedParams, $params);
+ $this->assertEquals($expectedParams['path'], $params['path']);
+ $this->assertTrue(array_key_exists('revision', $params));
+ $this->assertTrue($params['revision'] > 0);
$this->assertEquals('version2', $this->rootView->file_get_contents($filePath));
$info2 = $this->rootView->getFileInfo($filePath);
diff --git a/apps/systemtags/appinfo/app.php b/apps/systemtags/appinfo/app.php
index 0bb57e1227b..00663d5082b 100644
--- a/apps/systemtags/appinfo/app.php
+++ b/apps/systemtags/appinfo/app.php
@@ -39,9 +39,11 @@ $eventDispatcher->addListener(
\OCP\Util::addScript('systemtags/systemtagscollection');
\OCP\Util::addScript('systemtags/systemtagsinputfield');
\OCP\Util::addScript('systemtags', 'app');
+ \OCP\Util::addScript('systemtags', 'systemtagsfilelist');
\OCP\Util::addScript('systemtags', 'filesplugin');
\OCP\Util::addScript('systemtags', 'systemtagsinfoview');
\OCP\Util::addStyle('systemtags');
+ \OCP\Util::addStyle('systemtags', 'systemtagsfilelist');
}
);
@@ -73,3 +75,15 @@ $mapperListener = function(MapperEvent $event) use ($activityManager) {
$eventDispatcher->addListener(MapperEvent::EVENT_ASSIGN, $mapperListener);
$eventDispatcher->addListener(MapperEvent::EVENT_UNASSIGN, $mapperListener);
+
+$l = \OC::$server->getL10N('systemtags');
+
+\OCA\Files\App::getNavigationManager()->add(
+ array(
+ 'id' => 'systemtagsfilter',
+ 'appname' => 'systemtags',
+ 'script' => 'list.php',
+ 'order' => 9,
+ 'name' => $l->t('Tags')
+ )
+);
diff --git a/apps/systemtags/css/systemtagsfilelist.css b/apps/systemtags/css/systemtagsfilelist.css
new file mode 100644
index 00000000000..e8fb665e26b
--- /dev/null
+++ b/apps/systemtags/css/systemtagsfilelist.css
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2016
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+#app-content-systemtagsfilter .select2-container {
+ width: 30%;
+}
+
+#app-content-systemtagsfilter .select2-choices {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ background: #fff;
+ color: #555;
+ box-sizing: content-box;
+ border-radius: 3px;
+ border: 1px solid #ddd;
+ margin: 3px 3px 3px 0;
+ padding: 0;
+ min-height: auto;
+}
+
+.nav-icon-systemtagsfilter {
+ background-image: url('../img/tag.svg');
+}
diff --git a/apps/systemtags/img/tag.png b/apps/systemtags/img/tag.png
new file mode 100644
index 00000000000..5f4767a6f46
--- /dev/null
+++ b/apps/systemtags/img/tag.png
Binary files differ
diff --git a/apps/systemtags/img/tag.svg b/apps/systemtags/img/tag.svg
new file mode 100644
index 00000000000..6024607dd0a
--- /dev/null
+++ b/apps/systemtags/img/tag.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <rect style="color:#000000" fill-opacity="0" height="97.986" width="163.31" y="-32.993" x="-62.897"/>
+ <path opacity=".5" style="color:#000000" d="m6 1c-2.7614 0-5 2.2386-5 5s2.2386 5 5 5c0.98478 0 1.8823-0.28967 2.6562-0.78125l4.4688 4.625c0.09558 0.10527 0.22619 0.16452 0.375 0.15625 0.14882-0.0083 0.3031-0.07119 0.40625-0.1875l0.9375-1.0625c0.19194-0.22089 0.19549-0.53592 0-0.71875l-4.594-4.406c0.478-0.7663 0.75-1.6555 0.75-2.625 0-2.7614-2.2386-5-5-5zm0 2c1.6569 0 3 1.3431 3 3s-1.3431 3-3 3-3-1.3431-3-3 1.3431-3 3-3z"/>
+</svg>
diff --git a/apps/systemtags/js/app.js b/apps/systemtags/js/app.js
index f55aa5c9a6e..d28514358c1 100644
--- a/apps/systemtags/js/app.js
+++ b/apps/systemtags/js/app.js
@@ -16,5 +16,92 @@
OCA.SystemTags = {};
}
+ OCA.SystemTags.App = {
+
+ initFileList: function($el) {
+ if (this._fileList) {
+ return this._fileList;
+ }
+
+ this._fileList = new OCA.SystemTags.FileList(
+ $el,
+ {
+ id: 'systemtags',
+ scrollContainer: $('#app-content'),
+ fileActions: this._createFileActions()
+ }
+ );
+
+ this._fileList.appName = t('systemtags', 'Tags');
+ return this._fileList;
+ },
+
+ removeFileList: function() {
+ if (this._fileList) {
+ this._fileList.$fileList.empty();
+ }
+ },
+
+ _createFileActions: function() {
+ // inherit file actions from the files app
+ var fileActions = new OCA.Files.FileActions();
+ // note: not merging the legacy actions because legacy apps are not
+ // compatible with the sharing overview and need to be adapted first
+ fileActions.registerDefaultActions();
+ fileActions.merge(OCA.Files.fileActions);
+
+ if (!this._globalActionsInitialized) {
+ // in case actions are registered later
+ this._onActionsUpdated = _.bind(this._onActionsUpdated, this);
+ OCA.Files.fileActions.on('setDefault.app-systemtags', this._onActionsUpdated);
+ OCA.Files.fileActions.on('registerAction.app-systemtags', this._onActionsUpdated);
+ this._globalActionsInitialized = true;
+ }
+
+ // when the user clicks on a folder, redirect to the corresponding
+ // folder in the files app instead of opening it directly
+ fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
+ OCA.Files.App.setActiveView('files', {silent: true});
+ OCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true);
+ });
+ fileActions.setDefault('dir', 'Open');
+ return fileActions;
+ },
+
+ _onActionsUpdated: function(ev) {
+ if (!this._fileList) {
+ return;
+ }
+
+ if (ev.action) {
+ this._fileList.fileActions.registerAction(ev.action);
+ } else if (ev.defaultAction) {
+ this._fileList.fileActions.setDefault(
+ ev.defaultAction.mime,
+ ev.defaultAction.name
+ );
+ }
+ },
+
+ /**
+ * Destroy the app
+ */
+ destroy: function() {
+ OCA.Files.fileActions.off('setDefault.app-systemtags', this._onActionsUpdated);
+ OCA.Files.fileActions.off('registerAction.app-systemtags', this._onActionsUpdated);
+ this.removeFileList();
+ this._fileList = null;
+ delete this._globalActionsInitialized;
+ }
+ };
+
})();
+$(document).ready(function() {
+ $('#app-content-systemtagsfilter').on('show', function(e) {
+ OCA.SystemTags.App.initFileList($(e.target));
+ });
+ $('#app-content-systemtagsfilter').on('hide', function() {
+ OCA.SystemTags.App.removeFileList();
+ });
+});
diff --git a/apps/systemtags/js/filesplugin.js b/apps/systemtags/js/filesplugin.js
index 471440c2e09..588037455ae 100644
--- a/apps/systemtags/js/filesplugin.js
+++ b/apps/systemtags/js/filesplugin.js
@@ -23,7 +23,8 @@
OCA.SystemTags.FilesPlugin = {
allowedLists: [
'files',
- 'favorites'
+ 'favorites',
+ 'systemtagsfilter'
],
attach: function(fileList) {
diff --git a/apps/systemtags/js/systemtagsfilelist.js b/apps/systemtags/js/systemtagsfilelist.js
new file mode 100644
index 00000000000..56838018a2c
--- /dev/null
+++ b/apps/systemtags/js/systemtagsfilelist.js
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+(function() {
+ /**
+ * @class OCA.SystemTags.FileList
+ * @augments OCA.Files.FileList
+ *
+ * @classdesc SystemTags file list.
+ * Contains a list of files filtered by system tags.
+ *
+ * @param $el container element with existing markup for the #controls
+ * and a table
+ * @param [options] map of options, see other parameters
+ * @param {Array.<string>} [options.systemTagIds] array of system tag ids to
+ * filter by
+ */
+ var FileList = function($el, options) {
+ this.initialize($el, options);
+ };
+ FileList.prototype = _.extend({}, OCA.Files.FileList.prototype,
+ /** @lends OCA.SystemTags.FileList.prototype */ {
+ id: 'systemtagsfilter',
+ appName: t('systemtags', 'Tagged files'),
+
+ /**
+ * Array of system tag ids to filter by
+ *
+ * @type Array.<string>
+ */
+ _systemTagIds: [],
+
+ _clientSideSort: true,
+ _allowSelection: false,
+
+ _filterField: null,
+
+ /**
+ * @private
+ */
+ initialize: function($el, options) {
+ OCA.Files.FileList.prototype.initialize.apply(this, arguments);
+ if (this.initialized) {
+ return;
+ }
+
+ if (options && options.systemTagIds) {
+ this._systemTagIds = options.systemTagIds;
+ }
+
+ OC.Plugins.attach('OCA.SystemTags.FileList', this);
+
+ var $controls = this.$el.find('#controls').empty();
+
+ this._initFilterField($controls);
+ },
+
+ destroy: function() {
+ this.$filterField.remove();
+
+ OCA.Files.FileList.prototype.destroy.apply(this, arguments);
+ },
+
+ _initFilterField: function($container) {
+ this.$filterField = $('<input type="hidden" name="tags"/>');
+ $container.append(this.$filterField);
+ this.$filterField.select2({
+ placeholder: t('systemtags', 'Select tags to filter by'),
+ allowClear: false,
+ multiple: true,
+ separator: ',',
+ query: _.bind(this._queryTagsAutocomplete, this),
+
+ id: function(tag) {
+ return tag.id;
+ },
+
+ initSelection: function(element, callback) {
+ var val = $(element).val().trim();
+ if (val) {
+ var tagIds = val.split(','),
+ tags = [];
+
+ OC.SystemTags.collection.fetch({
+ success: function() {
+ _.each(tagIds, function(tagId) {
+ var tag = OC.SystemTags.collection.get(tagId);
+ if (!_.isUndefined(tag)) {
+ tags.push(tag.toJSON());
+ }
+ });
+
+ callback(tags);
+ }
+ });
+ } else {
+ callback([]);
+ }
+ },
+
+ formatResult: function (tag) {
+ return OC.SystemTags.getDescriptiveTag(tag);
+ },
+
+ formatSelection: function (tag) {
+ return OC.SystemTags.getDescriptiveTag(tag)[0].outerHTML;
+ },
+
+ escapeMarkup: function(m) {
+ // prevent double markup escape
+ return m;
+ }
+ });
+ this.$filterField.on('change', _.bind(this._onTagsChanged, this));
+ return this.$filterField;
+ },
+
+ /**
+ * Autocomplete function for dropdown results
+ *
+ * @param {Object} query select2 query object
+ */
+ _queryTagsAutocomplete: function(query) {
+ OC.SystemTags.collection.fetch({
+ success: function() {
+ var results = OC.SystemTags.collection.filterByName(query.term);
+
+ query.callback({
+ results: _.invoke(results, 'toJSON')
+ });
+ }
+ });
+ },
+
+ /**
+ * Event handler for when the URL changed
+ */
+ _onUrlChanged: function(e) {
+ if (e.dir) {
+ var tags = _.filter(e.dir.split('/'), function(val) { return val.trim() !== ''; });
+ this.$filterField.select2('val', tags || []);
+ this._systemTagIds = tags;
+ this.reload();
+ }
+ },
+
+ _onTagsChanged: function(ev) {
+ var val = $(ev.target).val().trim();
+ if (val !== '') {
+ this._systemTagIds = val.split(',');
+ } else {
+ this._systemTagIds = [];
+ }
+
+ this.$el.trigger(jQuery.Event('changeDirectory', {
+ dir: this._systemTagIds.join('/')
+ }));
+ this.reload();
+ },
+
+ updateEmptyContent: function() {
+ var dir = this.getCurrentDirectory();
+ if (dir === '/') {
+ // root has special permissions
+ if (!this._systemTagIds.length) {
+ // no tags selected
+ this.$el.find('#emptycontent').html('<div class="icon-systemtags"></div>' +
+ '<h2>' + t('systemtags', 'Please select tags to filter by') + '</h2>');
+ } else {
+ // tags selected but no results
+ this.$el.find('#emptycontent').html('<div class="icon-systemtags"></div>' +
+ '<h2>' + t('systemtags', 'No files found for the selected tags') + '</h2>');
+ }
+ this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty);
+ this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty);
+ }
+ else {
+ OCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments);
+ }
+ },
+
+ getDirectoryPermissions: function() {
+ return OC.PERMISSION_READ | OC.PERMISSION_DELETE;
+ },
+
+ updateStorageStatistics: function() {
+ // no op because it doesn't have
+ // storage info like free space / used space
+ },
+
+ reload: function() {
+ if (!this._systemTagIds.length) {
+ // don't reload
+ this.updateEmptyContent();
+ this.setFiles([]);
+ return $.Deferred().resolve();
+ }
+
+ this._selectedFiles = {};
+ this._selectionSummary.clear();
+ if (this._currentFileModel) {
+ this._currentFileModel.off();
+ }
+ this._currentFileModel = null;
+ this.$el.find('.select-all').prop('checked', false);
+ this.showMask();
+ this._reloadCall = this.filesClient.getFilteredFiles(
+ {
+ systemTagIds: this._systemTagIds
+ },
+ {
+ properties: this._getWebdavProperties()
+ }
+ );
+ if (this._detailsView) {
+ // close sidebar
+ this._updateDetailsView(null);
+ }
+ var callBack = this.reloadCallback.bind(this);
+ return this._reloadCall.then(callBack, callBack);
+ },
+
+ reloadCallback: function(status, result) {
+ if (result) {
+ // prepend empty dir info because original handler
+ result.unshift({});
+ }
+
+ return OCA.Files.FileList.prototype.reloadCallback.call(this, status, result);
+ }
+ });
+
+ OCA.SystemTags.FileList = FileList;
+})();
diff --git a/apps/systemtags/list.php b/apps/systemtags/list.php
new file mode 100644
index 00000000000..dd4fe01e767
--- /dev/null
+++ b/apps/systemtags/list.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+// Check if we are a user
+OCP\User::checkLoggedIn();
+
+$tmpl = new OCP\Template('systemtags', 'list', '');
+$tmpl->printPage();
diff --git a/apps/systemtags/templates/list.php b/apps/systemtags/templates/list.php
new file mode 100644
index 00000000000..841ce7b5b6d
--- /dev/null
+++ b/apps/systemtags/templates/list.php
@@ -0,0 +1,38 @@
+<div id="controls">
+</div>
+
+<div id="emptycontent" class="hidden">
+ <div class="icon-folder"></div>
+ <h2><?php p($l->t('No files in here')); ?></h2>
+ <p class="uploadmessage hidden"></p>
+</div>
+
+<div class="nofilterresults emptycontent hidden">
+ <div class="icon-search"></div>
+ <h2><?php p($l->t('No entries found in this folder')); ?></h2>
+ <p></p>
+</div>
+
+<table id="filestable" data-preview-x="32" data-preview-y="32">
+ <thead>
+ <tr>
+ <th id='headerName' class="hidden column-name">
+ <div id="headerName-container">
+ <a class="name sort columntitle" data-sort="name"><span><?php p($l->t( 'Name' )); ?></span><span class="sort-indicator"></span></a>
+ </div>
+ </th>
+ <th id="headerSize" class="hidden column-size">
+ <a class="size sort columntitle" data-sort="size"><span><?php p($l->t('Size')); ?></span><span class="sort-indicator"></span></a>
+ </th>
+ <th id="headerDate" class="hidden column-mtime">
+ <a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t( 'Modified' )); ?></span><span class="sort-indicator"></span></a>
+ </th>
+ </tr>
+ </thead>
+ <tbody id="fileList">
+ </tbody>
+ <tfoot>
+ </tfoot>
+</table>
+<input type="hidden" name="dir" id="dir" value="" />
+
diff --git a/apps/systemtags/tests/js/systemtagsfilelistSpec.js b/apps/systemtags/tests/js/systemtagsfilelistSpec.js
new file mode 100644
index 00000000000..ba41d347ca4
--- /dev/null
+++ b/apps/systemtags/tests/js/systemtagsfilelistSpec.js
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2016 Vincent Petry <pvince81@owncloud.com>
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+describe('OCA.SystemTags.FileList tests', function() {
+ var FileInfo = OC.Files.FileInfo;
+ var fileList;
+
+ beforeEach(function() {
+ // init parameters and test table elements
+ $('#testArea').append(
+ '<div id="app-content-container">' +
+ // init horrible parameters
+ '<input type="hidden" id="dir" value="/"></input>' +
+ '<input type="hidden" id="permissions" value="31"></input>' +
+ '<div id="controls"></div>' +
+ // dummy table
+ // TODO: at some point this will be rendered by the fileList class itself!
+ '<table id="filestable">' +
+ '<thead><tr>' +
+ '<th id="headerName" class="hidden column-name">' +
+ '<input type="checkbox" id="select_all_files" class="select-all">' +
+ '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
+ '<span class="selectedActions hidden">' +
+ '</th>' +
+ '<th class="hidden column-mtime">' +
+ '<a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a>' +
+ '</th>' +
+ '</tr></thead>' +
+ '<tbody id="fileList"></tbody>' +
+ '<tfoot></tfoot>' +
+ '</table>' +
+ '<div id="emptycontent">Empty content message</div>' +
+ '</div>'
+ );
+ });
+ afterEach(function() {
+ fileList.destroy();
+ fileList = undefined;
+ });
+
+ describe('filter field', function() {
+ var select2Stub, oldCollection, fetchTagsStub;
+ var $tagsField;
+
+ beforeEach(function() {
+ fetchTagsStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch');
+ select2Stub = sinon.stub($.fn, 'select2');
+ oldCollection = OC.SystemTags.collection;
+ OC.SystemTags.collection = new OC.SystemTags.SystemTagsCollection([
+ {
+ id: '123',
+ name: 'abc'
+ },
+ {
+ id: '456',
+ name: 'def'
+ }
+ ]);
+
+ fileList = new OCA.SystemTags.FileList(
+ $('#app-content-container'), {
+ systemTagIds: []
+ }
+ );
+ $tagsField = fileList.$el.find('[name=tags]');
+ });
+ afterEach(function() {
+ select2Stub.restore();
+ fetchTagsStub.restore();
+ OC.SystemTags.collection = oldCollection;
+ });
+ it('inits select2 on filter field', function() {
+ expect(select2Stub.calledOnce).toEqual(true);
+ });
+ it('uses global system tags collection', function() {
+ var callback = sinon.stub();
+ var opts = select2Stub.firstCall.args[0];
+
+ $tagsField.val('123');
+
+ opts.initSelection($tagsField, callback);
+
+ expect(callback.notCalled).toEqual(true);
+ expect(fetchTagsStub.calledOnce).toEqual(true);
+
+ fetchTagsStub.yieldTo('success', fetchTagsStub.thisValues[0]);
+
+ expect(callback.calledOnce).toEqual(true);
+ expect(callback.lastCall.args[0]).toEqual([
+ OC.SystemTags.collection.get('123').toJSON()
+ ]);
+ });
+ it('fetches tag list from the global collection', function() {
+ var callback = sinon.stub();
+ var opts = select2Stub.firstCall.args[0];
+
+ $tagsField.val('123');
+
+ opts.query({
+ term: 'de',
+ callback: callback
+ });
+
+ expect(fetchTagsStub.calledOnce).toEqual(true);
+ expect(callback.notCalled).toEqual(true);
+ fetchTagsStub.yieldTo('success', fetchTagsStub.thisValues[0]);
+
+ expect(callback.calledOnce).toEqual(true);
+ expect(callback.lastCall.args[0]).toEqual({
+ results: [
+ OC.SystemTags.collection.get('456').toJSON()
+ ]
+ });
+ });
+ it('reloads file list after selection', function() {
+ var reloadStub = sinon.stub(fileList, 'reload');
+ $tagsField.val('456,123').change();
+ expect(reloadStub.calledOnce).toEqual(true);
+ reloadStub.restore();
+ });
+ it('updates URL after selection', function() {
+ var handler = sinon.stub();
+ fileList.$el.on('changeDirectory', handler);
+ $tagsField.val('456,123').change();
+
+ expect(handler.calledOnce).toEqual(true);
+ expect(handler.lastCall.args[0].dir).toEqual('456/123');
+ });
+ it('updates tag selection when url changed', function() {
+ fileList.$el.trigger(new $.Event('urlChanged', {dir: '456/123'}));
+
+ expect(select2Stub.lastCall.args[0]).toEqual('val');
+ expect(select2Stub.lastCall.args[1]).toEqual(['456', '123']);
+ });
+ });
+
+ describe('loading results', function() {
+ var getFilteredFilesSpec, requestDeferred;
+
+ beforeEach(function() {
+ requestDeferred = new $.Deferred();
+ getFilteredFilesSpec = sinon.stub(OC.Files.Client.prototype, 'getFilteredFiles')
+ .returns(requestDeferred.promise());
+ });
+ afterEach(function() {
+ getFilteredFilesSpec.restore();
+ });
+
+ it('renders empty message when no tags were set', function() {
+ fileList = new OCA.SystemTags.FileList(
+ $('#app-content-container'), {
+ systemTagIds: []
+ }
+ );
+
+ fileList.reload();
+
+ expect(fileList.$el.find('#emptycontent').hasClass('hidden')).toEqual(false);
+
+ expect(getFilteredFilesSpec.notCalled).toEqual(true);
+ });
+
+ it('render files', function() {
+ fileList = new OCA.SystemTags.FileList(
+ $('#app-content-container'), {
+ systemTagIds: ['123', '456']
+ }
+ );
+
+ fileList.reload();
+
+ expect(getFilteredFilesSpec.calledOnce).toEqual(true);
+ expect(getFilteredFilesSpec.lastCall.args[0].systemTagIds).toEqual(['123', '456']);
+
+ var testFiles = [new FileInfo({
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ mimetype: 'text/plain',
+ mtime: 123456789,
+ size: 12,
+ etag: 'abc',
+ permissions: OC.PERMISSION_ALL
+ }), new FileInfo({
+ id: 2,
+ type: 'file',
+ name: 'Two.jpg',
+ mimetype: 'image/jpeg',
+ mtime: 234567890,
+ size: 12049,
+ etag: 'def',
+ permissions: OC.PERMISSION_ALL
+ }), new FileInfo({
+ id: 3,
+ type: 'file',
+ name: 'Three.pdf',
+ mimetype: 'application/pdf',
+ mtime: 234560000,
+ size: 58009,
+ etag: '123',
+ permissions: OC.PERMISSION_ALL
+ }), new FileInfo({
+ id: 4,
+ type: 'dir',
+ name: 'somedir',
+ mimetype: 'httpd/unix-directory',
+ mtime: 134560000,
+ size: 250,
+ etag: '456',
+ permissions: OC.PERMISSION_ALL
+ })];
+
+ requestDeferred.resolve(207, testFiles);
+
+ expect(fileList.$el.find('#emptycontent').hasClass('hidden')).toEqual(true);
+ expect(fileList.$el.find('tbody>tr').length).toEqual(4);
+ });
+ });
+});
diff --git a/apps/user_ldap/js/wizard/wizardTabAdvanced.js b/apps/user_ldap/js/wizard/wizardTabAdvanced.js
index 9e898ba2fc8..d1e5002d40a 100644
--- a/apps/user_ldap/js/wizard/wizardTabAdvanced.js
+++ b/apps/user_ldap/js/wizard/wizardTabAdvanced.js
@@ -55,6 +55,10 @@ OCA = OCA || {};
$element: $('#ldap_display_name'),
setMethod: 'setUserDisplayName'
},
+ ldap_user_display_name_2: {
+ $element: $('#ldap_user_display_name_2'),
+ setMethod: 'setUserDisplayName2'
+ },
ldap_base_users: {
$element: $('#ldap_base_users'),
setMethod: 'setBaseDNUsers'
@@ -195,6 +199,15 @@ OCA = OCA || {};
},
/**
+ * sets the additional user display name attribute
+ *
+ * @param {string} attribute
+ */
+ setUserDisplayName2: function(attribute) {
+ this.setElementValue(this.managedItems.ldap_user_display_name_2.$element, attribute);
+ },
+
+ /**
* sets the Base DN for users
*
* @param {string} base
diff --git a/apps/user_ldap/l10n/cs_CZ.js b/apps/user_ldap/l10n/cs_CZ.js
index e78755719b7..687f1848d2c 100644
--- a/apps/user_ldap/l10n/cs_CZ.js
+++ b/apps/user_ldap/l10n/cs_CZ.js
@@ -122,6 +122,7 @@ OC.L10N.register(
"Directory Settings" : "Nastavení adresáře",
"User Display Name Field" : "Pole zobrazovaného jména uživatele",
"The LDAP attribute to use to generate the user's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména uživatele.",
+ "2nd User Display Name Field" : "Druhé pole zobrazovaného jména uživatele",
"Base User Tree" : "Základní uživatelský strom",
"One User Base DN per line" : "Jedna uživatelská základní DN na řádku",
"User Search Attributes" : "Atributy vyhledávání uživatelů",
diff --git a/apps/user_ldap/l10n/cs_CZ.json b/apps/user_ldap/l10n/cs_CZ.json
index 37e56cda1a7..6ec1f1abfed 100644
--- a/apps/user_ldap/l10n/cs_CZ.json
+++ b/apps/user_ldap/l10n/cs_CZ.json
@@ -120,6 +120,7 @@
"Directory Settings" : "Nastavení adresáře",
"User Display Name Field" : "Pole zobrazovaného jména uživatele",
"The LDAP attribute to use to generate the user's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména uživatele.",
+ "2nd User Display Name Field" : "Druhé pole zobrazovaného jména uživatele",
"Base User Tree" : "Základní uživatelský strom",
"One User Base DN per line" : "Jedna uživatelská základní DN na řádku",
"User Search Attributes" : "Atributy vyhledávání uživatelů",
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index a013589cff2..9d934181190 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -39,7 +39,7 @@ OC.L10N.register(
"Select attributes" : "Sélectionner les attributs",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilisateur introuvable. Veuillez vérifier les attributs de login et le nom d'utilisateur. Filtre effectif (à copier-coller pour valider en ligne de commande):<br/>",
"User found and settings verified." : "Utilisateur trouvé et paramètres vérifiés.",
- "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter.",
+ "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Les paramètres ont été vérifiés, mais la recherche retourne plus d'un utilisateur. Seul le premier trouvé pourra se connecter. Nous vous conseillons d'utiliser un filtre plus restrictif.",
"An unspecified error occurred. Please check the settings and the log." : "Une erreur inconnue s'est produite. Veuillez vérifier les paramètres et le log.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Le filtre de recherche n'est pas valide, probablement à cause de problèmes de syntaxe tels que des parenthèses manquantes. Veuillez le corriger.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Une erreur s'est produite lors de la connexion au LDAP / AD. Veuillez vérifier l'hôte, le port et les informations d'identification.",
@@ -122,6 +122,8 @@ OC.L10N.register(
"Directory Settings" : "Paramètres du répertoire",
"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.",
+ "2nd User Display Name Field" : "Second attribut pour le nom d'affichage",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optionnel. Attribut LDAP à ajouter au nom d'affichage, entre parenthèses. Cela donnera par exemple : \"John Doe (john.doe@example.com)\".",
"Base User Tree" : "DN racine de l'arbre utilisateurs",
"One User Base DN per line" : "Un DN de base utilisateur par ligne",
"User Search Attributes" : "Attributs de recherche utilisateurs",
@@ -132,6 +134,8 @@ OC.L10N.register(
"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",
+ "Dynamic Group Member URL" : "Dynamic Group Member URL",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'attribut LDAP des objets groupes qui contient l'URL de recherche LDAP déterminant quels objets appartiennent au groupe. (Un attribut vide désactive la fonctionnalité de groupes dynamiques)",
"Nested Groups" : "Groupes imbriqués",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DNs).",
"Paging chunksize" : "Paging chunksize",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index 0b6c076f0d3..64df1a3db67 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -37,7 +37,7 @@
"Select attributes" : "Sélectionner les attributs",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilisateur introuvable. Veuillez vérifier les attributs de login et le nom d'utilisateur. Filtre effectif (à copier-coller pour valider en ligne de commande):<br/>",
"User found and settings verified." : "Utilisateur trouvé et paramètres vérifiés.",
- "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter.",
+ "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Les paramètres ont été vérifiés, mais la recherche retourne plus d'un utilisateur. Seul le premier trouvé pourra se connecter. Nous vous conseillons d'utiliser un filtre plus restrictif.",
"An unspecified error occurred. Please check the settings and the log." : "Une erreur inconnue s'est produite. Veuillez vérifier les paramètres et le log.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Le filtre de recherche n'est pas valide, probablement à cause de problèmes de syntaxe tels que des parenthèses manquantes. Veuillez le corriger.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Une erreur s'est produite lors de la connexion au LDAP / AD. Veuillez vérifier l'hôte, le port et les informations d'identification.",
@@ -120,6 +120,8 @@
"Directory Settings" : "Paramètres du répertoire",
"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.",
+ "2nd User Display Name Field" : "Second attribut pour le nom d'affichage",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optionnel. Attribut LDAP à ajouter au nom d'affichage, entre parenthèses. Cela donnera par exemple : \"John Doe (john.doe@example.com)\".",
"Base User Tree" : "DN racine de l'arbre utilisateurs",
"One User Base DN per line" : "Un DN de base utilisateur par ligne",
"User Search Attributes" : "Attributs de recherche utilisateurs",
@@ -130,6 +132,8 @@
"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",
+ "Dynamic Group Member URL" : "Dynamic Group Member URL",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'attribut LDAP des objets groupes qui contient l'URL de recherche LDAP déterminant quels objets appartiennent au groupe. (Un attribut vide désactive la fonctionnalité de groupes dynamiques)",
"Nested Groups" : "Groupes imbriqués",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DNs).",
"Paging chunksize" : "Paging chunksize",
diff --git a/apps/user_ldap/l10n/he.js b/apps/user_ldap/l10n/he.js
index 56be7447e72..0e4b78f0373 100644
--- a/apps/user_ldap/l10n/he.js
+++ b/apps/user_ldap/l10n/he.js
@@ -113,7 +113,16 @@ OC.L10N.register(
"Turn off SSL certificate validation." : "כיבוי אימות אישורי אבטחה SSL.",
"in seconds. A change empties the cache." : "בשניות. שינוי מרוקן את המטמון.",
"Directory Settings" : "הגדרות תיקייה",
+ "User Display Name Field" : "שדה שם תצוגה למשתמש",
"Base User Tree" : "עץ משתמש בסיסי",
- "in bytes" : "בבתים"
+ "Base Group Tree" : "עץ קבוצה בסיסי",
+ "Group Search Attributes" : "מאפייני חיפוש קבוצה",
+ "Special Attributes" : "מאפיינים מיוחדים",
+ "Quota Field" : "שדה מכסה",
+ "Quota Default" : "ברירת מחדל מכסה",
+ "in bytes" : "בבתים",
+ "Email Field" : "שדה דואר אלקטרוני",
+ "Internal Username" : "שם משתמש פנימי",
+ "Internal Username Attribute:" : "מאפיין שם משתמש פנימי:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/user_ldap/l10n/he.json b/apps/user_ldap/l10n/he.json
index ca2ba2f91a6..21b0cbb70a4 100644
--- a/apps/user_ldap/l10n/he.json
+++ b/apps/user_ldap/l10n/he.json
@@ -111,7 +111,16 @@
"Turn off SSL certificate validation." : "כיבוי אימות אישורי אבטחה SSL.",
"in seconds. A change empties the cache." : "בשניות. שינוי מרוקן את המטמון.",
"Directory Settings" : "הגדרות תיקייה",
+ "User Display Name Field" : "שדה שם תצוגה למשתמש",
"Base User Tree" : "עץ משתמש בסיסי",
- "in bytes" : "בבתים"
+ "Base Group Tree" : "עץ קבוצה בסיסי",
+ "Group Search Attributes" : "מאפייני חיפוש קבוצה",
+ "Special Attributes" : "מאפיינים מיוחדים",
+ "Quota Field" : "שדה מכסה",
+ "Quota Default" : "ברירת מחדל מכסה",
+ "in bytes" : "בבתים",
+ "Email Field" : "שדה דואר אלקטרוני",
+ "Internal Username" : "שם משתמש פנימי",
+ "Internal Username Attribute:" : "מאפיין שם משתמש פנימי:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/user_ldap/l10n/it.js b/apps/user_ldap/l10n/it.js
index 8bb42e1a72a..7bc6de0d622 100644
--- a/apps/user_ldap/l10n/it.js
+++ b/apps/user_ldap/l10n/it.js
@@ -122,6 +122,8 @@ OC.L10N.register(
"Directory Settings" : "Impostazioni delle cartelle",
"User Display Name Field" : "Campo per la visualizzazione del nome utente",
"The LDAP attribute to use to generate the user's display name." : "L'attributo LDAP da usare per generare il nome visualizzato dell'utente.",
+ "2nd User Display Name Field" : "Campo per il secondo nome visualizzato dell'utente",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Facoltativo. Un attributo LDAP da aggiungere al nome visualizzato tra parentesi. Ad es. »Mario Rossi (mario.rossi@esempio.org)«.",
"Base User Tree" : "Struttura base dell'utente",
"One User Base DN per line" : "Un DN base utente per riga",
"User Search Attributes" : "Attributi di ricerca utente",
@@ -132,6 +134,8 @@ OC.L10N.register(
"One Group Base DN per line" : "Un DN base gruppo per riga",
"Group Search Attributes" : "Attributi di ricerca gruppo",
"Group-Member association" : "Associazione gruppo-utente ",
+ "Dynamic Group Member URL" : "URL membro di gruppo dinamico",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'attributo LDAP che sugli oggetti di gruppo contiene un URL di ricerca LDAP che determina quali oggetti appartengono al gruppo. (Un valore vuoto disabilità la funzionalità di appartenenza ai gruppi dinamica)",
"Nested Groups" : "Gruppi nidificati",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando è attivato, i gruppi che contengono altri gruppi sono supportati. (Funziona solo se l'attributo del gruppo membro contiene DN.)",
"Paging chunksize" : "Dimensione del blocco di paginazione",
diff --git a/apps/user_ldap/l10n/it.json b/apps/user_ldap/l10n/it.json
index 73234261016..412508e64a7 100644
--- a/apps/user_ldap/l10n/it.json
+++ b/apps/user_ldap/l10n/it.json
@@ -120,6 +120,8 @@
"Directory Settings" : "Impostazioni delle cartelle",
"User Display Name Field" : "Campo per la visualizzazione del nome utente",
"The LDAP attribute to use to generate the user's display name." : "L'attributo LDAP da usare per generare il nome visualizzato dell'utente.",
+ "2nd User Display Name Field" : "Campo per il secondo nome visualizzato dell'utente",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Facoltativo. Un attributo LDAP da aggiungere al nome visualizzato tra parentesi. Ad es. »Mario Rossi (mario.rossi@esempio.org)«.",
"Base User Tree" : "Struttura base dell'utente",
"One User Base DN per line" : "Un DN base utente per riga",
"User Search Attributes" : "Attributi di ricerca utente",
@@ -130,6 +132,8 @@
"One Group Base DN per line" : "Un DN base gruppo per riga",
"Group Search Attributes" : "Attributi di ricerca gruppo",
"Group-Member association" : "Associazione gruppo-utente ",
+ "Dynamic Group Member URL" : "URL membro di gruppo dinamico",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'attributo LDAP che sugli oggetti di gruppo contiene un URL di ricerca LDAP che determina quali oggetti appartengono al gruppo. (Un valore vuoto disabilità la funzionalità di appartenenza ai gruppi dinamica)",
"Nested Groups" : "Gruppi nidificati",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando è attivato, i gruppi che contengono altri gruppi sono supportati. (Funziona solo se l'attributo del gruppo membro contiene DN.)",
"Paging chunksize" : "Dimensione del blocco di paginazione",
diff --git a/apps/user_ldap/l10n/ja.js b/apps/user_ldap/l10n/ja.js
index e138c46e08e..bafddc9b25d 100644
--- a/apps/user_ldap/l10n/ja.js
+++ b/apps/user_ldap/l10n/ja.js
@@ -122,6 +122,7 @@ OC.L10N.register(
"Directory Settings" : "ディレクトリ設定",
"User Display Name Field" : "ユーザー表示名のフィールド",
"The LDAP attribute to use to generate the user's display name." : "ユーザーの表示名の生成に利用するLDAP属性",
+ "2nd User Display Name Field" : "第2ユーザー表示名のフィールド",
"Base User Tree" : "ベースユーザーツリー",
"One User Base DN per line" : "1行に1つのユーザーベースDN",
"User Search Attributes" : "ユーザー検索属性",
@@ -132,6 +133,7 @@ OC.L10N.register(
"One Group Base DN per line" : "1行に1つのグループベースDN",
"Group Search Attributes" : "グループ検索属性",
"Group-Member association" : "グループとメンバーの関連付け",
+ "Dynamic Group Member URL" : "ダイナミックグループメンバーURL",
"Nested Groups" : "ネストされたグループ",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "オンにすると、グループを含むグループが有効になります。(グループメンバーの属性にDNが含まれる場合のみ利用できます。)",
"Paging chunksize" : "ページ分割サイズ",
diff --git a/apps/user_ldap/l10n/ja.json b/apps/user_ldap/l10n/ja.json
index ef69c48adcc..f03609104e9 100644
--- a/apps/user_ldap/l10n/ja.json
+++ b/apps/user_ldap/l10n/ja.json
@@ -120,6 +120,7 @@
"Directory Settings" : "ディレクトリ設定",
"User Display Name Field" : "ユーザー表示名のフィールド",
"The LDAP attribute to use to generate the user's display name." : "ユーザーの表示名の生成に利用するLDAP属性",
+ "2nd User Display Name Field" : "第2ユーザー表示名のフィールド",
"Base User Tree" : "ベースユーザーツリー",
"One User Base DN per line" : "1行に1つのユーザーベースDN",
"User Search Attributes" : "ユーザー検索属性",
@@ -130,6 +131,7 @@
"One Group Base DN per line" : "1行に1つのグループベースDN",
"Group Search Attributes" : "グループ検索属性",
"Group-Member association" : "グループとメンバーの関連付け",
+ "Dynamic Group Member URL" : "ダイナミックグループメンバーURL",
"Nested Groups" : "ネストされたグループ",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "オンにすると、グループを含むグループが有効になります。(グループメンバーの属性にDNが含まれる場合のみ利用できます。)",
"Paging chunksize" : "ページ分割サイズ",
diff --git a/apps/user_ldap/l10n/nl.js b/apps/user_ldap/l10n/nl.js
index 27f6dd9ffc7..418baacea33 100644
--- a/apps/user_ldap/l10n/nl.js
+++ b/apps/user_ldap/l10n/nl.js
@@ -122,6 +122,7 @@ OC.L10N.register(
"Directory Settings" : "Mapinstellingen",
"User Display Name Field" : "Veld gebruikers weergavenaam",
"The LDAP attribute to use to generate the user's display name." : "Het te gebruiken LDAP attribuut voor het genereren van de weergavenaam voor de gebruiker.",
+ "2nd User Display Name Field" : "2e gebruiker weergavenaam veld",
"Base User Tree" : "Basis Gebruikers Structuur",
"One User Base DN per line" : "Een User Base DN per regel",
"User Search Attributes" : "Attributen voor gebruikerszoekopdrachten",
@@ -132,6 +133,7 @@ OC.L10N.register(
"One Group Base DN per line" : "Een Group Base DN per regel",
"Group Search Attributes" : "Attributen voor groepszoekopdrachten",
"Group-Member association" : "Groepslid associatie",
+ "Dynamic Group Member URL" : "Dynamisch Groepslid URL",
"Nested Groups" : "Geneste groepen",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wanneer ingeschakeld worden groepen binnen groepen ondersteund. (Werkt alleen als het groepslid attribuut DNs bevat)",
"Paging chunksize" : "Paging chunkgrootte",
diff --git a/apps/user_ldap/l10n/nl.json b/apps/user_ldap/l10n/nl.json
index c98d7aa64dc..3dd4745dd8b 100644
--- a/apps/user_ldap/l10n/nl.json
+++ b/apps/user_ldap/l10n/nl.json
@@ -120,6 +120,7 @@
"Directory Settings" : "Mapinstellingen",
"User Display Name Field" : "Veld gebruikers weergavenaam",
"The LDAP attribute to use to generate the user's display name." : "Het te gebruiken LDAP attribuut voor het genereren van de weergavenaam voor de gebruiker.",
+ "2nd User Display Name Field" : "2e gebruiker weergavenaam veld",
"Base User Tree" : "Basis Gebruikers Structuur",
"One User Base DN per line" : "Een User Base DN per regel",
"User Search Attributes" : "Attributen voor gebruikerszoekopdrachten",
@@ -130,6 +131,7 @@
"One Group Base DN per line" : "Een Group Base DN per regel",
"Group Search Attributes" : "Attributen voor groepszoekopdrachten",
"Group-Member association" : "Groepslid associatie",
+ "Dynamic Group Member URL" : "Dynamisch Groepslid URL",
"Nested Groups" : "Geneste groepen",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wanneer ingeschakeld worden groepen binnen groepen ondersteund. (Werkt alleen als het groepslid attribuut DNs bevat)",
"Paging chunksize" : "Paging chunkgrootte",
diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js
index e027c930ceb..4a0b743154f 100644
--- a/apps/user_ldap/l10n/pt_BR.js
+++ b/apps/user_ldap/l10n/pt_BR.js
@@ -122,6 +122,8 @@ OC.L10N.register(
"Directory Settings" : "Configurações de Diretório",
"User Display Name Field" : "Campo Nome de Exibição de Usuário",
"The LDAP attribute to use to generate the user's display name." : "O atributo LDAP para usar para gerar o nome de exibição do usuário.",
+ "2nd User Display Name Field" : "2º Nome do Campo de Exibição do Usuário",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Um atributo LDAP para ser adicionado ao nome de exibição entre colchetes. Exemplo de resultado »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Árvore de Usuário Base",
"One User Base DN per line" : "Um usuário-base DN por linha",
"User Search Attributes" : "Atributos de Busca de Usuário",
@@ -132,6 +134,8 @@ OC.L10N.register(
"One Group Base DN per line" : "Um grupo-base DN por linha",
"Group Search Attributes" : "Atributos de Busca de Grupo",
"Group-Member association" : "Associação Grupo-Membro",
+ "Dynamic Group Member URL" : "Membro do Grupo Dinâmico URL",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que em objetos do grupo contém uma pesquisa URL LDAP que determina quais objetos pertencem ao grupo. (Um cenário vazio desativa a funcionalidade de membros de grupo dinâmico.)",
"Nested Groups" : "Grupos Aninhados",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando habilitado, os grupos que contêm os grupos são suportados. (Só funciona se o atributo de membro de grupo contém DNs.)",
"Paging chunksize" : "Bloco de paginação",
diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json
index 8251fa082a6..87f8d3864ec 100644
--- a/apps/user_ldap/l10n/pt_BR.json
+++ b/apps/user_ldap/l10n/pt_BR.json
@@ -120,6 +120,8 @@
"Directory Settings" : "Configurações de Diretório",
"User Display Name Field" : "Campo Nome de Exibição de Usuário",
"The LDAP attribute to use to generate the user's display name." : "O atributo LDAP para usar para gerar o nome de exibição do usuário.",
+ "2nd User Display Name Field" : "2º Nome do Campo de Exibição do Usuário",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Um atributo LDAP para ser adicionado ao nome de exibição entre colchetes. Exemplo de resultado »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Árvore de Usuário Base",
"One User Base DN per line" : "Um usuário-base DN por linha",
"User Search Attributes" : "Atributos de Busca de Usuário",
@@ -130,6 +132,8 @@
"One Group Base DN per line" : "Um grupo-base DN por linha",
"Group Search Attributes" : "Atributos de Busca de Grupo",
"Group-Member association" : "Associação Grupo-Membro",
+ "Dynamic Group Member URL" : "Membro do Grupo Dinâmico URL",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que em objetos do grupo contém uma pesquisa URL LDAP que determina quais objetos pertencem ao grupo. (Um cenário vazio desativa a funcionalidade de membros de grupo dinâmico.)",
"Nested Groups" : "Grupos Aninhados",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando habilitado, os grupos que contêm os grupos são suportados. (Só funciona se o atributo de membro de grupo contém DNs.)",
"Paging chunksize" : "Bloco de paginação",
diff --git a/apps/user_ldap/l10n/pt_PT.js b/apps/user_ldap/l10n/pt_PT.js
index d6bd1d9d515..788c092eb32 100644
--- a/apps/user_ldap/l10n/pt_PT.js
+++ b/apps/user_ldap/l10n/pt_PT.js
@@ -122,6 +122,8 @@ OC.L10N.register(
"Directory Settings" : "Definições de directorias",
"User Display Name Field" : "Mostrador do nome de utilizador.",
"The LDAP attribute to use to generate the user's display name." : "Atributo LDAP para gerar o nome de utilizador do ownCloud.",
+ "2nd User Display Name Field" : "2.º Mostrador do Nome de Utilizador.",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Atributo LDAP a ser adicionado ao nome de utilizador entre parênteses. Resultados em e.g. »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Base da árvore de utilizadores.",
"One User Base DN per line" : "Uma base de utilizador DN por linha",
"User Search Attributes" : "Utilizar atributos de pesquisa",
@@ -132,6 +134,8 @@ OC.L10N.register(
"One Group Base DN per line" : "Uma base de grupo DN por linha",
"Group Search Attributes" : "Atributos de pesquisa de grupo",
"Group-Member association" : "Associar utilizador ao grupo.",
+ "Dynamic Group Member URL" : "URL Dinâmica de Membro do Grupo",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que em objetos de grupo contém um URL de pesquisa LDAP que determina que objetos pertencem ao grupo. (Uma definição vazia desativa a funcionalidade de membros de grupo dinâmico.)",
"Nested Groups" : "Grupos agrupados",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando habilitado os grupos, os grupos são suportados. (Só funciona se o atributo de membro de grupo contém DNs.)",
"Paging chunksize" : "Bloco de paginação",
diff --git a/apps/user_ldap/l10n/pt_PT.json b/apps/user_ldap/l10n/pt_PT.json
index 8073db3efa6..f75b1d1e5ea 100644
--- a/apps/user_ldap/l10n/pt_PT.json
+++ b/apps/user_ldap/l10n/pt_PT.json
@@ -120,6 +120,8 @@
"Directory Settings" : "Definições de directorias",
"User Display Name Field" : "Mostrador do nome de utilizador.",
"The LDAP attribute to use to generate the user's display name." : "Atributo LDAP para gerar o nome de utilizador do ownCloud.",
+ "2nd User Display Name Field" : "2.º Mostrador do Nome de Utilizador.",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Atributo LDAP a ser adicionado ao nome de utilizador entre parênteses. Resultados em e.g. »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Base da árvore de utilizadores.",
"One User Base DN per line" : "Uma base de utilizador DN por linha",
"User Search Attributes" : "Utilizar atributos de pesquisa",
@@ -130,6 +132,8 @@
"One Group Base DN per line" : "Uma base de grupo DN por linha",
"Group Search Attributes" : "Atributos de pesquisa de grupo",
"Group-Member association" : "Associar utilizador ao grupo.",
+ "Dynamic Group Member URL" : "URL Dinâmica de Membro do Grupo",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que em objetos de grupo contém um URL de pesquisa LDAP que determina que objetos pertencem ao grupo. (Uma definição vazia desativa a funcionalidade de membros de grupo dinâmico.)",
"Nested Groups" : "Grupos agrupados",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando habilitado os grupos, os grupos são suportados. (Só funciona se o atributo de membro de grupo contém DNs.)",
"Paging chunksize" : "Bloco de paginação",
diff --git a/apps/user_ldap/l10n/sq.js b/apps/user_ldap/l10n/sq.js
index aaebf07862d..81da1fbf76b 100644
--- a/apps/user_ldap/l10n/sq.js
+++ b/apps/user_ldap/l10n/sq.js
@@ -122,6 +122,8 @@ OC.L10N.register(
"Directory Settings" : "Rregullime Drejtorie",
"User Display Name Field" : "Fushë Emri Përdoruesi Në Ekran",
"The LDAP attribute to use to generate the user's display name." : "Atribut LDAP që përdoret për të prodhuar emër ekrani për përdoruesin.",
+ "2nd User Display Name Field" : "Fushë e 2-të Emri Përdoruesi Në Ekran",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opsionale. Një atribut LDAP për t’u shtuar te emri në ekran, në kllapa. Përfundimi do t’i ngjante »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Strukturë Bazë Përdoruesi",
"One User Base DN per line" : "Një DN Bazë Përdoruesi për rresht",
"User Search Attributes" : "Atribute Kërkimesh Nga Përdoruesi",
@@ -132,8 +134,12 @@ OC.L10N.register(
"One Group Base DN per line" : "Një DN Bazë Grupi për rresht",
"Group Search Attributes" : "Atribute Kërkimi Grupi",
"Group-Member association" : "Përshoqërim Grup-Përdorues",
+ "Dynamic Group Member URL" : "URL Anëtari Grupi Dinamik",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Atributi LDAP që në objekte grupi përmban një URL kërkimi LDAP që përcakton se cilat objekte i përkasin grupit. (Nëse rregullimi lihet i zbrazët, funksioni i anëtarësisë në grup dinamik.)",
"Nested Groups" : "Grupe Brenda Njëri-Tjetrit",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Kur aktivizohet, grupet që përmbajnë grupe mbulohen. (Funksionon vetëm nëse atributi për anëtar grupi përmban DN-ra.)",
+ "Paging chunksize" : "Madhësi copash faqosjeje",
+ "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Madhësi copash të përdorura për kërkime LDAP të sistemuara në faqe, kërkime që japin përfundime të papërpunuara, të tilla si numër përdoruesish ose grupesh. (Caktimi si 0 i çaktivizon kërkimet e faqosura LDAP për këto raste.)",
"Special Attributes" : "Atribute Speciale",
"Quota Field" : "Fushë Kuotash",
"Quota Default" : "Parazgjedhje Kuotash",
diff --git a/apps/user_ldap/l10n/sq.json b/apps/user_ldap/l10n/sq.json
index 335a42630b5..f4f0224dd0a 100644
--- a/apps/user_ldap/l10n/sq.json
+++ b/apps/user_ldap/l10n/sq.json
@@ -120,6 +120,8 @@
"Directory Settings" : "Rregullime Drejtorie",
"User Display Name Field" : "Fushë Emri Përdoruesi Në Ekran",
"The LDAP attribute to use to generate the user's display name." : "Atribut LDAP që përdoret për të prodhuar emër ekrani për përdoruesin.",
+ "2nd User Display Name Field" : "Fushë e 2-të Emri Përdoruesi Në Ekran",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opsionale. Një atribut LDAP për t’u shtuar te emri në ekran, në kllapa. Përfundimi do t’i ngjante »John Doe (john.doe@example.org)«.",
"Base User Tree" : "Strukturë Bazë Përdoruesi",
"One User Base DN per line" : "Një DN Bazë Përdoruesi për rresht",
"User Search Attributes" : "Atribute Kërkimesh Nga Përdoruesi",
@@ -130,8 +132,12 @@
"One Group Base DN per line" : "Një DN Bazë Grupi për rresht",
"Group Search Attributes" : "Atribute Kërkimi Grupi",
"Group-Member association" : "Përshoqërim Grup-Përdorues",
+ "Dynamic Group Member URL" : "URL Anëtari Grupi Dinamik",
+ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Atributi LDAP që në objekte grupi përmban një URL kërkimi LDAP që përcakton se cilat objekte i përkasin grupit. (Nëse rregullimi lihet i zbrazët, funksioni i anëtarësisë në grup dinamik.)",
"Nested Groups" : "Grupe Brenda Njëri-Tjetrit",
"When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Kur aktivizohet, grupet që përmbajnë grupe mbulohen. (Funksionon vetëm nëse atributi për anëtar grupi përmban DN-ra.)",
+ "Paging chunksize" : "Madhësi copash faqosjeje",
+ "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Madhësi copash të përdorura për kërkime LDAP të sistemuara në faqe, kërkime që japin përfundime të papërpunuara, të tilla si numër përdoruesish ose grupesh. (Caktimi si 0 i çaktivizon kërkimet e faqosura LDAP për këto raste.)",
"Special Attributes" : "Atribute Speciale",
"Quota Field" : "Fushë Kuotash",
"Quota Default" : "Parazgjedhje Kuotash",
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 82cd342ae2f..16b942084c4 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -521,6 +521,7 @@ class Access extends LDAPUtility implements user\IUserTools {
private function ldap2ownCloudNames($ldapObjects, $isUsers) {
if($isUsers) {
$nameAttribute = $this->connection->ldapUserDisplayName;
+ $sndAttribute = $this->connection->ldapUserDisplayName2;
} else {
$nameAttribute = $this->connection->ldapGroupDisplayName;
}
@@ -542,13 +543,14 @@ class Access extends LDAPUtility implements user\IUserTools {
if($isUsers) {
//cache the user names so it does not need to be retrieved
//again later (e.g. sharing dialogue).
- $this->cacheUserExists($ocName);
- if(!is_null($nameByLDAP)) {
- $this->cacheUserDisplayName($ocName, $nameByLDAP);
+ if(is_null($nameByLDAP)) {
+ continue;
}
+ $sndName = isset($ldapObject[$sndAttribute])
+ ? $ldapObject[$sndAttribute] : '';
+ $this->cacheUserDisplayName($ocName, $nameByLDAP, $sndName);
}
}
- continue;
}
return $ownCloudNames;
}
@@ -575,8 +577,11 @@ class Access extends LDAPUtility implements user\IUserTools {
* caches the user display name
* @param string $ocName the internal ownCloud username
* @param string $displayName the display name
+ * @param string $displayName2 the second display name
*/
- public function cacheUserDisplayName($ocName, $displayName) {
+ public function cacheUserDisplayName($ocName, $displayName, $displayName2 = '') {
+ $user = $this->userManager->get($ocName);
+ $displayName = $user->composeAndStoreDisplayName($displayName, $displayName2);
$cacheKeyTrunk = 'getDisplayName';
$this->connection->writeToCache($cacheKeyTrunk.$ocName, $displayName);
}
@@ -1300,7 +1305,7 @@ class Access extends LDAPUtility implements user\IUserTools {
return false;
}
$result=$testConnection->bind();
- $this->connection->bind();
+ $this->ldap->unbind($this->connection->getConnectionResource());
return $result;
}
diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php
index 11090f1301b..f829160b62a 100644
--- a/apps/user_ldap/lib/configuration.php
+++ b/apps/user_ldap/lib/configuration.php
@@ -48,6 +48,7 @@ class Configuration {
'turnOffCertCheck' => null,
'ldapIgnoreNamingRules' => null,
'ldapUserDisplayName' => null,
+ 'ldapUserDisplayName2' => null,
'ldapUserFilterObjectclass' => null,
'ldapUserFilterGroups' => null,
'ldapUserFilter' => null,
@@ -208,6 +209,7 @@ class Configuration {
case 'ldapAgentPassword':
$readMethod = 'getPwd';
break;
+ case 'ldapUserDisplayName2':
case 'ldapGroupDisplayName':
$readMethod = 'getLcValue';
break;
@@ -418,6 +420,7 @@ class Configuration {
'ldap_groupfilter_objectclass' => '',
'ldap_groupfilter_groups' => '',
'ldap_display_name' => 'displayName',
+ 'ldap_user_display_name_2' => '',
'ldap_group_display_name' => 'cn',
'ldap_tls' => 0,
'ldap_quota_def' => '',
@@ -475,6 +478,7 @@ class Configuration {
'ldap_groupfilter_objectclass' => 'ldapGroupFilterObjectclass',
'ldap_groupfilter_groups' => 'ldapGroupFilterGroups',
'ldap_display_name' => 'ldapUserDisplayName',
+ 'ldap_user_display_name_2' => 'ldapUserDisplayName2',
'ldap_group_display_name' => 'ldapGroupDisplayName',
'ldap_tls' => 'ldapTLS',
'ldap_quota_def' => 'ldapQuotaDefault',
diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php
index addd7d0b51d..b1ed23f95fe 100644
--- a/apps/user_ldap/lib/connection.php
+++ b/apps/user_ldap/lib/connection.php
@@ -37,6 +37,7 @@ use OC\ServerNotAvailableException;
*
* @property string ldapUserFilter
* @property string ldapUserDisplayName
+ * @property string ldapUserDisplayName2
* @property boolean hasPagedResultSupport
* @property string[] ldapBaseUsers
* @property int|string ldapPagingSize holds an integer
diff --git a/apps/user_ldap/lib/user/manager.php b/apps/user_ldap/lib/user/manager.php
index cfa333b06d4..d76142c79ac 100644
--- a/apps/user_ldap/lib/user/manager.php
+++ b/apps/user_ldap/lib/user/manager.php
@@ -147,6 +147,7 @@ class Manager {
$this->access->getConnection()->ldapQuotaAttribute,
$this->access->getConnection()->ldapEmailAttribute,
$this->access->getConnection()->ldapUserDisplayName,
+ $this->access->getConnection()->ldapUserDisplayName2,
);
foreach($possible as $attr) {
if(!is_null($attr)) {
diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php
index 13f88aa6507..3bc790a6c10 100644
--- a/apps/user_ldap/lib/user/user.php
+++ b/apps/user_ldap/lib/user/user.php
@@ -168,13 +168,22 @@ class User {
unset($attr);
//displayName
+ $displayName = $displayName2 = '';
$attr = strtolower($this->connection->ldapUserDisplayName);
if(isset($ldapEntry[$attr])) {
$displayName = $ldapEntry[$attr][0];
- if(!empty($displayName)) {
- $this->storeDisplayName($displayName);
- $this->access->cacheUserDisplayName($this->getUsername(), $displayName);
- }
+ }
+ $attr = strtolower($this->connection->ldapUserDisplayName2);
+ if(isset($ldapEntry[$attr])) {
+ $displayName2 = $ldapEntry[$attr][0];
+ }
+ if(!empty($displayName)) {
+ $this->composeAndStoreDisplayName($displayName);
+ $this->access->cacheUserDisplayName(
+ $this->getUsername(),
+ $displayName,
+ $displayName2
+ );
}
unset($attr);
@@ -350,6 +359,7 @@ class User {
/**
* Stores a key-value pair in relation to this user
+ *
* @param string $key
* @param string $value
*/
@@ -358,11 +368,19 @@ class User {
}
/**
- * Stores the display name in the databae
+ * Composes the display name and stores it in the database. The final
+ * display name is returned.
+ *
* @param string $displayName
+ * @param string $displayName2
+ * @returns string the effective display name
*/
- public function storeDisplayName($displayName) {
+ public function composeAndStoreDisplayName($displayName, $displayName2 = '') {
+ if(!empty($displayName2)) {
+ $displayName .= ' (' . $displayName2 . ')';
+ }
$this->store('displayName', $displayName);
+ return $displayName;
}
/**
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 1c0c9a8acb7..23e6d5591a9 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -84,6 +84,7 @@ style('user_ldap', 'settings');
<h3><?php p($l->t('Directory Settings'));?></h3>
<div>
<p><label for="ldap_display_name"><?php p($l->t('User Display Name Field'));?></label><input type="text" id="ldap_display_name" name="ldap_display_name" data-default="<?php p($_['ldap_display_name_default']); ?>" title="<?php p($l->t('The LDAP attribute to use to generate the user\'s display name.'));?>" /></p>
+ <p><label for="ldap_user_display_name_2"><?php p($l->t('2nd User Display Name Field'));?></label><input type="text" id="ldap_user_display_name_2" name="ldap_user_display_name_2" data-default="<?php p($_['ldap_user_display_name_2_default']); ?>" title="<?php p($l->t('Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.'));?>" /></p>
<p><label for="ldap_base_users"><?php p($l->t('Base User Tree'));?></label><textarea id="ldap_base_users" name="ldap_base_users" placeholder="<?php p($l->t('One User Base DN per line'));?>" data-default="<?php p($_['ldap_base_users_default']); ?>" title="<?php p($l->t('Base User Tree'));?>"></textarea></p>
<p><label for="ldap_attributes_for_user_search"><?php p($l->t('User Search Attributes'));?></label><textarea id="ldap_attributes_for_user_search" name="ldap_attributes_for_user_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_user_search_default']); ?>" title="<?php p($l->t('User Search Attributes'));?>"></textarea></p>
<p><label for="ldap_group_display_name"><?php p($l->t('Group Display Name Field'));?></label><input type="text" id="ldap_group_display_name" name="ldap_group_display_name" data-default="<?php p($_['ldap_group_display_name_default']); ?>" title="<?php p($l->t('The LDAP attribute to use to generate the groups\'s display name.'));?>" /></p>
diff --git a/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserDisplayName.php b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserDisplayName.php
new file mode 100644
index 00000000000..fcf85371d3a
--- /dev/null
+++ b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserDisplayName.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+use OCA\user_ldap\lib\user\User;
+use OCA\User_LDAP\Mapping\UserMapping;
+use OCA\user_ldap\tests\integration\AbstractIntegrationTest;
+
+require_once __DIR__ . '/../../../../../../lib/base.php';
+
+class IntegrationTestUserDisplayName extends AbstractIntegrationTest {
+ /** @var UserMapping */
+ protected $mapping;
+
+ /**
+ * prepares the LDAP environment and sets up a test configuration for
+ * the LDAP backend.
+ */
+ public function init() {
+ require(__DIR__ . '/../../setup-scripts/createExplicitUsers.php');
+ parent::init();
+ $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection());
+ $this->mapping->clear();
+ $this->access->setUserMapper($this->mapping);
+ $userBackend = new OCA\user_ldap\USER_LDAP($this->access, \OC::$server->getConfig());
+ \OC_User::useBackend($userBackend);
+ }
+
+ /**
+ * adds a map entry for the user, so we know the username
+ *
+ * @param $dn
+ * @param $username
+ */
+ private function prepareUser($dn, $username) {
+ // assigns our self-picked oc username to the dn
+ $this->mapping->map($dn, $username, 'fakeUUID-' . $username);
+ }
+
+ /**
+ * tests whether a display name consisting of two parts is created correctly
+ *
+ * @return bool
+ */
+ protected function case1() {
+ $username = 'alice1337';
+ $dn = 'uid=alice,ou=Users,' . $this->base;
+ $this->prepareUser($dn, $username);
+ $displayName = \OC::$server->getUserManager()->get($username)->getDisplayName();
+
+ return strpos($displayName, '(Alice@example.com)') !== false;
+ }
+
+ /**
+ * tests whether a display name consisting of one part is created correctly
+ *
+ * @return bool
+ */
+ protected function case2() {
+ $this->connection->setConfiguration([
+ 'ldapUserDisplayName2' => '',
+ ]);
+ $username = 'boris23421';
+ $dn = 'uid=boris,ou=Users,' . $this->base;
+ $this->prepareUser($dn, $username);
+ $displayName = \OC::$server->getUserManager()->get($username)->getDisplayName();
+
+ return strpos($displayName, '(Boris@example.com)') === false;
+ }
+
+ /**
+ * sets up the LDAP configuration to be used for the test
+ */
+ protected function initConnection() {
+ parent::initConnection();
+ $this->connection->setConfiguration([
+ 'ldapUserDisplayName' => 'displayName',
+ 'ldapUserDisplayName2' => 'mail',
+ ]);
+ }
+}
+
+require_once(__DIR__ . '/../../setup-scripts/config.php');
+$test = new IntegrationTestUserDisplayName($host, $port, $adn, $apwd, $bdn);
+$test->init();
+$test->run();
diff --git a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
index e580dece40c..fb5609865c4 100644
--- a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
+++ b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
@@ -63,6 +63,7 @@ foreach ($users as $uid) {
$entry['sn'] = $sn;
$entry['userPassword'] = $uid;
$entry['displayName'] = $sn . ', ' . $fn;
+ $entry['mail'] = $fn . '@example.com';
$ok = ldap_add($cr, $newDN, $entry);
if ($ok) {
diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php
index 6fa7f3b6b27..046edf58968 100644
--- a/apps/user_ldap/tests/user/user.php
+++ b/apps/user_ldap/tests/user/user.php
@@ -749,7 +749,7 @@ class Test_User_User extends \Test\TestCase {
'markRefreshTime',
'updateQuota',
'updateEmail',
- 'storeDisplayName',
+ 'composeAndStoreDisplayName',
'storeLDAPUserName',
'getHomePath',
'updateAvatar'
@@ -894,4 +894,29 @@ class Test_User_User extends \Test\TestCase {
$user->getHomePath();
}
+
+ public function displayNameProvider() {
+ return [
+ ['Roland Deschain', '', 'Roland Deschain'],
+ ['Roland Deschain', null, 'Roland Deschain'],
+ ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)'],
+ ];
+ }
+
+ /**
+ * @dataProvider displayNameProvider
+ */
+ public function testComposeAndStoreDisplayName($part1, $part2, $expected) {
+ list($access, $config, $filesys, $image, $log, $avaMgr, , $userMgr) =
+ $this->getTestInstances();
+
+ $config->expects($this->once())
+ ->method('setUserValue');
+
+ $user = new User(
+ 'user', 'cn=user', $access, $config, $filesys, $image, $log, $avaMgr, $userMgr);
+
+ $displayName = $user->composeAndStoreDisplayName($part1, $part2);
+ $this->assertSame($expected, $displayName);
+ }
}
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index 65a4bbdda77..865b7e61892 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -176,6 +176,11 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
$this->access->connection->ldapUserDisplayName . '=*',
$this->access->getFilterPartForUserSearch($search)
));
+ $attrs = array($this->access->connection->ldapUserDisplayName, 'dn');
+ $additionalAttribute = $this->access->connection->ldapUserDisplayName2;
+ if(!empty($additionalAttribute)) {
+ $attrs[] = $additionalAttribute;
+ }
\OCP\Util::writeLog('user_ldap',
'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter,
@@ -350,13 +355,30 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
return $displayName;
}
+ //Check whether the display name is configured to have a 2nd feature
+ $additionalAttribute = $this->access->connection->ldapUserDisplayName2;
+ $displayName2 = '';
+ if(!empty($additionalAttribute)) {
+ $displayName2 = $this->access->readAttribute(
+ $this->access->username2dn($uid),
+ $additionalAttribute);
+ }
+
$displayName = $this->access->readAttribute(
$this->access->username2dn($uid),
$this->access->connection->ldapUserDisplayName);
if($displayName && (count($displayName) > 0)) {
- $this->access->connection->writeToCache($cacheKey, $displayName[0]);
- return $displayName[0];
+ $displayName = $displayName[0];
+
+ if(is_array($displayName2) && (count($displayName2) > 0)) {
+ $displayName2 = $displayName2[0];
+ }
+
+ $user = $this->access->userManager->get($uid);
+ $displayName = $user->composeAndStoreDisplayName($displayName, $displayName2);
+ $this->access->connection->writeToCache($cacheKey, $displayName);
+ return $displayName;
}
return null;
diff --git a/build/integration/features/provisioning-v1.feature b/build/integration/features/provisioning-v1.feature
index 3b8633b872a..af177b713dd 100644
--- a/build/integration/features/provisioning-v1.feature
+++ b/build/integration/features/provisioning-v1.feature
@@ -284,6 +284,7 @@ Feature: provisioning
And apps returned are
| comments |
| dav |
+ | federatedfilesharing |
| files |
| files_sharing |
| files_trashbin |
diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature
index bdc1a4224d8..1a1a5c1981a 100644
--- a/build/integration/features/sharing-v1.feature
+++ b/build/integration/features/sharing-v1.feature
@@ -480,13 +480,18 @@ Feature: sharing
Then the OCS status code should be "100"
And the HTTP status code should be "200"
-
-
-
-
-
-
-
-
-
-
+ Scenario: Keep usergroup shares (#22143)
+ Given As an "admin"
+ And user "user0" exists
+ And user "user1" exists
+ And user "user2" exists
+ And group "group" exists
+ And user "user1" belongs to group "group"
+ And user "user2" belongs to group "group"
+ And user "user0" created a folder "/TMP"
+ And file "TMP" of user "user0" is shared with group "group"
+ And user "user1" created a folder "/myFOLDER"
+ And User "user1" moves file "/TMP" to "/myFOLDER/myTMP"
+ And user "user2" does not exist
+ And user "user1" should see following elements
+ | /myFOLDER/myTMP/ |
diff --git a/console.php b/console.php
index 2073654fa8d..d08d400c051 100644
--- a/console.php
+++ b/console.php
@@ -80,7 +80,7 @@ try {
echo "The process control (PCNTL) extensions are required in case you want to interrupt long running commands - see http://php.net/manual/en/book.pcntl.php" . PHP_EOL;
}
- $application = new Application(\OC::$server->getConfig());
+ $application = new Application(\OC::$server->getConfig(), \OC::$server->getEventDispatcher(), \OC::$server->getRequest());
$application->loadCommands(new ConsoleOutput());
$application->run();
} catch (Exception $ex) {
diff --git a/core/ajax/share.php b/core/ajax/share.php
index cd4144bc6a7..987b637cc97 100644
--- a/core/ajax/share.php
+++ b/core/ajax/share.php
@@ -43,92 +43,6 @@ $defaults = new \OCP\Defaults();
if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSource'])) {
switch ($_POST['action']) {
- case 'share':
- if (isset($_POST['shareType']) && isset($_POST['shareWith']) && isset($_POST['permissions'])) {
- try {
- $shareType = (int)$_POST['shareType'];
- $shareWith = $_POST['shareWith'];
- $itemSourceName = isset($_POST['itemSourceName']) ? (string)$_POST['itemSourceName'] : null;
-
- /*
- * Nasty nasty fix for https://github.com/owncloud/core/issues/19950
- */
- $passwordChanged = null;
- if (is_array($shareWith)) {
- $passwordChanged = ($shareWith['passwordChanged'] === 'true');
- if ($shareType === OCP\Share::SHARE_TYPE_LINK && $shareWith['password'] === '') {
- $shareWith = null;
- } else {
- $shareWith = $shareWith['password'];
- }
- } else {
- /*
- * We need this branch since the calendar and contacts also use this
- * endpoint
- */
- if ($shareType === OCP\Share::SHARE_TYPE_LINK && $shareWith === '') {
- $shareWith = null;
- }
- }
-
- $itemSourceName=(isset($_POST['itemSourceName'])) ? (string)$_POST['itemSourceName']:'';
-
- $token = OCP\Share::shareItem(
- $_POST['itemType'],
- $_POST['itemSource'],
- $shareType,
- $shareWith,
- $_POST['permissions'],
- $itemSourceName,
- (!empty($_POST['expirationDate']) ? new \DateTime((string)$_POST['expirationDate']) : null),
- $passwordChanged
- );
-
- if (is_string($token)) {
- OC_JSON::success(array('data' => array('token' => $token)));
- } else {
- OC_JSON::success();
- }
- } catch (\OC\HintException $exception) {
- OC_JSON::error(array('data' => array('message' => $exception->getHint())));
- } catch (Exception $exception) {
- OC_JSON::error(array('data' => array('message' => $exception->getMessage())));
- }
- }
- break;
- case 'unshare':
- if (isset($_POST['shareType']) && isset($_POST['shareWith'])) {
- if ((int)$_POST['shareType'] === OCP\Share::SHARE_TYPE_LINK && $_POST['shareWith'] == '') {
- $shareWith = null;
- } else {
- $shareWith = (string)$_POST['shareWith'];
- }
- $return = OCP\Share::unshare((string)$_POST['itemType'],(string) $_POST['itemSource'], (int)$_POST['shareType'], $shareWith);
- ($return) ? OC_JSON::success() : OC_JSON::error();
- }
- break;
- case 'setPermissions':
- if (isset($_POST['shareType']) && isset($_POST['shareWith']) && isset($_POST['permissions'])) {
- $return = OCP\Share::setPermissions(
- (string)$_POST['itemType'],
- (string)$_POST['itemSource'],
- (int)$_POST['shareType'],
- (string)$_POST['shareWith'],
- (int)$_POST['permissions']
- );
- ($return) ? OC_JSON::success() : OC_JSON::error();
- }
- break;
- case 'setExpirationDate':
- if (isset($_POST['date'])) {
- try {
- $return = OCP\Share::setExpirationDate((string)$_POST['itemType'], (string)$_POST['itemSource'], (string)$_POST['date']);
- ($return) ? OC_JSON::success() : OC_JSON::error();
- } catch (\Exception $e) {
- OC_JSON::error(array('data' => array('message' => $e->getMessage())));
- }
- }
- break;
case 'informRecipients':
$l = \OC::$server->getL10N('core');
$shareType = (int) $_POST['shareType'];
diff --git a/core/command/integrity/checkapp.php b/core/command/integrity/checkapp.php
new file mode 100644
index 00000000000..87b8eb47687
--- /dev/null
+++ b/core/command/integrity/checkapp.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * @author Victor Dubiniuk <dubiniuk@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Core\Command\Integrity;
+
+use OC\IntegrityCheck\Checker;
+use OC\Core\Command\Base;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Class CheckApp
+ *
+ * @package OC\Core\Command\Integrity
+ */
+class CheckApp extends Base {
+
+ /**
+ * @var Checker
+ */
+ private $checker;
+
+ public function __construct(Checker $checker) {
+ parent::__construct();
+ $this->checker = $checker;
+ }
+
+ /**
+ * {@inheritdoc }
+ */
+ protected function configure() {
+ parent::configure();
+ $this
+ ->setName('integrity:check-app')
+ ->setDescription('Check an app integrity using a signature.')
+ ->addArgument('appid', null, InputArgument::REQUIRED, 'Application to check')
+ ->addOption('path', null, InputOption::VALUE_OPTIONAL, 'Path to application. If none is given it will be guessed.');
+ }
+
+ /**
+ * {@inheritdoc }
+ */
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $appid = $input->getArgument('appid');
+ $path = strval($input->getOption('path'));
+ $result = $this->checker->verifyAppSignature($appid, $path);
+ $this->writeArrayInOutputFormat($input, $output, $result);
+ }
+
+}
diff --git a/core/command/integrity/checkcore.php b/core/command/integrity/checkcore.php
new file mode 100644
index 00000000000..ac29937e2ed
--- /dev/null
+++ b/core/command/integrity/checkcore.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * @author Victor Dubiniuk <dubiniuk@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Core\Command\Integrity;
+
+use OC\IntegrityCheck\Checker;
+use OC\Core\Command\Base;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Class CheckCore
+ *
+ * @package OC\Core\Command\Integrity
+ */
+class CheckCore extends Base {
+ /**
+ * @var Checker
+ */
+ private $checker;
+
+ public function __construct(Checker $checker) {
+ parent::__construct();
+ $this->checker = $checker;
+ }
+
+ /**
+ * {@inheritdoc }
+ */
+ protected function configure() {
+ parent::configure();
+ $this
+ ->setName('integrity:check-core')
+ ->setDescription('Check a core integrity using a signature.');
+ }
+
+ /**
+ * {@inheritdoc }
+ */
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $result = $this->checker->verifyCoreSignature();
+ $this->writeArrayInOutputFormat($input, $output, $result);
+ }
+}
diff --git a/core/command/integrity/signcore.php b/core/command/integrity/signcore.php
index 531a4d33aa3..e5c2de73e00 100644
--- a/core/command/integrity/signcore.php
+++ b/core/command/integrity/signcore.php
@@ -59,7 +59,8 @@ class SignCore extends Command {
->setName('integrity:sign-core')
->setDescription('Sign core using a private key.')
->addOption('privateKey', null, InputOption::VALUE_REQUIRED, 'Path to private key to use for signing')
- ->addOption('certificate', null, InputOption::VALUE_REQUIRED, 'Path to certificate to use for signing');
+ ->addOption('certificate', null, InputOption::VALUE_REQUIRED, 'Path to certificate to use for signing')
+ ->addOption('path', null, InputOption::VALUE_REQUIRED, 'Path of core to sign');
}
/**
@@ -68,8 +69,9 @@ class SignCore extends Command {
protected function execute(InputInterface $input, OutputInterface $output) {
$privateKeyPath = $input->getOption('privateKey');
$keyBundlePath = $input->getOption('certificate');
- if(is_null($privateKeyPath) || is_null($keyBundlePath)) {
- $output->writeln('--privateKey and --certificate are required.');
+ $path = $input->getOption('path');
+ if(is_null($privateKeyPath) || is_null($keyBundlePath) || is_null($path)) {
+ $output->writeln('--privateKey, --certificate and --path are required.');
return null;
}
@@ -91,7 +93,7 @@ class SignCore extends Command {
$x509 = new X509();
$x509->loadX509($keyBundle);
$x509->setPrivateKey($rsa);
- $this->checker->writeCoreSignature($x509, $rsa);
+ $this->checker->writeCoreSignature($x509, $rsa, $path);
$output->writeln('Successfully signed "core"');
}
diff --git a/core/img/appstore.png b/core/img/appstore.png
deleted file mode 100644
index 2b90216f797..00000000000
--- a/core/img/appstore.png
+++ /dev/null
Binary files differ
diff --git a/core/img/appstore.svg b/core/img/appstore.svg
new file mode 100644
index 00000000000..ac111e59746
--- /dev/null
+++ b/core/img/appstore.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="US_UK_Download_on_the" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" width="135px" height="40px" viewBox="0 0 135 40" enable-background="new 0 0 135 40" xml:space="preserve">
+<g>
+ <path fill="#A6A6A6" d="M130.197,40H4.729C2.122,40,0,37.872,0,35.267V4.726C0,2.12,2.122,0,4.729,0h125.468
+ C132.803,0,135,2.12,135,4.726v30.541C135,37.872,132.803,40,130.197,40L130.197,40z"/>
+ <path d="M134.032,35.268c0,2.116-1.714,3.83-3.834,3.83H4.729c-2.119,0-3.839-1.714-3.839-3.83V4.725
+ c0-2.115,1.72-3.835,3.839-3.835h125.468c2.121,0,3.834,1.72,3.834,3.835L134.032,35.268L134.032,35.268z"/>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M30.128,19.784c-0.029-3.223,2.639-4.791,2.761-4.864c-1.511-2.203-3.853-2.504-4.676-2.528
+ c-1.967-0.207-3.875,1.177-4.877,1.177c-1.022,0-2.565-1.157-4.228-1.123c-2.14,0.033-4.142,1.272-5.24,3.196
+ c-2.266,3.923-0.576,9.688,1.595,12.859c1.086,1.553,2.355,3.287,4.016,3.226c1.625-0.067,2.232-1.036,4.193-1.036
+ c1.943,0,2.513,1.036,4.207,0.997c1.744-0.028,2.842-1.56,3.89-3.127c1.255-1.78,1.759-3.533,1.779-3.623
+ C33.507,24.924,30.161,23.647,30.128,19.784z"/>
+ <path fill="#FFFFFF" d="M26.928,10.306c0.874-1.093,1.472-2.58,1.306-4.089c-1.265,0.056-2.847,0.875-3.758,1.944
+ c-0.806,0.942-1.526,2.486-1.34,3.938C24.557,12.205,26.016,11.382,26.928,10.306z"/>
+ </g>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M53.645,31.504h-2.271l-1.244-3.909h-4.324l-1.185,3.909h-2.211l4.284-13.308h2.646L53.645,31.504z
+ M49.755,25.955L48.63,22.48c-0.119-0.355-0.342-1.191-0.671-2.507h-0.04c-0.131,0.566-0.342,1.402-0.632,2.507l-1.105,3.475
+ H49.755z"/>
+ <path fill="#FFFFFF" d="M64.662,26.588c0,1.632-0.441,2.922-1.323,3.869c-0.79,0.843-1.771,1.264-2.942,1.264
+ c-1.264,0-2.172-0.454-2.725-1.362h-0.04v5.055h-2.132V25.067c0-1.026-0.027-2.079-0.079-3.159h1.875l0.119,1.521h0.04
+ c0.711-1.146,1.79-1.718,3.238-1.718c1.132,0,2.077,0.447,2.833,1.342C64.284,23.949,64.662,25.127,64.662,26.588z M62.49,26.666
+ c0-0.934-0.21-1.704-0.632-2.31c-0.461-0.632-1.08-0.948-1.856-0.948c-0.526,0-1.004,0.176-1.431,0.523
+ c-0.428,0.35-0.708,0.807-0.839,1.373c-0.066,0.264-0.099,0.48-0.099,0.65v1.6c0,0.698,0.214,1.287,0.642,1.768
+ s0.984,0.721,1.668,0.721c0.803,0,1.428-0.31,1.875-0.928C62.266,28.496,62.49,27.68,62.49,26.666z"/>
+ <path fill="#FFFFFF" d="M75.699,26.588c0,1.632-0.441,2.922-1.324,3.869c-0.789,0.843-1.77,1.264-2.941,1.264
+ c-1.264,0-2.172-0.454-2.724-1.362H68.67v5.055h-2.132V25.067c0-1.026-0.027-2.079-0.079-3.159h1.875l0.119,1.521h0.04
+ c0.71-1.146,1.789-1.718,3.238-1.718c1.131,0,2.076,0.447,2.834,1.342C75.32,23.949,75.699,25.127,75.699,26.588z M73.527,26.666
+ c0-0.934-0.211-1.704-0.633-2.31c-0.461-0.632-1.078-0.948-1.855-0.948c-0.527,0-1.004,0.176-1.432,0.523
+ c-0.428,0.35-0.707,0.807-0.838,1.373c-0.065,0.264-0.099,0.48-0.099,0.65v1.6c0,0.698,0.214,1.287,0.64,1.768
+ c0.428,0.48,0.984,0.721,1.67,0.721c0.803,0,1.428-0.31,1.875-0.928C73.303,28.496,73.527,27.68,73.527,26.666z"/>
+ <path fill="#FFFFFF" d="M88.039,27.772c0,1.132-0.393,2.053-1.182,2.764c-0.867,0.777-2.074,1.165-3.625,1.165
+ c-1.432,0-2.58-0.276-3.449-0.829l0.494-1.777c0.936,0.566,1.963,0.85,3.082,0.85c0.803,0,1.428-0.182,1.877-0.544
+ c0.447-0.362,0.67-0.848,0.67-1.454c0-0.54-0.184-0.995-0.553-1.364c-0.367-0.369-0.98-0.712-1.836-1.029
+ c-2.33-0.869-3.494-2.142-3.494-3.816c0-1.094,0.408-1.991,1.225-2.689c0.814-0.699,1.9-1.048,3.258-1.048
+ c1.211,0,2.217,0.211,3.02,0.632l-0.533,1.738c-0.75-0.408-1.598-0.612-2.547-0.612c-0.75,0-1.336,0.185-1.756,0.553
+ c-0.355,0.329-0.533,0.73-0.533,1.205c0,0.526,0.203,0.961,0.611,1.303c0.355,0.316,1,0.658,1.936,1.027
+ c1.145,0.461,1.986,1,2.527,1.618C87.77,26.081,88.039,26.852,88.039,27.772z"/>
+ <path fill="#FFFFFF" d="M95.088,23.508h-2.35v4.659c0,1.185,0.414,1.777,1.244,1.777c0.381,0,0.697-0.033,0.947-0.099l0.059,1.619
+ c-0.42,0.157-0.973,0.236-1.658,0.236c-0.842,0-1.5-0.257-1.975-0.77c-0.473-0.514-0.711-1.376-0.711-2.587v-4.837h-1.4v-1.6h1.4
+ v-1.757l2.094-0.632v2.389h2.35V23.508z"/>
+ <path fill="#FFFFFF" d="M105.691,26.627c0,1.475-0.422,2.686-1.264,3.633c-0.883,0.975-2.055,1.461-3.516,1.461
+ c-1.408,0-2.529-0.467-3.365-1.401s-1.254-2.113-1.254-3.534c0-1.487,0.43-2.705,1.293-3.652c0.861-0.948,2.023-1.422,3.484-1.422
+ c1.408,0,2.541,0.467,3.396,1.402C105.283,24.021,105.691,25.192,105.691,26.627z M103.479,26.696
+ c0-0.885-0.189-1.644-0.572-2.277c-0.447-0.766-1.086-1.148-1.914-1.148c-0.857,0-1.508,0.383-1.955,1.148
+ c-0.383,0.634-0.572,1.405-0.572,2.317c0,0.885,0.189,1.644,0.572,2.276c0.461,0.766,1.105,1.148,1.936,1.148
+ c0.814,0,1.453-0.39,1.914-1.168C103.281,28.347,103.479,27.58,103.479,26.696z"/>
+ <path fill="#FFFFFF" d="M112.621,23.783c-0.211-0.039-0.436-0.059-0.672-0.059c-0.75,0-1.33,0.283-1.738,0.85
+ c-0.355,0.5-0.533,1.132-0.533,1.895v5.035h-2.131l0.02-6.574c0-1.106-0.027-2.113-0.08-3.021h1.857l0.078,1.836h0.059
+ c0.225-0.631,0.58-1.139,1.066-1.52c0.475-0.343,0.988-0.514,1.541-0.514c0.197,0,0.375,0.014,0.533,0.039V23.783z"/>
+ <path fill="#FFFFFF" d="M122.156,26.252c0,0.382-0.025,0.704-0.078,0.967h-6.396c0.025,0.948,0.334,1.673,0.928,2.173
+ c0.539,0.447,1.236,0.671,2.092,0.671c0.947,0,1.811-0.151,2.588-0.454l0.334,1.48c-0.908,0.396-1.98,0.593-3.217,0.593
+ c-1.488,0-2.656-0.438-3.506-1.313c-0.848-0.875-1.273-2.05-1.273-3.524c0-1.447,0.395-2.652,1.186-3.613
+ c0.828-1.026,1.947-1.539,3.355-1.539c1.383,0,2.43,0.513,3.141,1.539C121.873,24.047,122.156,25.055,122.156,26.252z
+ M120.123,25.699c0.014-0.632-0.125-1.178-0.414-1.639c-0.369-0.593-0.936-0.889-1.699-0.889c-0.697,0-1.264,0.289-1.697,0.869
+ c-0.355,0.461-0.566,1.014-0.631,1.658H120.123z"/>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M49.05,10.009c0,1.177-0.353,2.063-1.058,2.658c-0.653,0.549-1.581,0.824-2.783,0.824
+ c-0.596,0-1.106-0.026-1.533-0.078V6.982c0.557-0.09,1.157-0.136,1.805-0.136c1.145,0,2.008,0.249,2.59,0.747
+ C48.723,8.156,49.05,8.961,49.05,10.009z M47.945,10.038c0-0.763-0.202-1.348-0.606-1.756c-0.404-0.407-0.994-0.611-1.771-0.611
+ c-0.33,0-0.611,0.022-0.844,0.068v4.889c0.129,0.02,0.365,0.029,0.708,0.029c0.802,0,1.421-0.223,1.857-0.669
+ S47.945,10.892,47.945,10.038z"/>
+ <path fill="#FFFFFF" d="M54.909,11.037c0,0.725-0.207,1.319-0.621,1.785c-0.434,0.479-1.009,0.718-1.727,0.718
+ c-0.692,0-1.243-0.229-1.654-0.689c-0.41-0.459-0.615-1.038-0.615-1.736c0-0.73,0.211-1.329,0.635-1.794s0.994-0.698,1.712-0.698
+ c0.692,0,1.248,0.229,1.669,0.688C54.708,9.757,54.909,10.333,54.909,11.037z M53.822,11.071c0-0.435-0.094-0.808-0.281-1.119
+ c-0.22-0.376-0.533-0.564-0.94-0.564c-0.421,0-0.741,0.188-0.961,0.564c-0.188,0.311-0.281,0.69-0.281,1.138
+ c0,0.435,0.094,0.808,0.281,1.119c0.227,0.376,0.543,0.564,0.951,0.564c0.4,0,0.714-0.191,0.94-0.574
+ C53.725,11.882,53.822,11.506,53.822,11.071z"/>
+ <path fill="#FFFFFF" d="M62.765,8.719l-1.475,4.714h-0.96l-0.611-2.047c-0.155-0.511-0.281-1.019-0.379-1.523h-0.019
+ c-0.091,0.518-0.217,1.025-0.379,1.523l-0.649,2.047h-0.971l-1.387-4.714h1.077l0.533,2.241c0.129,0.53,0.235,1.035,0.32,1.513
+ h0.019c0.078-0.394,0.207-0.896,0.389-1.503l0.669-2.25h0.854l0.641,2.202c0.155,0.537,0.281,1.054,0.378,1.552h0.029
+ c0.071-0.485,0.178-1.002,0.32-1.552l0.572-2.202H62.765z"/>
+ <path fill="#FFFFFF" d="M68.198,13.433H67.15v-2.7c0-0.832-0.316-1.248-0.95-1.248c-0.311,0-0.562,0.114-0.757,0.343
+ c-0.193,0.229-0.291,0.499-0.291,0.808v2.796h-1.048v-3.366c0-0.414-0.013-0.863-0.038-1.349h0.921l0.049,0.737h0.029
+ c0.122-0.229,0.304-0.418,0.543-0.569c0.284-0.176,0.602-0.265,0.95-0.265c0.44,0,0.806,0.142,1.097,0.427
+ c0.362,0.349,0.543,0.87,0.543,1.562V13.433z"/>
+ <path fill="#FFFFFF" d="M71.088,13.433h-1.047V6.556h1.047V13.433z"/>
+ <path fill="#FFFFFF" d="M77.258,11.037c0,0.725-0.207,1.319-0.621,1.785c-0.434,0.479-1.01,0.718-1.727,0.718
+ c-0.693,0-1.244-0.229-1.654-0.689c-0.41-0.459-0.615-1.038-0.615-1.736c0-0.73,0.211-1.329,0.635-1.794s0.994-0.698,1.711-0.698
+ c0.693,0,1.248,0.229,1.67,0.688C77.057,9.757,77.258,10.333,77.258,11.037z M76.17,11.071c0-0.435-0.094-0.808-0.281-1.119
+ c-0.219-0.376-0.533-0.564-0.939-0.564c-0.422,0-0.742,0.188-0.961,0.564c-0.188,0.311-0.281,0.69-0.281,1.138
+ c0,0.435,0.094,0.808,0.281,1.119c0.227,0.376,0.543,0.564,0.951,0.564c0.4,0,0.713-0.191,0.939-0.574
+ C76.074,11.882,76.17,11.506,76.17,11.071z"/>
+ <path fill="#FFFFFF" d="M82.33,13.433h-0.941l-0.078-0.543h-0.029c-0.322,0.433-0.781,0.65-1.377,0.65
+ c-0.445,0-0.805-0.143-1.076-0.427c-0.246-0.258-0.369-0.579-0.369-0.96c0-0.576,0.24-1.015,0.723-1.319
+ c0.482-0.304,1.16-0.453,2.033-0.446V10.3c0-0.621-0.326-0.931-0.979-0.931c-0.465,0-0.875,0.117-1.229,0.349l-0.213-0.688
+ c0.438-0.271,0.979-0.407,1.617-0.407c1.232,0,1.85,0.65,1.85,1.95v1.736C82.262,12.78,82.285,13.155,82.33,13.433z
+ M81.242,11.813v-0.727c-1.156-0.02-1.734,0.297-1.734,0.95c0,0.246,0.066,0.43,0.201,0.553c0.135,0.123,0.307,0.184,0.512,0.184
+ c0.23,0,0.445-0.073,0.641-0.218c0.197-0.146,0.318-0.331,0.363-0.558C81.236,11.946,81.242,11.884,81.242,11.813z"/>
+ <path fill="#FFFFFF" d="M88.285,13.433h-0.93l-0.049-0.757h-0.029c-0.297,0.576-0.803,0.864-1.514,0.864
+ c-0.568,0-1.041-0.223-1.416-0.669s-0.562-1.025-0.562-1.736c0-0.763,0.203-1.381,0.611-1.853c0.395-0.44,0.879-0.66,1.455-0.66
+ c0.633,0,1.076,0.213,1.328,0.64h0.02V6.556h1.049v5.607C88.248,12.622,88.26,13.045,88.285,13.433z M87.199,11.445v-0.786
+ c0-0.136-0.01-0.246-0.029-0.33c-0.059-0.252-0.186-0.464-0.379-0.635c-0.195-0.171-0.43-0.257-0.701-0.257
+ c-0.391,0-0.697,0.155-0.922,0.466c-0.223,0.311-0.336,0.708-0.336,1.193c0,0.466,0.107,0.844,0.322,1.135
+ c0.227,0.31,0.533,0.465,0.916,0.465c0.344,0,0.619-0.129,0.828-0.388C87.1,12.069,87.199,11.781,87.199,11.445z"/>
+ <path fill="#FFFFFF" d="M97.248,11.037c0,0.725-0.207,1.319-0.621,1.785c-0.434,0.479-1.008,0.718-1.727,0.718
+ c-0.691,0-1.242-0.229-1.654-0.689c-0.41-0.459-0.615-1.038-0.615-1.736c0-0.73,0.211-1.329,0.635-1.794s0.994-0.698,1.713-0.698
+ c0.691,0,1.248,0.229,1.668,0.688C97.047,9.757,97.248,10.333,97.248,11.037z M96.162,11.071c0-0.435-0.094-0.808-0.281-1.119
+ c-0.221-0.376-0.533-0.564-0.941-0.564c-0.42,0-0.74,0.188-0.961,0.564c-0.188,0.311-0.281,0.69-0.281,1.138
+ c0,0.435,0.094,0.808,0.281,1.119c0.227,0.376,0.543,0.564,0.951,0.564c0.4,0,0.715-0.191,0.941-0.574
+ C96.064,11.882,96.162,11.506,96.162,11.071z"/>
+ <path fill="#FFFFFF" d="M102.883,13.433h-1.047v-2.7c0-0.832-0.316-1.248-0.951-1.248c-0.311,0-0.562,0.114-0.756,0.343
+ s-0.291,0.499-0.291,0.808v2.796h-1.049v-3.366c0-0.414-0.012-0.863-0.037-1.349h0.92l0.049,0.737h0.029
+ c0.123-0.229,0.305-0.418,0.543-0.569c0.285-0.176,0.602-0.265,0.951-0.265c0.439,0,0.805,0.142,1.096,0.427
+ c0.363,0.349,0.543,0.87,0.543,1.562V13.433z"/>
+ <path fill="#FFFFFF" d="M109.936,9.504h-1.154v2.29c0,0.582,0.205,0.873,0.611,0.873c0.188,0,0.344-0.016,0.467-0.049
+ l0.027,0.795c-0.207,0.078-0.479,0.117-0.814,0.117c-0.414,0-0.736-0.126-0.969-0.378c-0.234-0.252-0.35-0.676-0.35-1.271V9.504
+ h-0.689V8.719h0.689V7.855l1.027-0.31v1.173h1.154V9.504z"/>
+ <path fill="#FFFFFF" d="M115.484,13.433h-1.049v-2.68c0-0.845-0.316-1.268-0.949-1.268c-0.486,0-0.818,0.245-1,0.735
+ c-0.031,0.103-0.049,0.229-0.049,0.377v2.835h-1.047V6.556h1.047v2.841h0.02c0.33-0.517,0.803-0.775,1.416-0.775
+ c0.434,0,0.793,0.142,1.078,0.427c0.355,0.355,0.533,0.883,0.533,1.581V13.433z"/>
+ <path fill="#FFFFFF" d="M121.207,10.853c0,0.188-0.014,0.346-0.039,0.475h-3.143c0.014,0.466,0.164,0.821,0.455,1.067
+ c0.266,0.22,0.609,0.33,1.029,0.33c0.465,0,0.889-0.074,1.271-0.223l0.164,0.728c-0.447,0.194-0.973,0.291-1.582,0.291
+ c-0.73,0-1.305-0.215-1.721-0.645c-0.418-0.43-0.625-1.007-0.625-1.731c0-0.711,0.193-1.303,0.582-1.775
+ c0.406-0.504,0.955-0.756,1.648-0.756c0.678,0,1.193,0.252,1.541,0.756C121.068,9.77,121.207,10.265,121.207,10.853z
+ M120.207,10.582c0.008-0.311-0.061-0.579-0.203-0.805c-0.182-0.291-0.459-0.437-0.834-0.437c-0.342,0-0.621,0.142-0.834,0.427
+ c-0.174,0.227-0.277,0.498-0.311,0.815H120.207z"/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/core/img/desktopapp.svg b/core/img/desktopapp.svg
index d63cfef0848..98f3616537d 100644
--- a/core/img/desktopapp.svg
+++ b/core/img/desktopapp.svg
@@ -1,5 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="60" width="170" version="1.1" y="0px" x="0px" xmlns:cc="http://creativecommons.org/ns#" enable-background="new 0 0 792 612" viewBox="0 0 1346.4 475.2" xmlns:dc="http://purl.org/dc/elements/1.1/">
-<rect rx="50" ry="50" height="475.2" width="1346.4" y="-3.5527e-15" x="-2.8405e-15"/><path d="m150.48 126.72c-11.88 0-23.76 11.88-23.76 23.76v166.32l-47.52 23.76v11.88s0 11.88 11.88 11.88h356.4c11.88 0 11.88-11.88 11.88-11.88v-11.88l-47.52-23.76v-166.32c0-11.88-11.88-23.76-23.76-23.76zm0 23.667h237.6v142.65h-237.6z" fill="#fff"/><text style="word-spacing:0px;letter-spacing:0px" xml:space="preserve" font-size="316.8px" y="239.58" x="451.44" font-family="Sans" line-height="125%" fill="#ffffff"><tspan font-size="126.72px" font-weight="600" y="239.58" x="451.44" font-family="FreeSans" fill="#ffffff">Desktop app</tspan></text>
-<text style="word-spacing:0px;letter-spacing:0px" xml:space="preserve" font-size="316.8px" y="342.54001" x="493.01996" font-family="Sans" line-height="125%" fill="#ffffff"><tspan y="342.54001" x="493.01996" font-size="71.28px" font-family="FreeSans" fill="#ffffff">Windows, OS X, Linux</tspan></text>
+ <rect rx="50" ry="50" height="475.2" width="1346.4" y="-3.5527e-15" x="-2.8405e-15"/>
+ <path d="m150.48 126.72c-11.88 0-23.76 11.88-23.76 23.76v166.32l-47.52 23.76v11.88s0 11.88 11.88 11.88h356.4c11.88 0 11.88-11.88 11.88-11.88v-11.88l-47.52-23.76v-166.32c0-11.88-11.88-23.76-23.76-23.76zm0 23.667h237.6v142.65h-237.6z" fill="#fff"/>
+ <g id="text8" style="font-size:316.79998779px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ffffff">
+ <path d="m 537.87938,193.48313 q 0,22.33687 -12.74625,34.21687 -12.68438,11.88 -36.69188,11.88 l -25.61625,0 0,-90.46125 28.40063,0 q 22.15125,0 34.4025,11.69438 12.25125,11.69437 12.25125,32.67 z m -19.92375,0.495 q 0,-29.14313 -25.74,-29.14313 l -10.20938,0 0,58.905 8.22938,0 q 27.72,0 27.72,-29.76187 z" />
+ <path d="m 583.79063,182.53125 q -6.00188,0 -9.405,3.83625 -3.40313,3.77438 -3.89813,10.76625 l 26.4825,0 q -0.12375,-6.99187 -3.65062,-10.76625 -3.52688,-3.83625 -9.52875,-3.83625 z m 2.66062,58.28625 q -16.70625,0 -26.11125,-9.21937 -9.405,-9.21938 -9.405,-26.11125 0,-17.38688 8.6625,-26.85375 8.72438,-9.52875 24.06938,-9.52875 14.66437,0 22.83187,8.35312 8.1675,8.35313 8.1675,23.07938 l 0,9.1575 -44.61187,0 q 0.30937,8.04375 4.76437,12.56062 4.455,4.51688 12.49875,4.51688 6.24938,0 11.81813,-1.29938 5.56875,-1.29937 11.6325,-4.14562 l 0,14.6025 q -4.95,2.475 -10.58063,3.65062 -5.63062,1.2375 -13.73625,1.2375 z" />
+ <path d="m 678.3975,219.0375 q 0,10.6425 -7.425,16.21125 -7.36312,5.56875 -22.08937,5.56875 -7.54875,0 -12.87,-1.05187 -5.32125,-0.99 -9.96188,-2.97 l 0,-15.5925 q 5.25938,2.475 11.81813,4.14562 6.62062,1.67063 11.6325,1.67063 10.27125,0 10.27125,-5.94 0,-2.2275 -1.36125,-3.58875 -1.36125,-1.42313 -4.7025,-3.15563 -3.34125,-1.79437 -8.91,-4.14562 -7.98188,-3.34125 -11.75625,-6.1875 -3.7125,-2.84625 -5.445,-6.49688 -1.67063,-3.7125 -1.67063,-9.09562 0,-9.21938 7.11563,-14.23125 7.1775,-5.07375 20.295,-5.07375 12.49875,0 24.31687,5.445 l -5.6925,13.6125 q -5.1975,-2.2275 -9.71437,-3.65063 -4.51688,-1.42312 -9.21938,-1.42312 -8.35312,0 -8.35312,4.51687 0,2.53688 2.66062,4.39313 2.7225,1.85625 11.81813,5.50687 8.10562,3.27938 11.88,6.12563 3.77437,2.84625 5.56875,6.55875 1.79437,3.7125 1.79437,8.84812 z" />
+ <path d="m 711.37688,201.96 8.22937,-10.51875 19.36688,-21.0375 21.285,0 -27.4725,30.00938 29.14312,39.16687 -21.78,0 -19.92375,-28.02937 -8.10562,6.49687 0,21.5325 -18.87188,0 0,-96.2775 18.87188,0 0,42.94125 -0.99,15.71625 0.2475,0 z" />
+ <path d="m 801.09562,225.78188 q 4.95,0 11.88,-2.16563 l 0,14.04563 q -7.05375,3.15562 -17.325,3.15562 -11.32313,0 -16.52063,-5.6925 -5.13562,-5.75437 -5.13562,-17.20125 l 0,-33.35062 -9.03375,0 0,-7.98188 10.395,-6.31125 5.445,-14.6025 12.06562,0 0,14.72625 19.36688,0 0,14.16938 -19.36688,0 0,33.35062 q 0,4.02188 2.2275,5.94 2.28938,1.91813 6.00188,1.91813 z" />
+ <path d="m 841.93312,204.86813 q 0,10.27125 3.34125,15.53062 3.40313,5.25938 11.01375,5.25938 7.54875,0 10.82813,-5.1975 3.34125,-5.25938 3.34125,-15.5925 0,-10.27125 -3.34125,-15.40688 -3.34125,-5.13562 -10.95188,-5.13562 -7.54875,0 -10.89,5.13562 -3.34125,5.07375 -3.34125,15.40688 z m 47.82938,0 q 0,16.89187 -8.91,26.42062 -8.91,9.52875 -24.81188,9.52875 -9.96187,0 -17.5725,-4.33125 -7.61062,-4.39312 -11.69437,-12.56062 -4.08375,-8.1675 -4.08375,-19.0575 0,-16.95375 8.84812,-26.35875 8.84813,-9.405 24.87375,-9.405 9.96188,0 17.5725,4.33125 7.61063,4.33125 11.69438,12.43687 4.08375,8.10563 4.08375,18.99563 z" />
+ <path d="m 943.34627,240.8175 q -12.18938,0 -19.11938,-8.84812 l -0.99,0 q 0.99,8.6625 0.99,10.02375 l 0,28.02937 -18.87187,0 0,-99.61875 15.345,0 2.66062,8.97188 0.86625,0 q 6.62063,-10.27125 19.61438,-10.27125 12.25125,0 19.18125,9.46687 6.93,9.46688 6.93,26.29688 0,11.07562 -3.27938,19.24312 -3.2175,8.1675 -9.21937,12.43688 -6.00188,4.26937 -14.1075,4.26937 z m -5.56875,-56.61562 q -6.99188,0 -10.20938,4.33125 -3.2175,4.26937 -3.34125,14.16937 l 0,2.04188 q 0,11.1375 3.27938,15.96375 3.34125,4.82625 10.51875,4.82625 12.68437,0 12.68437,-20.91375 0,-10.20938 -3.15562,-15.28313 -3.09375,-5.13562 -9.77625,-5.13562 z" />
+ <path d="m 1062.3938,239.58 -3.6507,-9.405 -0.495,0 q -4.7643,6.00188 -9.8381,8.35313 -5.0119,2.28937 -13.1175,2.28937 -9.9619,0 -15.7162,-5.6925 -5.6925,-5.6925 -5.6925,-16.21125 0,-11.01375 7.6725,-16.21125 7.7343,-5.25937 23.265,-5.81625 l 12.0037,-0.37125 0,-3.03187 q 0,-10.51875 -10.7662,-10.51875 -8.2913,0 -19.4907,5.01187 L 1020.3188,175.23 q 11.9418,-6.24937 26.4825,-6.24937 13.9218,0 21.3468,6.06375 7.425,6.06375 7.425,18.43875 l 0,46.09687 -13.1793,0 z m -5.5688,-32.05125 -7.3012,0.2475 q -8.2294,0.2475 -12.2513,2.97 -4.0219,2.7225 -4.0219,8.29125 0,7.98188 9.1575,7.98188 6.5588,0 10.4569,-3.77438 3.96,-3.77437 3.96,-10.02375 l 0,-5.6925 z" />
+ <path d="m 1132.9312,240.8175 q -12.1893,0 -19.1193,-8.84812 l -0.99,0 q 0.99,8.6625 0.99,10.02375 l 0,28.02937 -18.8719,0 0,-99.61875 15.345,0 2.6606,8.97188 0.8663,0 q 6.6206,-10.27125 19.6143,-10.27125 12.2513,0 19.1813,9.46687 6.93,9.46688 6.93,26.29688 0,11.07562 -3.2794,19.24312 -3.2175,8.1675 -9.2194,12.43688 -6.0018,4.26937 -14.1075,4.26937 z m -5.5687,-56.61562 q -6.9919,0 -10.2094,4.33125 -3.2175,4.26937 -3.3412,14.16937 l 0,2.04188 q 0,11.1375 3.2793,15.96375 3.3413,4.82625 10.5188,4.82625 12.6844,0 12.6844,-20.91375 0,-10.20938 -3.1557,-15.28313 -3.0937,-5.13562 -9.7762,-5.13562 z" />
+ <path d="m 1213.1213,240.8175 q -12.1894,0 -19.1194,-8.84812 l -0.99,0 q 0.99,8.6625 0.99,10.02375 l 0,28.02937 -18.8719,0 0,-99.61875 15.345,0 2.6607,8.97188 0.8662,0 q 6.6206,-10.27125 19.6144,-10.27125 12.2512,0 19.1812,9.46687 6.93,9.46688 6.93,26.29688 0,11.07562 -3.2793,19.24312 -3.2175,8.1675 -9.2194,12.43688 -6.0019,4.26937 -14.1075,4.26937 z m -5.5688,-56.61562 q -6.9918,0 -10.2093,4.33125 -3.2175,4.26937 -3.3413,14.16937 l 0,2.04188 q 0,11.1375 3.2794,15.96375 3.3412,4.82625 10.5187,4.82625 12.6844,0 12.6844,-20.91375 0,-10.20938 -3.1556,-15.28313 -3.0938,-5.13562 -9.7763,-5.13562 z" /></g>
+ <g id="text12" style="fill:#ffffff">
+ <path d="m 544.42648,342.54001 -5.84719,0 -10.26738,-34.07379 q -0.7309,-2.2623 -1.63582,-5.70797 -0.90492,-3.44566 -0.93973,-4.14176 -0.7657,4.59422 -2.43632,10.05856 l -9.95414,33.86496 -5.84719,0 -13.53902,-50.88445 6.26484,0 8.03988,31.42863 q 1.67063,6.61289 2.43633,11.97281 0.93973,-6.36926 2.78437,-12.46008 l 9.11883,-30.94136 6.26485,0 9.57128,31.2198 q 1.67063,5.39473 2.81918,12.18164 0.66129,-4.94226 2.50594,-12.04242 l 8.00508,-31.35902 6.26484,0 -13.60863,50.88445 z" />
+ <path d="m 570.91285,342.54001 -5.77758,0 0,-38.14594 5.77758,0 0,38.14594 z M 564.648,294.05708 q 0,-1.98387 0.97453,-2.88879 0.97454,-0.93973 2.43633,-0.93973 1.39219,0 2.40153,0.93973 1.00933,0.93973 1.00933,2.88879 0,1.94906 -1.00933,2.92359 -1.00934,0.93973 -2.40153,0.93973 -1.46179,0 -2.43633,-0.93973 -0.97453,-0.97453 -0.97453,-2.92359 z" />
+ <path d="m 609.33722,342.54001 0,-24.67652 q 0,-4.66383 -2.12309,-6.96094 -2.12308,-2.29711 -6.64769,-2.29711 -5.98641,0 -8.77078,3.23683 -2.78438,3.23684 -2.78438,10.68504 l 0,20.0127 -5.77758,0 0,-38.14594 4.69864,0 0.93972,5.2207 0.27844,0 q 1.77504,-2.81917 4.97707,-4.35058 3.20203,-1.56621 7.13496,-1.56621 6.89133,0 10.3718,3.34125 3.48047,3.30644 3.48047,10.61543 l 0,24.88535 -5.77758,0 z" />
+ <path d="m 652.91269,337.42372 -0.31324,0 q -4.00254,5.81238 -11.97281,5.81238 -7.48301,0 -11.65957,-5.11629 -4.14176,-5.11629 -4.14176,-14.54836 0,-9.43207 4.17656,-14.65277 4.17656,-5.2207 11.62477,-5.2207 7.76144,0 11.9032,5.63836 l 0.45246,0 -0.24363,-2.74957 -0.13922,-2.67996 0,-15.52289 5.77758,0 0,54.15609 -4.69864,0 -0.7657,-5.11629 z m -11.55516,0.97453 q 5.9168,0 8.56196,-3.20203 2.67996,-3.23684 2.67996,-10.4066 l 0,-1.21817 q 0,-8.10949 -2.71477,-11.55515 -2.67996,-3.48047 -8.59675,-3.48047 -5.08149,0 -7.79625,3.96773 -2.67997,3.93293 -2.67997,11.1375 0,7.30899 2.67997,11.03309 2.67996,3.7241 7.86585,3.7241 z" />
+ <path d="m 703.58832,323.43224 q 0,9.32765 -4.69863,14.58316 -4.69864,5.2207 -12.98215,5.2207 -5.11629,0 -9.08403,-2.40152 -3.96773,-2.40152 -6.12562,-6.89133 -2.15789,-4.4898 -2.15789,-10.51101 0,-9.32766 4.66383,-14.51356 4.66383,-5.2207 12.94734,-5.2207 8.00508,0 12.70371,5.32512 4.73344,5.32511 4.73344,14.40914 z m -29.06191,0 q 0,7.30898 2.92359,11.1375 2.92359,3.82851 8.59676,3.82851 5.67316,0 8.59675,-3.79371 2.9584,-3.82852 2.9584,-11.1723 0,-7.27418 -2.9584,-11.03309 -2.92359,-3.79371 -8.66636,-3.79371 -5.67317,0 -8.56196,3.7241 -2.88878,3.7241 -2.88878,11.1027 z" />
+ <path d="m 744.83187,342.54001 -6.99575,-22.37942 q -0.66129,-2.05347 -2.47113,-9.32765 l -0.27844,0 q -1.39218,6.09082 -2.43633,9.39726 l -7.20457,22.30981 -6.6825,0 -10.4066,-38.14594 6.05602,0 q 3.6893,14.37434 5.60355,21.89215 1.94907,7.51781 2.2275,10.12816 l 0.27844,0 q 0.38285,-1.98386 1.21816,-5.11629 0.87012,-3.16722 1.49661,-5.01187 l 6.99574,-21.89215 6.26484,0 6.82172,21.89215 q 1.94906,5.98641 2.64516,10.05855 l 0.27843,0 q 0.13922,-1.25296 0.7309,-3.86332 0.62649,-2.61035 7.27418,-28.08738 l 5.98641,0 -10.54582,38.14594 -6.85652,0 z" />
+ <path d="m 793.69766,332.13341 q 0,5.32511 -3.96774,8.2139 -3.96773,2.88879 -11.1375,2.88879 -7.58742,0 -11.83359,-2.40152 l 0,-5.35992 q 2.74957,1.39218 5.88199,2.19269 3.16723,0.80051 6.09082,0.80051 4.52461,0 6.96094,-1.42699 2.43633,-1.4618 2.43633,-4.4202 0,-2.2275 -1.94907,-3.79371 -1.91425,-1.60101 -7.51781,-3.7589 -5.32511,-1.98387 -7.58742,-3.44567 -2.2275,-1.4966 -3.34125,-3.37605 -1.07894,-1.87946 -1.07894,-4.48981 0,-4.66383 3.79371,-7.34379 3.79371,-2.71476 10.4066,-2.71476 6.16043,0 12.04242,2.50594 l -2.05348,4.69863 q -5.74277,-2.36672 -10.4066,-2.36672 -4.10695,0 -6.19523,1.28777 -2.08828,1.28778 -2.08828,3.55008 0,1.53141 0.7657,2.61035 0.80051,1.07895 2.54074,2.05348 1.74024,0.97453 6.6825,2.81918 6.78691,2.47113 9.15363,4.97707 2.40153,2.50594 2.40153,6.29965 z" />
+ <path d="m 809.11612,334.25649 0.52207,0.80051 q -0.90492,3.48047 -2.61035,8.07469 -1.70543,4.62902 -3.55008,8.59676 l -4.35059,0 q 0.93973,-3.61969 2.05348,-8.94481 1.14856,-5.32512 1.60102,-8.52715 l 6.33445,0 z" />
+ <path d="m 884.15502,317.02817 q 0,12.21645 -6.19524,19.21219 -6.16043,6.99574 -17.15871,6.99574 -11.24191,0 -17.36754,-6.85652 -6.09082,-6.89133 -6.09082,-19.42102 0,-12.42527 6.12563,-19.24699 6.12562,-6.85652 17.40234,-6.85652 10.96348,0 17.12391,6.96094 6.16043,6.96093 6.16043,19.21218 z m -40.54746,0 q 0,10.337 4.38539,15.69692 4.42019,5.32511 12.80812,5.32511 8.45754,0 12.77332,-5.32511 4.31578,-5.32512 4.31578,-15.69692 0,-10.26738 -4.31578,-15.55769 -4.28098,-5.32512 -12.70371,-5.32512 -8.45754,0 -12.87773,5.35992 -4.38539,5.32512 -4.38539,15.52289 z" />
+ <path d="m 924.25001,329.00099 q 0,6.7173 -4.87265,10.47621 -4.87266,3.7589 -13.22578,3.7589 -9.04922,0 -13.92188,-2.33191 l 0,-5.70797 q 3.13242,1.32258 6.82172,2.08828 3.6893,0.7657 7.30898,0.7657 5.9168,0 8.91,-2.2275 2.99321,-2.2623 2.99321,-6.26484 0,-2.64516 -1.07895,-4.31578 -1.04414,-1.70543 -3.55008,-3.13242 -2.47113,-1.42699 -7.55261,-3.23684 -7.10016,-2.54074 -10.16297,-6.02121 -3.02801,-3.48047 -3.02801,-9.08402 0,-5.88199 4.4202,-9.36246 4.42019,-3.48047 11.69437,-3.48047 7.58742,0 13.95668,2.78437 l -1.84465,5.1511 q -6.29965,-2.64516 -12.25125,-2.64516 -4.69863,0 -7.34379,2.01867 -2.64515,2.01867 -2.64515,5.60356 0,2.64515 0.97453,4.35058 0.97453,1.67063 3.27164,3.09762 2.33191,1.39219 7.10016,3.09762 8.00507,2.85398 10.99828,6.12562 3.028,3.27164 3.028,8.49235 z" />
+ <path d="m 987.03767,342.54001 -6.7173,0 -13.67824,-22.37942 -13.92188,22.37942 -6.26484,0 16.91508,-26.59078 -15.76653,-24.29367 6.54328,0 12.63411,20.15191 12.73851,-20.15191 6.29965,0 -15.76652,24.08484 16.98468,26.79961 z" />
+ <path d="m 999.56738,334.25649 0.52212,0.80051 q -0.90497,3.48047 -2.6104,8.07469 -1.70543,4.62902 -3.55008,8.59676 l -4.35058,0 q 0.93972,-3.61969 2.05347,-8.94481 1.14856,-5.32512 1.60102,-8.52715 l 6.33445,0 z" />
+ <path d="m 1030.4391,342.54001 0,-50.88445 5.9168,0 0,45.52453 22.449,0 0,5.35992 -28.3658,0 z" />
+ <path d="m 1072.3788,342.54001 -5.7776,0 0,-38.14594 5.7776,0 0,38.14594 z m -6.2649,-48.48293 q 0,-1.98387 0.9746,-2.88879 0.9745,-0.93973 2.4363,-0.93973 1.3922,0 2.4015,0.93973 1.0094,0.93973 1.0094,2.88879 0,1.94906 -1.0094,2.92359 -1.0093,0.93973 -2.4015,0.93973 -1.4618,0 -2.4363,-0.93973 -0.9746,-0.97453 -0.9746,-2.92359 z" />
+ <path d="m 1110.8032,342.54001 0,-24.67652 q 0,-4.66383 -2.1231,-6.96094 -2.1231,-2.29711 -6.6477,-2.29711 -5.9864,0 -8.7708,3.23683 -2.7844,3.23684 -2.7844,10.68504 l 0,20.0127 -5.7775,0 0,-38.14594 4.6986,0 0.9397,5.2207 0.2785,0 q 1.775,-2.81917 4.977,-4.35058 3.2021,-1.56621 7.135,-1.56621 6.8913,0 10.3718,3.34125 3.4805,3.30644 3.4805,10.61543 l 0,24.88535 -5.7776,0 z" />
+ <path d="m 1133.8439,304.39407 0,24.74613 q 0,4.66383 2.123,6.96094 2.1231,2.29711 6.6477,2.29711 5.9864,0 8.736,-3.27164 2.7844,-3.27164 2.7844,-10.68504 l 0,-20.0475 5.7776,0 0,38.14594 -4.7683,0 -0.8353,-5.11629 -0.3132,0 q -1.7751,2.81918 -4.9423,4.31578 -3.1324,1.4966 -7.1698,1.4966 -6.9609,0 -10.4414,-3.30644 -3.4456,-3.30645 -3.4456,-10.58063 l 0,-24.95496 5.8472,0 z" />
+ <path d="m 1181.3174,323.01458 -13.2606,-18.62051 6.5781,0 10.0586,14.61797 10.0237,-14.61797 6.5085,0 -13.2606,18.62051 13.9567,19.52543 -6.5433,0 -10.685,-15.45328 -10.7895,15.45328 -6.5433,0 13.9567,-19.52543 z" />
+ </g>
</svg>
diff --git a/core/img/googleplay.png b/core/img/googleplay.png
index 9b33dab692b..640c3c2ba08 100644
--- a/core/img/googleplay.png
+++ b/core/img/googleplay.png
Binary files differ
diff --git a/core/js/files/client.js b/core/js/files/client.js
index 3d31f974ff8..55a8e2c485a 100644
--- a/core/js/files/client.js
+++ b/core/js/files/client.js
@@ -239,9 +239,9 @@
path = path.substr(0, path.length - 1);
}
- path = '/' + decodeURIComponent(path);
+ path = decodeURIComponent(path);
- if (response.propStat.length === 1 && response.propStat[0].status !== 200) {
+ if (response.propStat.length === 0 || response.propStat[0].status !== 'HTTP/1.1 200 OK') {
return null;
}
@@ -415,6 +415,77 @@
},
/**
+ * Fetches a flat list of files filtered by a given filter criteria.
+ * (currently only system tags is supported)
+ *
+ * @param {Object} filter filter criteria
+ * @param {Object} [filter.systemTagIds] list of system tag ids to filter by
+ * @param {Object} [options] options
+ * @param {Array} [options.properties] list of Webdav properties to retrieve
+ *
+ * @return {Promise} promise
+ */
+ getFilteredFiles: function(filter, options) {
+ options = options || {};
+ var self = this;
+ var deferred = $.Deferred();
+ var promise = deferred.promise();
+ var properties;
+ if (_.isUndefined(options.properties)) {
+ properties = this.getPropfindProperties();
+ } else {
+ properties = options.properties;
+ }
+
+ if (!filter || !filter.systemTagIds || !filter.systemTagIds.length) {
+ throw 'Missing filter argument';
+ }
+
+ var headers = _.extend({}, this._defaultHeaders);
+ // root element with namespaces
+ var body = '<oc:filter-files ';
+ var namespace;
+ for (namespace in this._client.xmlNamespaces) {
+ body += ' xmlns:' + this._client.xmlNamespaces[namespace] + '="' + namespace + '"';
+ }
+ body += '>\n';
+
+ // properties query
+ body += ' <' + this._client.xmlNamespaces['DAV:'] + ':prop>\n';
+ _.each(properties, function(prop) {
+ var property = self._client.parseClarkNotation(prop);
+ body += ' <' + self._client.xmlNamespaces[property.namespace] + ':' + property.name + ' />\n';
+ });
+
+ body += ' </' + this._client.xmlNamespaces['DAV:'] + ':prop>\n';
+
+ // rules block
+ body += ' <oc:filter-rules>\n';
+ _.each(filter.systemTagIds, function(systemTagIds) {
+ body += ' <oc:systemtag>' + escapeHTML(systemTagIds) + '</oc:systemtag>\n';
+ });
+ body += ' </oc:filter-rules>\n';
+
+ // end of root
+ body += '</oc:filter-files>\n';
+
+ this._client.request(
+ 'REPORT',
+ this._buildUrl(),
+ headers,
+ body
+ ).then(function(result) {
+ if (self._isSuccessStatus(result.status)) {
+ var results = self._parseResult(result.body);
+ deferred.resolve(result.status, results);
+ } else {
+ deferred.reject(result.status);
+ }
+ });
+ return promise;
+ },
+
+ /**
* Returns the file info of a given path.
*
* @param {String} path path
@@ -505,7 +576,7 @@
var promise = deferred.promise();
options = options || {};
var headers = _.extend({}, this._defaultHeaders);
- var contentType = 'text/plain';
+ var contentType = 'text/plain;charset=utf-8';
if (options.contentType) {
contentType = options.contentType;
}
diff --git a/core/js/files/iedavclient.js b/core/js/files/iedavclient.js
index 4fd9a3a3bf4..e5b3968a197 100644
--- a/core/js/files/iedavclient.js
+++ b/core/js/files/iedavclient.js
@@ -17,73 +17,60 @@
dav.Client.prototype = _.extend({}, dav.Client.prototype, {
/**
- * Generates a propFind request.
+ * Performs a HTTP request, and returns a Promise
*
- * @param {string} url Url to do the propfind request on
- * @param {Array} properties List of properties to retrieve.
+ * @param {string} method HTTP method
+ * @param {string} url Relative or absolute url
+ * @param {Object} headers HTTP headers as an object.
+ * @param {string} body HTTP request body.
* @return {Promise}
*/
- propFind : function(url, properties, depth) {
+ request : function(method, url, headers, body) {
- if(typeof depth == "undefined") {
- depth = 0;
+ var self = this;
+ var xhr = this.xhrProvider();
+
+ if (this.userName) {
+ headers['Authorization'] = 'Basic ' + btoa(this.userName + ':' + this.password);
+ // xhr.open(method, this.resolveUrl(url), true, this.userName, this.password);
+ }
+ xhr.open(method, this.resolveUrl(url), true);
+ var ii;
+ for(ii in headers) {
+ xhr.setRequestHeader(ii, headers[ii]);
}
+ xhr.send(body);
- var headers = {
- Depth : depth,
- 'Content-Type' : 'application/xml; charset=utf-8'
- };
+ return new Promise(function(fulfill, reject) {
- var body =
- '<?xml version="1.0"?>\n' +
- '<d:propfind ';
+ xhr.onreadystatechange = function() {
- var namespace;
- for (namespace in this.xmlNamespaces) {
- body += ' xmlns:' + this.xmlNamespaces[namespace] + '="' + namespace + '"';
- }
- body += '>\n' +
- ' <d:prop>\n';
-
- for(var ii in properties) {
- var propText = properties[ii];
- if (typeof propText !== 'string') {
- // can happen on IE8
- continue;
- }
- var property = this.parseClarkNotation(properties[ii]);
- if (this.xmlNamespaces[property.namespace]) {
- body+=' <' + this.xmlNamespaces[property.namespace] + ':' + property.name + ' />\n';
- } else {
- body+=' <x:' + property.name + ' xmlns:x="' + property.namespace + '" />\n';
- }
+ if (xhr.readyState !== 4) {
+ return;
+ }
- }
- body+=' </d:prop>\n';
- body+='</d:propfind>';
-
- return this.request('PROPFIND', url, headers, body).then(
- function(result) {
- var elements = this.parseMultiStatus(result.xhr.responseXML);
- var response;
- if (depth===0) {
- response = {
- status: result.status,
- body: elements[0]
- };
- } else {
- response = {
- status: result.status,
- body: elements
- };
+ var resultBody = xhr.response;
+ if (xhr.status === 207) {
+ resultBody = self.parseMultiStatus(xhr.responseXML);
}
- return response;
- }.bind(this)
- );
+ fulfill({
+ body: resultBody,
+ status: xhr.status,
+ xhr: xhr
+ });
- },
+ };
+
+ xhr.ontimeout = function() {
+
+ reject(new Error('Timeout exceeded'));
+
+ };
+
+ });
+ },
_getElementsByTagName: function(node, name, resolver) {
var parts = name.split(':');
@@ -102,7 +89,6 @@
* @param {Array}
*/
parseMultiStatus : function(doc) {
-
var result = [];
var resolver = function(foo) {
var ii;
diff --git a/core/js/mimetypelist.js b/core/js/mimetypelist.js
index dea065814d1..89c6e8c4d4e 100644
--- a/core/js/mimetypelist.js
+++ b/core/js/mimetypelist.js
@@ -17,12 +17,14 @@ OC.MimeTypeList={
"application/json": "text/code",
"application/msaccess": "file",
"application/msexcel": "x-office/spreadsheet",
+ "application/msonenote": "x-office/document",
"application/mspowerpoint": "x-office/presentation",
"application/msword": "x-office/document",
"application/octet-stream": "file",
"application/postscript": "image",
"application/rss+xml": "application/xml",
"application/vnd.android.package-archive": "package/x-generic",
+ "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.ms-excel": "x-office/spreadsheet",
"application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.binary.macroEnabled.12": "x-office/spreadsheet",
@@ -51,6 +53,8 @@ OC.MimeTypeList={
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": "x-office/spreadsheet",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "x-office/document",
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": "x-office/document",
+ "application/vnd.visio": "x-office/document",
+ "application/vnd.wordperfect": "x-office/document",
"application/x-7z-compressed": "package/x-generic",
"application/x-cbr": "text",
"application/x-compressed": "package/x-generic",
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
index bc49c61a5aa..de41b66ec32 100644
--- a/core/js/setupchecks.js
+++ b/core/js/setupchecks.js
@@ -194,7 +194,7 @@
}
var afterCall = function(xhr) {
var messages = [];
- if (xhr.status !== 403 && xhr.status !== 307 && xhr.status !== 301) {
+ if (xhr.status !== 403 && xhr.status !== 307 && xhr.status !== 301 && xhr.responseText === '') {
messages.push({
msg: 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.'),
type: OC.SetupChecks.MESSAGE_TYPE_ERROR
diff --git a/core/js/systemtags/systemtagsinputfield.js b/core/js/systemtags/systemtagsinputfield.js
index 48fc98c6188..a64e5386102 100644
--- a/core/js/systemtags/systemtagsinputfield.js
+++ b/core/js/systemtags/systemtagsinputfield.js
@@ -425,6 +425,10 @@
}
},
+ getValues: function() {
+ this.$tagsField.select2('val');
+ },
+
setValues: function(values) {
this.$tagsField.select2('val', values);
},
diff --git a/core/js/tests/specs/files/clientSpec.js b/core/js/tests/specs/files/clientSpec.js
index 61cff0a66ec..7673ec6e0fc 100644
--- a/core/js/tests/specs/files/clientSpec.js
+++ b/core/js/tests/specs/files/clientSpec.js
@@ -19,12 +19,18 @@
*
*/
+/* global dav */
+
describe('OC.Files.Client tests', function() {
var Client = OC.Files.Client;
var baseUrl;
var client;
+ var requestStub;
+ var requestDeferred;
beforeEach(function() {
+ requestDeferred = new $.Deferred();
+ requestStub = sinon.stub(dav.Client.prototype, 'request').returns(requestDeferred.promise());
baseUrl = 'https://testhost/owncloud/remote.php/webdav/';
client = new Client({
@@ -35,6 +41,7 @@ describe('OC.Files.Client tests', function() {
});
afterEach(function() {
client = null;
+ requestStub.restore();
});
/**
@@ -51,11 +58,10 @@ describe('OC.Files.Client tests', function() {
promise.done(successHandler);
promise.fail(failHandler);
- fakeServer.requests[0].respond(
- status,
- {'Content-Type': 'application/xml'},
- ''
- );
+ requestDeferred.resolve({
+ status: status,
+ body: ''
+ });
promise.then(function() {
expect(successHandler.calledOnce).toEqual(true);
@@ -81,19 +87,16 @@ describe('OC.Files.Client tests', function() {
promise.done(successHandler);
promise.fail(failHandler);
- fakeServer.requests[0].respond(
- status,
- {'Content-Type': 'application/xml'},
- ''
- );
+ requestDeferred.resolve({
+ status: status,
+ body: ''
+ });
promise.then(function() {
expect(failHandler.calledOnce).toEqual(true);
expect(failHandler.calledWith(status)).toEqual(true);
expect(successHandler.notCalled).toEqual(true);
-
- fulfill();
});
return promise;
@@ -149,7 +152,8 @@ describe('OC.Files.Client tests', function() {
describe('file listing', function() {
- var folderContentsXml =
+ // TODO: switch this to the already parsed structure
+ var folderContentsXml = dav.Client.prototype.parseMultiStatus(
'<?xml version="1.0" encoding="utf-8"?>' +
'<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns">' +
makeResponseBlock(
@@ -159,8 +163,9 @@ describe('OC.Files.Client tests', function() {
'd:getetag': '"56cfcabd79abb"',
'd:resourcetype': '<d:collection/>',
'oc:id': '00000011oc2d13a6a068',
+ 'oc:fileid': '11',
'oc:permissions': 'RDNVCK',
- 'oc:size': 120
+ 'oc:size': '120'
},
[
'd:getcontenttype',
@@ -176,6 +181,7 @@ describe('OC.Files.Client tests', function() {
'd:getcontentlength': 250,
'd:resourcetype': '',
'oc:id': '00000051oc2d13a6a068',
+ 'oc:fileid': '51',
'oc:permissions': 'RDNVW'
},
[
@@ -189,25 +195,27 @@ describe('OC.Files.Client tests', function() {
'd:getetag': '"66cfcabd79abb"',
'd:resourcetype': '<d:collection/>',
'oc:id': '00000015oc2d13a6a068',
+ 'oc:fileid': '15',
'oc:permissions': 'RDNVCK',
- 'oc:size': 100
+ 'oc:size': '100'
},
[
'd:getcontenttype',
'd:getcontentlength'
]
) +
- '</d:multistatus>';
+ '</d:multistatus>'
+ );
it('sends PROPFIND with explicit properties to get file list', function() {
client.getFolderContents('path/to space/文件夹');
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('PROPFIND');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
- expect(fakeServer.requests[0].requestHeaders.Depth).toEqual(1);
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('PROPFIND');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
+ expect(requestStub.lastCall.args[2].Depth).toEqual(1);
- var props = getRequestedProperties(fakeServer.requests[0].requestBody);
+ var props = getRequestedProperties(requestStub.lastCall.args[3]);
expect(props).toContain('{DAV:}getlastmodified');
expect(props).toContain('{DAV:}getcontentlength');
expect(props).toContain('{DAV:}getcontenttype');
@@ -219,24 +227,23 @@ describe('OC.Files.Client tests', function() {
});
it('sends PROPFIND to base url when empty path given', function() {
client.getFolderContents('');
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].url).toEqual(baseUrl);
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl);
});
it('sends PROPFIND to base url when root path given', function() {
client.getFolderContents('/');
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].url).toEqual(baseUrl);
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl);
});
it('parses the result list into a FileInfo array', function() {
var promise = client.getFolderContents('path/to space/文件夹');
- expect(fakeServer.requests.length).toEqual(1);
+ expect(requestStub.calledOnce).toEqual(true);
- fakeServer.requests[0].respond(
- 207,
- {'Content-Type': 'application/xml'},
- folderContentsXml
- );
+ requestDeferred.resolve({
+ status: 207,
+ body: folderContentsXml
+ });
promise.then(function(status, response) {
expect(status).toEqual(207);
@@ -250,7 +257,7 @@ describe('OC.Files.Client tests', function() {
expect(info.id).toEqual(51);
expect(info.path).toEqual('/path/to space/文件夹');
expect(info.name).toEqual('One.txt');
- expect(info.permissions).toEqual(31);
+ expect(info.permissions).toEqual(27);
expect(info.size).toEqual(250);
expect(info.mtime).toEqual(1436535485000);
expect(info.mimetype).toEqual('text/plain');
@@ -268,18 +275,16 @@ describe('OC.Files.Client tests', function() {
expect(info.mimetype).toEqual('httpd/unix-directory');
expect(info.etag).toEqual('66cfcabd79abb');
});
- return promise.promise();
});
it('returns parent node in result if specified', function() {
var promise = client.getFolderContents('path/to space/文件夹', {includeParent: true});
- expect(fakeServer.requests.length).toEqual(1);
+ expect(requestStub.calledOnce).toEqual(true);
- fakeServer.requests[0].respond(
- 207,
- {'Content-Type': 'application/xml'},
- folderContentsXml
- );
+ requestDeferred.resolve({
+ status: 207,
+ body: folderContentsXml
+ });
promise.then(function(status, response) {
expect(status).toEqual(207);
@@ -303,20 +308,172 @@ describe('OC.Files.Client tests', function() {
expect(response[1].id).toEqual(51);
expect(response[2].id).toEqual(15);
});
-
- return promise;
});
it('rejects promise when an error occurred', function() {
var promise = client.getFolderContents('path/to space/文件夹', {includeParent: true});
- return respondAndCheckError(promise, 404);
+ respondAndCheckError(promise, 404);
});
it('throws exception if arguments are missing', function() {
// TODO
});
});
+ describe('file filtering', function() {
+
+ // TODO: switch this to the already parsed structure
+ var folderContentsXml = dav.Client.prototype.parseMultiStatus(
+ '<?xml version="1.0" encoding="utf-8"?>' +
+ '<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns">' +
+ makeResponseBlock(
+ '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/',
+ {
+ 'd:getlastmodified': 'Fri, 10 Jul 2015 10:00:05 GMT',
+ 'd:getetag': '"56cfcabd79abb"',
+ 'd:resourcetype': '<d:collection/>',
+ 'oc:id': '00000011oc2d13a6a068',
+ 'oc:fileid': '11',
+ 'oc:permissions': 'RDNVCK',
+ 'oc:size': '120'
+ },
+ [
+ 'd:getcontenttype',
+ 'd:getcontentlength'
+ ]
+ ) +
+ makeResponseBlock(
+ '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt',
+ {
+ 'd:getlastmodified': 'Fri, 10 Jul 2015 13:38:05 GMT',
+ 'd:getetag': '"559fcabd79a38"',
+ 'd:getcontenttype': 'text/plain',
+ 'd:getcontentlength': 250,
+ 'd:resourcetype': '',
+ 'oc:id': '00000051oc2d13a6a068',
+ 'oc:fileid': '51',
+ 'oc:permissions': 'RDNVW'
+ },
+ [
+ 'oc:size',
+ ]
+ ) +
+ makeResponseBlock(
+ '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/sub',
+ {
+ 'd:getlastmodified': 'Fri, 10 Jul 2015 14:00:00 GMT',
+ 'd:getetag': '"66cfcabd79abb"',
+ 'd:resourcetype': '<d:collection/>',
+ 'oc:id': '00000015oc2d13a6a068',
+ 'oc:fileid': '15',
+ 'oc:permissions': 'RDNVCK',
+ 'oc:size': '100'
+ },
+ [
+ 'd:getcontenttype',
+ 'd:getcontentlength'
+ ]
+ ) +
+ '</d:multistatus>'
+ );
+
+ it('sends REPORT with filter information', function() {
+ client.getFilteredFiles({
+ systemTagIds: ['123', '456']
+ });
+
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('REPORT');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl);
+
+ var body = requestStub.lastCall.args[3];
+ var doc = (new window.DOMParser()).parseFromString(
+ body,
+ 'application/xml'
+ );
+
+ var ns = 'http://owncloud.org/ns';
+ expect(doc.documentElement.localName).toEqual('filter-files');
+ expect(doc.documentElement.namespaceURI).toEqual(ns);
+
+ var filterRoots = doc.getElementsByTagNameNS(ns, 'filter-rules');
+ var rulesList = filterRoots[0] = doc.getElementsByTagNameNS(ns, 'systemtag');
+ expect(rulesList.length).toEqual(2);
+ expect(rulesList[0].localName).toEqual('systemtag');
+ expect(rulesList[0].namespaceURI).toEqual(ns);
+ expect(rulesList[0].textContent).toEqual('123');
+ expect(rulesList[1].localName).toEqual('systemtag');
+ expect(rulesList[1].namespaceURI).toEqual(ns);
+ expect(rulesList[1].textContent).toEqual('456');
+ });
+ it('sends REPORT with explicit properties to filter file list', function() {
+ client.getFilteredFiles({
+ systemTagIds: ['123', '456']
+ });
+
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('REPORT');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl);
+
+ var props = getRequestedProperties(requestStub.lastCall.args[3]);
+ expect(props).toContain('{DAV:}getlastmodified');
+ expect(props).toContain('{DAV:}getcontentlength');
+ expect(props).toContain('{DAV:}getcontenttype');
+ expect(props).toContain('{DAV:}getetag');
+ expect(props).toContain('{DAV:}resourcetype');
+ expect(props).toContain('{http://owncloud.org/ns}fileid');
+ expect(props).toContain('{http://owncloud.org/ns}size');
+ expect(props).toContain('{http://owncloud.org/ns}permissions');
+ });
+ it('parses the result list into a FileInfo array', function() {
+ var promise = client.getFilteredFiles({
+ systemTagIds: ['123', '456']
+ });
+
+ expect(requestStub.calledOnce).toEqual(true);
+
+ requestDeferred.resolve({
+ status: 207,
+ body: folderContentsXml
+ });
+
+ promise.then(function(status, response) {
+ expect(status).toEqual(207);
+ expect(_.isArray(response)).toEqual(true);
+
+ // returns all entries
+ expect(response.length).toEqual(3);
+
+ // file entry
+ var info = response[0];
+ expect(info instanceof OC.Files.FileInfo).toEqual(true);
+ expect(info.id).toEqual(11);
+
+ // file entry
+ var info = response[1];
+ expect(info instanceof OC.Files.FileInfo).toEqual(true);
+ expect(info.id).toEqual(51);
+
+ // sub entry
+ info = response[2];
+ expect(info instanceof OC.Files.FileInfo).toEqual(true);
+ expect(info.id).toEqual(15);
+ });
+ });
+ it('throws exception if arguments are missing', function() {
+ var thrown = null;
+ try {
+ client.getFilteredFiles({
+ systemTagIds: []
+ });
+ } catch (e) {
+ thrown = true;
+ }
+
+ expect(thrown).toEqual(true);
+ });
+ });
+
describe('file info', function() {
- var responseXml =
+ var responseXml = dav.Client.prototype.parseMultiStatus(
'<?xml version="1.0" encoding="utf-8"?>' +
'<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns">' +
makeResponseBlock(
@@ -326,25 +483,27 @@ describe('OC.Files.Client tests', function() {
'd:getetag': '"56cfcabd79abb"',
'd:resourcetype': '<d:collection/>',
'oc:id': '00000011oc2d13a6a068',
+ 'oc:fileid': '11',
'oc:permissions': 'RDNVCK',
- 'oc:size': 120
+ 'oc:size': '120'
},
[
'd:getcontenttype',
'd:getcontentlength'
]
) +
- '</d:multistatus>';
+ '</d:multistatus>'
+ );
it('sends PROPFIND with zero depth to get single file info', function() {
client.getFileInfo('path/to space/文件夹');
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('PROPFIND');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
- expect(fakeServer.requests[0].requestHeaders.Depth).toEqual(0);
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('PROPFIND');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
+ expect(requestStub.lastCall.args[2].Depth).toEqual(0);
- var props = getRequestedProperties(fakeServer.requests[0].requestBody);
+ var props = getRequestedProperties(requestStub.lastCall.args[3]);
expect(props).toContain('{DAV:}getlastmodified');
expect(props).toContain('{DAV:}getcontentlength');
expect(props).toContain('{DAV:}getcontenttype');
@@ -357,13 +516,12 @@ describe('OC.Files.Client tests', function() {
it('parses the result into a FileInfo', function() {
var promise = client.getFileInfo('path/to space/文件夹');
- expect(fakeServer.requests.length).toEqual(1);
+ expect(requestStub.calledOnce).toEqual(true);
- fakeServer.requests[0].respond(
- 207,
- {'Content-Type': 'application/xml'},
- responseXml
- );
+ requestDeferred.resolve({
+ status: 207,
+ body: responseXml
+ });
promise.then(function(status, response) {
expect(status).toEqual(207);
@@ -380,11 +538,9 @@ describe('OC.Files.Client tests', function() {
expect(info.mimetype).toEqual('httpd/unix-directory');
expect(info.etag).toEqual('56cfcabd79abb');
});
-
- return promise;
});
it('properly parses entry inside root', function() {
- var responseXml =
+ var responseXml = dav.Client.prototype.parseMultiStatus(
'<?xml version="1.0" encoding="utf-8"?>' +
'<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns">' +
makeResponseBlock(
@@ -394,25 +550,26 @@ describe('OC.Files.Client tests', function() {
'd:getetag': '"56cfcabd79abb"',
'd:resourcetype': '<d:collection/>',
'oc:id': '00000011oc2d13a6a068',
+ 'oc:fileid': '11',
'oc:permissions': 'RDNVCK',
- 'oc:size': 120
+ 'oc:size': '120'
},
[
'd:getcontenttype',
'd:getcontentlength'
]
) +
- '</d:multistatus>';
+ '</d:multistatus>'
+ );
var promise = client.getFileInfo('in root');
- expect(fakeServer.requests.length).toEqual(1);
+ expect(requestStub.calledOnce).toEqual(true);
- fakeServer.requests[0].respond(
- 207,
- {'Content-Type': 'application/xml'},
- responseXml
- );
+ requestDeferred.resolve({
+ status: 207,
+ body: responseXml
+ });
promise.then(function(status, response) {
expect(status).toEqual(207);
@@ -429,12 +586,10 @@ describe('OC.Files.Client tests', function() {
expect(info.mimetype).toEqual('httpd/unix-directory');
expect(info.etag).toEqual('56cfcabd79abb');
});
-
- return promise;
});
it('rejects promise when an error occurred', function() {
var promise = client.getFileInfo('path/to space/文件夹');
- return respondAndCheckError(promise, 404);
+ respondAndCheckError(promise, 404);
});
it('throws exception if arguments are missing', function() {
// TODO
@@ -449,6 +604,7 @@ describe('OC.Files.Client tests', function() {
'd:getetag': '"559fcabd79a38"',
'd:getcontentlength': 250,
'oc:id': '00000051oc2d13a6a068',
+ 'oc:fileid': '51',
'oc:permissions': webdavPerm,
};
@@ -458,25 +614,28 @@ describe('OC.Files.Client tests', function() {
props['d:resourcetype'] = '<d:collection/>';
}
- var responseXml =
+ var def = new $.Deferred();
+ requestStub.reset();
+ requestStub.returns(def);
+
+ var responseXml = dav.Client.prototype.parseMultiStatus(
'<?xml version="1.0" encoding="utf-8"?>' +
'<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns">' +
makeResponseBlock(
'/owncloud/remote.php/webdav/file.txt',
props
) +
- '</d:multistatus>';
+ '</d:multistatus>'
+ );
+
var promise = client.getFileInfo('file.txt');
- expect(fakeServer.requests.length).toEqual(1);
- fakeServer.requests[0].respond(
- 207,
- {'Content-Type': 'application/xml'},
- responseXml
- );
+ expect(requestStub.calledOnce).toEqual(true);
- fakeServer.restore();
- fakeServer = sinon.fakeServer.create();
+ def.resolve({
+ status: 207,
+ body: responseXml
+ });
return promise;
}
@@ -486,7 +645,6 @@ describe('OC.Files.Client tests', function() {
promise.then(function(result) {
expect(result.permissions).toEqual(expectedPermissions);
});
- return promise;
}
function testMountType(permission, isFile, expectedMountType) {
@@ -494,7 +652,6 @@ describe('OC.Files.Client tests', function() {
promise.then(function(result) {
expect(result.mountType).toEqual(expectedMountType);
});
- return promise;
}
it('properly parses file permissions', function() {
@@ -508,11 +665,9 @@ describe('OC.Files.Client tests', function() {
['R', true, OC.PERMISSION_READ | OC.PERMISSION_SHARE],
['CKWDR', true, OC.PERMISSION_ALL]
];
- return Promise.all(
- _.map(testCases, function(testCase) {
- return testPermission.apply(testCase);
- })
- );
+ _.each(testCases, function(testCase) {
+ return testPermission.apply(testCase);
+ });
});
it('properly parses folder permissions', function() {
var testCases = [
@@ -525,11 +680,9 @@ describe('OC.Files.Client tests', function() {
['CKWDR', false, OC.PERMISSION_ALL]
];
- return Promise.all(
- _.map(testCases, function(testCase) {
- return testPermission.apply(testCase);
- })
- );
+ _.each(testCases, function(testCase) {
+ return testPermission.apply(testCase);
+ });
});
it('properly parses mount types', function() {
var testCases = [
@@ -539,11 +692,9 @@ describe('OC.Files.Client tests', function() {
['SM', false, 'shared']
];
- return Promise.all(
- _.map(testCases, function(testCase) {
- return testMountType.apply(testCase);
- })
- );
+ _.each(testCases, function(testCase) {
+ return testMountType.apply(testCase);
+ });
});
});
@@ -551,26 +702,23 @@ describe('OC.Files.Client tests', function() {
it('returns file contents', function() {
var promise = client.getFileContents('path/to space/文件夹/One.txt');
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('GET');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt');
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('GET');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt');
- fakeServer.requests[0].respond(
- 200,
- {'Content-Type': 'text/plain'},
- 'some contents'
- );
+ requestDeferred.resolve({
+ status: 200,
+ body: 'some contents'
+ });
promise.then(function(status, response) {
expect(status).toEqual(200);
expect(response).toEqual('some contents');
});
-
- return promise;
});
it('rejects promise when an error occurred', function() {
var promise = client.getFileContents('path/to space/文件夹/One.txt');
- return respondAndCheckError(promise, 409);
+ respondAndCheckError(promise, 409);
});
it('throws exception if arguments are missing', function() {
// TODO
@@ -584,14 +732,14 @@ describe('OC.Files.Client tests', function() {
'some contents'
);
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('PUT');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt');
- expect(fakeServer.requests[0].requestBody).toEqual('some contents');
- expect(fakeServer.requests[0].requestHeaders['If-None-Match']).toEqual('*');
- expect(fakeServer.requests[0].requestHeaders['Content-Type']).toEqual('text/plain;charset=utf-8');
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('PUT');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt');
+ expect(requestStub.lastCall.args[2]['If-None-Match']).toEqual('*');
+ expect(requestStub.lastCall.args[2]['Content-Type']).toEqual('text/plain;charset=utf-8');
+ expect(requestStub.lastCall.args[3]).toEqual('some contents');
- return respondAndCheckStatus(promise, 201);
+ respondAndCheckStatus(promise, 201);
});
it('sends PUT with file contents with headers matching options', function() {
var promise = client.putFileContents(
@@ -603,21 +751,21 @@ describe('OC.Files.Client tests', function() {
}
);
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('PUT');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt');
- expect(fakeServer.requests[0].requestBody).toEqual('some contents');
- expect(fakeServer.requests[0].requestHeaders['If-None-Match']).not.toBeDefined();
- expect(fakeServer.requests[0].requestHeaders['Content-Type']).toEqual('text/markdown;charset=utf-8');
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('PUT');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt');
+ expect(requestStub.lastCall.args[2]['If-None-Match']).not.toBeDefined();
+ expect(requestStub.lastCall.args[2]['Content-Type']).toEqual('text/markdown');
+ expect(requestStub.lastCall.args[3]).toEqual('some contents');
- return respondAndCheckStatus(promise, 201);
+ respondAndCheckStatus(promise, 201);
});
it('rejects promise when an error occurred', function() {
var promise = client.putFileContents(
'path/to space/文件夹/One.txt',
'some contents'
);
- return respondAndCheckError(promise, 409);
+ respondAndCheckError(promise, 409);
});
it('throws exception if arguments are missing', function() {
// TODO
@@ -628,15 +776,15 @@ describe('OC.Files.Client tests', function() {
it('sends MKCOL with specified path', function() {
var promise = client.createDirectory('path/to space/文件夹/new dir');
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('MKCOL');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/new%20dir');
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('MKCOL');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/new%20dir');
- return respondAndCheckStatus(promise, 201);
+ respondAndCheckStatus(promise, 201);
});
it('rejects promise when an error occurred', function() {
var promise = client.createDirectory('path/to space/文件夹/new dir');
- return respondAndCheckError(promise, 404);
+ respondAndCheckError(promise, 404);
});
it('throws exception if arguments are missing', function() {
// TODO
@@ -647,15 +795,15 @@ describe('OC.Files.Client tests', function() {
it('sends DELETE with specified path', function() {
var promise = client.remove('path/to space/文件夹');
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('DELETE');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('DELETE');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
- return respondAndCheckStatus(promise, 201);
+ respondAndCheckStatus(promise, 201);
});
it('rejects promise when an error occurred', function() {
var promise = client.remove('path/to space/文件夹');
- return respondAndCheckError(promise, 404);
+ respondAndCheckError(promise, 404);
});
it('throws exception if arguments are missing', function() {
// TODO
@@ -669,15 +817,15 @@ describe('OC.Files.Client tests', function() {
'path/to space/anotherdir/文件夹'
);
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('MOVE');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
- expect(fakeServer.requests[0].requestHeaders.Destination)
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('MOVE');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
+ expect(requestStub.lastCall.args[2].Destination)
.toEqual(baseUrl + 'path/to%20space/anotherdir/%E6%96%87%E4%BB%B6%E5%A4%B9');
- expect(fakeServer.requests[0].requestHeaders.Overwrite)
+ expect(requestStub.lastCall.args[2].Overwrite)
.toEqual('F');
- return respondAndCheckStatus(promise, 201);
+ respondAndCheckStatus(promise, 201);
});
it('sends MOVE with silent overwrite mode when specified', function() {
var promise = client.move(
@@ -686,15 +834,15 @@ describe('OC.Files.Client tests', function() {
{allowOverwrite: true}
);
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].method).toEqual('MOVE');
- expect(fakeServer.requests[0].url).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
- expect(fakeServer.requests[0].requestHeaders.Destination)
+ expect(requestStub.calledOnce).toEqual(true);
+ expect(requestStub.lastCall.args[0]).toEqual('MOVE');
+ expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9');
+ expect(requestStub.lastCall.args[2].Destination)
.toEqual(baseUrl + 'path/to%20space/anotherdir/%E6%96%87%E4%BB%B6%E5%A4%B9');
- expect(fakeServer.requests[0].requestHeaders.Overwrite)
+ expect(requestStub.lastCall.args[2].Overwrite)
.not.toBeDefined();
- return respondAndCheckStatus(promise, 201);
+ respondAndCheckStatus(promise, 201);
});
it('rejects promise when an error occurred', function() {
var promise = client.move(
@@ -702,7 +850,7 @@ describe('OC.Files.Client tests', function() {
'path/to space/anotherdir/文件夹',
{allowOverwrite: true}
);
- return respondAndCheckError(promise, 404);
+ respondAndCheckError(promise, 404);
});
it('throws exception if arguments are missing', function() {
// TODO
diff --git a/core/js/update.js b/core/js/update.js
index 1626b6f2c49..77ac1bb20ff 100644
--- a/core/js/update.js
+++ b/core/js/update.js
@@ -60,12 +60,16 @@
updateEventSource.listen('failure', function(message) {
$(window).off('beforeunload.inprogress');
$('<span>').addClass('error').append(message).append('<br />').appendTo($el);
- $('<span>')
- .addClass('bold')
- .append(t('core', 'The update was unsuccessful. ' +
- 'Please report this issue to the ' +
- '<a href="https://github.com/owncloud/core/issues" target="_blank">ownCloud community</a>.'))
- .appendTo($el);
+ var span = $('<span>')
+ .addClass('bold');
+ if(message === 'Exception: Updates between multiple major versions and downgrades are unsupported.') {
+ span.append(t('core', 'The update was unsuccessful. For more information <a href="{url}">check our forum post</a> covering this issue.', {'url': 'https://forum.owncloud.org/viewtopic.php?f=17&t=32087'}));
+ } else {
+ span.append(t('core', 'The update was unsuccessful. ' +
+ 'Please report this issue to the ' +
+ '<a href="https://github.com/owncloud/core/issues" target="_blank">ownCloud community</a>.'));
+ }
+ span.appendTo($el);
});
updateEventSource.listen('done', function() {
$(window).off('beforeunload.inprogress');
diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js
index b7c3bb29c98..e2279486bcf 100644
--- a/core/l10n/bg_BG.js
+++ b/core/l10n/bg_BG.js
@@ -90,8 +90,8 @@ OC.L10N.register(
"Strong password" : "Сигурна парола",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Вашият web сървър все още не е удачно настроен да позволява синхронизация на файлове, защото 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 файла не функционира. Силно препоръчваме да настроиш уебсъръра по такъв начин, че директорията за данни да не бъде достъпна или да я преместиш извън директорията корен на сървъра.",
"Error occurred while checking server setup" : "Настъпи грешка при проверката на настройките на сървъра.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Твоята директория за данни и файлове вероятно са достъпни от интернет. .htaccess файла не функционира. Силно препоръчваме да настроиш уебсъръра по такъв начин, че директорията за данни да не бъде достъпна или да я преместиш извън директорията корен на сървъра.",
"Shared" : "Споделено",
"Shared with {recipients}" : "Споделено с {recipients}.",
"Error" : "Грешка",
diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json
index 70a30ad8719..95145c3e993 100644
--- a/core/l10n/bg_BG.json
+++ b/core/l10n/bg_BG.json
@@ -88,8 +88,8 @@
"Strong password" : "Сигурна парола",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Вашият web сървър все още не е удачно настроен да позволява синхронизация на файлове, защото 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 файла не функционира. Силно препоръчваме да настроиш уебсъръра по такъв начин, че директорията за данни да не бъде достъпна или да я преместиш извън директорията корен на сървъра.",
"Error occurred while checking server setup" : "Настъпи грешка при проверката на настройките на сървъра.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Твоята директория за данни и файлове вероятно са достъпни от интернет. .htaccess файла не функционира. Силно препоръчваме да настроиш уебсъръра по такъв начин, че директорията за данни да не бъде достъпна или да я преместиш извън директорията корен на сървъра.",
"Shared" : "Споделено",
"Shared with {recipients}" : "Споделено с {recipients}.",
"Error" : "Грешка",
diff --git a/core/l10n/ca.js b/core/l10n/ca.js
index d437b19d614..501d5e5f970 100644
--- a/core/l10n/ca.js
+++ b/core/l10n/ca.js
@@ -105,8 +105,8 @@ OC.L10N.register(
"Strong password" : "Contrasenya forta",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "El servidor web no està configurat correctament per permetre la sincronització de fitxers perquè la interfície WebDAV sembla no funcionar correctament.",
"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." : "Aquest servidor no té connexió a internet. Això significa que algunes de les característiques com el muntatge d'emmagatzemament extern, les notificacions quant a actualitzacions o la instal·lació d'aplicacions de tercers no funcionarà. L'accés remot a fitxers i l'enviament de correus electrònics podria tampoc no funcionar. Us suggerim que habiliteu la connexió a internet per aquest servidor si voleu tenir totes les característiques.",
- "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 carpeta de dades i els vostres fitxers probablement són accessibles des d'Internet. El fitxer .htaccess no funciona. Us recomanem que configureu el servidor web de tal manera que la carpeta de dades no sigui accessible o que moveu la carpeta de dades fora de l'arrel de documents del servidor web.",
"Error occurred while checking server setup" : "Hi ha hagut un error en comprovar la configuració del servidor",
+ "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 carpeta de dades i els vostres fitxers probablement són accessibles des d'Internet. El fitxer .htaccess no funciona. Us recomanem que configureu el servidor web de tal manera que la carpeta de dades no sigui accessible o que moveu la carpeta de dades fora de l'arrel de documents del servidor web.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Esteu accedint aquesta web a través de HTTP. Us recomanem que configureu el servidor per requerir HTTPS tal i com es descriu als <a href=\"{docUrl}\">consells de seguretat</a>",
"Shared" : "Compartit",
"Shared with {recipients}" : "Compartit amb {recipients}",
diff --git a/core/l10n/ca.json b/core/l10n/ca.json
index 46cd0fabae1..79eaac70bc0 100644
--- a/core/l10n/ca.json
+++ b/core/l10n/ca.json
@@ -103,8 +103,8 @@
"Strong password" : "Contrasenya forta",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "El servidor web no està configurat correctament per permetre la sincronització de fitxers perquè la interfície WebDAV sembla no funcionar correctament.",
"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." : "Aquest servidor no té connexió a internet. Això significa que algunes de les característiques com el muntatge d'emmagatzemament extern, les notificacions quant a actualitzacions o la instal·lació d'aplicacions de tercers no funcionarà. L'accés remot a fitxers i l'enviament de correus electrònics podria tampoc no funcionar. Us suggerim que habiliteu la connexió a internet per aquest servidor si voleu tenir totes les característiques.",
- "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 carpeta de dades i els vostres fitxers probablement són accessibles des d'Internet. El fitxer .htaccess no funciona. Us recomanem que configureu el servidor web de tal manera que la carpeta de dades no sigui accessible o que moveu la carpeta de dades fora de l'arrel de documents del servidor web.",
"Error occurred while checking server setup" : "Hi ha hagut un error en comprovar la configuració del servidor",
+ "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 carpeta de dades i els vostres fitxers probablement són accessibles des d'Internet. El fitxer .htaccess no funciona. Us recomanem que configureu el servidor web de tal manera que la carpeta de dades no sigui accessible o que moveu la carpeta de dades fora de l'arrel de documents del servidor web.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Esteu accedint aquesta web a través de HTTP. Us recomanem que configureu el servidor per requerir HTTPS tal i com es descriu als <a href=\"{docUrl}\">consells de seguretat</a>",
"Shared" : "Compartit",
"Shared with {recipients}" : "Compartit amb {recipients}",
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index 8fcfef6f2b4..22ee4fcc1f4 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -120,7 +120,6 @@ 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é.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Tento webový server není správně nastaven pro rozpoznání \"{url}\". Více informací lze nalézt v naší <a target=\"_blank\" href=\"{docLink}\">dokumentaci</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">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=\"{docLink}\">dokumentaci</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "PHP nemá práva pro čtení v /dev/urandom, to je ale z bezpečnostních důvodů velmi doporučováno. Více informací lze nalézt v <a href=\"{docLink}\">dokumentaci</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Vaše verze PHP ({version}) již není <a href=\"{phpLink}\">podporována</a>. Doporučujeme aktualizovat na poslední verzi PHP pro využití vylepšení výkonu a bezpečnosti.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached je nakonfigurován jako distribuovaná cache, ale je nainstalován nesprávný PHP modul \"memcache\". \\OC\\Memcache\\Memcached podporuje pouze \"memcached\" a ne \"memcache\". Projděte si <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki popisující oba moduly</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Některé soubory neprošly kontrolou integrity. Více informací o tom jak tento problém vyřešit, lze nalézt v naší <a href=\"{docLink}\">dokumentaci</a>. (<a target=\"_blank\" href=\"{codeIntegrityDownloadEndpoint}\">Seznam neplatných souborů…</a> / <a href=\"{rescanEndpoint}\">Znovu ověřit…</a>)",
"Error occurred while checking server setup" : "Při ověřování nastavení serveru došlo k chybě",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP hlavička \"Strict-Transport-Security\" není nakonfigurována na minimum \"{seconds}\" sekund. Pro vylepšení bezpečnosti doporučujeme povolit HSTS dle popisu v našich <a href=\"{docUrl}\">bezpečnostních tipech</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Přistupujete na tuto stránku přes protokol HTTP. Důrazně doporučujeme nakonfigurovat server tak, aby vyžadoval použití HTTPS jak je popsáno v našich <a href=\"{docUrl}\">bezpečnostních tipech</a>.",
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index 19c22abd616..ab479593c95 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -118,7 +118,6 @@
"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é.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Tento webový server není správně nastaven pro rozpoznání \"{url}\". Více informací lze nalézt v naší <a target=\"_blank\" href=\"{docLink}\">dokumentaci</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">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=\"{docLink}\">dokumentaci</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "PHP nemá práva pro čtení v /dev/urandom, to je ale z bezpečnostních důvodů velmi doporučováno. Více informací lze nalézt v <a href=\"{docLink}\">dokumentaci</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Vaše verze PHP ({version}) již není <a href=\"{phpLink}\">podporována</a>. Doporučujeme aktualizovat na poslední verzi PHP pro využití vylepšení výkonu a bezpečnosti.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached je nakonfigurován jako distribuovaná cache, ale je nainstalován nesprávný PHP modul \"memcache\". \\OC\\Memcache\\Memcached podporuje pouze \"memcached\" a ne \"memcache\". Projděte si <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki popisující oba moduly</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Některé soubory neprošly kontrolou integrity. Více informací o tom jak tento problém vyřešit, lze nalézt v naší <a href=\"{docLink}\">dokumentaci</a>. (<a target=\"_blank\" href=\"{codeIntegrityDownloadEndpoint}\">Seznam neplatných souborů…</a> / <a href=\"{rescanEndpoint}\">Znovu ověřit…</a>)",
"Error occurred while checking server setup" : "Při ověřování nastavení serveru došlo k chybě",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP hlavička \"Strict-Transport-Security\" není nakonfigurována na minimum \"{seconds}\" sekund. Pro vylepšení bezpečnosti doporučujeme povolit HSTS dle popisu v našich <a href=\"{docUrl}\">bezpečnostních tipech</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Přistupujete na tuto stránku přes protokol HTTP. Důrazně doporučujeme nakonfigurovat server tak, aby vyžadoval použití HTTPS jak je popsáno v našich <a href=\"{docUrl}\">bezpečnostních tipech</a>.",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index 1c665f51620..f45f2308b14 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"Strong password" : "Stærkt kodeord",
"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. ",
"Error occurred while checking server setup" : "Der opstod fejl under tjek af serveropsætningen",
+ "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. ",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP-hovedet \"Strict-Transport-Security\" er ikke konfigureret til mindst \"{seconds}\" sekunder. For udvidet sikkerhed anbefaler vi at aktivere HSTS, som foreskrevet i vores <a href=\"{docUrl}\">sikkerhedstips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du tilgår dette sted gennem HTTP. Vi anbefaler kraftigt at du konfigurerer din server, så der kræves brug af HTTPS i stedet for, som foreskrevet i vores <a href=\"{docUrl}\">sikkerhedstips</a>.",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index 854e11ec5f8..b8055f42a41 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -110,8 +110,8 @@
"Strong password" : "Stærkt kodeord",
"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. ",
"Error occurred while checking server setup" : "Der opstod fejl under tjek af serveropsætningen",
+ "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. ",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP-hovedet \"Strict-Transport-Security\" er ikke konfigureret til mindst \"{seconds}\" sekunder. For udvidet sikkerhed anbefaler vi at aktivere HSTS, som foreskrevet i vores <a href=\"{docUrl}\">sikkerhedstips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du tilgår dette sted gennem HTTP. Vi anbefaler kraftigt at du konfigurerer din server, så der kræves brug af HTTPS i stedet for, som foreskrevet i vores <a href=\"{docUrl}\">sikkerhedstips</a>.",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 411d02d01be..4155124874c 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -116,8 +116,8 @@ OC.L10N.register(
"Strong password" : "Starkes Passwort",
"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.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du greifst auf diese Site über HTTP zu. Wir raten dringend dazu, Deinen Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index 3e50e1ad20c..ad3d0102b1e 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -114,8 +114,8 @@
"Strong password" : "Starkes Passwort",
"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.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du greifst auf diese Site über HTTP zu. Wir raten dringend dazu, Deinen Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index eb3cff6bef5..ebf0b4785c3 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -115,8 +115,8 @@ OC.L10N.register(
"Strong password" : "Starkes Passwort",
"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.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sie greifen auf diese Site über HTTP zu. Wir raten dringend dazu, Ihren Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index 4eec4c90246..886ecec4f84 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -113,8 +113,8 @@
"Strong password" : "Starkes Passwort",
"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.",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für umfassende Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> erläutert ist.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sie greifen auf diese Site über HTTP zu. Wir raten dringend dazu, Ihren Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.",
diff --git a/core/l10n/el.js b/core/l10n/el.js
index bbee35b0a45..405103ddd67 100644
--- a/core/l10n/el.js
+++ b/core/l10n/el.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"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." : "Αυτός ο διακομιστής δεν έχει ενεργή σύνδεση στο διαδίκτυο. Αυτό σημαίνει ότι κάποιες υπηρεσίες όπως η σύνδεση με εξωτερικούς αποθηκευτικούς χώρους, ειδοποιήσεις για ενημερώσεις ή η εγκατάσταση εφαρμογών 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 του διακομιστή.",
"Error occurred while checking server setup" : "Παρουσιάστηκε σφάλμα κατά τον έλεγχο της εγκατάστασης με το διακομιστή",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ο κατάλογος δεδομένων και τα αρχεία σας είναι πιθανόν διαθέσιμα στο διαδίκτυο. Το αρχείο .htaccess δεν λειτουργεί. Σας προτείνουμε ανεπιφύλακτα να ρυθμίσετε το διακομιστή σας με τέτοιο τρόπο ώστε ο κατάλογος δεδομένων να μην είναι πλέον προσβάσιμος ή να μετακινήσετε τον κατάλογο δεδομένων εκτός του καταλόγου της ρίζας εγγράφων-document root του διακομιστή.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Η «Strict-Transport-Security\" κεφαλίδα HTTP δεν έχει ρυθμιστεί για τουλάχιστον \"{seconds}\" δευτερόλεπτα. Για αυξημένη ασφάλεια συστήνουμε την ενεργοποίηση του HSTS όπως περιγράφεται στις <a href=\"{docUrl}\">προτάσεις ασφαλείας</a> μας.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Έχετε πρόσβαση σε αυτό τον ιστότοπο μέσω HTTP. Προτείνουμε ανεπιφύλακτα να ρυθμίσετε το διακομιστή σας ώστε να απαιτεί τη χρήση HTTPS όπως περιγράφεται στις <a href=\"{docUrl}\">προτάσεις ασφαλείας</a> μας.",
diff --git a/core/l10n/el.json b/core/l10n/el.json
index 90068f5cddb..2c8e8b2e6af 100644
--- a/core/l10n/el.json
+++ b/core/l10n/el.json
@@ -110,8 +110,8 @@
"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." : "Αυτός ο διακομιστής δεν έχει ενεργή σύνδεση στο διαδίκτυο. Αυτό σημαίνει ότι κάποιες υπηρεσίες όπως η σύνδεση με εξωτερικούς αποθηκευτικούς χώρους, ειδοποιήσεις για ενημερώσεις ή η εγκατάσταση εφαρμογών 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 του διακομιστή.",
"Error occurred while checking server setup" : "Παρουσιάστηκε σφάλμα κατά τον έλεγχο της εγκατάστασης με το διακομιστή",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ο κατάλογος δεδομένων και τα αρχεία σας είναι πιθανόν διαθέσιμα στο διαδίκτυο. Το αρχείο .htaccess δεν λειτουργεί. Σας προτείνουμε ανεπιφύλακτα να ρυθμίσετε το διακομιστή σας με τέτοιο τρόπο ώστε ο κατάλογος δεδομένων να μην είναι πλέον προσβάσιμος ή να μετακινήσετε τον κατάλογο δεδομένων εκτός του καταλόγου της ρίζας εγγράφων-document root του διακομιστή.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Η «Strict-Transport-Security\" κεφαλίδα HTTP δεν έχει ρυθμιστεί για τουλάχιστον \"{seconds}\" δευτερόλεπτα. Για αυξημένη ασφάλεια συστήνουμε την ενεργοποίηση του HSTS όπως περιγράφεται στις <a href=\"{docUrl}\">προτάσεις ασφαλείας</a> μας.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Έχετε πρόσβαση σε αυτό τον ιστότοπο μέσω HTTP. Προτείνουμε ανεπιφύλακτα να ρυθμίσετε το διακομιστή σας ώστε να απαιτεί τη χρήση HTTPS όπως περιγράφεται στις <a href=\"{docUrl}\">προτάσεις ασφαλείας</a> μας.",
diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js
index b7e897f8fef..2b1dfbf8cdf 100644
--- a/core/l10n/en_GB.js
+++ b/core/l10n/en_GB.js
@@ -92,8 +92,8 @@ OC.L10N.register(
"Strong password" : "Strong password",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Your web server is not yet set up properly to allow file synchronisation 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." : "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 enabling the Internet connection for this server.",
- "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." : "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.",
"Error occurred while checking server setup" : "Error occurred whilst checking server setup",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "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.",
"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." : "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.",
"Shared" : "Shared",
"Shared with {recipients}" : "Shared with {recipients}",
diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json
index 1ed840aa71f..e19ddcb1723 100644
--- a/core/l10n/en_GB.json
+++ b/core/l10n/en_GB.json
@@ -90,8 +90,8 @@
"Strong password" : "Strong password",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Your web server is not yet set up properly to allow file synchronisation 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." : "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 enabling the Internet connection for this server.",
- "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." : "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.",
"Error occurred while checking server setup" : "Error occurred whilst checking server setup",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "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.",
"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." : "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.",
"Shared" : "Shared",
"Shared with {recipients}" : "Shared with {recipients}",
diff --git a/core/l10n/es.js b/core/l10n/es.js
index 30cdf6e4547..5ad0aafd8da 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -120,7 +120,6 @@ 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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Su servidor web no está configurado correctamente para resolver \"{url}\". Más información puede ser encontrada en nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionan. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "La memoria caché no ha sido configurada. Para aumentar su rendimiento por favor configure memcache si está disponible. Más información puede ser encontrada en nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom no es legible por PHP el mismo es altamente desalentado por razones de seguridad. Más información puede ser encontrada en nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Su versión PHP ({version}) ya no es <a target=\"_blank\" href=\"{phpLink}\">respaldada por PHP</a>. Recomendamos actualizar su versión de PHP para aprovechar las actualizaciones de rendimiento y seguridad proporcionadas por PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "memcached es un sistema de cache distribuido. pero ha sido instalado por error el modulo PHP memcache.\nConsulte <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki acerca de ambos modulos</a>",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Algunos archivos no han superado la comprobación de integridad. Para más información sobre cómo resolver este inconveniente consulte nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de archivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reescanear…</a>)",
"Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como es descripta en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está ingresando a este sitio de internet vía HTTP. Le sugerimos enérgicamente que configure su servidor que utilice HTTPS como se describe en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index 2f8395f0dd6..fc01075cb00 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Su servidor web aún no está configurado adecuadamente para permitir sincronización de archivos ya que la interfaz WebDAV parece no estar funcionando.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Su servidor web no está configurado correctamente para resolver \"{url}\". Más información puede ser encontrada en nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionan. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "La memoria caché no ha sido configurada. Para aumentar su rendimiento por favor configure memcache si está disponible. Más información puede ser encontrada en nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom no es legible por PHP el mismo es altamente desalentado por razones de seguridad. Más información puede ser encontrada en nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Su versión PHP ({version}) ya no es <a target=\"_blank\" href=\"{phpLink}\">respaldada por PHP</a>. Recomendamos actualizar su versión de PHP para aprovechar las actualizaciones de rendimiento y seguridad proporcionadas por PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "memcached es un sistema de cache distribuido. pero ha sido instalado por error el modulo PHP memcache.\nConsulte <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki acerca de ambos modulos</a>",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Algunos archivos no han superado la comprobación de integridad. Para más información sobre cómo resolver este inconveniente consulte nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de archivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reescanear…</a>)",
"Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como es descripta en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está ingresando a este sitio de internet vía HTTP. Le sugerimos enérgicamente que configure su servidor que utilice HTTPS como se describe en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index 12c131f8410..3a17c0d37bb 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -120,7 +120,6 @@ 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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "HTTP-palvelintasi ei ole määritetty kelvollisesti selvittämään osoitetta \"{url}\". Lisätietoja on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiosta</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Välimuistia ei ole määritetty. Paranna suorituskykyä ottamalla memcache käyttöön. Lisätietoja on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiossa</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom ei ole PHP:n luettavissa, eikä tätä missään tapauksessa suositella tietoturvasyistä. Lisätietoja on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiossa</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "PHP-versiosi ({version}) ei ole enää tuettu <a target=\"_blank\" href=\"{phpLink}\"> PHP:n toimesta</a>. Suosittelemme päivittämään PHP:n version, jotta hyödyt suorituskykyparannuksista sekä tietoturvakorjauksista.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached on määritetty hajautetuksi välimuistiksi, mutta väärä PHP-moduuli \"memcache\" on asennettu. \\OC\\Memcache\\Memcached tukee vain moduulia \"memcached\", ei moduulia \"memcache\". Lisätietoja <a target=\"_blank\" href=\"{wikiLink}\">memcachedin wikissä molemmista moduuleista</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Jotkin tiedostot eivät läpäisseet eheystarkistusta. Lisätietoja ongelman selvittämiseksi on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiossa</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Luettelo virheellisistä tiedostoista…</a> / <a href=\"{rescanEndpoint}\">Tarkista uudelleen…</a>)",
"Error occurred while checking server setup" : "Virhe palvelimen määrityksiä tarkistaessa",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP-otsaketta \"Strict-Transport-Security\" ei ole määritetty vähintään \"{seconds}\" sekuntiin. Suosittelemme HSTS:n käyttöä paremman tietoturvan vuoksi, kuten <a href=\"{docUrl}\">tietoturvavinkeissä</a> neuvotaan.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Käytät sivustoa HTTP-yhteydellä. Suosittelemme asettamaan palvelimen vaatimaan HTTPS-yhteyden, kuten <a href=\"{docUrl}\">tietoturvavinkeissä</a> neuvotaan.",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index 89944f4e153..0df670a2808 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -118,7 +118,6 @@
"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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "HTTP-palvelintasi ei ole määritetty kelvollisesti selvittämään osoitetta \"{url}\". Lisätietoja on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiosta</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Välimuistia ei ole määritetty. Paranna suorituskykyä ottamalla memcache käyttöön. Lisätietoja on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiossa</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom ei ole PHP:n luettavissa, eikä tätä missään tapauksessa suositella tietoturvasyistä. Lisätietoja on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiossa</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "PHP-versiosi ({version}) ei ole enää tuettu <a target=\"_blank\" href=\"{phpLink}\"> PHP:n toimesta</a>. Suosittelemme päivittämään PHP:n version, jotta hyödyt suorituskykyparannuksista sekä tietoturvakorjauksista.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached on määritetty hajautetuksi välimuistiksi, mutta väärä PHP-moduuli \"memcache\" on asennettu. \\OC\\Memcache\\Memcached tukee vain moduulia \"memcached\", ei moduulia \"memcache\". Lisätietoja <a target=\"_blank\" href=\"{wikiLink}\">memcachedin wikissä molemmista moduuleista</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Jotkin tiedostot eivät läpäisseet eheystarkistusta. Lisätietoja ongelman selvittämiseksi on saatavilla <a target=\"_blank\" href=\"{docLink}\">dokumentaatiossa</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Luettelo virheellisistä tiedostoista…</a> / <a href=\"{rescanEndpoint}\">Tarkista uudelleen…</a>)",
"Error occurred while checking server setup" : "Virhe palvelimen määrityksiä tarkistaessa",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP-otsaketta \"Strict-Transport-Security\" ei ole määritetty vähintään \"{seconds}\" sekuntiin. Suosittelemme HSTS:n käyttöä paremman tietoturvan vuoksi, kuten <a href=\"{docUrl}\">tietoturvavinkeissä</a> neuvotaan.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Käytät sivustoa HTTP-yhteydellä. Suosittelemme asettamaan palvelimen vaatimaan HTTPS-yhteyden, kuten <a href=\"{docUrl}\">tietoturvavinkeissä</a> neuvotaan.",
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index 2f1ebc3a9cb..d0f7c7cb976 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -125,7 +125,7 @@ OC.L10N.register(
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Votre version de PHP ({version}) <a target=\"_blank\" href=\"{phpLink}\">n'est plus prise en charge par les créateurs de PHP</a>. Nous vous recommandons de mettre à niveau votre installation de PHP pour bénéficier de meilleures performances et des mises à jour de sécurité fournies par PHP.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.",
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "\"memcached\" est configuré comme cache distribué, mais le module installé est \"memcache\". \\OC\\Memcache\\Memcached ne prend en charge que \"memcached\" et non \"memcache\". <a target=\"_blank\" href=\"{wikiLink}\">Consulter le wiki de memcached à propos de ces deux modules.</a>",
- "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Des fichiers n'ont pas passé la vérification d’intégrité. \nConsultez la <a target=\"_blank\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations sur comment résoudre ce problème.\n(<a target=\"_blank\" href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers non valides…</a> / <a href=\"{rescanEndpoint}\">Relancer…</a>)",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Des fichiers n'ont pas passé la vérification d’intégrité. \nConsultez la <a target=\"_blank\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations sur comment résoudre ce problème. \n(<a target=\"_blank\" href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers non valides…</a> / <a href=\"{rescanEndpoint}\">Relancer…</a>)",
"Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur",
"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 de le déplacer hors de la racine du serveur web.",
"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.",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index df7cd0cf3c5..2496d318992 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -123,7 +123,7 @@
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Votre version de PHP ({version}) <a target=\"_blank\" href=\"{phpLink}\">n'est plus prise en charge par les créateurs de PHP</a>. Nous vous recommandons de mettre à niveau votre installation de PHP pour bénéficier de meilleures performances et des mises à jour de sécurité fournies par PHP.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.",
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "\"memcached\" est configuré comme cache distribué, mais le module installé est \"memcache\". \\OC\\Memcache\\Memcached ne prend en charge que \"memcached\" et non \"memcache\". <a target=\"_blank\" href=\"{wikiLink}\">Consulter le wiki de memcached à propos de ces deux modules.</a>",
- "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Des fichiers n'ont pas passé la vérification d’intégrité. \nConsultez la <a target=\"_blank\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations sur comment résoudre ce problème.\n(<a target=\"_blank\" href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers non valides…</a> / <a href=\"{rescanEndpoint}\">Relancer…</a>)",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Des fichiers n'ont pas passé la vérification d’intégrité. \nConsultez la <a target=\"_blank\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations sur comment résoudre ce problème. \n(<a target=\"_blank\" href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers non valides…</a> / <a href=\"{rescanEndpoint}\">Relancer…</a>)",
"Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur",
"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 de le déplacer hors de la racine du serveur web.",
"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.",
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index 957f1f5df4b..8a092803cbb 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -102,8 +102,8 @@ OC.L10N.register(
"Strong password" : "Contrasinal forte",
"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.",
"Error occurred while checking server setup" : "Aconteceu un erro mentras se comprobaba a configuración do servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A cabeceira HTTP «Strict-Transport-Security» non está configurada para menos de «{seconds}» segundos . Para mellorar a seguridade, recomendámoslle que active o uso de HTTPS, tal e como se describe nos <a href=\"{docUrl}\">consellos de seguridade</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está accedendo a este sitio a través de HTTP. Suxerímoslle que configure o seu servidor para requirir, no seu canto, o uso de HTTPS, tal e como se descrine nos<a href=\"{docUrl}\">consellos de seguridade</a>.",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index e572387c179..87912e84f37 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -100,8 +100,8 @@
"Strong password" : "Contrasinal forte",
"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.",
"Error occurred while checking server setup" : "Aconteceu un erro mentras se comprobaba a configuración do servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A cabeceira HTTP «Strict-Transport-Security» non está configurada para menos de «{seconds}» segundos . Para mellorar a seguridade, recomendámoslle que active o uso de HTTPS, tal e como se describe nos <a href=\"{docUrl}\">consellos de seguridade</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está accedendo a este sitio a través de HTTP. Suxerímoslle que configure o seu servidor para requirir, no seu canto, o uso de HTTPS, tal e como se descrine nos<a href=\"{docUrl}\">consellos de seguridade</a>.",
diff --git a/core/l10n/he.js b/core/l10n/he.js
index 9a7bfeede44..9bb93dfcb7f 100644
--- a/core/l10n/he.js
+++ b/core/l10n/he.js
@@ -120,7 +120,6 @@ 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 כנראה שבור.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "שרת האינטרנט שלך לא מוגדר כהלכה לפתור \"{url}\". מידע נוסף קיים <a target=\"_blank\" href=\"{docLink}\">במסמכים</a> שלנו.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "לשרת זה אין חיבור אינטרנט פעיל. לפיכך חלק מהתכונות כגון עגינת אחסון חיצוני, הודעות על עדכונים או התקנת יישומי צד שלישי לא יעבדו. ייתכן ולא יעבדו גם כניסה לקבצים מבחוץ ושליחת הודעות דואר אלקטרוני. אנו ממליצים לאפשר חיבור אינטרנט לשרת זה אם ברצונך שיהיו לך את כל התכונות.",
- "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "כנראה וניתן לגשת אל תיקיית data והקבצים שלך מהאינטרנט. קובץ .htaccess אינו עובד. אנו ממליצים בכל תוקף שתגדיר את השרת בצורה כזאת שלא ניתן יהיה לגשת לתיקיית ה- data או להעביר את תיקיית ה- dta מחוץ לנתיב המסמכים של שרת האינטרנט.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "לא הוגדר memory cache. על מנת לשפר את הביצועים יש להגדיר memcache אם קיים. מידע נוסף ניתן לצפות ב- <a target=\"_blank\" href=\"{docLink}\">מסמכי התיעוד</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom אינו ניתן לקריאה על ידי PHP אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- <a target=\"_blank\" href=\"{docLink}\">מסמכי התיעוד</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "גרסת ה- PHP שלך ({version}) אינה <a target=\"_blank\" href=\"{phpLink}\">נתמכת כבר על ידי PHP</a>. אנו ממליצים לשדרג את גרסת ה- PHP ולהנות מהיתרון של עדכוני האבטחה והביצועים שמספק ה- PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached מוגדר כמטמון מופץ, אבל מותקן מודול PHP לא נכון \"memcache\". רק \\OC\\Memcache\\Memcached תומך ב- \"memcached\" אבל לא ב- \"memcache\". ניתן לצפות ב- <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki בנושא שני המודולים</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "חלק מהקבצים לא עברו את בדיקת התקינות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו. (<a href=\"{codeIntegrityDownloadEndpoint}\">רשימה של קבצים לא תקינים…</a> / <a href=\"{rescanEndpoint}\">סריקה מחדש…</a>)",
"Error occurred while checking server setup" : "שגיאה אירעה בזמן בדיקת התקנת השרת",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "כנראה וניתן לגשת אל תיקיית data והקבצים שלך מהאינטרנט. קובץ .htaccess אינו עובד. אנו ממליצים בכל תוקף שתגדיר את השרת בצורה כזאת שלא ניתן יהיה לגשת לתיקיית ה- data או להעביר את תיקיית ה- dta מחוץ לנתיב המסמכים של שרת האינטרנט.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "כותרת ה- HTTP \"{header}\" אינה מוגדרת להיות שווה ל- \"{expected}\". הדבר מהווה פוטנציאל סיכון אבטחה או פגיעה בפרטיות ואנו ממליצים לתקן את הגדרה זו.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "כותרת HTTP \"Strict-Transport-Security\" אינה מוגדרת לפחות \"{seconds}\" שניות. להגברת האבטחה אנו ממליצים לאפשר HSTS כפי שמוסבר ב- <a href=\"{docUrl}\">טיפים לאבטחה</a> שלנו.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "הנך נכנס לאתר באמצעות פרוטוקול HTTP. אנו ממליצים מאוד להגדיר את השרת לעבוד עם פרוטוקול HTTPS במקום כפי שמוסבר ב- <a href=\"{docUrl}\">טיפים לאבטחה</a> שלנו.",
diff --git a/core/l10n/he.json b/core/l10n/he.json
index 9e25f9895d1..db60742f7c8 100644
--- a/core/l10n/he.json
+++ b/core/l10n/he.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "שרת האינטרנט שלך אינו מוגדר כהלכה לאפשר סנכרון כיוון שממשק ה־WebDAV כנראה שבור.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "שרת האינטרנט שלך לא מוגדר כהלכה לפתור \"{url}\". מידע נוסף קיים <a target=\"_blank\" href=\"{docLink}\">במסמכים</a> שלנו.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "לשרת זה אין חיבור אינטרנט פעיל. לפיכך חלק מהתכונות כגון עגינת אחסון חיצוני, הודעות על עדכונים או התקנת יישומי צד שלישי לא יעבדו. ייתכן ולא יעבדו גם כניסה לקבצים מבחוץ ושליחת הודעות דואר אלקטרוני. אנו ממליצים לאפשר חיבור אינטרנט לשרת זה אם ברצונך שיהיו לך את כל התכונות.",
- "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "כנראה וניתן לגשת אל תיקיית data והקבצים שלך מהאינטרנט. קובץ .htaccess אינו עובד. אנו ממליצים בכל תוקף שתגדיר את השרת בצורה כזאת שלא ניתן יהיה לגשת לתיקיית ה- data או להעביר את תיקיית ה- dta מחוץ לנתיב המסמכים של שרת האינטרנט.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "לא הוגדר memory cache. על מנת לשפר את הביצועים יש להגדיר memcache אם קיים. מידע נוסף ניתן לצפות ב- <a target=\"_blank\" href=\"{docLink}\">מסמכי התיעוד</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom אינו ניתן לקריאה על ידי PHP אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- <a target=\"_blank\" href=\"{docLink}\">מסמכי התיעוד</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "גרסת ה- PHP שלך ({version}) אינה <a target=\"_blank\" href=\"{phpLink}\">נתמכת כבר על ידי PHP</a>. אנו ממליצים לשדרג את גרסת ה- PHP ולהנות מהיתרון של עדכוני האבטחה והביצועים שמספק ה- PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached מוגדר כמטמון מופץ, אבל מותקן מודול PHP לא נכון \"memcache\". רק \\OC\\Memcache\\Memcached תומך ב- \"memcached\" אבל לא ב- \"memcache\". ניתן לצפות ב- <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki בנושא שני המודולים</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "חלק מהקבצים לא עברו את בדיקת התקינות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו. (<a href=\"{codeIntegrityDownloadEndpoint}\">רשימה של קבצים לא תקינים…</a> / <a href=\"{rescanEndpoint}\">סריקה מחדש…</a>)",
"Error occurred while checking server setup" : "שגיאה אירעה בזמן בדיקת התקנת השרת",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "כנראה וניתן לגשת אל תיקיית data והקבצים שלך מהאינטרנט. קובץ .htaccess אינו עובד. אנו ממליצים בכל תוקף שתגדיר את השרת בצורה כזאת שלא ניתן יהיה לגשת לתיקיית ה- data או להעביר את תיקיית ה- dta מחוץ לנתיב המסמכים של שרת האינטרנט.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "כותרת ה- HTTP \"{header}\" אינה מוגדרת להיות שווה ל- \"{expected}\". הדבר מהווה פוטנציאל סיכון אבטחה או פגיעה בפרטיות ואנו ממליצים לתקן את הגדרה זו.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "כותרת HTTP \"Strict-Transport-Security\" אינה מוגדרת לפחות \"{seconds}\" שניות. להגברת האבטחה אנו ממליצים לאפשר HSTS כפי שמוסבר ב- <a href=\"{docUrl}\">טיפים לאבטחה</a> שלנו.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "הנך נכנס לאתר באמצעות פרוטוקול HTTP. אנו ממליצים מאוד להגדיר את השרת לעבוד עם פרוטוקול HTTPS במקום כפי שמוסבר ב- <a href=\"{docUrl}\">טיפים לאבטחה</a> שלנו.",
diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js
index 5142d6cb2eb..5ff649e74f2 100644
--- a/core/l10n/hu_HU.js
+++ b/core/l10n/hu_HU.js
@@ -113,10 +113,10 @@ OC.L10N.register(
"Strong password" : "Erős jelszó",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "A webszerver nincs megfelelően beállítva a fájl szinkronizációhoz, mert a WebDAV interfész nem működik.",
"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." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány tulajdonság, mint pl. külső tárolók felcsatolása, frissítési értesítések, vagy egyéb applikációk nem működnek. A fájlok távoli elérése és az email értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden tulajdonságot használni akar.",
- "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." : "Az adat könyvtára és a fáljai valószínűleg elérhetőek az internetről. A .htaccess fájl nem működik. Erősen ajánlott, hogy úgy állítsa be a webszerverét, hogy az adatkönyvtár ne legyen elérhető az internetről, vagy mogassa ki az adatokat a webszerver gyökérkönyvtárából.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom nem olvasható a PHP számára, mely nagy biztonsági probléma. Bővebb információt találhatsz a <a target=\"_blank\" href=\"{docLink}\">dokumentációban</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A PHP verziód ({version}) többé nem támogatott a <a target=\"_blank\" href=\"{phpLink}\">PHP által</a>. Azt javasoljuk, hogy frissítsd a PHP verziód, hogy kitud használni a teljesítménybeli és biztonsági javításokat.",
"Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben",
+ "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." : "Az adat könyvtára és a fáljai valószínűleg elérhetőek az internetről. A .htaccess fájl nem működik. Erősen ajánlott, hogy úgy állítsa be a webszerverét, hogy az adatkönyvtár ne legyen elérhető az internetről, vagy mogassa ki az adatokat a webszerver gyökérkönyvtárából.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Nagyon ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json
index 8034ea197f4..c4b6737a571 100644
--- a/core/l10n/hu_HU.json
+++ b/core/l10n/hu_HU.json
@@ -111,10 +111,10 @@
"Strong password" : "Erős jelszó",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "A webszerver nincs megfelelően beállítva a fájl szinkronizációhoz, mert a WebDAV interfész nem működik.",
"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." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány tulajdonság, mint pl. külső tárolók felcsatolása, frissítési értesítések, vagy egyéb applikációk nem működnek. A fájlok távoli elérése és az email értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden tulajdonságot használni akar.",
- "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." : "Az adat könyvtára és a fáljai valószínűleg elérhetőek az internetről. A .htaccess fájl nem működik. Erősen ajánlott, hogy úgy állítsa be a webszerverét, hogy az adatkönyvtár ne legyen elérhető az internetről, vagy mogassa ki az adatokat a webszerver gyökérkönyvtárából.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom nem olvasható a PHP számára, mely nagy biztonsági probléma. Bővebb információt találhatsz a <a target=\"_blank\" href=\"{docLink}\">dokumentációban</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A PHP verziód ({version}) többé nem támogatott a <a target=\"_blank\" href=\"{phpLink}\">PHP által</a>. Azt javasoljuk, hogy frissítsd a PHP verziód, hogy kitud használni a teljesítménybeli és biztonsági javításokat.",
"Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben",
+ "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." : "Az adat könyvtára és a fáljai valószínűleg elérhetőek az internetről. A .htaccess fájl nem működik. Erősen ajánlott, hogy úgy állítsa be a webszerverét, hogy az adatkönyvtár ne legyen elérhető az internetről, vagy mogassa ki az adatokat a webszerver gyökérkönyvtárából.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Nagyon ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
diff --git a/core/l10n/id.js b/core/l10n/id.js
index a8f7816be46..055750ddb50 100644
--- a/core/l10n/id.js
+++ b/core/l10n/id.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"Strong password" : "Sandi kuat",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Server web Anda belum diatur dengan benar untuk mengizinkan sinkronisasi berkas karena antarmuka WebDAV nampaknya rusak.",
"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." : "Server ini tidak tersambung ke internet. Ini berarti beberapa fitur seperti me-mount penyimpanan eksternal, notifikasi pembaruan atau instalasi aplikasi pihak ketiga tidak akan bekerja. Mengakses berkas secara remote dan mengirim notifikasi email juga tidak bekerja. Kami menyarankan untuk mengaktifkan koneksi internet untuk server ini jika Anda ingin memiliki fitur ini.",
- "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." : "Direktori data dan berkas Anda kemungkinan dapat diakses dari Internet. Berkas .htaccess tidak bekerja. Kami sangat menyarankan Anda untuk mengkonfigurasi server web agar direktori data tidak lagi dapat diakses atau pindahkan direktori data Anda di luar root dokumen server web.",
"Error occurred while checking server setup" : "Kesalahan tidak terduga saat memeriksa setelan server",
+ "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." : "Direktori data dan berkas Anda kemungkinan dapat diakses dari Internet. Berkas .htaccess tidak bekerja. Kami sangat menyarankan Anda untuk mengkonfigurasi server web agar direktori data tidak lagi dapat diakses atau pindahkan direktori data Anda di luar root dokumen server web.",
"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 \"{header}\" tidak dikonfigurasi sama dengan \"{expected}\". Hal ini berpotensi pada resiko keamanan dan privasi. Kami sarankan untuk menyesuaikan pengaturan ini.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP header \"Strict-Transport-Security\" tidak diatur kurang dari \"{seconds}\" detik. Untuk peningkatan keamanan, kami menyarankan untuk mengaktifkan HSTS seperti yang dijelaskan di <a href=\"{docUrl}\">tips keamanan</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Anda mengakses situs ini via HTTP. Kami sangat menyarankan Anda untuk mengatur server Anda menggunakan HTTPS yang dibahas di <a href=\"{docUrl}\">tips keamanan</a> kami.",
diff --git a/core/l10n/id.json b/core/l10n/id.json
index fd16d67b1e1..46e34fdd987 100644
--- a/core/l10n/id.json
+++ b/core/l10n/id.json
@@ -110,8 +110,8 @@
"Strong password" : "Sandi kuat",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Server web Anda belum diatur dengan benar untuk mengizinkan sinkronisasi berkas karena antarmuka WebDAV nampaknya rusak.",
"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." : "Server ini tidak tersambung ke internet. Ini berarti beberapa fitur seperti me-mount penyimpanan eksternal, notifikasi pembaruan atau instalasi aplikasi pihak ketiga tidak akan bekerja. Mengakses berkas secara remote dan mengirim notifikasi email juga tidak bekerja. Kami menyarankan untuk mengaktifkan koneksi internet untuk server ini jika Anda ingin memiliki fitur ini.",
- "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." : "Direktori data dan berkas Anda kemungkinan dapat diakses dari Internet. Berkas .htaccess tidak bekerja. Kami sangat menyarankan Anda untuk mengkonfigurasi server web agar direktori data tidak lagi dapat diakses atau pindahkan direktori data Anda di luar root dokumen server web.",
"Error occurred while checking server setup" : "Kesalahan tidak terduga saat memeriksa setelan server",
+ "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." : "Direktori data dan berkas Anda kemungkinan dapat diakses dari Internet. Berkas .htaccess tidak bekerja. Kami sangat menyarankan Anda untuk mengkonfigurasi server web agar direktori data tidak lagi dapat diakses atau pindahkan direktori data Anda di luar root dokumen server web.",
"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 \"{header}\" tidak dikonfigurasi sama dengan \"{expected}\". Hal ini berpotensi pada resiko keamanan dan privasi. Kami sarankan untuk menyesuaikan pengaturan ini.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP header \"Strict-Transport-Security\" tidak diatur kurang dari \"{seconds}\" detik. Untuk peningkatan keamanan, kami menyarankan untuk mengaktifkan HSTS seperti yang dijelaskan di <a href=\"{docUrl}\">tips keamanan</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Anda mengakses situs ini via HTTP. Kami sangat menyarankan Anda untuk mengatur server Anda menggunakan HTTPS yang dibahas di <a href=\"{docUrl}\">tips keamanan</a> kami.",
diff --git a/core/l10n/is.js b/core/l10n/is.js
index d079011931f..ede14b8c41f 100644
--- a/core/l10n/is.js
+++ b/core/l10n/is.js
@@ -105,8 +105,8 @@ OC.L10N.register(
"Strong password" : "Sterkt lykilorð",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vefþjónninn er ekki enn sett upp á réttan hátt til að leyfa skráar samstillingu því WebDAV viðmótið virðist vera brotinn.",
"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." : "Þessi miðlari hefur ekki virka nettengingu. Þetta þýðir að sumir eginleikar eins og virkja ytri gagnageymslu, tilkynningar um uppfærslur eða uppsetningu á foritum þriðja aðila mun ekki virka. Fjar aðgangur af skrám og senda tilkynningar í tölvupósti vika líklega ekki heldur. Við leggjum til að virkja internet tengingu fyrir þennan vefþjóni ef þú vilt hafa alla eiginleika.",
- "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." : "Gagnamappa og skrá eru líklega aðgengilegar af internetinu vegna þess að .htaccess skrá er ekki virk. Við mælum eindregið með að þú stillir vefþjón þinn á þann hátt að gagnamappa er ekki lengur aðgengileg eða þú færir gagnamöppu út fyrir rót vefþjóns.",
"Error occurred while checking server setup" : "Villa kom upp við athugun á uppsetingu miðlara",
+ "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." : "Gagnamappa og skrá eru líklega aðgengilegar af internetinu vegna þess að .htaccess skrá er ekki virk. Við mælum eindregið með að þú stillir vefþjón þinn á þann hátt að gagnamappa er ekki lengur aðgengileg eða þú færir gagnamöppu út fyrir rót vefþjóns.",
"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 haus er ekki stilltur til jafns við \\\"{expected}\\\". Þetta er mögulegur öryggis eða næðis áhætta, við mælum með því að aðlaga þessa stillingu.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\\\"Strangt-Transport-Security\\\" HTTP haus er ekki stilltur á minst \\\"{seconds}\\\" sekúndur. Fyrir aukið öryggi mælum við með því að virkja HSTS eins og lýst er í <a href=\\\"{docUrl}\\\">security tips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : " Þú ert að tengjast með HTTP. Við mælum eindregið með að þú stillir miðlara á HTTPS í staðin eins og lýst er í okkar <a href=\\\"{docUrl}\\\">security tips</a>.",
diff --git a/core/l10n/is.json b/core/l10n/is.json
index bee7653fc55..4d7876a63de 100644
--- a/core/l10n/is.json
+++ b/core/l10n/is.json
@@ -103,8 +103,8 @@
"Strong password" : "Sterkt lykilorð",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vefþjónninn er ekki enn sett upp á réttan hátt til að leyfa skráar samstillingu því WebDAV viðmótið virðist vera brotinn.",
"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." : "Þessi miðlari hefur ekki virka nettengingu. Þetta þýðir að sumir eginleikar eins og virkja ytri gagnageymslu, tilkynningar um uppfærslur eða uppsetningu á foritum þriðja aðila mun ekki virka. Fjar aðgangur af skrám og senda tilkynningar í tölvupósti vika líklega ekki heldur. Við leggjum til að virkja internet tengingu fyrir þennan vefþjóni ef þú vilt hafa alla eiginleika.",
- "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." : "Gagnamappa og skrá eru líklega aðgengilegar af internetinu vegna þess að .htaccess skrá er ekki virk. Við mælum eindregið með að þú stillir vefþjón þinn á þann hátt að gagnamappa er ekki lengur aðgengileg eða þú færir gagnamöppu út fyrir rót vefþjóns.",
"Error occurred while checking server setup" : "Villa kom upp við athugun á uppsetingu miðlara",
+ "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." : "Gagnamappa og skrá eru líklega aðgengilegar af internetinu vegna þess að .htaccess skrá er ekki virk. Við mælum eindregið með að þú stillir vefþjón þinn á þann hátt að gagnamappa er ekki lengur aðgengileg eða þú færir gagnamöppu út fyrir rót vefþjóns.",
"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 haus er ekki stilltur til jafns við \\\"{expected}\\\". Þetta er mögulegur öryggis eða næðis áhætta, við mælum með því að aðlaga þessa stillingu.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\\\"Strangt-Transport-Security\\\" HTTP haus er ekki stilltur á minst \\\"{seconds}\\\" sekúndur. Fyrir aukið öryggi mælum við með því að virkja HSTS eins og lýst er í <a href=\\\"{docUrl}\\\">security tips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : " Þú ert að tengjast með HTTP. Við mælum eindregið með að þú stillir miðlara á HTTPS í staðin eins og lýst er í okkar <a href=\\\"{docUrl}\\\">security tips</a>.",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index d23609d57ec..56c94d5a34d 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -120,7 +120,6 @@ 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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Il tuo server web non è configurato correttamente per risolvere \"{url}\". Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Non è stata configurata alcuna cache di memoria. Per migliorare le prestazioni, configura memcache, se disponibile. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom non è leggibile da PHP e ciò è vivamente sconsigliato per motivi di sicurezza. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "La tua versione ({version}) di PHP non è più <a target=\"_blank\" href=\"{phpLink}\">supportata da PHP</a>. Ti consigliamo di aggiornare la versione di PHP per trarre vantaggio dagli aggiornamenti in termini di prestazioni e sicurezza forniti da PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a target=\"_blank\" href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Elenco dei file non validi…</a> / <a href=\"{rescanEndpoint}\">Nuova scansione…</a>)",
"Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore almeno di \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sei connesso a questo sito tramite HTTP. Ti suggeriamo vivamente di configurare il tuo server per richiedere invece l'utilizzo del protocollo HTTPS, come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index 966d0f58125..d437ca3af31 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -118,7 +118,6 @@
"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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Il tuo server web non è configurato correttamente per risolvere \"{url}\". Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Non è stata configurata alcuna cache di memoria. Per migliorare le prestazioni, configura memcache, se disponibile. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom non è leggibile da PHP e ciò è vivamente sconsigliato per motivi di sicurezza. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "La tua versione ({version}) di PHP non è più <a target=\"_blank\" href=\"{phpLink}\">supportata da PHP</a>. Ti consigliamo di aggiornare la versione di PHP per trarre vantaggio dagli aggiornamenti in termini di prestazioni e sicurezza forniti da PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a target=\"_blank\" href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Elenco dei file non validi…</a> / <a href=\"{rescanEndpoint}\">Nuova scansione…</a>)",
"Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore almeno di \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sei connesso a questo sito tramite HTTP. Ti suggeriamo vivamente di configurare il tuo server per richiedere invece l'utilizzo del protocollo HTTPS, come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.",
diff --git a/core/l10n/ja.js b/core/l10n/ja.js
index 1b368469f43..4e8722fb858 100644
--- a/core/l10n/ja.js
+++ b/core/l10n/ja.js
@@ -118,8 +118,8 @@ OC.L10N.register(
"Good password" : "良好なパスワード",
"Strong password" : "強いパスワード",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "WebDAVインターフェースが動作していないようです。Webサーバーは、ファイルの同期を許可するよう適切に設定されていません。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Webサーバーは適切に\"{url}\"を解決するように設定されていません.より詳しい情報については、<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a> を参照ください。",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "このサーバーはインターネットに接続していません。この場合、外部ストレージのマウント、更新の通知やサードパーティ製のアプリ、といった一部の機能が利用できません。また、リモート接続でのファイルアクセス、通知メールの送信のような機能も利用できないことがあります。すべての機能を利用するには、このサーバーのインターネット接続を有効にすることをお勧めします。",
- "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ファイルが機能していません。データディレクトリがアクセスされないようにWebサーバーを設定するか、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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a> を参照してください。",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom は PHP から読み取ることができず、この状態はセキュリティの観点からおすすめできません。より詳しい情報については、<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a> を参照ください。",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、<a target=\"_blank\" href=\"{phpLink}\">PHPでサポート</a> されていません。セキュリティ確保とパフォーマンス向上のために、PHPから提供されている新しいバージョンにアップグレードすることを強くお勧めします。",
@@ -127,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached は分散キャッシュとして設定されています。しかし、PHPモジュール \"memcache\"が間違ってインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしています。\"memcache\" ではありません。<a target=\"_blank\" href=\"{wikiLink}\">memcached wiki で両方のモジュール</a> について確認してください。",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "いくつかのファイルで整合性の確認に失敗しました。この問題を解決するための詳細情報は<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a>にあります。 (<a href=\"{codeIntegrityDownloadEndpoint}\">不適正なファイルのリスト…</a> / <a href=\"{rescanEndpoint}\">再スキャン…</a>)",
"Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "データディレクトリとファイルがインターネットからアクセス可能になっている可能性があります。.htaccessファイルが機能していません。データディレクトリがアクセスされないようにWebサーバーを設定するか、Webサーバーのドキュメントルートからデータディレクトリを移動するように強くお勧めします。",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP ヘッダが最小値の \"{seconds}\" 秒に設定されていません。 セキュリティを強化するため、<a href=\"{docUrl}\">security tips</a>を参照して、HSTS を有効にすることをおすすめします。",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP経由でアクセスしています。<a href=\"{docUrl}\">security tips</a>を参照して、代わりにHTTPSを使用するようサーバーを設定することを強くおすすめします。 instead as described in our .",
@@ -175,6 +176,8 @@ OC.L10N.register(
"Error while sending notification" : "通知送信中にエラーが発生",
"Non-existing tag #{tag}" : "存在しないタグ#{tag}",
"not assignable" : "割り当てできない",
+ "invisible" : "不可視",
+ "({scope})" : "({scope})",
"Delete" : "削除",
"Rename" : "名前の変更",
"Global tags" : "グローバルタグ",
diff --git a/core/l10n/ja.json b/core/l10n/ja.json
index 4dbcaac6a08..7206ddb8ad7 100644
--- a/core/l10n/ja.json
+++ b/core/l10n/ja.json
@@ -116,8 +116,8 @@
"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インターフェースが動作していないようです。Webサーバーは、ファイルの同期を許可するよう適切に設定されていません。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Webサーバーは適切に\"{url}\"を解決するように設定されていません.より詳しい情報については、<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a> を参照ください。",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "このサーバーはインターネットに接続していません。この場合、外部ストレージのマウント、更新の通知やサードパーティ製のアプリ、といった一部の機能が利用できません。また、リモート接続でのファイルアクセス、通知メールの送信のような機能も利用できないことがあります。すべての機能を利用するには、このサーバーのインターネット接続を有効にすることをお勧めします。",
- "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ファイルが機能していません。データディレクトリがアクセスされないようにWebサーバーを設定するか、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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a> を参照してください。",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom は PHP から読み取ることができず、この状態はセキュリティの観点からおすすめできません。より詳しい情報については、<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a> を参照ください。",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、<a target=\"_blank\" href=\"{phpLink}\">PHPでサポート</a> されていません。セキュリティ確保とパフォーマンス向上のために、PHPから提供されている新しいバージョンにアップグレードすることを強くお勧めします。",
@@ -125,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached は分散キャッシュとして設定されています。しかし、PHPモジュール \"memcache\"が間違ってインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしています。\"memcache\" ではありません。<a target=\"_blank\" href=\"{wikiLink}\">memcached wiki で両方のモジュール</a> について確認してください。",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "いくつかのファイルで整合性の確認に失敗しました。この問題を解決するための詳細情報は<a target=\"_blank\" href=\"{docLink}\">ドキュメント</a>にあります。 (<a href=\"{codeIntegrityDownloadEndpoint}\">不適正なファイルのリスト…</a> / <a href=\"{rescanEndpoint}\">再スキャン…</a>)",
"Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "データディレクトリとファイルがインターネットからアクセス可能になっている可能性があります。.htaccessファイルが機能していません。データディレクトリがアクセスされないようにWebサーバーを設定するか、Webサーバーのドキュメントルートからデータディレクトリを移動するように強くお勧めします。",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP ヘッダが最小値の \"{seconds}\" 秒に設定されていません。 セキュリティを強化するため、<a href=\"{docUrl}\">security tips</a>を参照して、HSTS を有効にすることをおすすめします。",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP経由でアクセスしています。<a href=\"{docUrl}\">security tips</a>を参照して、代わりにHTTPSを使用するようサーバーを設定することを強くおすすめします。 instead as described in our .",
@@ -173,6 +174,8 @@
"Error while sending notification" : "通知送信中にエラーが発生",
"Non-existing tag #{tag}" : "存在しないタグ#{tag}",
"not assignable" : "割り当てできない",
+ "invisible" : "不可視",
+ "({scope})" : "({scope})",
"Delete" : "削除",
"Rename" : "名前の変更",
"Global tags" : "グローバルタグ",
diff --git a/core/l10n/ko.js b/core/l10n/ko.js
index ea6019900b4..f87ab8db4bd 100644
--- a/core/l10n/ko.js
+++ b/core/l10n/ko.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"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." : "서버에서 인터넷 연결을 사용할 수 없습니다. 외부 저장소 마운트, 업데이트 알림, 제 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 파일이 작동하지 않습니다. 웹 서버 설정을 변경하여 데이터 디렉터리에 직접 접근할 수 없도록 하거나, 데이터 디렉터리를 웹 서버 문서 경로 바깥에 두십시오.",
"Error occurred while checking server setup" : "서버 설정을 확인하는 중 오류 발생",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "인터넷에서 데이터 디렉터리와 파일에 접근할 수 있습니다. .htaccess 파일이 작동하지 않습니다. 웹 서버 설정을 변경하여 데이터 디렉터리에 직접 접근할 수 없도록 하거나, 데이터 디렉터리를 웹 서버 문서 경로 바깥에 두십시오.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 헤더가 \"{expected}\"와(과) 같이 설정되지 않았습니다. 잠재적인 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 헤더 \"Strict-Transport-Security\"가 최소한 \"{seconds}\"초 이상으로 설정되어야 합니다. 강화된 보안을 위해서 <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 HSTS를 활성화하는 것을 추천합니다.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "이 사이트를 HTTP로 접근하고 있습니다. <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 서버 설정을 변경하여 HTTPS를 사용하는 것을 강력히 추천합니다.",
diff --git a/core/l10n/ko.json b/core/l10n/ko.json
index 8ce1b2b5632..a4827533dd6 100644
--- a/core/l10n/ko.json
+++ b/core/l10n/ko.json
@@ -110,8 +110,8 @@
"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." : "서버에서 인터넷 연결을 사용할 수 없습니다. 외부 저장소 마운트, 업데이트 알림, 제 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 파일이 작동하지 않습니다. 웹 서버 설정을 변경하여 데이터 디렉터리에 직접 접근할 수 없도록 하거나, 데이터 디렉터리를 웹 서버 문서 경로 바깥에 두십시오.",
"Error occurred while checking server setup" : "서버 설정을 확인하는 중 오류 발생",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "인터넷에서 데이터 디렉터리와 파일에 접근할 수 있습니다. .htaccess 파일이 작동하지 않습니다. 웹 서버 설정을 변경하여 데이터 디렉터리에 직접 접근할 수 없도록 하거나, 데이터 디렉터리를 웹 서버 문서 경로 바깥에 두십시오.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 헤더가 \"{expected}\"와(과) 같이 설정되지 않았습니다. 잠재적인 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 헤더 \"Strict-Transport-Security\"가 최소한 \"{seconds}\"초 이상으로 설정되어야 합니다. 강화된 보안을 위해서 <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 HSTS를 활성화하는 것을 추천합니다.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "이 사이트를 HTTP로 접근하고 있습니다. <a href=\"{docUrl}\">보안 팁</a>에 나타난 것처럼 서버 설정을 변경하여 HTTPS를 사용하는 것을 강력히 추천합니다.",
diff --git a/core/l10n/mk.js b/core/l10n/mk.js
index 07e25191b51..0b23329eff2 100644
--- a/core/l10n/mk.js
+++ b/core/l10n/mk.js
@@ -103,8 +103,8 @@ OC.L10N.register(
"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." : "Овој опслужувач нема работна Интернет врска. Ова значи дека некои опции како што е монтирање на надворешни складишта, известувања за ажурирање или инсталации на апликации од 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 не работи. Строго ви препорачуваме да го подесите вашиот веб опслужувач на начин на кој вашата папка за податоци не е веќе достапна од интернет или да ја преместите папката за податоци надвор од коренот на веб опслужувачот.",
"Error occurred while checking server setup" : "Се случи грешка при проверката на подесувањата на опслужувачот",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Вашата папка за податоци и вашите датотеки се најверојатно достапни од интернет. Датотеката .htaccess не работи. Строго ви препорачуваме да го подесите вашиот веб опслужувач на начин на кој вашата папка за податоци не е веќе достапна од интернет или да ја преместите папката за податоци надвор од коренот на веб опслужувачот.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заглавието \"{header}\" не е конфигурирано да биде еднакво на \"{expected}\". Ова е потенцијално сигурносен ризик и препорачуваме да прилагодат подесувањата.",
"Shared" : "Споделен",
"Shared with {recipients}" : "Споделено со {recipients}",
diff --git a/core/l10n/mk.json b/core/l10n/mk.json
index 1ec66dcb648..1fec5b4d9c7 100644
--- a/core/l10n/mk.json
+++ b/core/l10n/mk.json
@@ -101,8 +101,8 @@
"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." : "Овој опслужувач нема работна Интернет врска. Ова значи дека некои опции како што е монтирање на надворешни складишта, известувања за ажурирање или инсталации на апликации од 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 не работи. Строго ви препорачуваме да го подесите вашиот веб опслужувач на начин на кој вашата папка за податоци не е веќе достапна од интернет или да ја преместите папката за податоци надвор од коренот на веб опслужувачот.",
"Error occurred while checking server setup" : "Се случи грешка при проверката на подесувањата на опслужувачот",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Вашата папка за податоци и вашите датотеки се најверојатно достапни од интернет. Датотеката .htaccess не работи. Строго ви препорачуваме да го подесите вашиот веб опслужувач на начин на кој вашата папка за податоци не е веќе достапна од интернет или да ја преместите папката за податоци надвор од коренот на веб опслужувачот.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заглавието \"{header}\" не е конфигурирано да биде еднакво на \"{expected}\". Ова е потенцијално сигурносен ризик и препорачуваме да прилагодат подесувањата.",
"Shared" : "Споделен",
"Shared with {recipients}" : "Споделено со {recipients}",
diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js
index aef4964a4a0..44d81bc8c00 100644
--- a/core/l10n/nb_NO.js
+++ b/core/l10n/nb_NO.js
@@ -120,7 +120,6 @@ OC.L10N.register(
"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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Web-serveren er ikke satt opp riktig for å oppløse \"{url}\". Mer informasjon finnes i <a target=\"_blank\" href=\"{docLink}\">dokumentasjonen</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Intet minne-cache er konfigurert. For å forbedre ytelsen, installer et minne-cache hvis tilgjengelig. Mer informasjon finnes i <a target=\"_blank\" href=\"{docLink}\">dokumentasjonen</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom kan ikke leses av PHP, noe som er sterkt frarådet av sikkerhetshensyn. Mer informasjon finnes i <a target=\"_blank\" href=\"{docLink}\">dokumentasjonen</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Din PHP-versjon ({version}) er ikke <a target=\"_blank\" href=\"{phpLink}\">støttet av PHP</a> lenger. Vi oppfordrer deg til å oppgradere din PHP-versjon for å nyte fordel av ytelses- og sikkerhetsoppdateringer som tilbys av PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached er konfigurert som distribuert cache, men feil PHP-module \"memcache\" er installert. \\OC\\Memcache\\Memcached støtter bare \"memcached\" og ikke \"memcache\". Se <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki om begge modulene</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Noen filer feilet integritets-sjekken. Informasjon for å løse situasjonen finnes i <a target=\"_blank\" href=\"{docLink}\">documentasjonen</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste med ugyldige filer…</a> / <a href=\"{rescanEndpoint}\">Skann på nytt…</a>)",
"Error occurred while checking server setup" : "Feil oppstod ved sjekking av server-oppsett",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP header \"Strict-Transport-Security\" er ikke konfigurert til minst \"{seconds}\" sekunder. For beste sikkerhet anbefaler vi at HSTS aktiveres som beskrevet i <a href=\"{docUrl}\">sikkerhetstips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du aksesserer denne nettsiden via HTTP. Vi anbefaler på det sterkeste at du konfigurerer serveren til å kreve HTTPS i stedet, som beskrevet i <a href=\"{docUrl}\">sikkerhetstips</a>.",
diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json
index b9cda317839..70ba89ac243 100644
--- a/core/l10n/nb_NO.json
+++ b/core/l10n/nb_NO.json
@@ -118,7 +118,6 @@
"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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Web-serveren er ikke satt opp riktig for å oppløse \"{url}\". Mer informasjon finnes i <a target=\"_blank\" href=\"{docLink}\">dokumentasjonen</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Intet minne-cache er konfigurert. For å forbedre ytelsen, installer et minne-cache hvis tilgjengelig. Mer informasjon finnes i <a target=\"_blank\" href=\"{docLink}\">dokumentasjonen</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom kan ikke leses av PHP, noe som er sterkt frarådet av sikkerhetshensyn. Mer informasjon finnes i <a target=\"_blank\" href=\"{docLink}\">dokumentasjonen</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Din PHP-versjon ({version}) er ikke <a target=\"_blank\" href=\"{phpLink}\">støttet av PHP</a> lenger. Vi oppfordrer deg til å oppgradere din PHP-versjon for å nyte fordel av ytelses- og sikkerhetsoppdateringer som tilbys av PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached er konfigurert som distribuert cache, men feil PHP-module \"memcache\" er installert. \\OC\\Memcache\\Memcached støtter bare \"memcached\" og ikke \"memcache\". Se <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki om begge modulene</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Noen filer feilet integritets-sjekken. Informasjon for å løse situasjonen finnes i <a target=\"_blank\" href=\"{docLink}\">documentasjonen</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste med ugyldige filer…</a> / <a href=\"{rescanEndpoint}\">Skann på nytt…</a>)",
"Error occurred while checking server setup" : "Feil oppstod ved sjekking av server-oppsett",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP header \"Strict-Transport-Security\" er ikke konfigurert til minst \"{seconds}\" sekunder. For beste sikkerhet anbefaler vi at HSTS aktiveres som beskrevet i <a href=\"{docUrl}\">sikkerhetstips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du aksesserer denne nettsiden via HTTP. Vi anbefaler på det sterkeste at du konfigurerer serveren til å kreve HTTPS i stedet, som beskrevet i <a href=\"{docUrl}\">sikkerhetstips</a>.",
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index 560cdbcebbc..da4c200f4b9 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -120,7 +120,6 @@ 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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Uw webserver is niet goed ingesteld om \"{url}\" te vinden. Meer informatie is te vinden in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">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 target=\"_blank\" href=\"{docLink}\">documentatie</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom is niet leesbaar door PHP, hetgeen wordt afgeraden wegens beveiligingsredenen. Meer informatie in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "UwPHP versie ({version}) wordt niet langer <a target=\"_blank\" href=\"{phpLink}\">ondersteund door PHP</a>. We adviseren u om uw PHP versie te upgraden voor betere prestaties en security updates geleverd door PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki over beide modules</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw…</a>)",
"Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "U bent met deze site verbonden over HTTP. We adviseren met klem uw server zo te configureren dat HTTPS wordt vereist, zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.",
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index f5eb1c59b41..0febd1fbb7e 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -118,7 +118,6 @@
"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.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Uw webserver is niet goed ingesteld om \"{url}\" te vinden. Meer informatie is te vinden in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "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 target=\"_blank\" href=\"{docLink}\">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 target=\"_blank\" href=\"{docLink}\">documentatie</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom is niet leesbaar door PHP, hetgeen wordt afgeraden wegens beveiligingsredenen. Meer informatie in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "UwPHP versie ({version}) wordt niet langer <a target=\"_blank\" href=\"{phpLink}\">ondersteund door PHP</a>. We adviseren u om uw PHP versie te upgraden voor betere prestaties en security updates geleverd door PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki over beide modules</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw…</a>)",
"Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "U bent met deze site verbonden over HTTP. We adviseren met klem uw server zo te configureren dat HTTPS wordt vereist, zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.",
diff --git a/core/l10n/oc.js b/core/l10n/oc.js
index c72bd205dc9..355921f9cc0 100644
--- a/core/l10n/oc.js
+++ b/core/l10n/oc.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"Strong password" : "Senhal fòrt",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vòstre servidor web es pas corrèctament configurat per la sincronizacion de fichièrs : sembla que l'interfàcia WebDAV fonciona pas.",
"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." : "Aqueste servidor se pòt pas connectar a internet. Aquò significa que certanas foncionalitats, talas coma lo montatge de supòrts d'emmagazinatge distants, las notificacions de mesas a jorn o l'installacion d'aplicacions tèrças foncionaràn pas. L'accès als fichièrs a distància, e tanben las notificacions per mail pòdon tanben èsser indisponiblas. Es recomandat d'activar la connexion internet per aqueste servidor se volètz dispausar de l'ensemble de las foncionalitats ofèrtas.",
- "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òstre dorsièr de donadas e vòstres fichièrs son probablament accessibles dempuèi internet. Lo fichièr .htaccess fonciona pas. Vos recomandam bravament de configurar vòstre servidor web de manièra qu'aqueste dorsièr de donadas siá pas mai accessible, o de lo desplaçar en defòra de la raiç del servidor web.",
"Error occurred while checking server setup" : "Una error s'es produsida al moment de la verificacion de la configuracion del servidor",
+ "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òstre dorsièr de donadas e vòstres fichièrs son probablament accessibles dempuèi internet. Lo fichièr .htaccess fonciona pas. Vos recomandam bravament de configurar vòstre servidor web de manièra qu'aqueste dorsièr de donadas siá pas mai accessible, o de lo desplaçar en defòra de la raiç del servidor web.",
"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'entèsta HTTP \"{header}\" es pas configurada per èsser egala a \"{expected}\" en creant potencialament un risc religat a la seguretat e a la vida privada. Es doncas recomandat d'ajustar aqueste paramètre.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'entèsta HTTP \"Strict-Transport-Security\" es pas configurada a \"{seconds}\" segondas. Per renforçar la seguretat, recomandam d'activar HSTS coma descrich dins nòstre <a href=\"{docUrl}\">Guida pel renfortiment e la seguretat</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Accedissètz a aqueste site via HTTP. Vos recomandam fòrtament de configurar vòstre servidor per forçar l'utilizacion de HTTPS, coma explicat dins nòstre <a href=\"{docUrl}\">Guida pel renfortiment e la seguretat</a>.",
diff --git a/core/l10n/oc.json b/core/l10n/oc.json
index 455290a2940..77266355a03 100644
--- a/core/l10n/oc.json
+++ b/core/l10n/oc.json
@@ -110,8 +110,8 @@
"Strong password" : "Senhal fòrt",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vòstre servidor web es pas corrèctament configurat per la sincronizacion de fichièrs : sembla que l'interfàcia WebDAV fonciona pas.",
"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." : "Aqueste servidor se pòt pas connectar a internet. Aquò significa que certanas foncionalitats, talas coma lo montatge de supòrts d'emmagazinatge distants, las notificacions de mesas a jorn o l'installacion d'aplicacions tèrças foncionaràn pas. L'accès als fichièrs a distància, e tanben las notificacions per mail pòdon tanben èsser indisponiblas. Es recomandat d'activar la connexion internet per aqueste servidor se volètz dispausar de l'ensemble de las foncionalitats ofèrtas.",
- "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òstre dorsièr de donadas e vòstres fichièrs son probablament accessibles dempuèi internet. Lo fichièr .htaccess fonciona pas. Vos recomandam bravament de configurar vòstre servidor web de manièra qu'aqueste dorsièr de donadas siá pas mai accessible, o de lo desplaçar en defòra de la raiç del servidor web.",
"Error occurred while checking server setup" : "Una error s'es produsida al moment de la verificacion de la configuracion del servidor",
+ "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òstre dorsièr de donadas e vòstres fichièrs son probablament accessibles dempuèi internet. Lo fichièr .htaccess fonciona pas. Vos recomandam bravament de configurar vòstre servidor web de manièra qu'aqueste dorsièr de donadas siá pas mai accessible, o de lo desplaçar en defòra de la raiç del servidor web.",
"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'entèsta HTTP \"{header}\" es pas configurada per èsser egala a \"{expected}\" en creant potencialament un risc religat a la seguretat e a la vida privada. Es doncas recomandat d'ajustar aqueste paramètre.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'entèsta HTTP \"Strict-Transport-Security\" es pas configurada a \"{seconds}\" segondas. Per renforçar la seguretat, recomandam d'activar HSTS coma descrich dins nòstre <a href=\"{docUrl}\">Guida pel renfortiment e la seguretat</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Accedissètz a aqueste site via HTTP. Vos recomandam fòrtament de configurar vòstre servidor per forçar l'utilizacion de HTTPS, coma explicat dins nòstre <a href=\"{docUrl}\">Guida pel renfortiment e la seguretat</a>.",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index 3d4e236bac2..f821a6c461d 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -120,7 +120,6 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Seu servidor web ainda não está configurado corretamente para permitir a sincronização de arquivos, pois a interface WebDAV parece ser desconfigurada.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor 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.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure um cache de memória, se disponível. Mais informação podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não pode ser lido pelo PHP o que é altamente desencorajado por razões de segurança. Mais informações podem ser encontradas na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão do PHP ({version}) não é mais <a target=\"_blank\" href=\"{phpLink}\">suportada pelo PHP</a>. Nós o incentivamos a atualizar sua versão do PHP para tirar proveito de atualizações de desempenho e de segurança fornecidas pelo PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurado como cache distribuído, mas o módulo PHP \"memcache\" errado está instalado. \\OC\\Memcache\\Memcached suporta apenas \"memcached\" e não \"memcache\". Veja a <a target=\"_blank\" href=\"{wikiLink}\">o wiki sobre memcached sobre ambos os módulos</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns arquivos não passaram na verificação de integridade. Mais informações sobre como resolver este problema podem ser encontradas na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reexaminar…</a>)",
"Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho \"Transporte-de-Segurança-Restrita\"HTTP não está configurada para menos de \"{seconds}\" segundos. Para uma maior segurança recomendamos a ativação HSTS conforme descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Você está acessando este site via HTTP. Nós fortemente sugerimos que você ao invéz, configure o servidor para exigir o uso de HTTPS como descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index f2289975685..431df239c7f 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Seu servidor web ainda não está configurado corretamente para permitir a sincronização de arquivos, pois a interface WebDAV parece ser desconfigurada.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor 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.",
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure um cache de memória, se disponível. Mais informação podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não pode ser lido pelo PHP o que é altamente desencorajado por razões de segurança. Mais informações podem ser encontradas na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão do PHP ({version}) não é mais <a target=\"_blank\" href=\"{phpLink}\">suportada pelo PHP</a>. Nós o incentivamos a atualizar sua versão do PHP para tirar proveito de atualizações de desempenho e de segurança fornecidas pelo PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurado como cache distribuído, mas o módulo PHP \"memcache\" errado está instalado. \\OC\\Memcache\\Memcached suporta apenas \"memcached\" e não \"memcache\". Veja a <a target=\"_blank\" href=\"{wikiLink}\">o wiki sobre memcached sobre ambos os módulos</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns arquivos não passaram na verificação de integridade. Mais informações sobre como resolver este problema podem ser encontradas na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reexaminar…</a>)",
"Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho \"Transporte-de-Segurança-Restrita\"HTTP não está configurada para menos de \"{seconds}\" segundos. Para uma maior segurança recomendamos a ativação HSTS conforme descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Você está acessando este site via HTTP. Nós fortemente sugerimos que você ao invéz, configure o servidor para exigir o uso de HTTPS como descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 653ec6ec8b5..56182467e68 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -120,7 +120,6 @@ 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 da Web não está configurado corretamente para permitir a sincronização de ficheiro, porque a interface WebDAV parece estar com problemas.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor 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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desanimador por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão ({version}) do PHP já não é <a target=\"_blank\" href=\"{phpLink}\">suportada pelo PHP</a>. Nós encorajamos-lhe a atualizar a sua versão do PHP para aproveitar o desempenho e as atualizações de segurança fornecidas pelo PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lists de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"{seconds}\" segundos. Para uma segurança melhorada recomendados a ativação do HSTS como descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Nós recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS, em vez do que está descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index af02e2bf081..c68733fefa5 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O seu servidor da Web não está configurado corretamente para permitir a sincronização de ficheiro, porque a interface WebDAV parece estar com problemas.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor 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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desanimador por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" href=\"{docLink}\">documentação</a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão ({version}) do PHP já não é <a target=\"_blank\" href=\"{phpLink}\">suportada pelo PHP</a>. Nós encorajamos-lhe a atualizar a sua versão do PHP para aproveitar o desempenho e as atualizações de segurança fornecidas pelo PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lists de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"{seconds}\" segundos. Para uma segurança melhorada recomendados a ativação do HSTS como descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Nós recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS, em vez do que está descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 2b942444db1..e15b06ab8da 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -120,7 +120,6 @@ 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, кажется, испорчен.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Ваш сервер не настроен для правильного разрешения \"{url}\". За дополнительной информацией обратитесь к нашей <a target=\"_blank\" href=\"{docLink}\">документации</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Этот сервер не имеет подключения к Интернету. Это означает, что некоторые из функций, таких как внешнее хранилище, уведомления об обновлениях и установка сторонних приложений не будут работать. Доступ к файлам удаленно и отправки уведомлений по почте могут не работать. Рекомендуется разрешить данному серверу доступ в Интернет если хотите, чтобы все функции работали.",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Кэш-памяти не настроено. Для повышения производительности, пожалуйста, настройте кэш-памяти (memcache) если есть такая возможность. Дополнительную информацию можно найти в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom не доступно чтение для PHP, что крайне нежелательно по соображениям безопасности. Дополнительную информацию можно найти в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версия PHP ({version}) больше не <a target=\"_blank\" href=\"{phpLink}\"> поддерживается разработчиками PHP</a>. Мы рекомендуем Вам обновить версию PHP, чтобы воспользоваться производительностью и безопасностью, предусмотренных в обновленной версии PHP.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "В качестве распределённого кеша настроен memcached, но установлен неверный модуль PHP \"memcache\". \\OC\\Memcache\\Memcached поддерживает только \"memcached\", но не \"memcache\". Изучите <a target=\"_blank\" href=\"{wikiLink}\">оба модуля в memcached wiki</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Некоторые файлы не прошли проверку целостности. Дополнительная информация о том, как устранить данную проблему доступна в нашей <a target=\"_blank\" href=\"{docLink}\">документации</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Сканировать ещё раз…</a>)",
"Error occurred while checking server setup" : "Произошла ошибка при проверке настроек сервера",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог данных и ваши файлы возможно доступны из Интернета. Файл .htaccess не работает. Мы настоятельно рекомендуем Вам настроить веб сервер таким образом, чтобы каталог данных не был больше доступен или переместить каталог данных за пределы корня веб сервера.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Заголовок HTTP \"{header}\" не настроен на значение \"{expected}\". Это потенциальная проблема безопасности и мы рекомендуем изменить эти настройки.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Заголовок HTTP \"Strict-Transport-Security\" не настроен хотя бы на \"{seconds}\" секунд. Для улучшения безопасности мы рекомендуем включить HSTS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Вы зашли на этот сайт через HTTP. Мы настоятельно рекомендуем настроить ваш сервер на использование HTTPS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.",
diff --git a/core/l10n/ru.json b/core/l10n/ru.json
index d90e88b37ae..e6031c72f77 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Ваш веб-сервер еще не настроен должным образом чтобы позволить синхронизацию файлов, потому что интерфейс WebDAV, кажется, испорчен.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Ваш сервер не настроен для правильного разрешения \"{url}\". За дополнительной информацией обратитесь к нашей <a target=\"_blank\" href=\"{docLink}\">документации</a>.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Этот сервер не имеет подключения к Интернету. Это означает, что некоторые из функций, таких как внешнее хранилище, уведомления об обновлениях и установка сторонних приложений не будут работать. Доступ к файлам удаленно и отправки уведомлений по почте могут не работать. Рекомендуется разрешить данному серверу доступ в Интернет если хотите, чтобы все функции работали.",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Кэш-памяти не настроено. Для повышения производительности, пожалуйста, настройте кэш-памяти (memcache) если есть такая возможность. Дополнительную информацию можно найти в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom не доступно чтение для PHP, что крайне нежелательно по соображениям безопасности. Дополнительную информацию можно найти в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </a>.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Ваша версия PHP ({version}) больше не <a target=\"_blank\" href=\"{phpLink}\"> поддерживается разработчиками PHP</a>. Мы рекомендуем Вам обновить версию PHP, чтобы воспользоваться производительностью и безопасностью, предусмотренных в обновленной версии PHP.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "В качестве распределённого кеша настроен memcached, но установлен неверный модуль PHP \"memcache\". \\OC\\Memcache\\Memcached поддерживает только \"memcached\", но не \"memcache\". Изучите <a target=\"_blank\" href=\"{wikiLink}\">оба модуля в memcached wiki</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Некоторые файлы не прошли проверку целостности. Дополнительная информация о том, как устранить данную проблему доступна в нашей <a target=\"_blank\" href=\"{docLink}\">документации</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Сканировать ещё раз…</a>)",
"Error occurred while checking server setup" : "Произошла ошибка при проверке настроек сервера",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог данных и ваши файлы возможно доступны из Интернета. Файл .htaccess не работает. Мы настоятельно рекомендуем Вам настроить веб сервер таким образом, чтобы каталог данных не был больше доступен или переместить каталог данных за пределы корня веб сервера.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Заголовок HTTP \"{header}\" не настроен на значение \"{expected}\". Это потенциальная проблема безопасности и мы рекомендуем изменить эти настройки.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Заголовок HTTP \"Strict-Transport-Security\" не настроен хотя бы на \"{seconds}\" секунд. Для улучшения безопасности мы рекомендуем включить HSTS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Вы зашли на этот сайт через HTTP. Мы настоятельно рекомендуем настроить ваш сервер на использование HTTPS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.",
diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js
index 0c68ac2fd6b..0b5d02742ef 100644
--- a/core/l10n/sk_SK.js
+++ b/core/l10n/sk_SK.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"Strong password" : "Silné heslo",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Server nemá funkčné pripojenie k internetu. Niektoré moduly ako napr. externé úložisko, oznámenie o dostupných aktualizáciách alebo inštalácia aplikácií tretích strán nebudú fungovať. Vzdialený prístup k súborom a odosielanie oznamovacích emailov tiež nemusí fungovať. Ak chcete využívať všetky funkcie, odporúčame povoliť tomuto serveru pripojenie 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áš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.",
"Error occurred while checking server setup" : "Počas kontroly nastavenia serveru sa stala chyba",
+ "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áš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.",
"Shared" : "Zdieľané",
"Shared with {recipients}" : "Zdieľa s {recipients}",
"Error" : "Chyba",
diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json
index c9a24cc78cb..5277b5ab28f 100644
--- a/core/l10n/sk_SK.json
+++ b/core/l10n/sk_SK.json
@@ -110,8 +110,8 @@
"Strong password" : "Silné heslo",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Server nemá funkčné pripojenie k internetu. Niektoré moduly ako napr. externé úložisko, oznámenie o dostupných aktualizáciách alebo inštalácia aplikácií tretích strán nebudú fungovať. Vzdialený prístup k súborom a odosielanie oznamovacích emailov tiež nemusí fungovať. Ak chcete využívať všetky funkcie, odporúčame povoliť tomuto serveru pripojenie 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áš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.",
"Error occurred while checking server setup" : "Počas kontroly nastavenia serveru sa stala chyba",
+ "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áš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.",
"Shared" : "Zdieľané",
"Shared with {recipients}" : "Zdieľa s {recipients}",
"Error" : "Chyba",
diff --git a/core/l10n/sq.js b/core/l10n/sq.js
index bcdec3b9c73..dea5cd4a05c 100644
--- a/core/l10n/sq.js
+++ b/core/l10n/sq.js
@@ -120,7 +120,6 @@ OC.L10N.register(
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Shërbyesi juaj web ende s’është rregulluar për të lejuar njëkohësim kartelash, ngaqë ndërfaqja WebDAV duket se është e dëmtuar.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Shërbyesi juaj s’është rregulluar si duhet për të kuptuar \"{url}\". Të dhëna të mëtejshme mund të gjenden te <a target=\"_blank\" href=\"{docLink}\">dokumentimi</a> ynë.",
"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." : "Ky shërbyes nuk ka lidhje Internet që funksionon. Kjo do të thotë që disa prej veçorive, të tilla si montimi i depozitave të jashtme, njoftimet mbi përditësime apo instalim aplikacionesh nga palë të treta, s’do të funksionojnë. Edhe hyrja në kartela së largëti, apo dërgimi i email-eve për njoftime mund të mos funksionojnë. Këshillojmë të aktivizoni për këtë shërbyes lidhjen në Internet, nëse doni t’i keni krejt këto veçori.",
- "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." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti. Kartela .htaccess s’funksionon. Këshillojmë me forcë që ta formësoni shërbyesin tuaj web në një mënyrë që drejtoria e të dhënave të mos lejojë më hyrje, ose ta zhvendosni drejtorinë e të dhënave jashtë rrënjës së dokumenteve të shërbyesit 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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "S’është formësuar ndonjë fshehtinë kujtese. Që të përmirësohet punimi juaj, ju lutemi, formësoni një fshehtinë kujtese, në pastë. Të dhëna të mëtejshme mund të gjenden te <a target=\"_blank\" href=\"{docLink}\">dokumentimi</a> ynë.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom s’është i lexueshëm nga PHP-ja, çka shkëshillohet me forcë, për arsye sigurie. Më tepër informacion mund të gjendet te <a target=\"_blank\" href=\"{docLink}\">dokumentimi</a> ynë.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Versioni juaj i PHP-së ({version}) nuk <a target=\"_blank\" href=\"{phpLink}\">mbulohet më nga PHP-ja</a>. Ju nxisim ta përmirësoni versionin tuaj të PHP-së që të përfitoni nga përditësimet e funksionimit dhe sigurisë të ofruara nga PHP-ja.",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached është formësuar si fshehtinë e shpërndarë, por është instaluar moduli i gabuar PHP \"memcache\". \\OC\\Memcache\\Memcached mbulon vetëm \"memcached\" dhe jo \"memcache\". Shihni <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki për të dy modulet</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Disa prej kartelave s’e kaluan dot kontrollin e integritetit. Si si mund të zgjidhet ky problem mund ta shihni më në thellësi te <a target=\"_blank\" href=\"{docLink}\">dokumentimi ynë</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listë e kartelave të pavlefshme…</a> / <a href=\"{rescanEndpoint}\">Rikontrolloji…</a>)",
"Error occurred while checking server setup" : "Ndodhi një gabim gjatë kontrollit të rregullimit të shërbyesit",
+ "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." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti. Kartela .htaccess s’funksionon. Këshillojmë me forcë që ta formësoni shërbyesin tuaj web në një mënyrë që drejtoria e të dhënave të mos lejojë më hyrje, ose ta zhvendosni drejtorinë e të dhënave jashtë rrënjës së dokumenteve të shërbyesit web.",
"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." : "Kryet HTTP \"{header}\" s’është formësuar të jetë i njëjtë me \"{expected}\". Ky është një rrezik potencial sigurie dhe privatësie dhe këshillojmë të ndreqet ky rregullim.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Kryet HTTP \"Strict-Transport-Security\" s’është formësuar të paktën \"{seconds}\". Për siguri të thelluar këshillojmë aktivizimin e HSTS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Po e përdorni këtë sajt përmes HTTP-je. Këshillojmë me forcë ta formësoni shërbyesin tuaj të kërkojë medoemos përdorimin e HTTPS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.",
diff --git a/core/l10n/sq.json b/core/l10n/sq.json
index 3fdd04bd429..842f34d005d 100644
--- a/core/l10n/sq.json
+++ b/core/l10n/sq.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Shërbyesi juaj web ende s’është rregulluar për të lejuar njëkohësim kartelash, ngaqë ndërfaqja WebDAV duket se është e dëmtuar.",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Shërbyesi juaj s’është rregulluar si duhet për të kuptuar \"{url}\". Të dhëna të mëtejshme mund të gjenden te <a target=\"_blank\" href=\"{docLink}\">dokumentimi</a> ynë.",
"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." : "Ky shërbyes nuk ka lidhje Internet që funksionon. Kjo do të thotë që disa prej veçorive, të tilla si montimi i depozitave të jashtme, njoftimet mbi përditësime apo instalim aplikacionesh nga palë të treta, s’do të funksionojnë. Edhe hyrja në kartela së largëti, apo dërgimi i email-eve për njoftime mund të mos funksionojnë. Këshillojmë të aktivizoni për këtë shërbyes lidhjen në Internet, nëse doni t’i keni krejt këto veçori.",
- "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." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti. Kartela .htaccess s’funksionon. Këshillojmë me forcë që ta formësoni shërbyesin tuaj web në një mënyrë që drejtoria e të dhënave të mos lejojë më hyrje, ose ta zhvendosni drejtorinë e të dhënave jashtë rrënjës së dokumenteve të shërbyesit 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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "S’është formësuar ndonjë fshehtinë kujtese. Që të përmirësohet punimi juaj, ju lutemi, formësoni një fshehtinë kujtese, në pastë. Të dhëna të mëtejshme mund të gjenden te <a target=\"_blank\" href=\"{docLink}\">dokumentimi</a> ynë.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom s’është i lexueshëm nga PHP-ja, çka shkëshillohet me forcë, për arsye sigurie. Më tepër informacion mund të gjendet te <a target=\"_blank\" href=\"{docLink}\">dokumentimi</a> ynë.",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "Versioni juaj i PHP-së ({version}) nuk <a target=\"_blank\" href=\"{phpLink}\">mbulohet më nga PHP-ja</a>. Ju nxisim ta përmirësoni versionin tuaj të PHP-së që të përfitoni nga përditësimet e funksionimit dhe sigurisë të ofruara nga PHP-ja.",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached është formësuar si fshehtinë e shpërndarë, por është instaluar moduli i gabuar PHP \"memcache\". \\OC\\Memcache\\Memcached mbulon vetëm \"memcached\" dhe jo \"memcache\". Shihni <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki për të dy modulet</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Disa prej kartelave s’e kaluan dot kontrollin e integritetit. Si si mund të zgjidhet ky problem mund ta shihni më në thellësi te <a target=\"_blank\" href=\"{docLink}\">dokumentimi ynë</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listë e kartelave të pavlefshme…</a> / <a href=\"{rescanEndpoint}\">Rikontrolloji…</a>)",
"Error occurred while checking server setup" : "Ndodhi një gabim gjatë kontrollit të rregullimit të shërbyesit",
+ "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." : "Drejtoria juaj e të dhënave dhe kartelat tuaja ka shumë mundësi të jenë të arritshme që nga interneti. Kartela .htaccess s’funksionon. Këshillojmë me forcë që ta formësoni shërbyesin tuaj web në një mënyrë që drejtoria e të dhënave të mos lejojë më hyrje, ose ta zhvendosni drejtorinë e të dhënave jashtë rrënjës së dokumenteve të shërbyesit web.",
"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." : "Kryet HTTP \"{header}\" s’është formësuar të jetë i njëjtë me \"{expected}\". Ky është një rrezik potencial sigurie dhe privatësie dhe këshillojmë të ndreqet ky rregullim.",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Kryet HTTP \"Strict-Transport-Security\" s’është formësuar të paktën \"{seconds}\". Për siguri të thelluar këshillojmë aktivizimin e HSTS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Po e përdorni këtë sajt përmes HTTP-je. Këshillojmë me forcë ta formësoni shërbyesin tuaj të kërkojë medoemos përdorimin e HTTPS-së, siç përshkruhet te <a href=\"{docUrl}\">këshillat tona mbi sigurinë</a>.",
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index 83cdd2605f3..b7a50cd3657 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -103,8 +103,8 @@ OC.L10N.register(
"Strong password" : "Јака лозинка",
"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 не ради. Предлажемо да подесите ваш веб сервер на начин да директоријум са подацима не буде доступан или га изместите изван кореног директоријума веб сервера.",
"Error occurred while checking server setup" : "Дошло је до грешке при провери поставки сервера",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш директоријум са подацима и ваши фајлови су вероватно доступни са интернета. Фајл .htaccess не ради. Предлажемо да подесите ваш веб сервер на начин да директоријум са подацима не буде доступан или га изместите изван кореног директоријума веб сервера.",
"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}“. Ово потенцијално угрожава безбедност и приватност и препоручујемо да подесите ову поставку.",
"Shared" : "Дељено",
"Shared with {recipients}" : "Дељено са {recipients}",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index ef5e9962968..b3bec19dd82 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -101,8 +101,8 @@
"Strong password" : "Јака лозинка",
"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 не ради. Предлажемо да подесите ваш веб сервер на начин да директоријум са подацима не буде доступан или га изместите изван кореног директоријума веб сервера.",
"Error occurred while checking server setup" : "Дошло је до грешке при провери поставки сервера",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш директоријум са подацима и ваши фајлови су вероватно доступни са интернета. Фајл .htaccess не ради. Предлажемо да подесите ваш веб сервер на начин да директоријум са подацима не буде доступан или га изместите изван кореног директоријума веб сервера.",
"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}“. Ово потенцијално угрожава безбедност и приватност и препоручујемо да подесите ову поставку.",
"Shared" : "Дељено",
"Shared with {recipients}" : "Дељено са {recipients}",
diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js
index 127e34c997f..b8b191ae8a3 100644
--- a/core/l10n/th_TH.js
+++ b/core/l10n/th_TH.js
@@ -120,7 +120,6 @@ 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 อาจเสียหาย",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "เว็บเซิร์ฟเวอร์ของคุณไม่ได้ติดตั้งอย่างถูกต้องเพื่อที่จะแก้ไข \"{url}\" สามารถข้อมูลเพิ่มเติมได้ใน <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "เซิร์ฟเวอร์นี้ไม่มีการเชื่อมต่ออินเทอร์เน็ตซึ่งหมายความว่าบางส่วนของคุณสมบัติ เช่น การจัดเก็บข้อมูลภายนอก การแจ้งเตือนเกี่ยวกับการปรับปรุงหรือการติดตั้งแอพพลิเคชันของบุคคลที่สามจะไม่ทำงาน การเข้าถึงไฟล์จากระยะไกลและการส่งอีเมล์แจ้งเตือนอาจจะไม่ทำงาน เราขอแนะนำให้เปิดใช้งานการเชื่อมต่ออินเทอร์เน็ตสำหรับเซิร์ฟเวอร์นี้ถ้าคุณต้องการใช้งานคุณสมบัติทั้งหมด",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "ไม่ได้กำหนดค่าหน่วยความจำแคช เพื่อเพิ่มประสิทธิภาพของคุณโปรดกำหนดค่า memcache หากต้องการข้อมูลเพิ่มเติมสามารถอ่านได้ใน <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "ไม่สามารถอ่าน /dev/urandom โดย PHP ซึ่งมีผลอย่างมากสำหรับเหตุผลด้านความปลอดภัย สามารถข้อมูลเพิ่มเติมได้ใน <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "PHP ของคุณรุ่น ({version}) <a target=\"_blank\" href=\"{phpLink}\">ไม่สนับสนุน PHP</a> เราขอแนะนำให้อัพเกรดรุ่น PHP ของคุณ เพื่อปรับปรุงประสิทธิภาพการทำงานและเนื้อหาด้านความปลอดภัย",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "การกำหนดค่า memcach ผิดพลาดเนื่องจากมีโมดูล PHP ของ memcache ได้ถูกติดตั้งไปแล้ว มีการติดตั้ง \\OC\\Memcache\\Memcached สนับสนุนเฉพาะ \"memcached\" แต่ไม่สนับสนุน \"memcache\" คุณสามารถดู <a target=\"_blank\" href=\"{wikiLink}\">ข้อมูลเกี่ยวกับทั้ง 2 โมดูล</a>",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "บางไฟล์ยังไม่ผ่านการตรวจสอบความสมบูรณ์ ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการแก้ไขปัญหาเหล่านี้สามารถอ่านได้จาก <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา (<a href=\"{codeIntegrityDownloadEndpoint}\">รายชื่อของไฟล์ที่ไม่ถูกต้อง…</a> / <a href=\"{rescanEndpoint}\">ค้นหาใหม่…</a>)",
"Error occurred while checking server setup" : "เกิดข้อผิดพลาดขณะที่ทำการตรวจสอบการติดตั้งเซิร์ฟเวอร์",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "ข้อมูลไดเรกทอรีและไฟล์ของคุณอาจจะสามารถเข้าถึงได้จากอินเทอร์เน็ต ขณะที่ htaccess ไฟล์ไม่ทำงาน เราขอแนะนำให้คุณกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณในทางที่ข้อมูลไดเรกทอรีไม่สามารถเข้าถึงได้หรือคุณย้ายข้อมูลไดเรกทอรีไปยังนอกเว็บเซิร์ฟเวอร์หรือเอกสาร",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" ไม่ได้กำหนดค่าส่วนหัว Http ให้เท่ากับ \"{expected}\" นี่คือระบบการรักษาความปลอดภัยที่มีศักยภาพหรือลดความเสี่ยงที่จะเกิดขึ้นเราขอแนะนำให้ปรับการตั้งค่านี้",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" ส่วนหัว HTTP ไม่ได้กำหนดค่าให้น้อยกว่า \"{seconds}\" วินาที เพื่อความปลอดภัยที่เพิ่มขึ้นเราขอแนะนำให้เปิดใช้งาน HSTS ที่อธิบายไว้ใน <a href=\"{docUrl}\">เคล็ดลับการรักษาความปลอดภัย</a> ของเรา",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "คุณกำลังเข้าถึงเว็บไซต์นี้ผ่านทาง HTTP เราขอแนะนำให้คุณกำหนดค่าเซิร์ฟเวอร์ของคุณที่จะต้องใช้ HTTPS แทนตามที่อธิบายไว้ใน <a href=\"{docUrl}\">เคล็ดลับการรักษาความปลอดภัย</a> ของเรา",
@@ -164,17 +164,20 @@ OC.L10N.register(
"change" : "เปลี่ยนแปลง",
"delete" : "ลบ",
"access control" : "ควบคุมการเข้าถึง",
+ "Could not unshare" : "ไม่สามารถยกเลิกการแชร์ได้",
"Share details could not be loaded for this item." : "รายละเอียดการแชร์ไม่สามารถโหลดสำหรับรายการนี้",
"An error occured. Please try again" : "เกิดข้อผิดพลาด กรุณาลองอีกครั้ง",
"Share" : "แชร์",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud ",
"Share with users or groups …" : "แชร์กับผู้ใช้หรือกลุ่ม ...",
"Share with users, groups or remote users …" : "แชร์กับผู้ใช้กลุ่มหรือผู้ใช้ระยะไกล ...",
+ "Error removing share" : "พบข้อผิดพลาดในรายการที่แชร์ออก",
"Warning" : "คำเตือน",
"Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน",
"Non-existing tag #{tag}" : "ไม่มีแท็กนี้อยู่ #{tag}",
"not assignable" : "ไม่ได้รับมอบหมาย",
"invisible" : "จะมองไม่เห็น",
+ "({scope})" : "({scope})",
"Delete" : "ลบ",
"Rename" : "เปลี่ยนชื่อ",
"Global tags" : "แท็กทั่วไป",
diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json
index 059cfd75f04..1a72dec0b22 100644
--- a/core/l10n/th_TH.json
+++ b/core/l10n/th_TH.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "เว็บเซิร์ฟเวอร์ของคุณยังไม่ถูกติดตั้งอย่างถูกต้องเพื่ออนุญาตให้ประสานข้อมูลให้ตรงกัน เนื่องจากอินเตอร์เฟซ WebDAV อาจเสียหาย",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "เว็บเซิร์ฟเวอร์ของคุณไม่ได้ติดตั้งอย่างถูกต้องเพื่อที่จะแก้ไข \"{url}\" สามารถข้อมูลเพิ่มเติมได้ใน <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "เซิร์ฟเวอร์นี้ไม่มีการเชื่อมต่ออินเทอร์เน็ตซึ่งหมายความว่าบางส่วนของคุณสมบัติ เช่น การจัดเก็บข้อมูลภายนอก การแจ้งเตือนเกี่ยวกับการปรับปรุงหรือการติดตั้งแอพพลิเคชันของบุคคลที่สามจะไม่ทำงาน การเข้าถึงไฟล์จากระยะไกลและการส่งอีเมล์แจ้งเตือนอาจจะไม่ทำงาน เราขอแนะนำให้เปิดใช้งานการเชื่อมต่ออินเทอร์เน็ตสำหรับเซิร์ฟเวอร์นี้ถ้าคุณต้องการใช้งานคุณสมบัติทั้งหมด",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "ไม่ได้กำหนดค่าหน่วยความจำแคช เพื่อเพิ่มประสิทธิภาพของคุณโปรดกำหนดค่า memcache หากต้องการข้อมูลเพิ่มเติมสามารถอ่านได้ใน <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "ไม่สามารถอ่าน /dev/urandom โดย PHP ซึ่งมีผลอย่างมากสำหรับเหตุผลด้านความปลอดภัย สามารถข้อมูลเพิ่มเติมได้ใน <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "PHP ของคุณรุ่น ({version}) <a target=\"_blank\" href=\"{phpLink}\">ไม่สนับสนุน PHP</a> เราขอแนะนำให้อัพเกรดรุ่น PHP ของคุณ เพื่อปรับปรุงประสิทธิภาพการทำงานและเนื้อหาด้านความปลอดภัย",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "การกำหนดค่า memcach ผิดพลาดเนื่องจากมีโมดูล PHP ของ memcache ได้ถูกติดตั้งไปแล้ว มีการติดตั้ง \\OC\\Memcache\\Memcached สนับสนุนเฉพาะ \"memcached\" แต่ไม่สนับสนุน \"memcache\" คุณสามารถดู <a target=\"_blank\" href=\"{wikiLink}\">ข้อมูลเกี่ยวกับทั้ง 2 โมดูล</a>",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "บางไฟล์ยังไม่ผ่านการตรวจสอบความสมบูรณ์ ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการแก้ไขปัญหาเหล่านี้สามารถอ่านได้จาก <a target=\"_blank\" href=\"{docLink}\">เอกสาร</a> ของเรา (<a href=\"{codeIntegrityDownloadEndpoint}\">รายชื่อของไฟล์ที่ไม่ถูกต้อง…</a> / <a href=\"{rescanEndpoint}\">ค้นหาใหม่…</a>)",
"Error occurred while checking server setup" : "เกิดข้อผิดพลาดขณะที่ทำการตรวจสอบการติดตั้งเซิร์ฟเวอร์",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "ข้อมูลไดเรกทอรีและไฟล์ของคุณอาจจะสามารถเข้าถึงได้จากอินเทอร์เน็ต ขณะที่ htaccess ไฟล์ไม่ทำงาน เราขอแนะนำให้คุณกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณในทางที่ข้อมูลไดเรกทอรีไม่สามารถเข้าถึงได้หรือคุณย้ายข้อมูลไดเรกทอรีไปยังนอกเว็บเซิร์ฟเวอร์หรือเอกสาร",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" ไม่ได้กำหนดค่าส่วนหัว Http ให้เท่ากับ \"{expected}\" นี่คือระบบการรักษาความปลอดภัยที่มีศักยภาพหรือลดความเสี่ยงที่จะเกิดขึ้นเราขอแนะนำให้ปรับการตั้งค่านี้",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" ส่วนหัว HTTP ไม่ได้กำหนดค่าให้น้อยกว่า \"{seconds}\" วินาที เพื่อความปลอดภัยที่เพิ่มขึ้นเราขอแนะนำให้เปิดใช้งาน HSTS ที่อธิบายไว้ใน <a href=\"{docUrl}\">เคล็ดลับการรักษาความปลอดภัย</a> ของเรา",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "คุณกำลังเข้าถึงเว็บไซต์นี้ผ่านทาง HTTP เราขอแนะนำให้คุณกำหนดค่าเซิร์ฟเวอร์ของคุณที่จะต้องใช้ HTTPS แทนตามที่อธิบายไว้ใน <a href=\"{docUrl}\">เคล็ดลับการรักษาความปลอดภัย</a> ของเรา",
@@ -162,17 +162,20 @@
"change" : "เปลี่ยนแปลง",
"delete" : "ลบ",
"access control" : "ควบคุมการเข้าถึง",
+ "Could not unshare" : "ไม่สามารถยกเลิกการแชร์ได้",
"Share details could not be loaded for this item." : "รายละเอียดการแชร์ไม่สามารถโหลดสำหรับรายการนี้",
"An error occured. Please try again" : "เกิดข้อผิดพลาด กรุณาลองอีกครั้ง",
"Share" : "แชร์",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud ",
"Share with users or groups …" : "แชร์กับผู้ใช้หรือกลุ่ม ...",
"Share with users, groups or remote users …" : "แชร์กับผู้ใช้กลุ่มหรือผู้ใช้ระยะไกล ...",
+ "Error removing share" : "พบข้อผิดพลาดในรายการที่แชร์ออก",
"Warning" : "คำเตือน",
"Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน",
"Non-existing tag #{tag}" : "ไม่มีแท็กนี้อยู่ #{tag}",
"not assignable" : "ไม่ได้รับมอบหมาย",
"invisible" : "จะมองไม่เห็น",
+ "({scope})" : "({scope})",
"Delete" : "ลบ",
"Rename" : "เปลี่ยนชื่อ",
"Global tags" : "แท็กทั่วไป",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index b8b7c91d4b8..ecf8d0ec69a 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"Strong password" : "Güçlü parola",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Web sunucunuz dosya transferi için düzgün bir şekilde yapılandırılmamış. WevDAV arabirimini sorunlu gözüküyor.",
"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",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP başlığı en az \"{seconds}\" saniye olarak ayarlanmış. İyileştirilmiş güvenlik için <a href=\"{docUrl}\">güvenlik ipuçlarımızda</a> belirtilen HSTS etkinleştirmesini öneririz.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Bu siteye HTTP aracılığıyla erişiyorsunuz. Sunucunuzu <a href=\"{docUrl}\">güvenlik ipuçlarımızda</a> gösterildiği şekilde HTTPS kullanımını zorlamak üzere yapılandırmanızı şiddetle öneririz.",
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index e0adbe5ec58..b06c275b268 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -110,8 +110,8 @@
"Strong password" : "Güçlü parola",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Web sunucunuz dosya transferi için düzgün bir şekilde yapılandırılmamış. WevDAV arabirimini sorunlu gözüküyor.",
"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",
+ "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.",
"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 \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP başlığı en az \"{seconds}\" saniye olarak ayarlanmış. İyileştirilmiş güvenlik için <a href=\"{docUrl}\">güvenlik ipuçlarımızda</a> belirtilen HSTS etkinleştirmesini öneririz.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Bu siteye HTTP aracılığıyla erişiyorsunuz. Sunucunuzu <a href=\"{docUrl}\">güvenlik ipuçlarımızda</a> gösterildiği şekilde HTTPS kullanımını zorlamak üzere yapılandırmanızı şiddetle öneririz.",
diff --git a/core/l10n/uk.js b/core/l10n/uk.js
index c2585f43c32..ece467103c5 100644
--- a/core/l10n/uk.js
+++ b/core/l10n/uk.js
@@ -105,8 +105,8 @@ OC.L10N.register(
"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 файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.",
"Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не налаштований як \"{expected}\". Це потенційний ризик для безпеки чи приватності і ми радимо виправити це налаштування.",
"Shared" : "Опубліковано",
"Shared with {recipients}" : "Опубліковано для {recipients}",
diff --git a/core/l10n/uk.json b/core/l10n/uk.json
index ac348537937..200c7d0cf47 100644
--- a/core/l10n/uk.json
+++ b/core/l10n/uk.json
@@ -103,8 +103,8 @@
"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 файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.",
"Error occurred while checking server setup" : "При перевірці налаштувань серверу сталася помилка",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ваш каталог даних і ваші файли можливо доступні з інтернету. .htaccess файл не працює. Ми наполегливо рекомендуємо вам налаштувати ваш веб сервер таким чином, щоб каталог даних більше не був доступний або перемістіть каталог даних за межі кореня веб сервера.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP заголовок \"{header}\" не налаштований як \"{expected}\". Це потенційний ризик для безпеки чи приватності і ми радимо виправити це налаштування.",
"Shared" : "Опубліковано",
"Shared with {recipients}" : "Опубліковано для {recipients}",
diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js
index 49e24e1412e..2d35f6e2b96 100644
--- a/core/l10n/zh_CN.js
+++ b/core/l10n/zh_CN.js
@@ -112,8 +112,8 @@ OC.L10N.register(
"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." : "此服务器上没有可用的因特网连接. 这意味着某些特性将无法工作,例如挂载外部存储器, 提醒更新或安装第三方应用等. 从远程访问文件和发送提醒电子邮件也可能无法工作. 如果你想要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." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
"Error occurred while checking server setup" : "当检查服务器启动时出错",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 头部没有配置和 \"{expected}\" 的一样。这是一个潜在的安全或者隐私风险,我们调整这项设置。",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 严格传输安全(Strict-Transport-Security)报头未配置到至少“{seconds}”秒。处于增强安全性考虑,我们推荐按照<a href=\"{docUrl}\">安全提示</a>启用 HSTS。",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点,我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>配置服务器强制使用 HTTPS。",
diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json
index 0c3f8972b71..4c3a33c7efa 100644
--- a/core/l10n/zh_CN.json
+++ b/core/l10n/zh_CN.json
@@ -110,8 +110,8 @@
"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." : "此服务器上没有可用的因特网连接. 这意味着某些特性将无法工作,例如挂载外部存储器, 提醒更新或安装第三方应用等. 从远程访问文件和发送提醒电子邮件也可能无法工作. 如果你想要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." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
"Error occurred while checking server setup" : "当检查服务器启动时出错",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 头部没有配置和 \"{expected}\" 的一样。这是一个潜在的安全或者隐私风险,我们调整这项设置。",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP 严格传输安全(Strict-Transport-Security)报头未配置到至少“{seconds}”秒。处于增强安全性考虑,我们推荐按照<a href=\"{docUrl}\">安全提示</a>启用 HSTS。",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在通过 HTTP 访问该站点,我们强烈建议您按照<a href=\"{docUrl}\">安全提示</a>配置服务器强制使用 HTTPS。",
diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js
index e39cc2bdcc8..df53568d7ae 100644
--- a/core/l10n/zh_TW.js
+++ b/core/l10n/zh_TW.js
@@ -120,7 +120,6 @@ 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 界面有問題",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "您的網路伺服器尚未妥善的設定\"{url}\"。更多資訊請參閱我們的 <a target=\"_blank\" href=\"{docLink}\">文件</a>。",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "伺服器沒有網際網路連線,有些功能,像是外部儲存、更新版通知將無法運作。從遠端存取資料或是寄送 email 通知可能也無法運作。建議您設定好網際網路連線以使用所有功能。",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "沒有設定 memory cache,為了增加效能,可以設定一個 memory cache ,請到<a target=\"_blank\" href=\"{docLink}\">我們的文件</a>取得更多資訊",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom 無法被 PHP 讀取,將造成安全性風險,請到<a target=\"_blank\" href=\"{docLink}\">我們的文件</a>取得更多資訊",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "您的PHP版本 ({version}) 不再被<a href=\"{phpLink}\">PHP</a>支援,我們建議您升級您的PHP版本來提升效能以及安全性。",
@@ -128,6 +127,7 @@ OC.L10N.register(
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 被設置成分散式緩存模式,但已經安裝了錯誤的PHP模組 \"memcache\"。\\OC\\Memcache\\Memcached 只支援 \"memcached\",並未支援\"memcache\"。請參閱<a target=\"_blank\" href=\"{wikiLink}\">關於這兩個模組的wiki</a>。",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "有些檔案並未通過程式碼完整性的檢查,更多有關如何解決上述問題的資訊請參閱我們的 <a target=\"_blank\" href=\"{docLink}\">文件</a>。(<a href=\"{codeIntegrityDownloadEndpoint}\">列出所有無效的檔案…</a> / <a href=\"{rescanEndpoint}\">重新掃描…</a>)",
"Error occurred while checking server setup" : "檢查伺服器設定時發生錯誤",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "您的資料目錄和您的檔案可能從網路網路被存取,使.htaccess 檔案無法發揮效果,我們強烈建議您配置您的網頁伺服器讓資料目錄不再被訪問存取或者將您的資料目錄移出網頁伺服器根目錄。",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 標頭配置與 \"{expected}\"不一樣,這是一個潛在安全性或者隱私上的風險,因此我們建議您調整此設定",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP 標頭 (HSTS) 並非設定為至少 {seconds} 秒,如我們的<a href=\"{docUrl}\">安全性提示</a>所述,為了加強安全性,我們建議啟動 HSTS (HTTP 強制安全傳輸)",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在藉由 HTTP 訪問此網站,如我們的<a href=\"{docUrl}\">安全性提示</a>所述,我們強烈建議設定您的伺服器須要求使用 HTTPS",
diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json
index 95df2e2f841..7b80119867f 100644
--- a/core/l10n/zh_TW.json
+++ b/core/l10n/zh_TW.json
@@ -118,7 +118,6 @@
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "您的網頁伺服器無法提供檔案同步功能,因為 WebDAV 界面有問題",
"Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "您的網路伺服器尚未妥善的設定\"{url}\"。更多資訊請參閱我們的 <a target=\"_blank\" href=\"{docLink}\">文件</a>。",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "伺服器沒有網際網路連線,有些功能,像是外部儲存、更新版通知將無法運作。從遠端存取資料或是寄送 email 通知可能也無法運作。建議您設定好網際網路連線以使用所有功能。",
- "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 target=\"_blank\" href=\"{docLink}\">documentation</a>." : "沒有設定 memory cache,為了增加效能,可以設定一個 memory cache ,請到<a target=\"_blank\" href=\"{docLink}\">我們的文件</a>取得更多資訊",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom 無法被 PHP 讀取,將造成安全性風險,請到<a target=\"_blank\" href=\"{docLink}\">我們的文件</a>取得更多資訊",
"Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "您的PHP版本 ({version}) 不再被<a href=\"{phpLink}\">PHP</a>支援,我們建議您升級您的PHP版本來提升效能以及安全性。",
@@ -126,6 +125,7 @@
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached 被設置成分散式緩存模式,但已經安裝了錯誤的PHP模組 \"memcache\"。\\OC\\Memcache\\Memcached 只支援 \"memcached\",並未支援\"memcache\"。請參閱<a target=\"_blank\" href=\"{wikiLink}\">關於這兩個模組的wiki</a>。",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "有些檔案並未通過程式碼完整性的檢查,更多有關如何解決上述問題的資訊請參閱我們的 <a target=\"_blank\" href=\"{docLink}\">文件</a>。(<a href=\"{codeIntegrityDownloadEndpoint}\">列出所有無效的檔案…</a> / <a href=\"{rescanEndpoint}\">重新掃描…</a>)",
"Error occurred while checking server setup" : "檢查伺服器設定時發生錯誤",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "您的資料目錄和您的檔案可能從網路網路被存取,使.htaccess 檔案無法發揮效果,我們強烈建議您配置您的網頁伺服器讓資料目錄不再被訪問存取或者將您的資料目錄移出網頁伺服器根目錄。",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP 標頭配置與 \"{expected}\"不一樣,這是一個潛在安全性或者隱私上的風險,因此我們建議您調整此設定",
"The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP 標頭 (HSTS) 並非設定為至少 {seconds} 秒,如我們的<a href=\"{docUrl}\">安全性提示</a>所述,為了加強安全性,我們建議啟動 HSTS (HTTP 強制安全傳輸)",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "您正在藉由 HTTP 訪問此網站,如我們的<a href=\"{docUrl}\">安全性提示</a>所述,我們強烈建議設定您的伺服器須要求使用 HTTPS",
diff --git a/core/register_command.php b/core/register_command.php
index 5f9a2675873..2e9e80fe8d7 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -43,6 +43,13 @@ $application->add(new \OC\Core\Command\Integrity\SignCore(
\OC::$server->getIntegrityCodeChecker(),
new \OC\IntegrityCheck\Helpers\FileAccessHelper()
));
+$application->add(new \OC\Core\Command\Integrity\CheckApp(
+ \OC::$server->getIntegrityCodeChecker()
+));
+$application->add(new \OC\Core\Command\Integrity\CheckCore(
+ \OC::$server->getIntegrityCodeChecker()
+));
+
if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
$application->add(new OC\Core\Command\App\Disable(\OC::$server->getAppManager()));
diff --git a/core/shipped.json b/core/shipped.json
index 069bb210ba7..b74f2f28c47 100644
--- a/core/shipped.json
+++ b/core/shipped.json
@@ -8,6 +8,7 @@
"enterprise_key",
"external",
"federation",
+ "federatedfilesharing",
"files",
"files_antivirus",
"files_drop",
@@ -39,6 +40,7 @@
],
"alwaysEnabled": [
"files",
- "dav"
+ "dav",
+ "federatedfilesharing"
]
}
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index 668c349f66c..dfc114816ec 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -120,6 +120,7 @@ OC.L10N.register(
"Apps" : "Aplikace",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Pouze následující znaky jsou povoleny pro uživatelské jméno: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
"A valid username must be provided" : "Musíte zadat platné uživatelské jméno",
+ "Username contains whitespace at the beginning or at the end" : "Uživatelské jméno obsahuje mezery na svém začátku nebo konci",
"A valid password must be provided" : "Musíte zadat platné heslo",
"The username is already being used" : "Uživatelské jméno je již využíváno",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nejsou instalovány ovladače databází (sqlite, mysql nebo postresql).",
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index f7de6d610cf..a729493c09c 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -118,6 +118,7 @@
"Apps" : "Aplikace",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Pouze následující znaky jsou povoleny pro uživatelské jméno: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
"A valid username must be provided" : "Musíte zadat platné uživatelské jméno",
+ "Username contains whitespace at the beginning or at the end" : "Uživatelské jméno obsahuje mezery na svém začátku nebo konci",
"A valid password must be provided" : "Musíte zadat platné heslo",
"The username is already being used" : "Uživatelské jméno je již využíváno",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nejsou instalovány ovladače databází (sqlite, mysql nebo postresql).",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index b9f54fc3b51..0b5e385d781 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -113,6 +113,7 @@ OC.L10N.register(
"Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte",
"Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden",
"Apps" : "Apps",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: \"a-z“, \"A-Z“, \"0-9“ und \"_.@-'“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
"The username is already being used" : "Dieser Benutzername existiert bereits",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 826775e7a4c..79495ea008f 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -111,6 +111,7 @@
"Sharing %s failed, because the file could not be found in the file cache" : "Freigabe von %s fehlgeschlagen, da die Datei im Datei-Cache nicht gefunden werden konnte",
"Could not find category \"%s\"" : "Die Kategorie „%s“ konnte nicht gefunden werden",
"Apps" : "Apps",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Folgende Zeichen sind im Benutzernamen erlaubt: \"a-z“, \"A-Z“, \"0-9“ und \"_.@-'“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
"The username is already being used" : "Dieser Benutzername existiert bereits",
diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js
index 43e4e35f258..56499eb89fa 100644
--- a/lib/l10n/eu.js
+++ b/lib/l10n/eu.js
@@ -35,6 +35,7 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["orain dela minutu %n","orain dela %n minutu"],
"seconds ago" : "segundu",
"web services under your control" : "web zerbitzuak zure kontrolpean",
+ "File name contains at least one invalid character" : "Fitxategi izenak behintzat baliogabeko karaktere bat du",
"App directory already exists" : "Aplikazioaren karpeta dagoeneko existitzen da",
"Can't create app folder. Please fix permissions. %s" : "Ezin izan da aplikazioaren karpeta sortu. Mesdez konpondu baimenak. %s",
"No source specified when installing app" : "Ez da jatorririk zehaztu aplikazioa instalatzerakoan",
diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json
index 6e104c0fdc2..91547707f32 100644
--- a/lib/l10n/eu.json
+++ b/lib/l10n/eu.json
@@ -33,6 +33,7 @@
"_%n minute ago_::_%n minutes ago_" : ["orain dela minutu %n","orain dela %n minutu"],
"seconds ago" : "segundu",
"web services under your control" : "web zerbitzuak zure kontrolpean",
+ "File name contains at least one invalid character" : "Fitxategi izenak behintzat baliogabeko karaktere bat du",
"App directory already exists" : "Aplikazioaren karpeta dagoeneko existitzen da",
"Can't create app folder. Please fix permissions. %s" : "Ezin izan da aplikazioaren karpeta sortu. Mesdez konpondu baimenak. %s",
"No source specified when installing app" : "Ez da jatorririk zehaztu aplikazioa instalatzerakoan",
diff --git a/lib/l10n/fi_FI.js b/lib/l10n/fi_FI.js
index 2d9bd6f681d..8b273fcc238 100644
--- a/lib/l10n/fi_FI.js
+++ b/lib/l10n/fi_FI.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"Apps" : "Sovellukset",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Vain seuraavat merkit ovat sallittuja käyttäjätunnuksessa: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-'\"",
"A valid username must be provided" : "Anna kelvollinen käyttäjätunnus",
+ "Username contains whitespace at the beginning or at the end" : "Käyttäjätunnus sisältää tyhjätilaa joko alussa tai lopussa",
"A valid password must be provided" : "Anna kelvollinen salasana",
"The username is already being used" : "Käyttäjätunnus on jo käytössä",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Tietokanta-ajureita (sqlite, mysql tai postgresql) ei ole asennettu.",
diff --git a/lib/l10n/fi_FI.json b/lib/l10n/fi_FI.json
index 31ef261b6c9..3db25f9f220 100644
--- a/lib/l10n/fi_FI.json
+++ b/lib/l10n/fi_FI.json
@@ -103,6 +103,7 @@
"Apps" : "Sovellukset",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Vain seuraavat merkit ovat sallittuja käyttäjätunnuksessa: \"a-z\", \"A-Z\", \"0-9\" ja \"_.@-'\"",
"A valid username must be provided" : "Anna kelvollinen käyttäjätunnus",
+ "Username contains whitespace at the beginning or at the end" : "Käyttäjätunnus sisältää tyhjätilaa joko alussa tai lopussa",
"A valid password must be provided" : "Anna kelvollinen salasana",
"The username is already being used" : "Käyttäjätunnus on jo käytössä",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Tietokanta-ajureita (sqlite, mysql tai postgresql) ei ole asennettu.",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index d59fea314e3..24bfced6f7c 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -34,6 +34,7 @@ OC.L10N.register(
"_%n month ago_::_%n months ago_" : ["Il y a %n mois","Il y a %n mois"],
"last year" : "l'année dernière",
"_%n year ago_::_%n years ago_" : ["il y a %n an","il y a %n ans"],
+ "_%n hour ago_::_%n hours ago_" : ["Il y a %n heure","Il y a %n heures"],
"_%n minute ago_::_%n minutes ago_" : ["il y a %n minute","il y a %n minutes"],
"seconds ago" : "il y a quelques secondes",
"web services under your control" : "services web sous votre contrôle",
@@ -117,8 +118,9 @@ OC.L10N.register(
"Cannot set expiration date more than %s days in the future" : "Impossible de définir la date d'expiration à plus de %s jours dans le futur",
"Could not find category \"%s\"" : "Impossible de trouver la catégorie \"%s\"",
"Apps" : "Applications",
- "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", et \"_.@-'\"",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", \"_@-\" et \".\" (le point)",
"A valid username must be provided" : "Un nom d'utilisateur valide doit être saisi",
+ "Username contains whitespace at the beginning or at the end" : "Le nom d'utilisateur contient des espaces au début ou à la fin",
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
"The username is already being used" : "Ce nom d'utilisateur est déjà utilisé",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Aucun pilote de base de données n’est installé (sqlite, mysql ou postgresql).",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index 21ed66eb278..bacb0a4211b 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -32,6 +32,7 @@
"_%n month ago_::_%n months ago_" : ["Il y a %n mois","Il y a %n mois"],
"last year" : "l'année dernière",
"_%n year ago_::_%n years ago_" : ["il y a %n an","il y a %n ans"],
+ "_%n hour ago_::_%n hours ago_" : ["Il y a %n heure","Il y a %n heures"],
"_%n minute ago_::_%n minutes ago_" : ["il y a %n minute","il y a %n minutes"],
"seconds ago" : "il y a quelques secondes",
"web services under your control" : "services web sous votre contrôle",
@@ -115,8 +116,9 @@
"Cannot set expiration date more than %s days in the future" : "Impossible de définir la date d'expiration à plus de %s jours dans le futur",
"Could not find category \"%s\"" : "Impossible de trouver la catégorie \"%s\"",
"Apps" : "Applications",
- "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", et \"_.@-'\"",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Seuls les caractères suivants sont autorisés dans un nom d'utilisateur : \"a-z\", \"A-Z\", \"0-9\", \"_@-\" et \".\" (le point)",
"A valid username must be provided" : "Un nom d'utilisateur valide doit être saisi",
+ "Username contains whitespace at the beginning or at the end" : "Le nom d'utilisateur contient des espaces au début ou à la fin",
"A valid password must be provided" : "Un mot de passe valide doit être saisi",
"The username is already being used" : "Ce nom d'utilisateur est déjà utilisé",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Aucun pilote de base de données n’est installé (sqlite, mysql ou postgresql).",
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index eaaa186a41a..7aab74e24e5 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -120,6 +120,7 @@ OC.L10N.register(
"Apps" : "Applicazioni",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Solo i seguenti caratteri sono consentiti in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Deve essere fornito un nome utente valido",
+ "Username contains whitespace at the beginning or at the end" : "Il nome utente contiene spazi all'inizio o alla fine",
"A valid password must be provided" : "Deve essere fornita una password valida",
"The username is already being used" : "Il nome utente è già utilizzato",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nessun driver di database (sqlite, mysql o postgresql) installato",
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index f29b3a2a740..f4238e6e598 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -118,6 +118,7 @@
"Apps" : "Applicazioni",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Solo i seguenti caratteri sono consentiti in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Deve essere fornito un nome utente valido",
+ "Username contains whitespace at the beginning or at the end" : "Il nome utente contiene spazi all'inizio o alla fine",
"A valid password must be provided" : "Deve essere fornita una password valida",
"The username is already being used" : "Il nome utente è già utilizzato",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nessun driver di database (sqlite, mysql o postgresql) installato",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index e3433a18d7a..971a622f0fc 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -113,12 +113,14 @@ OC.L10N.register(
"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 の共有に失敗しました。ファイルキャッシュにファイルがありませんでした。",
+ "Cannot increase permissions of %s" : "%s の権限を強化できません",
"Expiration date is in the past" : "有効期限が切れています",
"Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした",
"Apps" : "アプリ",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "有効なユーザー名を指定する必要があります",
+ "Username contains whitespace at the beginning or at the end" : "ユーザー名の最初か最後に空白が含まれています",
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
"The username is already being used" : "ユーザー名はすでに使われています",
"No database drivers (sqlite, mysql, or postgresql) installed." : "データベースドライバー (sqlite, mysql, postgresql) がインストールされていません。",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index a4b18386c7a..defcbdffebd 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -111,12 +111,14 @@
"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 の共有に失敗しました。ファイルキャッシュにファイルがありませんでした。",
+ "Cannot increase permissions of %s" : "%s の権限を強化できません",
"Expiration date is in the past" : "有効期限が切れています",
"Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした",
"Apps" : "アプリ",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
"A valid username must be provided" : "有効なユーザー名を指定する必要があります",
+ "Username contains whitespace at the beginning or at the end" : "ユーザー名の最初か最後に空白が含まれています",
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
"The username is already being used" : "ユーザー名はすでに使われています",
"No database drivers (sqlite, mysql, or postgresql) installed." : "データベースドライバー (sqlite, mysql, postgresql) がインストールされていません。",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index e49ddc6d27c..9e009e6d180 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -120,6 +120,7 @@ OC.L10N.register(
"Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", en \"_.@-\"",
"A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven",
+ "Username contains whitespace at the beginning or at the end" : "De gebruikersnaam bevat spaties aan het begin of eind",
"A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven",
"The username is already being used" : "De gebruikersnaam bestaat al",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Geen database drivers (sqlite, mysql of postgres) geïnstalleerd.",
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index 78b54fbbc6d..22b125ab713 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -118,6 +118,7 @@
"Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", en \"_.@-\"",
"A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven",
+ "Username contains whitespace at the beginning or at the end" : "De gebruikersnaam bevat spaties aan het begin of eind",
"A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven",
"The username is already being used" : "De gebruikersnaam bestaat al",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Geen database drivers (sqlite, mysql of postgres) geïnstalleerd.",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 1ffbdc17a7b..9baa9f51a44 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -120,6 +120,7 @@ OC.L10N.register(
"Apps" : "Aplicações",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Somente os seguintes caracteres são permitidos em um nome de usuário: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Forneça um nome de usuário válido",
+ "Username contains whitespace at the beginning or at the end" : "O nome de usuário contém espaço em branco no início ou no fim",
"A valid password must be provided" : "Forneça uma senha válida",
"The username is already being used" : "Este nome de usuário já está sendo usado",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhum driver de banco de dados (sqlite, mysql, or postgresql) instalado.",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index cb0e48af0db..e2bb90fd0ce 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -118,6 +118,7 @@
"Apps" : "Aplicações",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Somente os seguintes caracteres são permitidos em um nome de usuário: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Forneça um nome de usuário válido",
+ "Username contains whitespace at the beginning or at the end" : "O nome de usuário contém espaço em branco no início ou no fim",
"A valid password must be provided" : "Forneça uma senha válida",
"The username is already being used" : "Este nome de usuário já está sendo usado",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhum driver de banco de dados (sqlite, mysql, or postgresql) instalado.",
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index b2f2a21afb5..9ea7b813e70 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -117,6 +117,7 @@ OC.L10N.register(
"Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Apenas os seguintes caracteres são permitidos num nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido",
+ "Username contains whitespace at the beginning or at the end" : "Nome de utilizador contém espaço em branco no início ou no fim",
"A valid password must be provided" : "Uma password válida deve ser fornecida",
"The username is already being used" : "O nome de utilizador já está a ser usado",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhuma base de dados de drivers (sqlite, mysql, or postgresql) instaladas.",
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index c1a7f6dfd4a..60a31bb4393 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -115,6 +115,7 @@
"Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Apenas os seguintes caracteres são permitidos num nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Um nome de utilizador válido deve ser fornecido",
+ "Username contains whitespace at the beginning or at the end" : "Nome de utilizador contém espaço em branco no início ou no fim",
"A valid password must be provided" : "Uma password válida deve ser fornecida",
"The username is already being used" : "O nome de utilizador já está a ser usado",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhuma base de dados de drivers (sqlite, mysql, or postgresql) instaladas.",
diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js
index 18805d6337a..bfb5b12cc32 100644
--- a/lib/l10n/sq.js
+++ b/lib/l10n/sq.js
@@ -120,6 +120,7 @@ OC.L10N.register(
"Apps" : "Aplikacione",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"",
"A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi",
+ "Username contains whitespace at the beginning or at the end" : "Emri i përdoruesit përmban hapësirë në fillim ose në fund",
"A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm",
"The username is already being used" : "Emri i përdoruesit është tashmë i përdorur",
"No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.",
diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json
index 353659069e5..7768167dc4f 100644
--- a/lib/l10n/sq.json
+++ b/lib/l10n/sq.json
@@ -118,6 +118,7 @@
"Apps" : "Aplikacione",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"",
"A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi",
+ "Username contains whitespace at the beginning or at the end" : "Emri i përdoruesit përmban hapësirë në fillim ose në fund",
"A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm",
"The username is already being used" : "Emri i përdoruesit është tashmë i përdorur",
"No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.",
diff --git a/lib/private/app/appmanager.php b/lib/private/app/appmanager.php
index bf07a2ef548..eeb2216d5a8 100644
--- a/lib/private/app/appmanager.php
+++ b/lib/private/app/appmanager.php
@@ -27,11 +27,13 @@
namespace OC\App;
use OCP\App\IAppManager;
+use OCP\App\ManagerEvent;
use OCP\IAppConfig;
use OCP\ICacheFactory;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserSession;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class AppManager implements IAppManager {
@@ -68,6 +70,9 @@ class AppManager implements IAppManager {
/** @var string[] */
private $alwaysEnabled;
+ /** @var EventDispatcherInterface */
+ private $dispatcher;
+
/**
* @param \OCP\IUserSession $userSession
* @param \OCP\IAppConfig $appConfig
@@ -77,11 +82,13 @@ class AppManager implements IAppManager {
public function __construct(IUserSession $userSession,
IAppConfig $appConfig,
IGroupManager $groupManager,
- ICacheFactory $memCacheFactory) {
+ ICacheFactory $memCacheFactory,
+ EventDispatcherInterface $dispatcher) {
$this->userSession = $userSession;
$this->appConfig = $appConfig;
$this->groupManager = $groupManager;
$this->memCacheFactory = $memCacheFactory;
+ $this->dispatcher = $dispatcher;
}
/**
@@ -201,6 +208,9 @@ class AppManager implements IAppManager {
public function enableApp($appId) {
$this->installedAppsCache[$appId] = 'yes';
$this->appConfig->setValue($appId, 'enabled', 'yes');
+ $this->dispatcher->dispatch(ManagerEvent::EVENT_APP_ENABLE, new ManagerEvent(
+ ManagerEvent::EVENT_APP_ENABLE, $appId
+ ));
$this->clearAppsCache();
}
@@ -226,6 +236,9 @@ class AppManager implements IAppManager {
}, $groups);
$this->installedAppsCache[$appId] = json_encode($groupIds);
$this->appConfig->setValue($appId, 'enabled', json_encode($groupIds));
+ $this->dispatcher->dispatch(ManagerEvent::EVENT_APP_ENABLE_FOR_GROUPS, new ManagerEvent(
+ ManagerEvent::EVENT_APP_ENABLE_FOR_GROUPS, $appId, $groups
+ ));
$this->clearAppsCache();
}
@@ -241,6 +254,9 @@ class AppManager implements IAppManager {
}
unset($this->installedAppsCache[$appId]);
$this->appConfig->setValue($appId, 'enabled', 'no');
+ $this->dispatcher->dispatch(ManagerEvent::EVENT_APP_ENABLE, new ManagerEvent(
+ ManagerEvent::EVENT_APP_DISABLE, $appId
+ ));
$this->clearAppsCache();
}
diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php
index 5fc45fdd2e8..f74fe4aeb99 100644
--- a/lib/private/appframework/dependencyinjection/dicontainer.php
+++ b/lib/private/appframework/dependencyinjection/dicontainer.php
@@ -104,6 +104,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return $this->getServer()->getCapabilitiesManager();
});
+ $this->registerService('OCP\Comments\ICommentsManager', function($c) {
+ return $this->getServer()->getCommentsManager();
+ });
+
$this->registerService('OCP\\IConfig', function($c) {
return $this->getServer()->getConfig();
});
diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php
index 0cacc1cce71..36b2d9d08b8 100644
--- a/lib/private/comments/manager.php
+++ b/lib/private/comments/manager.php
@@ -21,6 +21,7 @@
namespace OC\Comments;
use Doctrine\DBAL\Exception\DriverException;
+use OCP\Comments\CommentsEvent;
use OCP\Comments\IComment;
use OCP\Comments\ICommentsManager;
use OCP\Comments\NotFoundException;
@@ -28,6 +29,7 @@ use OCP\IDBConnection;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUser;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class Manager implements ICommentsManager {
@@ -37,20 +39,33 @@ class Manager implements ICommentsManager {
/** @var ILogger */
protected $logger;
- /** @var IComment[] */
- protected $commentsCache = [];
-
/** @var IConfig */
protected $config;
+ /** @var EventDispatcherInterface */
+ protected $dispatcher;
+
+ /** @var IComment[] */
+ protected $commentsCache = [];
+
+ /**
+ * Manager constructor.
+ *
+ * @param IDBConnection $dbConn
+ * @param ILogger $logger
+ * @param IConfig $config
+ * @param EventDispatcherInterface $dispatcher
+ */
public function __construct(
IDBConnection $dbConn,
ILogger $logger,
- IConfig $config
+ IConfig $config,
+ EventDispatcherInterface $dispatcher
) {
$this->dbConn = $dbConn;
$this->logger = $logger;
$this->config = $config;
+ $this->dispatcher = $dispatcher;
}
/**
@@ -415,6 +430,13 @@ class Manager implements ICommentsManager {
throw new \InvalidArgumentException('Parameter must be string');
}
+ try {
+ $comment = $this->get($id);
+ } catch (\Exception $e) {
+ // Ignore exceptions, we just don't fire a hook then
+ $comment = null;
+ }
+
$qb = $this->dbConn->getQueryBuilder();
$query = $qb->delete('comments')
->where($qb->expr()->eq('id', $qb->createParameter('id')))
@@ -427,11 +449,19 @@ class Manager implements ICommentsManager {
$this->logger->logException($e, ['app' => 'core_comments']);
return false;
}
+
+ if ($affectedRows > 0 && $comment instanceof IComment) {
+ $this->dispatcher->dispatch(CommentsEvent::EVENT_DELETE, new CommentsEvent(
+ CommentsEvent::EVENT_DELETE,
+ $comment
+ ));
+ }
+
return ($affectedRows > 0);
}
/**
- * saves the comment permanently and returns it
+ * saves the comment permanently
*
* if the supplied comment has an empty ID, a new entry comment will be
* saved and the instance updated with the new ID.
@@ -493,6 +523,11 @@ class Manager implements ICommentsManager {
$comment->setId(strval($qb->getLastInsertId()));
}
+ $this->dispatcher->dispatch(CommentsEvent::EVENT_ADD, new CommentsEvent(
+ CommentsEvent::EVENT_ADD,
+ $comment
+ ));
+
return $affectedRows > 0;
}
@@ -526,6 +561,11 @@ class Manager implements ICommentsManager {
throw new NotFoundException('Comment to update does ceased to exist');
}
+ $this->dispatcher->dispatch(CommentsEvent::EVENT_UPDATE, new CommentsEvent(
+ CommentsEvent::EVENT_UPDATE,
+ $comment
+ ));
+
return $affectedRows > 0;
}
diff --git a/lib/private/comments/managerfactory.php b/lib/private/comments/managerfactory.php
index d3f6c44e539..b8e77c64fae 100644
--- a/lib/private/comments/managerfactory.php
+++ b/lib/private/comments/managerfactory.php
@@ -52,7 +52,8 @@ class ManagerFactory implements ICommentsManagerFactory {
return new Manager(
$this->serverContainer->getDatabaseConnection(),
$this->serverContainer->getLogger(),
- $this->serverContainer->getConfig()
+ $this->serverContainer->getConfig(),
+ $this->serverContainer->getEventDispatcher()
);
}
}
diff --git a/lib/private/console/application.php b/lib/private/console/application.php
index c7d9c24d7cb..10ff69b1c80 100644
--- a/lib/private/console/application.php
+++ b/lib/private/console/application.php
@@ -25,25 +25,34 @@ namespace OC\Console;
use OC_App;
use OC_Defaults;
+use OCP\Console\ConsoleEvent;
use OCP\IConfig;
+use OCP\IRequest;
use Symfony\Component\Console\Application as SymfonyApplication;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class Application {
- /**
- * @var IConfig
- */
+ /** @var IConfig */
private $config;
+ /** @var EventDispatcherInterface */
+ private $dispatcher;
+ /** @var IRequest */
+ private $request;
/**
* @param IConfig $config
+ * @param EventDispatcherInterface $dispatcher
+ * @param IRequest $request
*/
- public function __construct(IConfig $config) {
+ public function __construct(IConfig $config, EventDispatcherInterface $dispatcher, IRequest $request) {
$defaults = new OC_Defaults;
$this->config = $config;
$this->application = new SymfonyApplication($defaults->getName(), \OC_Util::getVersionString());
+ $this->dispatcher = $dispatcher;
+ $this->request = $request;
}
/**
@@ -107,6 +116,10 @@ class Application {
* @throws \Exception
*/
public function run(InputInterface $input = null, OutputInterface $output = null) {
+ $this->dispatcher->dispatch(ConsoleEvent::EVENT_RUN, new ConsoleEvent(
+ ConsoleEvent::EVENT_RUN,
+ $this->request->server['argv']
+ ));
return $this->application->run($input, $output);
}
}
diff --git a/lib/private/db/mdb2schemamanager.php b/lib/private/db/mdb2schemamanager.php
index 495ccb902d6..bcabb6fe57a 100644
--- a/lib/private/db/mdb2schemamanager.php
+++ b/lib/private/db/mdb2schemamanager.php
@@ -49,7 +49,6 @@ class MDB2SchemaManager {
/**
* saves database scheme to xml file
* @param string $file name of file
- * @param int|string $mode
* @return bool
*
* TODO: write more documentation
@@ -123,7 +122,7 @@ class MDB2SchemaManager {
/**
* update the database scheme
* @param string $file file to read structure from
- * @return string|boolean
+ * @return boolean
*/
public function simulateUpdateDbFromStructure($file) {
$toSchema = $this->readSchemaFromFile($file);
diff --git a/lib/private/db/querybuilder/expressionbuilder.php b/lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php
index b688ebfabbe..7ab4c03d97c 100644
--- a/lib/private/db/querybuilder/expressionbuilder.php
+++ b/lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php
@@ -19,9 +19,13 @@
*
*/
-namespace OC\DB\QueryBuilder;
+namespace OC\DB\QueryBuilder\ExpressionBuilder;
use Doctrine\DBAL\Query\Expression\ExpressionBuilder as DoctrineExpressionBuilder;
+use OC\DB\QueryBuilder\CompositeExpression;
+use OC\DB\QueryBuilder\Literal;
+use OC\DB\QueryBuilder\QueryFunction;
+use OC\DB\QueryBuilder\QuoteHelper;
use OCP\DB\QueryBuilder\IExpressionBuilder;
use OCP\IDBConnection;
@@ -331,4 +335,17 @@ class ExpressionBuilder implements IExpressionBuilder {
public function literal($input, $type = null) {
return new Literal($this->expressionBuilder->literal($input, $type));
}
+
+ /**
+ * Returns a IQueryFunction that casts the column to the given type
+ *
+ * @param string $column
+ * @param mixed $type One of IQueryBuilder::PARAM_*
+ * @return string
+ */
+ public function castColumn($column, $type) {
+ return new QueryFunction(
+ $this->helper->quoteColumnName($column)
+ );
+ }
}
diff --git a/lib/private/db/querybuilder/ociexpressionbuilder.php b/lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php
index 4c127bd752d..6a6d0f455f6 100644
--- a/lib/private/db/querybuilder/ociexpressionbuilder.php
+++ b/lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php
@@ -19,24 +19,25 @@
*
*/
-namespace OC\DB\QueryBuilder;
+namespace OC\DB\QueryBuilder\ExpressionBuilder;
+use OC\DB\QueryBuilder\QueryFunction;
use OCP\DB\QueryBuilder\ILiteral;
use OCP\DB\QueryBuilder\IParameter;
use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\DB\QueryBuilder\IQueryFunction;
class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @param mixed $column
* @param mixed|null $type
- * @return array|QueryFunction|string
+ * @return array|IQueryFunction|string
*/
protected function prepareColumn($column, $type) {
if ($type === IQueryBuilder::PARAM_STR && !is_array($column) && !($column instanceof IParameter) && !($column instanceof ILiteral)) {
- $column = $this->helper->quoteColumnName($column);
- $column = new QueryFunction('to_char(' . $column . ')');
+ $column = $this->castColumn($column, $type);
} else {
$column = $this->helper->quoteColumnNames($column);
}
@@ -132,4 +133,20 @@ class OCIExpressionBuilder extends ExpressionBuilder {
return $this->expressionBuilder->notIn($x, $y);
}
+
+ /**
+ * Returns a IQueryFunction that casts the column to the given type
+ *
+ * @param string $column
+ * @param mixed $type One of IQueryBuilder::PARAM_*
+ * @return IQueryFunction
+ */
+ public function castColumn($column, $type) {
+ if ($type === IQueryBuilder::PARAM_STR) {
+ $column = $this->helper->quoteColumnName($column);
+ return new QueryFunction('to_char(' . $column . ')');
+ }
+
+ return parent::castColumn($column, $type);
+ }
}
diff --git a/lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php b/lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php
new file mode 100644
index 00000000000..8a0b68db998
--- /dev/null
+++ b/lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\ExpressionBuilder;
+
+
+use OC\DB\QueryBuilder\QueryFunction;
+use OCP\DB\QueryBuilder\IQueryBuilder;
+
+class PgSqlExpressionBuilder extends ExpressionBuilder {
+
+ /**
+ * Returns a IQueryFunction that casts the column to the given type
+ *
+ * @param string $column
+ * @param mixed $type One of IQueryBuilder::PARAM_*
+ * @return string
+ */
+ public function castColumn($column, $type) {
+ if ($type === IQueryBuilder::PARAM_INT) {
+ $column = $this->helper->quoteColumnName($column);
+ return new QueryFunction('CAST(' . $column . ' AS INT)');
+ }
+
+ return parent::castColumn($column, $type);
+ }
+}
diff --git a/lib/private/db/querybuilder/querybuilder.php b/lib/private/db/querybuilder/querybuilder.php
index 42b290b90e7..ff31ffbc043 100644
--- a/lib/private/db/querybuilder/querybuilder.php
+++ b/lib/private/db/querybuilder/querybuilder.php
@@ -21,7 +21,11 @@
namespace OC\DB\QueryBuilder;
+use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
use OC\DB\OracleConnection;
+use OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder;
+use OC\DB\QueryBuilder\ExpressionBuilder\OCIExpressionBuilder;
+use OC\DB\QueryBuilder\ExpressionBuilder\PgSqlExpressionBuilder;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;
use OCP\DB\QueryBuilder\IParameter;
@@ -85,6 +89,8 @@ class QueryBuilder implements IQueryBuilder {
public function expr() {
if ($this->connection instanceof OracleConnection) {
return new OCIExpressionBuilder($this->connection);
+ } else if ($this->connection->getDatabasePlatform() instanceof PostgreSqlPlatform) {
+ return new PgSqlExpressionBuilder($this->connection);
} else {
return new ExpressionBuilder($this->connection);
}
diff --git a/lib/private/diagnostics/querylogger.php b/lib/private/diagnostics/querylogger.php
index 794e7a5e263..66a65b71d04 100644
--- a/lib/private/diagnostics/querylogger.php
+++ b/lib/private/diagnostics/querylogger.php
@@ -53,7 +53,7 @@ class QueryLogger implements IQueryLogger {
}
/**
- * @return \OCP\Diagnostics\IQuery[]
+ * @return Query[]
*/
public function getQueries() {
return $this->queries;
diff --git a/lib/private/files.php b/lib/private/files.php
index 7b451ac19be..a18bcc76519 100644
--- a/lib/private/files.php
+++ b/lib/private/files.php
@@ -160,6 +160,8 @@ class OC_Files {
/**
* @param View $view
* @param string $name
+ * @param string $dir
+ * @param boolean $onlyHeader
*/
private static function getSingleFile($view, $dir, $name, $onlyHeader) {
$filename = $dir . '/' . $name;
@@ -185,7 +187,7 @@ class OC_Files {
/**
* @param View $view
- * @param $dir
+ * @param string $dir
* @param string[]|string $files
*/
public static function lockFiles($view, $dir, $files) {
@@ -290,11 +292,11 @@ class OC_Files {
}
/**
- * @param $dir
+ * @param string $dir
* @param $files
- * @param $getType
+ * @param integer $getType
* @param View $view
- * @param $filename
+ * @param string $filename
*/
private static function unlockAllTheFiles($dir, $files, $getType, $view, $filename) {
if ($getType === self::FILE) {
diff --git a/lib/private/files/config/usermountcache.php b/lib/private/files/config/usermountcache.php
index a2da3e9f528..35f40353190 100644
--- a/lib/private/files/config/usermountcache.php
+++ b/lib/private/files/config/usermountcache.php
@@ -129,7 +129,7 @@ class UserMountCache implements IUserMountCache {
'root_id' => $mount->getRootId(),
'user_id' => $mount->getUser()->getUID(),
'mount_point' => $mount->getMountPoint()
- ]);
+ ], ['root_id', 'user_id']);
}
private function setMountPoint(ICachedMountInfo $mount) {
diff --git a/lib/private/files/node/file.php b/lib/private/files/node/file.php
index cf163b9b763..f8279c00b8c 100644
--- a/lib/private/files/node/file.php
+++ b/lib/private/files/node/file.php
@@ -169,6 +169,6 @@ class File extends Node implements \OCP\Files\File {
* @inheritdoc
*/
public function getChecksum() {
- return $this->fileInfo->getChecksum();
+ return $this->getFileInfo()->getChecksum();
}
}
diff --git a/lib/private/files/node/root.php b/lib/private/files/node/root.php
index 35163be0a0d..40ed531d5df 100644
--- a/lib/private/files/node/root.php
+++ b/lib/private/files/node/root.php
@@ -169,7 +169,7 @@ class Root extends Folder implements IRootFolder {
* @param string $path
* @throws \OCP\Files\NotFoundException
* @throws \OCP\Files\NotPermittedException
- * @return \OCP\Files\Node
+ * @return string
*/
public function get($path) {
$path = $this->normalizePath($path);
diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php
index 95bb3f74ba7..3d5898dcd80 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/files/storage/common.php
@@ -248,12 +248,6 @@ abstract class Common implements Storage, ILockingStorage {
return $this->getCachedFile($path);
}
- public function getLocalFolder($path) {
- $baseDir = \OC::$server->getTempManager()->getTemporaryFolder();
- $this->addLocalFolder($path, $baseDir);
- return $baseDir;
- }
-
/**
* @param string $path
* @param string $target
@@ -396,7 +390,7 @@ abstract class Common implements Storage, ILockingStorage {
* get the ETag for a file or folder
*
* @param string $path
- * @return string|false
+ * @return string
*/
public function getETag($path) {
return uniqid();
diff --git a/lib/private/files/storage/wrapper/availability.php b/lib/private/files/storage/wrapper/availability.php
index 1550c318ce3..55ddb0d5e8f 100644
--- a/lib/private/files/storage/wrapper/availability.php
+++ b/lib/private/files/storage/wrapper/availability.php
@@ -377,17 +377,6 @@ class Availability extends Wrapper {
}
/** {@inheritdoc} */
- public function getLocalFolder($path) {
- $this->checkAvailability();
- try {
- return parent::getLocalFolder($path);
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- $this->setAvailability(false);
- throw $e;
- }
- }
-
- /** {@inheritdoc} */
public function hasUpdated($path, $time) {
$this->checkAvailability();
try {
diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php
index 69438ef0c7c..f358bd59239 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/files/storage/wrapper/encryption.php
@@ -129,9 +129,15 @@ class Encryption extends Wrapper {
if (isset($this->unencryptedSize[$fullPath])) {
$size = $this->unencryptedSize[$fullPath];
// update file cache
+ if ($info) {
+ $info = $info->getData();
+ } else {
+ $info = [];
+ }
+
$info['encrypted'] = true;
$info['size'] = $size;
- $this->getCache()->put($path, $info->getData());
+ $this->getCache()->put($path, $info);
return $size;
}
diff --git a/lib/private/files/storage/wrapper/jail.php b/lib/private/files/storage/wrapper/jail.php
index 40738befd93..e5f5ab90359 100644
--- a/lib/private/files/storage/wrapper/jail.php
+++ b/lib/private/files/storage/wrapper/jail.php
@@ -353,17 +353,6 @@ class Jail extends Wrapper {
}
/**
- * get the path to a local version of the folder.
- * The local version of the folder can be temporary and doesn't have to be persistent across requests
- *
- * @param string $path
- * @return string
- */
- public function getLocalFolder($path) {
- return $this->storage->getLocalFolder($this->getSourcePath($path));
- }
-
- /**
* check if a file or folder has been updated since $time
*
* @param string $path
diff --git a/lib/private/files/storage/wrapper/wrapper.php b/lib/private/files/storage/wrapper/wrapper.php
index c632aa399e1..12914e7a1b8 100644
--- a/lib/private/files/storage/wrapper/wrapper.php
+++ b/lib/private/files/storage/wrapper/wrapper.php
@@ -354,17 +354,6 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage {
}
/**
- * get the path to a local version of the folder.
- * The local version of the folder can be temporary and doesn't have to be persistent across requests
- *
- * @param string $path
- * @return string
- */
- public function getLocalFolder($path) {
- return $this->storage->getLocalFolder($path);
- }
-
- /**
* check if a file or folder has been updated since $time
*
* @param string $path
diff --git a/lib/private/files/stream/dir.php b/lib/private/files/stream/dir.php
index fabadb0d596..7489ee683a2 100644
--- a/lib/private/files/stream/dir.php
+++ b/lib/private/files/stream/dir.php
@@ -58,6 +58,7 @@ class Dir {
/**
* @param string $path
+ * @param string[] $content
*/
public static function register($path, $content) {
self::$dirs[$path] = $content;
diff --git a/lib/private/files/type/detection.php b/lib/private/files/type/detection.php
index 9cc2e97c3cc..f106a98064f 100644
--- a/lib/private/files/type/detection.php
+++ b/lib/private/files/type/detection.php
@@ -121,7 +121,7 @@ class Detection implements IMimeTypeDetector {
}
/**
- * @return array
+ * @return string[]
*/
public function getAllAliases() {
$this->loadAliases();
@@ -264,7 +264,7 @@ class Detection implements IMimeTypeDetector {
/**
* Get path to the icon of a file type
- * @param string $mimeType the MIME type
+ * @param string $mimetype the MIME type
* @return string the url
*/
public function mimeTypeIcon($mimetype) {
diff --git a/lib/private/integritycheck/checker.php b/lib/private/integritycheck/checker.php
index c256fe66d32..e6f9f9a1457 100644
--- a/lib/private/integritycheck/checker.php
+++ b/lib/private/integritycheck/checker.php
@@ -90,6 +90,8 @@ class Checker {
// FIXME: Once the signing server is instructed to sign daily, beta and
// RCs as well these need to be included also.
$signedChannels = [
+ 'daily',
+ 'testing',
'stable',
];
if(!in_array($this->environmentHelper->getChannel(), $signedChannels, true)) {
@@ -113,16 +115,22 @@ class Checker {
* Enumerates all files belonging to the folder. Sensible defaults are excluded.
*
* @param string $folderToIterate
+ * @param string $root
* @return \RecursiveIteratorIterator
* @throws \Exception
*/
- private function getFolderIterator($folderToIterate) {
+ private function getFolderIterator($folderToIterate, $root = '') {
$dirItr = new \RecursiveDirectoryIterator(
$folderToIterate,
\RecursiveDirectoryIterator::SKIP_DOTS
);
+ if($root === '') {
+ $root = \OC::$SERVERROOT;
+ }
+ $root = rtrim($root, '/');
+
$excludeGenericFilesIterator = new ExcludeFileByNameFilterIterator($dirItr);
- $excludeFoldersIterator = new ExcludeFoldersByPathFilterIterator($excludeGenericFilesIterator);
+ $excludeFoldersIterator = new ExcludeFoldersByPathFilterIterator($excludeGenericFilesIterator, $root);
return new \RecursiveIteratorIterator(
$excludeFoldersIterator,
@@ -234,14 +242,16 @@ class Checker {
*
* @param X509 $certificate
* @param RSA $rsa
+ * @param string $path
*/
public function writeCoreSignature(X509 $certificate,
- RSA $rsa) {
- $iterator = $this->getFolderIterator($this->environmentHelper->getServerRoot());
- $hashes = $this->generateHashes($iterator, $this->environmentHelper->getServerRoot());
+ RSA $rsa,
+ $path) {
+ $iterator = $this->getFolderIterator($path, $path);
+ $hashes = $this->generateHashes($iterator, $path);
$signatureData = $this->createSignatureData($hashes, $certificate, $rsa);
$this->fileAccessHelper->file_put_contents(
- $this->environmentHelper->getServerRoot() . '/core/signature.json',
+ $path . '/core/signature.json',
json_encode($signatureData, JSON_PRETTY_PRINT)
);
}
diff --git a/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php b/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php
index c3994197fc6..67bcd423b68 100644
--- a/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php
+++ b/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php
@@ -24,7 +24,7 @@ namespace OC\IntegrityCheck\Iterator;
class ExcludeFoldersByPathFilterIterator extends \RecursiveFilterIterator {
private $excludedFolders = [];
- public function __construct(\RecursiveIterator $iterator) {
+ public function __construct(\RecursiveIterator $iterator, $root = '') {
parent::__construct($iterator);
$appFolders = \OC::$APPSROOTS;
@@ -33,9 +33,10 @@ class ExcludeFoldersByPathFilterIterator extends \RecursiveFilterIterator {
}
$this->excludedFolders = array_merge([
- rtrim(\OC::$server->getConfig()->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data'), '/'),
- rtrim(\OC::$SERVERROOT.'/themes', '/'),
- rtrim(\OC::$SERVERROOT.'/config', '/'),
+ rtrim($root . '/data', '/'),
+ rtrim($root .'/themes', '/'),
+ rtrim($root.'/config', '/'),
+ rtrim($root.'/apps', '/'),
], $appFolders);
}
diff --git a/lib/private/repair/dropoldjobs.php b/lib/private/repair/dropoldjobs.php
index 2d6172047c2..b2e9b05caa2 100644
--- a/lib/private/repair/dropoldjobs.php
+++ b/lib/private/repair/dropoldjobs.php
@@ -71,6 +71,7 @@ class DropOldJobs extends BasicEmitter implements RepairStep {
return [
['class' => 'OC_Cache_FileGlobalGC', 'arguments' => null],
['class' => 'OC\Cache\FileGlobalGC', 'arguments' => null],
+ ['class' => 'OCA\Files\BackgroundJob\DeleteOrphanedTagsJob', 'arguments' => null],
];
}
diff --git a/lib/private/repair/repairmimetypes.php b/lib/private/repair/repairmimetypes.php
index 692a7120a63..b84f19a3082 100644
--- a/lib/private/repair/repairmimetypes.php
+++ b/lib/private/repair/repairmimetypes.php
@@ -293,6 +293,17 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
self::updateMimetypes($updatedMimetypes);
}
+ private function introduceRichDocumentsMimeTypes() {
+ $updatedMimetypes = array(
+ 'lwp' => 'application/vnd.lotus-wordpro',
+ 'one' => 'application/msonenote',
+ 'vsd' => 'application/vnd.visio',
+ 'wpd' => 'application/vnd.wordperfect',
+ );
+
+ self::updateMimetypes($updatedMimetypes);
+ }
+
/**
* Fix mime types
*/
@@ -356,5 +367,11 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
$this->emit('\OC\Repair', 'info', array('Fixed rtf mime type'));
}
}
+
+ if (version_compare($ocVersionFromBeforeUpdate, '9.0.0.10', '<')) {
+ if ($this->introduceRichDocumentsMimeTypes()) {
+ $this->emit('\OC\Repair', 'info', array('Fixed richdocuments additional office mime types'));
+ }
+ }
}
}
diff --git a/lib/private/server.php b/lib/private/server.php
index 55ac64a0c2d..0d1bed4e7d2 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -413,7 +413,8 @@ class Server extends ServerContainer implements IServerContainer {
$c->getUserSession(),
$c->getAppConfig(),
$c->getGroupManager(),
- $c->getMemCacheFactory()
+ $c->getMemCacheFactory(),
+ $c->getEventDispatcher()
);
});
$this->registerService('DateTimeZone', function (Server $c) {
diff --git a/lib/private/setup/abstractdatabase.php b/lib/private/setup/abstractdatabase.php
index c97302ab252..0c1e5904e08 100644
--- a/lib/private/setup/abstractdatabase.php
+++ b/lib/private/setup/abstractdatabase.php
@@ -91,5 +91,8 @@ abstract class AbstractDatabase {
$this->tablePrefix = $dbTablePrefix;
}
+ /**
+ * @param string $userName
+ */
abstract public function setupDatabase($userName);
}
diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php
index e6afad6033a..de2466676c1 100644
--- a/lib/private/setup/mysql.php
+++ b/lib/private/setup/mysql.php
@@ -71,7 +71,7 @@ class MySQL extends AbstractDatabase {
}
/**
- * @param IDbConnection $connection
+ * @param IDBConnection $connection
* @throws \OC\DatabaseSetupException
*/
private function createDBUser($connection) {
diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php
index 1645e4451ab..f9581e48e62 100644
--- a/lib/private/share/helper.php
+++ b/lib/private/share/helper.php
@@ -227,7 +227,7 @@ class Helper extends \OC\Share\Constants {
*
* all return: http://localhost
*
- * @param string $shareWith
+ * @param string $remote
* @return string
*/
protected static function fixRemoteURL($remote) {
@@ -244,7 +244,7 @@ class Helper extends \OC\Share\Constants {
* split user and remote from federated cloud id
*
* @param string $id
- * @return array
+ * @return string[]
* @throws HintException
*/
public static function splitUserRemote($id) {
diff --git a/lib/private/share/hooks.php b/lib/private/share/hooks.php
index 1fa233916d1..c939164e39e 100644
--- a/lib/private/share/hooks.php
+++ b/lib/private/share/hooks.php
@@ -38,7 +38,7 @@ class Hooks extends \OC\Share\Constants {
public static function post_deleteUser($arguments) {
// Delete any items shared with the deleted user
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*share`'
- .' WHERE `share_with` = ? AND `share_type` = ? OR `share_type` = ?');
+ .' WHERE `share_with` = ? AND (`share_type` = ? OR `share_type` = ?)');
$query->execute(array($arguments['uid'], self::SHARE_TYPE_USER, self::$shareTypeGroupUserUnique));
// Delete any items the deleted user shared
$query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*share` WHERE `uid_owner` = ?');
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 96b920fe994..b09adf1aa99 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -2297,6 +2297,16 @@ class Share extends Constants {
return $id ? $id : false;
}
+ /**
+ * @param string $itemType
+ * @param string $itemSource
+ * @param int $shareType
+ * @param string $shareWith
+ * @param string $uidOwner
+ * @param int $permissions
+ * @param string|null $itemSourceName
+ * @param null|\DateTime $expirationDate
+ */
private static function checkReshare($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $itemSourceName, $expirationDate) {
$backend = self::getBackend($itemType);
diff --git a/lib/private/share20/manager.php b/lib/private/share20/manager.php
index 6ea638b84e6..3a19bd2dc3a 100644
--- a/lib/private/share20/manager.php
+++ b/lib/private/share20/manager.php
@@ -22,6 +22,7 @@
namespace OC\Share20;
use OCP\Files\IRootFolder;
+use OCP\Files\NotFoundException;
use OCP\IUserManager;
use OCP\Share\IManager;
use OCP\Share\IProviderFactory;
@@ -77,6 +78,7 @@ class Manager implements IManager {
* @param IL10N $l
* @param IProviderFactory $factory
* @param IUserManager $userManager
+ * @param IRootFolder $rootFolder
*/
public function __construct(
ILogger $logger,
@@ -164,6 +166,10 @@ class Manager implements IManager {
if ($share->getSharedWith() !== null) {
throw new \InvalidArgumentException('SharedWith should be empty');
}
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_REMOTE) {
+ if ($share->getSharedWith() === null) {
+ throw new \InvalidArgumentException('SharedWith should not be empty');
+ }
} else {
// We can't handle other types yet
throw new \InvalidArgumentException('unkown share type');
@@ -591,7 +597,7 @@ class Manager implements IManager {
}
}
- if ($share->getExpirationDate() !== $originalShare->getExpirationDate()) {
+ if ($share->getExpirationDate() != $originalShare->getExpirationDate()) {
//Verify the expiration date
$this->validateExpirationDate($share);
$expirationDateUpdated = true;
@@ -613,6 +619,29 @@ class Manager implements IManager {
]);
}
+ if ($share->getPassword() !== $originalShare->getPassword()) {
+ \OC_Hook::emit('OCP\Share', 'post_update_password', [
+ 'itemType' => $share->getNode() instanceof \OCP\Files\File ? 'file' : 'folder',
+ 'itemSource' => $share->getNode()->getId(),
+ 'uidOwner' => $share->getSharedBy(),
+ 'token' => $share->getToken(),
+ 'disabled' => is_null($share->getPassword()),
+ ]);
+ }
+
+ if ($share->getPermissions() !== $originalShare->getPermissions()) {
+ $userFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
+ \OC_Hook::emit('OCP\Share', 'post_update_permissions', array(
+ 'itemType' => $share->getNode() instanceof \OCP\Files\File ? 'file' : 'folder',
+ 'itemSource' => $share->getNode()->getId(),
+ 'shareType' => $share->getShareType(),
+ 'shareWith' => $share->getSharedWith(),
+ 'uidOwner' => $share->getSharedBy(),
+ 'permissions' => $share->getPermissions(),
+ 'path' => $userFolder->getRelativePath($share->getNode()->getPath()),
+ ));
+ }
+
return $share;
}
@@ -764,7 +793,57 @@ class Manager implements IManager {
$provider = $this->factory->getProviderForType($shareType);
- return $provider->getSharesBy($userId, $shareType, $path, $reshares, $limit, $offset);
+ $shares = $provider->getSharesBy($userId, $shareType, $path, $reshares, $limit, $offset);
+
+ /*
+ * Work around so we don't return expired shares but still follow
+ * proper pagination.
+ */
+ if ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
+ $shares2 = [];
+ $today = new \DateTime();
+
+ while(true) {
+ $added = 0;
+ foreach ($shares as $share) {
+ // Check if the share is expired and if so delete it
+ if ($share->getExpirationDate() !== null &&
+ $share->getExpirationDate() <= $today
+ ) {
+ try {
+ $this->deleteShare($share);
+ } catch (NotFoundException $e) {
+ //Ignore since this basically means the share is deleted
+ }
+ continue;
+ }
+ $added++;
+ $shares2[] = $share;
+
+ if (count($shares2) === $limit) {
+ break;
+ }
+ }
+
+ if (count($shares2) === $limit) {
+ break;
+ }
+
+ $offset += $added;
+
+ // Fetch again $limit shares
+ $shares = $provider->getSharesBy($userId, $shareType, $path, $reshares, $limit, $offset);
+
+ // No more shares means we are done
+ if (empty($shares)) {
+ break;
+ }
+ }
+
+ $shares = $shares2;
+ }
+
+ return $shares;
}
/**
@@ -789,6 +868,14 @@ class Manager implements IManager {
$share = $provider->getShareById($id, $recipient);
+ // Validate link shares expiration date
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK &&
+ $share->getExpirationDate() !== null &&
+ $share->getExpirationDate() <= new \DateTime()) {
+ $this->deleteShare($share);
+ throw new ShareNotFound();
+ }
+
return $share;
}
@@ -817,7 +904,11 @@ class Manager implements IManager {
$share = $provider->getShareByToken($token);
- //TODO check if share expired
+ if ($share->getExpirationDate() !== null &&
+ $share->getExpirationDate() <= new \DateTime()) {
+ $this->deleteShare($share);
+ throw new ShareNotFound();
+ }
return $share;
}
@@ -991,4 +1082,11 @@ class Manager implements IManager {
return false;
}
+ /**
+ * @inheritdoc
+ */
+ public function outgoingServer2ServerSharesAllowed() {
+ return $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') === 'yes';
+ }
+
}
diff --git a/lib/private/share20/providerfactory.php b/lib/private/share20/providerfactory.php
index 64147355596..bb440d2e01f 100644
--- a/lib/private/share20/providerfactory.php
+++ b/lib/private/share20/providerfactory.php
@@ -20,6 +20,10 @@
*/
namespace OC\Share20;
+use OCA\FederatedFileSharing\AddressHandler;
+use OCA\FederatedFileSharing\FederatedShareProvider;
+use OCA\FederatedFileSharing\Notifications;
+use OCA\FederatedFileSharing\TokenHandler;
use OCP\Share\IProviderFactory;
use OC\Share20\Exception\ProviderException;
use OCP\IServerContainer;
@@ -35,6 +39,8 @@ class ProviderFactory implements IProviderFactory {
private $serverContainer;
/** @var DefaultShareProvider */
private $defaultProvider = null;
+ /** @var FederatedShareProvider */
+ private $federatedProvider = null;
/**
* IProviderFactory constructor.
@@ -63,28 +69,88 @@ class ProviderFactory implements IProviderFactory {
}
/**
+ * Create the federated share provider
+ *
+ * @return FederatedShareProvider
+ */
+ protected function federatedShareProvider() {
+ if ($this->federatedProvider === null) {
+ /*
+ * Check if the app is enabled
+ */
+ $appManager = $this->serverContainer->getAppManager();
+ if (!$appManager->isEnabledForUser('federatedfilesharing')) {
+ return null;
+ }
+
+ /*
+ * TODO: add factory to federated sharing app
+ */
+ $l = $this->serverContainer->getL10N('federatedfilessharing');
+ $addressHandler = new AddressHandler(
+ $this->serverContainer->getURLGenerator(),
+ $l
+ );
+ $notifications = new Notifications(
+ $addressHandler,
+ $this->serverContainer->getHTTPClientService()
+ );
+ $tokenHandler = new TokenHandler(
+ $this->serverContainer->getSecureRandom()
+ );
+
+ $this->federatedProvider = new FederatedShareProvider(
+ $this->serverContainer->getDatabaseConnection(),
+ $addressHandler,
+ $notifications,
+ $tokenHandler,
+ $l,
+ $this->serverContainer->getLogger(),
+ $this->serverContainer->getRootFolder()
+ );
+ }
+
+ return $this->federatedProvider;
+ }
+
+ /**
* @inheritdoc
*/
public function getProvider($id) {
+ $provider = null;
if ($id === 'ocinternal') {
- return $this->defaultShareProvider();
+ $provider = $this->defaultShareProvider();
+ } else if ($id === 'ocFederatedSharing') {
+ $provider = $this->federatedShareProvider();
}
- throw new ProviderException('No provider with id .' . $id . ' found.');
+ if ($provider === null) {
+ throw new ProviderException('No provider with id .' . $id . ' found.');
+ }
+
+ return $provider;
}
/**
* @inheritdoc
*/
public function getProviderForType($shareType) {
+ $provider = null;
+
//FIXME we should not report type 2
if ($shareType === \OCP\Share::SHARE_TYPE_USER ||
$shareType === 2 ||
$shareType === \OCP\Share::SHARE_TYPE_GROUP ||
$shareType === \OCP\Share::SHARE_TYPE_LINK) {
- return $this->defaultShareProvider();
+ $provider = $this->defaultShareProvider();
+ } else if ($shareType === \OCP\Share::SHARE_TYPE_REMOTE) {
+ $provider = $this->federatedShareProvider();
+ }
+
+ if ($provider === null) {
+ throw new ProviderException('No share provider for share type ' . $shareType);
}
- throw new ProviderException('No share provider for share type ' . $shareType);
+ return $provider;
}
}
diff --git a/lib/private/share20/share.php b/lib/private/share20/share.php
index 448b05d20a3..e84d52b63a0 100644
--- a/lib/private/share20/share.php
+++ b/lib/private/share20/share.php
@@ -105,6 +105,8 @@ class Share implements \OCP\Share\IShare {
* @inheritdoc
*/
public function setNode(Node $node) {
+ $this->fileId = null;
+ $this->nodeType = null;
$this->node = $node;
return $this;
}
@@ -161,6 +163,7 @@ class Share implements \OCP\Share\IShare {
}
$this->nodeType = $type;
+ return $this;
}
/**
diff --git a/lib/private/template.php b/lib/private/template.php
index ae3e857a798..bc706e29344 100644
--- a/lib/private/template.php
+++ b/lib/private/template.php
@@ -53,23 +53,19 @@ class OC_Template extends \OC\Template\Base {
/** @var string */
protected $app; // app id
+ protected static $initTemplateEngineFirstRun = true;
+
/**
* Constructor
+ *
* @param string $app app providing the template
* @param string $name of the template file (without suffix)
- * @param string $renderAs = ""; produce a full page
+ * @param string $renderAs If $renderAs is set, OC_Template will try to
+ * produce a full page in the according layout. For
+ * now, $renderAs can be set to "guest", "user" or
+ * "admin".
* @param bool $registerCall = true
- * @return OC_Template object
- *
- * This function creates an OC_Template object.
- *
- * If $renderAs is set, OC_Template will try to produce a full page in the
- * according layout. For now, $renderAs can be set to "guest", "user" or
- * "admin".
*/
-
- protected static $initTemplateEngineFirstRun = true;
-
public function __construct( $app, $name, $renderAs = "", $registerCall = true ) {
// Read the selected theme from the config file
self::initTemplateEngine($renderAs);
@@ -92,6 +88,9 @@ class OC_Template extends \OC\Template\Base {
parent::__construct($template, $requestToken, $l10n, $themeDefaults);
}
+ /**
+ * @param string $renderAs
+ */
public static function initTemplateEngine($renderAs) {
if (self::$initTemplateEngineFirstRun){
@@ -182,7 +181,7 @@ class OC_Template extends \OC\Template\Base {
* Checking all the possible locations.
* @param string $theme
* @param string $app
- * @return array
+ * @return string[]
*/
protected function findTemplate($theme, $app, $name) {
// Check if it is a app template or not.
diff --git a/lib/private/updater.php b/lib/private/updater.php
index 32264484ee3..78457ba3a80 100644
--- a/lib/private/updater.php
+++ b/lib/private/updater.php
@@ -35,7 +35,6 @@ namespace OC;
use OC\Hooks\BasicEmitter;
use OC\IntegrityCheck\Checker;
-use OC\IntegrityCheck\Storage;
use OC_App;
use OC_Installer;
use OC_Util;
@@ -287,7 +286,6 @@ class Updater extends BasicEmitter {
* @param string $installedVersion previous version from which to upgrade from
*
* @throws \Exception
- * @return bool true if the operation succeeded, false otherwise
*/
private function doUpgrade($currentVersion, $installedVersion) {
// Stop update if the update is over several major versions
diff --git a/lib/private/user.php b/lib/private/user.php
index ae98bb9b01a..21971fc3d1d 100644
--- a/lib/private/user.php
+++ b/lib/private/user.php
@@ -253,7 +253,7 @@ class OC_User {
* Sets user display name for session
*
* @param string $uid
- * @param null $displayName
+ * @param string $displayName
* @return bool Whether the display name could get set
*/
public static function setDisplayName($uid, $displayName = null) {
diff --git a/lib/public/app/managerevent.php b/lib/public/app/managerevent.php
new file mode 100644
index 00000000000..99e9b11b024
--- /dev/null
+++ b/lib/public/app/managerevent.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP\App;
+
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Class ManagerEvent
+ *
+ * @package OCP\APP
+ * @since 9.0.0
+ */
+class ManagerEvent extends Event {
+
+ const EVENT_APP_ENABLE = 'OCP\App\IAppManager::enableApp';
+ const EVENT_APP_ENABLE_FOR_GROUPS = 'OCP\App\IAppManager::enableAppForGroups';
+ const EVENT_APP_DISABLE = 'OCP\App\IAppManager::disableApp';
+
+ /** @var string */
+ protected $event;
+ /** @var string */
+ protected $appID;
+ /** @var \OCP\IGroup[] */
+ protected $groups;
+
+ /**
+ * DispatcherEvent constructor.
+ *
+ * @param string $event
+ * @param $appID
+ * @param \OCP\IGroup[] $groups
+ * @since 9.0.0
+ */
+ public function __construct($event, $appID, array $groups = null) {
+ $this->event = $event;
+ $this->appID = $appID;
+ $this->groups = $groups;
+ }
+
+ /**
+ * @return string
+ * @since 9.0.0
+ */
+ public function getEvent() {
+ return $this->event;
+ }
+
+ /**
+ * @return string
+ * @since 9.0.0
+ */
+ public function getAppID() {
+ return $this->appID;
+ }
+
+ /**
+ * returns the group Ids
+ * @return string[]
+ * @since 9.0.0
+ */
+ public function getGroups() {
+ return array_map(function ($group) {
+ /** @var \OCP\IGroup $group */
+ return $group->getGID();
+ }, $this->groups);
+ }
+}
diff --git a/lib/public/comments/commentsevent.php b/lib/public/comments/commentsevent.php
new file mode 100644
index 00000000000..13110154479
--- /dev/null
+++ b/lib/public/comments/commentsevent.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP\Comments;
+
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Class CommentsEvent
+ *
+ * @package OCP\Comments
+ * @since 9.0.0
+ */
+class CommentsEvent extends Event {
+
+ const EVENT_ADD = 'OCP\Comments\ICommentsManager::addComment';
+ const EVENT_UPDATE = 'OCP\Comments\ICommentsManager::updateComment';
+ const EVENT_DELETE = 'OCP\Comments\ICommentsManager::deleteComment';
+
+ /** @var string */
+ protected $event;
+ /** @var IComment */
+ protected $comment;
+
+ /**
+ * DispatcherEvent constructor.
+ *
+ * @param string $event
+ * @param IComment $comment
+ * @since 9.0.IComment
+ */
+ public function __construct($event, IComment $comment) {
+ $this->event = $event;
+ $this->comment = $comment;
+ }
+
+ /**
+ * @return string
+ * @since 9.0.0
+ */
+ public function getEvent() {
+ return $this->event;
+ }
+
+ /**
+ * @return IComment
+ * @since 9.0.0
+ */
+ public function getComment() {
+ return $this->comment;
+ }
+}
diff --git a/lib/public/comments/icommentsmanager.php b/lib/public/comments/icommentsmanager.php
index 46608ca8165..0b37fde24d8 100644
--- a/lib/public/comments/icommentsmanager.php
+++ b/lib/public/comments/icommentsmanager.php
@@ -149,7 +149,7 @@ interface ICommentsManager {
public function delete($id);
/**
- * saves the comment permanently and returns it
+ * saves the comment permanently
*
* if the supplied comment has an empty ID, a new entry comment will be
* saved and the instance updated with the new ID.
diff --git a/lib/public/console/consoleevent.php b/lib/public/console/consoleevent.php
new file mode 100644
index 00000000000..b3f1229f0e8
--- /dev/null
+++ b/lib/public/console/consoleevent.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP\Console;
+
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Class ConsoleEvent
+ *
+ * @package OCP\Console
+ * @since 9.0.0
+ */
+class ConsoleEvent extends Event {
+
+ const EVENT_RUN = 'OC\Console\Application::run';
+
+ /** @var string */
+ protected $event;
+
+ /** @var string[] */
+ protected $arguments;
+
+ /**
+ * DispatcherEvent constructor.
+ *
+ * @param string $event
+ * @param string[] $arguments
+ * @since 9.0.0
+ */
+ public function __construct($event, array $arguments) {
+ $this->event = $event;
+ $this->arguments = $arguments;
+ }
+
+ /**
+ * @return string
+ * @since 9.0.0
+ */
+ public function getEvent() {
+ return $this->event;
+ }
+
+ /**
+ * @return string[]
+ * @since 9.0.0
+ */
+ public function getArguments() {
+ return $this->arguments;
+ }
+}
diff --git a/lib/public/db/querybuilder/iexpressionbuilder.php b/lib/public/db/querybuilder/iexpressionbuilder.php
index a53ae3846c2..4b53a0e0b8b 100644
--- a/lib/public/db/querybuilder/iexpressionbuilder.php
+++ b/lib/public/db/querybuilder/iexpressionbuilder.php
@@ -299,4 +299,14 @@ interface IExpressionBuilder {
* @since 8.2.0
*/
public function literal($input, $type = null);
+
+ /**
+ * Returns a IQueryFunction that casts the column to the given type
+ *
+ * @param string $column
+ * @param mixed $type One of IQueryBuilder::PARAM_*
+ * @return string
+ * @since 9.0.0
+ */
+ public function castColumn($column, $type);
}
diff --git a/lib/public/files/cache/icache.php b/lib/public/files/cache/icache.php
index 4ffb298a9e2..18641b29f9c 100644
--- a/lib/public/files/cache/icache.php
+++ b/lib/public/files/cache/icache.php
@@ -59,6 +59,8 @@ interface ICache {
/**
* get the metadata of all files stored in $folder
*
+ * Only returns files one level deep, no recursion
+ *
* @param string $folder
* @return ICacheEntry[]
* @since 9.0.0
@@ -68,6 +70,8 @@ interface ICache {
/**
* get the metadata of all files stored in $folder
*
+ * Only returns files one level deep, no recursion
+ *
* @param int $fileId the file id of the folder
* @return ICacheEntry[]
* @since 9.0.0
@@ -187,11 +191,12 @@ interface ICache {
public function getStatus($file);
/**
- * search for files matching $pattern
+ * search for files matching $pattern, files are matched if their filename matches the search pattern
*
* @param string $pattern the search pattern using SQL search syntax (e.g. '%searchstring%')
* @return ICacheEntry[] an array of cache entries where the name matches the search pattern
* @since 9.0.0
+ * @deprecated 9.0.0 due to lack of pagination, not all backends might implement this
*/
public function search($pattern);
@@ -202,6 +207,7 @@ interface ICache {
* where it will search for all mimetypes in the group ('image/*')
* @return ICacheEntry[] an array of cache entries where the mimetype matches the search
* @since 9.0.0
+ * @deprecated 9.0.0 due to lack of pagination, not all backends might implement this
*/
public function searchByMime($mimetype);
@@ -214,6 +220,7 @@ interface ICache {
* @param string $userId owner of the tags
* @return ICacheEntry[] file data
* @since 9.0.0
+ * @deprecated 9.0.0 due to lack of pagination, not all backends might implement this
*/
public function searchByTag($tag, $userId);
diff --git a/lib/public/files/file.php b/lib/public/files/file.php
index 3acf24b9277..1550f92682b 100644
--- a/lib/public/files/file.php
+++ b/lib/public/files/file.php
@@ -84,4 +84,14 @@ interface File extends Node {
* @since 6.0.0
*/
public function hash($type, $raw = false);
+
+ /**
+ * Get the stored checksum for this file
+ *
+ * @return string
+ * @since 9.0.0
+ * @throws InvalidPathException
+ * @throws NotFoundException
+ */
+ public function getChecksum();
}
diff --git a/lib/public/files/storage.php b/lib/public/files/storage.php
index 1c125221449..2511690b7d3 100644
--- a/lib/public/files/storage.php
+++ b/lib/public/files/storage.php
@@ -331,15 +331,6 @@ interface Storage extends IStorage {
public function getLocalFile($path);
/**
- * get the path to a local version of the folder.
- * The local version of the folder can be temporary and doesn't have to be persistent across requests
- *
- * @param string $path
- * @return string|false
- * @since 6.0.0
- */
- public function getLocalFolder($path);
- /**
* check if a file or folder has been updated since $time
*
* @param string $path
diff --git a/lib/public/files/storage/istorage.php b/lib/public/files/storage/istorage.php
index 4bc5e3536dc..a638ddd3021 100644
--- a/lib/public/files/storage/istorage.php
+++ b/lib/public/files/storage/istorage.php
@@ -304,15 +304,6 @@ interface IStorage {
public function free_space($path);
/**
- * search for occurrences of $query in file names
- *
- * @param string $query
- * @return array|false
- * @since 9.0.0
- */
- public function search($query);
-
- /**
* see http://php.net/manual/en/function.touch.php
* If the backend does not support the operation, false should be returned
*
@@ -334,16 +325,6 @@ interface IStorage {
public function getLocalFile($path);
/**
- * get the path to a local version of the folder.
- * The local version of the folder can be temporary and doesn't have to be persistent across requests
- *
- * @param string $path
- * @return string|false
- * @since 9.0.0
- */
- public function getLocalFolder($path);
-
- /**
* check if a file or folder has been updated since $time
*
* @param string $path
diff --git a/lib/public/files/storagenotavailableexception.php b/lib/public/files/storagenotavailableexception.php
index f9ac79d66ec..dd3915a2f6a 100644
--- a/lib/public/files/storagenotavailableexception.php
+++ b/lib/public/files/storagenotavailableexception.php
@@ -58,4 +58,30 @@ class StorageNotAvailableException extends HintException {
$l = \OC::$server->getL10N('core');
parent::__construct($message, $l->t('Storage not available'), $code, $previous);
}
+
+ /**
+ * Get the name for a status code
+ *
+ * @param int $code
+ * @return string
+ * @since 9.0.0
+ */
+ public static function getStateCodeName($code) {
+ switch ($code) {
+ case self::STATUS_SUCCESS:
+ return 'ok';
+ case self::STATUS_ERROR:
+ return 'error';
+ case self::STATUS_INDETERMINATE:
+ return 'indeterminate';
+ case self::STATUS_UNAUTHORIZED:
+ return 'unauthorized';
+ case self::STATUS_TIMEOUT:
+ return 'timeout';
+ case self::STATUS_NETWORK_ERROR:
+ return 'network error';
+ default:
+ return 'unknown';
+ }
+ }
}
diff --git a/lib/public/share/imanager.php b/lib/public/share/imanager.php
index 4d79f97c31a..f926104dde0 100644
--- a/lib/public/share/imanager.php
+++ b/lib/public/share/imanager.php
@@ -229,4 +229,11 @@ interface IManager {
*/
public function sharingDisabledForUser($userId);
+ /**
+ * Check if outgoing server2server shares are allowed
+ * @return bool
+ * @since 9.0.0
+ */
+ public function outgoingServer2ServerSharesAllowed();
+
}
diff --git a/lib/public/share/ishareprovider.php b/lib/public/share/ishareprovider.php
index 25fa76369ab..b339ce63d34 100644
--- a/lib/public/share/ishareprovider.php
+++ b/lib/public/share/ishareprovider.php
@@ -101,7 +101,7 @@ interface IShareProvider {
* @param bool $reshares Also get the shares where $user is the owner instead of just the shares where $user is the initiator
* @param int $limit The maximum number of shares to be returned, -1 for all shares
* @param int $offset
- * @return \OCP\Share\IShare Share[]
+ * @return \OCP\Share\IShare[]
* @since 9.0.0
*/
public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset);
diff --git a/resources/codesigning/core.crt b/resources/codesigning/core.crt
index 0692e940186..62f87c9d30c 100644
--- a/resources/codesigning/core.crt
+++ b/resources/codesigning/core.crt
@@ -1,24 +1,24 @@
-----BEGIN CERTIFICATE-----
-MIID/TCCAeUCAhAAMA0GCSqGSIb3DQEBCwUAMHkxFjAUBgNVBAoTDW93bkNsb3Vk
-IEluYy4xEjAQBgNVBAcTCUxleGluZ3RvbjEPMA0GA1UECBMGQm9zdG9uMQswCQYD
-VQQGEwJVUzEtMCsGA1UEAxMkb3duQ2xvdWQgQ29kZSBTaWduaW5nIFJvb3QgQXV0
-aG9yaXR5MB4XDTE2MDIwMzE3MTM0NVoXDTI2MDEzMTE3MTM0NVowDzENMAsGA1UE
-AwwEY29yZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKzP4ujnvS9l
-otPJ7zHZMD8IGgcuYVtZ40n4pWSArhJboazhMdadpfxEZAghZtzkK+AKz4V+92GV
-UOf+FgFRMcsaaBFr9INE4tdYKPVfHq19sDZVhYySfg7/z9qWc9XTMAm1lWpFyDQb
-CC0i1YFogk0JdPr5Ay2Ftgbbr+TtMduL0RshdClqoiwntLnFhu8VRZi3+/yHH2cN
-M5ANjm/MXT8Ae6KMVOzsYhBcxMLNVL08Ih1ubtu4LbKgyT5ShYzxqRnJ8U1KlmVT
-w/wsSGMvVTEJkozkQEyg88vkxwvqLLYs5bOvXY93S6YKb2gO7RAA2c/IaEDbL32t
-TJJhRoPif9cCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAiRhcef1Tc0Lj4BWIxYDV
-Fjkrd4HHe3FyZRdD1+NU4LSb/4xXknmrwu5tITrnoGqNfUGn9BlP5Ek7Iu15PMPi
-8Us8xszvgMZ7BG3x4zTMHwUseLT56/+qE76VN2vXusQBuEhOll/WN2qHvPi8BOCk
-fOL6/EIUdqfMh9FKGNKOJ5f95eKogyVVxVcUpGWoqZRQTJaNMBTdT8Zwv1aTLRgp
-Vf8JFzmxG9Atc/00w7cg4tV4lUpZafn1RYaIi4DWZhI43yR+Z8CKQBXt7iufu0QD
-VwWOqYjmK7aKB2bL3+8I2bL9pm9DUKrAPYSObdmasJQGFVNCILisWJjX5wlUC2IL
-FtMfZ4egyWZTLeQ+VQt92cJeVZYins5GECm1SqgXGnmQWv01/wNIqUhLuVFoLyVv
-aPhCYcjNcbwJm8m++kz/G6+5AhRv2JrZq3i1Cw/yRQuiotXrJE+ukIvvSEjlLJ0C
-Njm7EMy1mNfhIi1Xel/aUaf0y92GMsfnCuzI+tRG50HHupLEXHItlg2RILmNQNpo
-woqHpUZs5G5HZlE5ZnffJlZpJyqA1EpQDh1XXJqcVwV50V9o+CMvxXO8s2lUA+i6
-Kay+t3mz2dX6qflRUPLsPS4XLdB9MUiIHCOgMJfsK+9SZ+i1VymhV5UYx8rqglC7
-8crw8NpiIuOqQZW8LcZXZBU=
------END CERTIFICATE----- \ No newline at end of file
+MIID8TCCAdkCAhAAMA0GCSqGSIb3DQEBCwUAMG0xCzAJBgNVBAYTAlVTMQ8wDQYD
+VQQIDAZCb3N0b24xFjAUBgNVBAoMDW93bkNsb3VkIEluYy4xNTAzBgNVBAMMLG93
+bkNsb3VkIENvZGUgU2lnbmluZyBJbnRlcm1lZGlhdGUgQXV0aG9yaXR5MB4XDTE2
+MDIwMzE3NTE0OVoXDTI2MDEzMTE3NTE0OVowDzENMAsGA1UEAwwEY29yZTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPHdSljnHI+ueQd27UyWPO9n4Lqt
+bK0kdekiC3si7Mee7uXXJaGuqXJozHEZYB1LIFLdCU/itCxEk9hyLcyNzeT+nRT/
+zDuOYdbLgCj7/A5bX+u3jc29UlCYybSFchfMdvn7a0njCna4dE+73b4yEj16tS2h
+S1EUygSzgicWlJqMD3Z9Qc+zLEpdhq9oDdDB8HURi2NW4KzIraVncSH+zF1QduOh
+nERDnF8x48D3FLdTxGA0W/Kg4gYsq4NRvU6g3DJNdp4YfqRSFMmLFDCgzDuhan7D
+wgRlI9NAeHbnyoUPtrDBUceI7shIbC/i87xk9ptqV0AyFonkJtK6lWwZjNkCAwEA
+ATANBgkqhkiG9w0BAQsFAAOCAgEAAMgymqZE1YaHYlRGwvTE7gGDY3gmFOMaxQL4
+E5m0CnkBz4BdIPRsQFFdOv3l/MIWkw5ED3vUB925VpQZYFSiEuv5NbnlPaHZlIMI
+n8AV/sTP5jue3LhtAN4EM63xNBhudAT6wVsvGwOuQOx9Xv+ptO8Po7sTuNYP0CMH
+EOQN+/q8tYlSm2VW+dAlaJ+zVZwZldhVjL+lSH4E9ktWn3PmgNQeKfcnJISUbus6
+ZtsYDF/X96/Z2ZQvMXOKksgvU6XlvIxllcyebC9Bxe/h0D63GCO2tqN5CWQzIIqn
+apUynPX8BlLaaExqYGERwlUi/yOGaUVPUjEPVehviOQYgAqxlrkJk1dWeCrwUori
+CXpi+IUYkidfgiJ9F88M3ElpwqIaXp7G3/4oHBuE2u6M+L+1/vqPJeTCAWUxxpJE
+yYmM+db6D4TySFpQPENNzPS8bpR6T8w2hRumkldC42HrnyJJbpjOieTXhXzjdPvZ
+IEP9JGtkhB2du6nBF2MNAq2TqRXpcfQrQEbnQ13aV9bl+roTwwO+SOWK/wgvdOMI
+STQ0Xk0sTGlmQjPYPkibVceaWMR3sX4cNt5c33YhJys5jxHoAh42km4nN9tfykR5
+crl5lBlKjXh2GP0+omSO3x1jX4+iQPCW2TWoyKkUdLu/hGHG2w8RrTeme+kATECH
+YSu356M=
+-----END CERTIFICATE-----
diff --git a/resources/codesigning/root.crt b/resources/codesigning/root.crt
index 201164feb0c..cbd82898bab 100644
--- a/resources/codesigning/root.crt
+++ b/resources/codesigning/root.crt
@@ -1,36 +1,66 @@
-----BEGIN CERTIFICATE-----
-MIIGVDCCBDygAwIBAgIJAJGMJhEr5q3dMA0GCSqGSIb3DQEBCwUAMHkxFjAUBgNV
-BAoTDW93bkNsb3VkIEluYy4xEjAQBgNVBAcTCUxleGluZ3RvbjEPMA0GA1UECBMG
-Qm9zdG9uMQswCQYDVQQGEwJVUzEtMCsGA1UEAxMkb3duQ2xvdWQgQ29kZSBTaWdu
-aW5nIFJvb3QgQXV0aG9yaXR5MB4XDTE2MDIwMzE3MDYyOVoXDTI2MDEzMTE3MDYy
-OVoweTEWMBQGA1UEChMNb3duQ2xvdWQgSW5jLjESMBAGA1UEBxMJTGV4aW5ndG9u
-MQ8wDQYDVQQIEwZCb3N0b24xCzAJBgNVBAYTAlVTMS0wKwYDVQQDEyRvd25DbG91
-ZCBDb2RlIFNpZ25pbmcgUm9vdCBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDGAqfV+pZuKD9rKsny6PxQWYV35bJYo2xdYxFpd8oI/Fco
-Ygjv5iZc9U4/iY0mN3wSDjYXJtMQnO96qthSI/bqsxrD9wutRKXYo/VEZALWL8vR
-F+cRpgmCrq98tF7fNEhEX2PdVlmwEWV8c7wL+QAd+qXrVz+MyJyw6jlh5JzEEqAR
-kNNRFm2d5+FPgWZeBNE0tbj7XxBTFTn/OMAOndhLo2dwhTXu6t2Caq15IZt6YoPM
-Ibn/Y3c2E76vpfWCznB4uEsEx4C4Hkdmzu5BwjPjcnPoFGobHaURMnwrEOI1s0cn
-V7kl2120I2Dr29NTL4vgnxRM2SQp3253NVmy9EbabszwfHy9bGH5G6IKQyTLyJHG
-AIAN3QHfr86N3t/ELekNb8bbh+2OBzuytMbTPlauKny7isVfciGUfnJgU54mMbIc
-1XBiYEgKjdkq/IEiYkjtOToS29AvCnDkH82piEeW0TMmcNN7/Vq79S1YR4ceZ4PQ
-d0Qm0y59nXPVZMso5em39TJH1PRwe93RPDN8NM434sfbdjqMqDi+3E+urG01AzwT
-BZj8lUvD/FvDB1no2p4/JKeHmlR/AQmfWFA0c6dv5DlzeIldwar4paDER9McGXvy
-GSTDVEhdEJrbK8pQh2pIkHZ6WkuMyTXDMTvyRtuPwlk68MVmYic/AHUSLrGT0wID
-AQABo4HeMIHbMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFM2KMEEv31J4fR3ufEH6
-yiLvmRPmMIGrBgNVHSMEgaMwgaCAFM2KMEEv31J4fR3ufEH6yiLvmRPmoX2kezB5
-MRYwFAYDVQQKEw1vd25DbG91ZCBJbmMuMRIwEAYDVQQHEwlMZXhpbmd0b24xDzAN
-BgNVBAgTBkJvc3RvbjELMAkGA1UEBhMCVVMxLTArBgNVBAMTJG93bkNsb3VkIENv
-ZGUgU2lnbmluZyBSb290IEF1dGhvcml0eYIJAJGMJhEr5q3dMA0GCSqGSIb3DQEB
-CwUAA4ICAQBDLisFDvjYv8nbAAfqU9A8q9nTtA5XAmRPBE4zoawesFnyYRPD5xf8
-+/L9p3z7c5V4ui3yERd6PeNpMKW3NsY0TL6k3rYONQRwkNWE5eLcTelhVbqUBWoQ
-vTPJqQzP6HvOuErHv2yDBhO8graQiw8S3OOhQycrcPtSzGnenhvcYSJgJscx1EcE
-DAbTxfrTIyPgX4ouyoQPpPufUFYqYL/rNf9Ca03Gekyn9WFe9WGR7PzaKjn0dOQq
-wA9cPNitvwG//0emWZeH9naE4NPerzhwITyMDJUmQgZ/hW+lTTaZfISPQmMi24za
-00PbfeMYRNrkw21VkwkqLHqj9l7ud3hmyoTjKHdO8zOfeVyv3OfJmRLubv+x+wDE
-JSJNSyvgtMIlQ4WsM3mXUesN//3NsSGt/QUy9ARD7Nf8u1igchdxJLavXCJmnwYa
-jxxnGk16q1R5OJqDN9IbSbxRiS/WWKTJkhMBVQtsHMD2MK4Gtbw/J2n/4M/zioiS
-iZW1Eg1kI163oD/obEa5KzxJz+RXBGZef07q37Um8RTQ2kjI65sr/9oZ9tHdF9Zb
-vPGFcj/viac6O8Z9fDovTCfMHiGKwgDhrsQFkQz1/BEl2P1FIzNQeDBfyI7bI82x
-GIt/Th0uI+YIkhA0kLlq4cCoBjl0fL6hCy5DADdAMWFOwmUzG8EJWA==
+MIIFtDCCA5ygAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMx
+DzANBgNVBAgMBkJvc3RvbjEWMBQGA1UECgwNb3duQ2xvdWQgSW5jLjEtMCsGA1UE
+Awwkb3duQ2xvdWQgQ29kZSBTaWduaW5nIFJvb3QgQXV0aG9yaXR5MB4XDTE2MDIw
+MzE3NDMyNVoXDTI2MDEzMTE3NDMyNVowbTELMAkGA1UEBhMCVVMxDzANBgNVBAgM
+BkJvc3RvbjEWMBQGA1UECgwNb3duQ2xvdWQgSW5jLjE1MDMGA1UEAwwsb3duQ2xv
+dWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBBdXRob3JpdHkwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDKMul4pWev6vtgzB73CLQPMy8nDZGbvqII
+IgukQluMeLCW0P09I+J/mCiDd99mQTtWO+/LcpOChHYJ59qQz+g9TzKlVSuFDg47
+pc+jUvTLGGEDf9cAWtzsXYXlb9z7sTln/8JAvy8ghmaR/4JWU4hM/nmgDCpeXLLJ
+NFrxKDbzPLYj53iHN+XyE9GT6sDYoQd1BIWhTsMdvMqg870Jw2yN4hKw3V7/KoI/
+Z5CAA9dP4tAmltBpMz79dmLCciqXOD8mWEWl2tSZU+/WVyPxiE19IHoJETOhSg4c
+eud4DDdFt9Ohm4owvpxxRDbvV+Ic6sWb1gJBrM7/XJDmaUObpowjx8Daof1MuoHs
+FKh6/Y7RBdVlrp/ig3htxfm9BBMqnXIxgFWDiSbjCMk0Ygvx49gKMnVoRhZ/7pla
+j5nTRdbhsjS50E9zfc53EltM27YSwNZu62QKsU4yumg8UOhOYPRLHcySvNyyMZXS
+o+Kst27oGSgurHytFS7FVG1M3UUn67zkMpnnMYhfx8dz7+tupY9e0l0kDciwvNAO
+YrnvHoEiIbJmoyYOhL2j9WErUhAb3JKTSdYC0MmjaZZPv0HwCemx+rnApcoszmFG
+woZTRAa6Q64WGxlmFq0vsgmcTNsTzlYY20Kv+ZpZOiVYonyHFkorKWdsXKZQcnYq
+dcMqYxQE6wIDAQABo2YwZDAdBgNVHQ4EFgQUfZoNPRneQ1pk9SZT9A2lpG4Hw7Mw
+HwYDVR0jBBgwFoAUcZdiBiGr+Y+OH2DrlNwK03zWH+YwEgYDVR0TAQH/BAgwBgEB
+/wIBADAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAA2hoAEdbdM9
++ZA/q7UppF4BiKrSQNAQHLDwodutRY+gBYQsWpo8wLqdLvRVhlwDn3KmJEMfaDQm
+5YM+/snBkew9olCIyYw+t7xYtNhoW1et/nNNDL+Qq7uyH6g+uOMp4m3c+BMv4x5H
+EP3z7PY1qrPOVvzZu8o2iL8qpC0sXTKZy+xG/9VTYGnxCcG+V/Ua5aHOyetUttoN
+bxEcEQHHe07V+JlCPuI53hPsiGgzHv+nz/1sJV95mn9w88SHY0JO9bHp9w+mq92K
+r0Nv6Wctf7vNVmIOdRFHWOFie4+D3TpBSnB5PPQRbtf6IVEhjmcnWYBWcRGhH6cR
+4dqpuqzwVFopIFLYMeaeKGu8wZHi2YRrkFcrnqqmFI9RtBbt3eyfUQcKH7b9P4Ri
+qamb/h9sVjDM4wSQ6n+Qa2dgV28O0il35roa3qwvqySgn1wXS5CsAaeB1VWAS6/S
+v1WFt93n9LrraV4EUuu1BGXp525aVn6v+B71zN4JzYnHVE4yAb0EdOpKrlfmCCm/
+9Z90+BF2uK3QnpkyrH+LEOQoHrlAt80RZYd2Tl/K1WWNrPUlnCGXdxjVYakVRnfy
+Ud0KV4RsD93mNw/t2gU5U+SyYWU2fTJUE9qdJ4Ndw7B2DZ/5dcsu0rDV4sXkUoDY
++Dr25NoOcuqjCWRw2T3SBPSXBxjlhRTQ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIJALFuk51OGp2KMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNV
+BAYTAlVTMQ8wDQYDVQQIDAZCb3N0b24xFjAUBgNVBAoMDW93bkNsb3VkIEluYy4x
+LTArBgNVBAMMJG93bkNsb3VkIENvZGUgU2lnbmluZyBSb290IEF1dGhvcml0eTAe
+Fw0xNjAyMDMxNzM5NThaFw0yNjAxMzExNzM5NThaMGUxCzAJBgNVBAYTAlVTMQ8w
+DQYDVQQIDAZCb3N0b24xFjAUBgNVBAoMDW93bkNsb3VkIEluYy4xLTArBgNVBAMM
+JG93bkNsb3VkIENvZGUgU2lnbmluZyBSb290IEF1dGhvcml0eTCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAJmTnGtGaB0cDtQPxWr2r5FyXFzJ6GIkm4Lb
+7iY/DYpIEarbRFwqDCDZ00V+PWsTBBF6qXW5W7eZ+fOOdIEGoNaDuGtIlGVjj3Dz
+TZtmcFg0euimfLNYVvYZlPPh4kS3zDRZs30AgAdgq4RHWC4qjElWcVKTwERNQ2ln
+gRFRQEv+i2DI7sEK9ZpK7B1SfJ1o1fm/kPL7bVfiYda+QKp0vOxBecDnGV+rfz4t
+DT6mBOgwAiZnwojuiigfUJxSisv3roWri+0O+0TiXglV+oUtkIRrs0etkQGWAlgn
+H4CC+sZ5N2TiGPH1hksLkXP4mymlio8/x7ax0WfcxeTZu3ok9eK5fwIQVWam6dd9
+klCqZVttKodZYspvdFfwqMlf4lPEIY+r2PIdGjUhKu4FsDhORaGj8WMYRJUR44ls
+/r2ktCB/TOsh8DW2Pi9HAgxI4mrdmvL0WMSOBFZRcSC/nTz977oi1iiB2T+s7V0Z
+Y0AHMQYiIn83MFB7rb+mVlEoLID/evVSTfUaUaO8DqcfeQN/OFM/zcJY9YHv8AlJ
+3b8CPdeX9edMnyZWNdrhOSawjAbOBIna3o66RXdeC3oWg7FuckJmy7JLtRCJ2Owu
+losRAxe0z5mQmjFzMczxCYJQ4A+4U5UZwbd/MQJg508StcOumroYqruDic/Wbc3C
+v6DupG8dAgMBAAGjYzBhMB0GA1UdDgQWBBRxl2IGIav5j44fYOuU3ArTfNYf5jAf
+BgNVHSMEGDAWgBRxl2IGIav5j44fYOuU3ArTfNYf5jAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAR6IZBOBw3KzRxvUP
++46RZYayMrdLyAgMzbDvQe7WCaeuA2UoPVL8jN7X2Lvw12Mz84+EKs1voR0OBxlY
+6muuyl0SETa2k4UtklVscMvcokG+m5aVNJ7/HHGFmKsTyJDMxSzDA/r3KRPXZOwV
+CLUVTkr5fQbIaVljA89U2p3pN/X7gNq89xi/XiszNCEIvvSscRmBGlRmx4XbjXHK
+XKO74+HiM/ahqUI792ae97jlsy9jG4OIelse3+e1KBWNsGtU90asnUHgyMXVL8gp
+ocznGvWceAhkcogUCUCXq1Rh/mKcGQdi2z0g/X+MGzfA9Ij4NQZLnNPh2UjgxCtG
+KWPUzs0t/xoCtJh1WpwqTrOUcYqFAaBa282sD/O8tX4t076aGKdbhfo6tvaOFwDU
+iRPgdMol++BFnfCld53Yivg2+S6+xo1wzuPkNjVFXHjx9vMyiov/HHKqJoBsuCwU
+7VegzM/6Cvh32lSZfUHsfynCab/7vv923KyaANWxb0QsHZSSt+mmOK3ZmC96vCEa
+55IGNckOvOGW9yCIz3Q0kEj2hoJs1bw0SkwGWs7N1TkugQjM/S7/Im1LJUxdtqQK
+Zjn+8U6U3TR1aKLYEdqHCGcVoRXKDG/S40FHxyeV/9buTI7SSvhzZfj+qasmJe1L
+Kd08UdS/im8RwbVSS1mih5hbAHg=
-----END CERTIFICATE----- \ No newline at end of file
diff --git a/resources/config/mimetypealiases.dist.json b/resources/config/mimetypealiases.dist.json
index ed471f228e2..545d4b0c399 100644
--- a/resources/config/mimetypealiases.dist.json
+++ b/resources/config/mimetypealiases.dist.json
@@ -17,12 +17,14 @@
"application/json": "text/code",
"application/msaccess": "file",
"application/msexcel": "x-office/spreadsheet",
+ "application/msonenote": "x-office/document",
"application/mspowerpoint": "x-office/presentation",
"application/msword": "x-office/document",
"application/octet-stream": "file",
"application/postscript": "image",
"application/rss+xml": "application/xml",
"application/vnd.android.package-archive": "package/x-generic",
+ "application/vnd.lotus-wordpro": "x-office/document",
"application/vnd.ms-excel": "x-office/spreadsheet",
"application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet",
"application/vnd.ms-excel.sheet.binary.macroEnabled.12": "x-office/spreadsheet",
@@ -51,6 +53,8 @@
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": "x-office/spreadsheet",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "x-office/document",
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": "x-office/document",
+ "application/vnd.visio": "x-office/document",
+ "application/vnd.wordperfect": "x-office/document",
"application/x-7z-compressed": "package/x-generic",
"application/x-cbr": "text",
"application/x-compressed": "package/x-generic",
diff --git a/resources/config/mimetypemapping.dist.json b/resources/config/mimetypemapping.dist.json
index e26ec7038b1..d08a46bb017 100644
--- a/resources/config/mimetypemapping.dist.json
+++ b/resources/config/mimetypemapping.dist.json
@@ -76,6 +76,7 @@
"key": ["application/x-iwork-keynote-sffkey"],
"keynote": ["application/x-iwork-keynote-sffkey"],
"kra": ["application/x-krita"],
+ "lwp": ["application/vnd.lotus-wordpro"],
"m2t": ["video/mp2t"],
"m4v": ["video/mp4"],
"markdown": ["text/markdown"],
@@ -106,6 +107,7 @@
"oga": ["audio/ogg"],
"ogg": ["audio/ogg"],
"ogv": ["video/ogg"],
+ "one": ["application/msonenote"],
"opus": ["audio/ogg"],
"orf": ["image/x-dcraw"],
"otf": ["application/font-sfnt"],
@@ -154,9 +156,11 @@
"vcard": ["text/vcard"],
"vcf": ["text/vcard"],
"vob": ["video/dvd"],
+ "vsd": ["application/vnd.visio"],
"wav": ["audio/wav"],
"webm": ["video/webm"],
"woff": ["application/font-woff"],
+ "wpd": ["application/vnd.wordperfect"],
"wmv": ["video/x-ms-wmv"],
"xcf": ["application/x-gimp"],
"xla": ["application/vnd.ms-excel"],
diff --git a/settings/css/settings.css b/settings/css/settings.css
index 9e98960a715..978f9e44e58 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -54,6 +54,10 @@ input#openid, input#webdav { width:20em; }
max-width: 75%;
}
+.clientsbox img {
+ height: 60px;
+}
+
#sslCertificate tr.expired {
background-color: rgba(255, 0, 0, 0.5);
}
@@ -243,9 +247,6 @@ input.userFilter {width: 200px;}
/* APPS */
.appinfo { margin: 1em 40px; }
-#app-navigation {
- padding-bottom: 0px;
-}
#app-navigation .appwarning {
background: #fcc;
}
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 151ab6cdecc..306e3952e53 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -732,24 +732,20 @@ $(document).ready(function () {
.focus()
.keypress(function (event) {
if (event.keyCode === 13) {
- if ($(this).val().length > 0) {
- $tr.data('mailAddress', $input.val());
- $input.blur();
- $.ajax({
- type: 'PUT',
- url: OC.generateUrl('/settings/users/{id}/mailAddress', {id: uid}),
- data: {
- mailAddress: $(this).val()
- }
- }).fail(function (result) {
- OC.Notification.show(result.responseJSON.data.message);
- // reset the values
- $tr.data('mailAddress', mailAddress);
- $tr.children('.mailAddress').children('span').text(mailAddress);
- });
- } else {
- $input.blur();
- }
+ $tr.data('mailAddress', $input.val());
+ $input.blur();
+ $.ajax({
+ type: 'PUT',
+ url: OC.generateUrl('/settings/users/{id}/mailAddress', {id: uid}),
+ data: {
+ mailAddress: $(this).val()
+ }
+ }).fail(function (result) {
+ OC.Notification.show(result.responseJSON.data.message);
+ // reset the values
+ $tr.data('mailAddress', mailAddress);
+ $tr.children('.mailAddress').children('span').text(mailAddress);
+ });
}
})
.blur(function () {
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index 3f314c54816..8f446dea0a5 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -155,6 +155,7 @@ OC.L10N.register(
"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.",
"Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren",
"Please read carefully before activating server-side encryption: " : "Bitte lesen Sie ganz genau, bevor Sie die Serverseite Verschlüsselung aktivieren:",
+ "This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Wollen Sie die Verschlüsselung wirklich aktivieren?",
"Enable encryption" : "Verschlüsselung aktivieren",
"No encryption module loaded, please enable an encryption module in the app menu." : "Kein Verschlüsselungs-Modul geladen, bitte aktiviere ein Verschlüsselungs-Modul im Anwendungs-Menü.",
"Select default encryption module:" : "Standard-Verschlüsselungs-Modul auswählen:",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index 0df74f1d602..feedc0cae48 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -153,6 +153,7 @@
"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.",
"Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren",
"Please read carefully before activating server-side encryption: " : "Bitte lesen Sie ganz genau, bevor Sie die Serverseite Verschlüsselung aktivieren:",
+ "This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Wollen Sie die Verschlüsselung wirklich aktivieren?",
"Enable encryption" : "Verschlüsselung aktivieren",
"No encryption module loaded, please enable an encryption module in the app menu." : "Kein Verschlüsselungs-Modul geladen, bitte aktiviere ein Verschlüsselungs-Modul im Anwendungs-Menü.",
"Select default encryption module:" : "Standard-Verschlüsselungs-Modul auswählen:",
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index 43a6ef4358e..e136e19caa3 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -217,7 +217,7 @@ OC.L10N.register(
"Enable only for specific groups" : "Activer uniquement pour certains groupes",
"Uninstall App" : "Désinstaller l'application",
"Enable experimental apps" : "Activer les applications expérimentales",
- "SSL Root Certificates" : "Certificats Racine SSL",
+ "SSL Root Certificates" : "Certificats Racines SSL",
"Common Name" : "Nom d'usage",
"Valid until" : "Valide jusqu'à",
"Issued By" : "Délivré par",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index 9b5fbd02401..0efcfb34db5 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -215,7 +215,7 @@
"Enable only for specific groups" : "Activer uniquement pour certains groupes",
"Uninstall App" : "Désinstaller l'application",
"Enable experimental apps" : "Activer les applications expérimentales",
- "SSL Root Certificates" : "Certificats Racine SSL",
+ "SSL Root Certificates" : "Certificats Racines SSL",
"Common Name" : "Nom d'usage",
"Valid until" : "Valide jusqu'à",
"Issued By" : "Délivré par",
diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js
index 2d092c302d1..1720099f52f 100644
--- a/settings/l10n/ja.js
+++ b/settings/l10n/ja.js
@@ -235,12 +235,14 @@ OC.L10N.register(
"Select from Files" : "ファイルから選択",
"Remove image" : "画像を削除",
"png or jpg, max. 20 MB" : "png もしくは jpg, 最大.20MB",
+ "Picture provided by original account" : "オリジナルのアカウントで提供されている写真",
"Cancel" : "キャンセル",
"Choose as profile picture" : "プロファイル画像として選択",
"Full name" : "氏名",
"No display name set" : "表示名が未設定",
"Email" : "メール",
"Your email address" : "あなたのメールアドレス",
+ "For password recovery and notifications" : "パスワード回復と通知用",
"No email address set" : "メールアドレスが設定されていません",
"You are member of the following groups:" : "以下のグループのメンバーです:",
"Password" : "パスワード",
diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json
index 996a53df9c5..8afff417176 100644
--- a/settings/l10n/ja.json
+++ b/settings/l10n/ja.json
@@ -233,12 +233,14 @@
"Select from Files" : "ファイルから選択",
"Remove image" : "画像を削除",
"png or jpg, max. 20 MB" : "png もしくは jpg, 最大.20MB",
+ "Picture provided by original account" : "オリジナルのアカウントで提供されている写真",
"Cancel" : "キャンセル",
"Choose as profile picture" : "プロファイル画像として選択",
"Full name" : "氏名",
"No display name set" : "表示名が未設定",
"Email" : "メール",
"Your email address" : "あなたのメールアドレス",
+ "For password recovery and notifications" : "パスワード回復と通知用",
"No email address set" : "メールアドレスが設定されていません",
"You are member of the following groups:" : "以下のグループのメンバーです:",
"Password" : "パスワード",
diff --git a/settings/templates/personal.php b/settings/templates/personal.php
index b00a5c5dd8a..14378899e92 100644
--- a/settings/templates/personal.php
+++ b/settings/templates/personal.php
@@ -170,7 +170,7 @@ if($_['passwordChangeSupported']) {
<div id="clientsbox" class="section clientsbox">
<h2><?php p($l->t('Get the apps to sync your files'));?></h2>
<a href="<?php p($_['clients']['desktop']); ?>" target="_blank">
- <img src="<?php print_unescaped(OCP\Util::imagePath('core', 'desktopapp.png')); ?>"
+ <img src="<?php print_unescaped(OCP\Util::imagePath('core', 'desktopapp.svg')); ?>"
alt="<?php p($l->t('Desktop client'));?>" />
</a>
<a href="<?php p($_['clients']['android']); ?>" target="_blank">
@@ -178,7 +178,7 @@ if($_['passwordChangeSupported']) {
alt="<?php p($l->t('Android app'));?>" />
</a>
<a href="<?php p($_['clients']['ios']); ?>" target="_blank">
- <img src="<?php print_unescaped(OCP\Util::imagePath('core', 'appstore.png')); ?>"
+ <img src="<?php print_unescaped(OCP\Util::imagePath('core', 'appstore.svg')); ?>"
alt="<?php p($l->t('iOS app'));?>" />
</a>
diff --git a/tests/enable_all.php b/tests/enable_all.php
index 6f2d1fa8717..afea5c89665 100644
--- a/tests/enable_all.php
+++ b/tests/enable_all.php
@@ -23,3 +23,4 @@ enableApp('user_ldap');
enableApp('files_versions');
enableApp('provisioning_api');
enableApp('federation');
+enableApp('federatedfilesharing');
diff --git a/tests/karma.config.js b/tests/karma.config.js
index 2b569fb7584..111af7a1559 100644
--- a/tests/karma.config.js
+++ b/tests/karma.config.js
@@ -101,6 +101,7 @@ module.exports = function(config) {
// need to enforce loading order...
'apps/systemtags/js/app.js',
'apps/systemtags/js/systemtagsinfoview.js',
+ 'apps/systemtags/js/systemtagsfilelist.js',
'apps/systemtags/js/filesplugin.js'
],
testFiles: ['apps/systemtags/tests/js/**/*.js']
diff --git a/tests/lib/app.php b/tests/lib/app.php
index 389c9e5d2cf..065296827dd 100644
--- a/tests/lib/app.php
+++ b/tests/lib/app.php
@@ -312,6 +312,7 @@ class Test_App extends \Test\TestCase {
'appforgroup1',
'appforgroup12',
'dav',
+ 'federatedfilesharing',
),
false
),
@@ -325,6 +326,7 @@ class Test_App extends \Test\TestCase {
'appforgroup12',
'appforgroup2',
'dav',
+ 'federatedfilesharing',
),
false
),
@@ -339,6 +341,7 @@ class Test_App extends \Test\TestCase {
'appforgroup12',
'appforgroup2',
'dav',
+ 'federatedfilesharing',
),
false
),
@@ -353,6 +356,7 @@ class Test_App extends \Test\TestCase {
'appforgroup12',
'appforgroup2',
'dav',
+ 'federatedfilesharing',
),
false,
),
@@ -367,6 +371,7 @@ class Test_App extends \Test\TestCase {
'appforgroup12',
'appforgroup2',
'dav',
+ 'federatedfilesharing',
),
true,
),
@@ -444,11 +449,11 @@ class Test_App extends \Test\TestCase {
);
$apps = \OC_App::getEnabledApps(true);
- $this->assertEquals(array('files', 'app3', 'dav'), $apps);
+ $this->assertEquals(array('files', 'app3', 'dav', 'federatedfilesharing',), $apps);
// mock should not be called again here
$apps = \OC_App::getEnabledApps(false);
- $this->assertEquals(array('files', 'app3', 'dav'), $apps);
+ $this->assertEquals(array('files', 'app3', 'dav', 'federatedfilesharing',), $apps);
$this->restoreAppConfig();
\OC_User::setUserId(null);
@@ -480,7 +485,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(), $c->getMemCacheFactory());
+ return new \OC\App\AppManager($c->getUserSession(), $appConfig, $c->getGroupManager(), $c->getMemCacheFactory(), $c->getEventDispatcher());
});
}
@@ -492,7 +497,7 @@ class Test_App extends \Test\TestCase {
return new \OC\AppConfig($c->getDatabaseConnection());
});
\OC::$server->registerService('AppManager', function (\OC\Server $c) {
- return new \OC\App\AppManager($c->getUserSession(), $c->getAppConfig(), $c->getGroupManager(), $c->getMemCacheFactory());
+ return new \OC\App\AppManager($c->getUserSession(), $c->getAppConfig(), $c->getGroupManager(), $c->getMemCacheFactory(), $c->getEventDispatcher());
});
// 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 f82f1049ce3..ef7c01658e1 100644
--- a/tests/lib/app/manager.php
+++ b/tests/lib/app/manager.php
@@ -79,6 +79,9 @@ class Manager extends TestCase {
/** @var \OCP\App\IAppManager */
protected $manager;
+ /** @var \Symfony\Component\EventDispatcher\EventDispatcherInterface */
+ protected $eventDispatcher;
+
protected function setUp() {
parent::setUp();
@@ -87,11 +90,12 @@ class Manager extends TestCase {
$this->appConfig = $this->getAppConfig();
$this->cacheFactory = $this->getMock('\OCP\ICacheFactory');
$this->cache = $this->getMock('\OCP\ICache');
+ $this->eventDispatcher = $this->getMock('\Symfony\Component\EventDispatcher\EventDispatcherInterface');
$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);
+ $this->manager = new \OC\App\AppManager($this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher);
}
protected function expectClearCache() {
@@ -149,7 +153,7 @@ class Manager extends TestCase {
/** @var \OC\App\AppManager|\PHPUnit_Framework_MockObject_MockObject $manager */
$manager = $this->getMockBuilder('OC\App\AppManager')
->setConstructorArgs([
- $this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory
+ $this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher
])
->setMethods([
'getAppInfo'
@@ -192,7 +196,7 @@ class Manager extends TestCase {
/** @var \OC\App\AppManager|\PHPUnit_Framework_MockObject_MockObject $manager */
$manager = $this->getMockBuilder('OC\App\AppManager')
->setConstructorArgs([
- $this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory
+ $this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher
])
->setMethods([
'getAppInfo'
@@ -282,7 +286,7 @@ class Manager extends TestCase {
$this->appConfig->setValue('test1', 'enabled', 'yes');
$this->appConfig->setValue('test2', 'enabled', 'no');
$this->appConfig->setValue('test3', 'enabled', '["foo"]');
- $this->assertEquals(['dav', 'files', 'test1', 'test3'], $this->manager->getInstalledApps());
+ $this->assertEquals(['dav', 'federatedfilesharing', 'files', 'test1', 'test3'], $this->manager->getInstalledApps());
}
public function testGetAppsForUser() {
@@ -296,18 +300,19 @@ class Manager extends TestCase {
$this->appConfig->setValue('test2', 'enabled', 'no');
$this->appConfig->setValue('test3', 'enabled', '["foo"]');
$this->appConfig->setValue('test4', 'enabled', '["asd"]');
- $this->assertEquals(['dav', 'files', 'test1', 'test3'], $this->manager->getEnabledAppsForUser($user));
+ $this->assertEquals(['dav', 'federatedfilesharing', 'files', 'test1', 'test3'], $this->manager->getEnabledAppsForUser($user));
}
public function testGetAppsNeedingUpgrade() {
$this->manager = $this->getMockBuilder('\OC\App\AppManager')
- ->setConstructorArgs([$this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory])
+ ->setConstructorArgs([$this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher])
->setMethods(['getAppInfo'])
->getMock();
$appInfos = [
'dav' => ['id' => 'dav'],
'files' => ['id' => 'files'],
+ 'federatedfilesharing' => ['id' => 'federatedfilesharing'],
'test1' => ['id' => 'test1', 'version' => '1.0.1', 'requiremax' => '9.0.0'],
'test2' => ['id' => 'test2', 'version' => '1.0.0', 'requiremin' => '8.2.0'],
'test3' => ['id' => 'test3', 'version' => '1.2.4', 'requiremin' => '9.0.0'],
@@ -341,13 +346,14 @@ class Manager extends TestCase {
public function testGetIncompatibleApps() {
$this->manager = $this->getMockBuilder('\OC\App\AppManager')
- ->setConstructorArgs([$this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory])
+ ->setConstructorArgs([$this->userSession, $this->appConfig, $this->groupManager, $this->cacheFactory, $this->eventDispatcher])
->setMethods(['getAppInfo'])
->getMock();
$appInfos = [
'dav' => ['id' => 'dav'],
'files' => ['id' => 'files'],
+ 'federatedfilesharing' => ['id' => 'federatedfilesharing'],
'test1' => ['id' => 'test1', 'version' => '1.0.1', 'requiremax' => '8.0.0'],
'test2' => ['id' => 'test2', 'version' => '1.0.0', 'requiremin' => '8.2.0'],
'test3' => ['id' => 'test3', 'version' => '1.2.4', 'requiremin' => '9.0.0'],
diff --git a/tests/lib/command/integrity/SignCoreTest.php b/tests/lib/command/integrity/SignCoreTest.php
index 885c6fc664e..ff1f6b23a95 100644
--- a/tests/lib/command/integrity/SignCoreTest.php
+++ b/tests/lib/command/integrity/SignCoreTest.php
@@ -63,7 +63,7 @@ class SignCoreTest extends TestCase {
$outputInterface
->expects($this->at(0))
->method('writeln')
- ->with('--privateKey and --certificate are required.');
+ ->with('--privateKey, --certificate and --path are required.');
$this->invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface]);
}
@@ -86,7 +86,7 @@ class SignCoreTest extends TestCase {
$outputInterface
->expects($this->at(0))
->method('writeln')
- ->with('--privateKey and --certificate are required.');
+ ->with('--privateKey, --certificate and --path are required.');
$this->invokePrivate($this->signCore, 'execute', [$inputInterface, $outputInterface]);
}
@@ -105,6 +105,11 @@ class SignCoreTest extends TestCase {
->method('getOption')
->with('certificate')
->will($this->returnValue('certificate'));
+ $inputInterface
+ ->expects($this->at(2))
+ ->method('getOption')
+ ->with('path')
+ ->will($this->returnValue('certificate'));
$this->fileAccessHelper
->expects($this->at(0))
@@ -134,6 +139,11 @@ class SignCoreTest extends TestCase {
->method('getOption')
->with('certificate')
->will($this->returnValue('certificate'));
+ $inputInterface
+ ->expects($this->at(2))
+ ->method('getOption')
+ ->with('path')
+ ->will($this->returnValue('certificate'));
$this->fileAccessHelper
->expects($this->at(0))
@@ -168,6 +178,11 @@ class SignCoreTest extends TestCase {
->method('getOption')
->with('certificate')
->will($this->returnValue('certificate'));
+ $inputInterface
+ ->expects($this->at(2))
+ ->method('getOption')
+ ->with('path')
+ ->will($this->returnValue('certificate'));
$this->fileAccessHelper
->expects($this->at(0))
diff --git a/tests/lib/db/querybuilder/expressionbuildertest.php b/tests/lib/db/querybuilder/expressionbuildertest.php
index 8310c4adf68..f38faab9169 100644
--- a/tests/lib/db/querybuilder/expressionbuildertest.php
+++ b/tests/lib/db/querybuilder/expressionbuildertest.php
@@ -22,7 +22,7 @@
namespace Test\DB\QueryBuilder;
use Doctrine\DBAL\Query\Expression\ExpressionBuilder as DoctrineExpressionBuilder;
-use OC\DB\QueryBuilder\ExpressionBuilder;
+use OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder;
use OCP\DB\QueryBuilder\IQueryBuilder;
use Test\TestCase;
diff --git a/tests/lib/files/storage/home.php b/tests/lib/files/storage/home.php
index 7e10f09d554..1ed3b137cd4 100644
--- a/tests/lib/files/storage/home.php
+++ b/tests/lib/files/storage/home.php
@@ -82,18 +82,6 @@ class Home extends Storage {
}
/**
- * Tests that the root path matches the data dir
- */
- public function testRoot() {
- if (\OC_Util::runningOnWindows()) {
- // Windows removes trailing slashes when returning paths
- $this->assertEquals(rtrim($this->tmpDir, '/'), $this->instance->getLocalFolder(''));
- } else {
- $this->assertEquals($this->tmpDir, $this->instance->getLocalFolder(''));
- }
- }
-
- /**
* Tests that the home id is in the format home::user1
*/
public function testId() {
diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php
index 95dd70bfdac..42bd491df5c 100644
--- a/tests/lib/files/storage/storage.php
+++ b/tests/lib/files/storage/storage.php
@@ -262,9 +262,6 @@ abstract class Storage extends \Test\TestCase {
$this->instance->file_put_contents('/folder/bar.txt', 'asd');
$this->instance->mkdir('/folder/recursive');
$this->instance->file_put_contents('/folder/recursive/file.txt', 'foo');
- $localFolder = $this->instance->getLocalFolder('/folder');
-
- $this->assertTrue(is_dir($localFolder));
// test below require to use instance->getLocalFile because the physical storage might be different
$localFile = $this->instance->getLocalFile('/folder/lorem.txt');
diff --git a/tests/lib/integritycheck/checkertest.php b/tests/lib/integritycheck/checkertest.php
index dec3ea84a64..fac60b0c123 100644
--- a/tests/lib/integritycheck/checkertest.php
+++ b/tests/lib/integritycheck/checkertest.php
@@ -465,7 +465,7 @@ class CheckerTest extends TestCase {
$rsa->loadKey($rsaPrivateKey);
$x509 = new X509();
$x509->loadX509($keyBundle);
- $this->checker->writeCoreSignature($x509, $rsa);
+ $this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/app/');
}
public function testWriteCoreSignatureWithUnmodifiedHtaccess() {
@@ -495,7 +495,7 @@ class CheckerTest extends TestCase {
$rsa->loadKey($rsaPrivateKey);
$x509 = new X509();
$x509->loadX509($keyBundle);
- $this->checker->writeCoreSignature($x509, $rsa);
+ $this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessUnmodified/');
}
public function testWriteCoreSignatureWithInvalidModifiedHtaccess() {
@@ -506,10 +506,6 @@ class CheckerTest extends TestCase {
"signature": "qpDddYGgAKNR3TszOgjPXRphUl2P9Ym5OQaetltocgZASGDkOun5D64+1D0QJRKb4SG2+48muxGOHyL2Ngos4NUrrSR+SIkywZacay82YQBCEdr7\/4MjW1WHRPjvboLwEJwViw0EdAjsWRpD68aPnzUGrGsy2BsCo06P5iwjk9cXcHxdjC9R39npvoC3QNvQ2jmNIbh1Lc4U97dbb+CsXEQCLU1OSa9p3q6cEFV98Easwt7uF\/DzHK+CbeZlxVZ0DwLh2\/ylT1PyGou8QC1b3vKAnPjLWMO+UsCPpCKhk3C5pV+5etQ8puGd+0x2t5tEU+qXxLzek91zWNC+rqgC\/WlqLKbwPb\/BCHs4zLGV55Q2fEQmT21x0KCUELdPs4dBnYP4Ox5tEDugtJujWFzOHzoY6gGa\/BY\/78pSZXmq9o8dWkBEtioWWvaNZ1rM0ddE83GBlBTgjigi9Ay1D++bUW\/FCBB7CMk6qyNlV81H+cBuIEODw2aymmkM9LLDD2Qbmvo8gHEPRjiQxPC5OpDlcdSNiL+zcxVxeuX4FpT+9xzz\/\/DRONhufxRpsbuCOMxd96RW7y9U2N2Uxb3Bzn\/BIqEayUUsdgZjfaGcXXYKR+chu\/LOwNYN6RlnLsgqL\/dhGKwlRVKXw1RA2\/af\/CpqyR7uVP6al1YJo\/YJ+5XJ6zE=",
"certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEvjCCAqagAwIBAgIUc\/0FxYrsgSs9rDxp03EJmbjN0NwwDQYJKoZIhvcNAQEF\r\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTEw\r\nMzIxMDMzM1oXDTE2MTEwMzIxMDMzM1owDzENMAsGA1UEAwwEY29yZTCCAiIwDQYJ\r\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBALb6EgHpkAqZbO5vRO8XSh7G7XGWHw5s\r\niOf4RwPXR6SE9bWZEm\/b72SfWk\/\/J6AbrD8WiOzBuT\/ODy6k5T1arEdHO+Pux0W1\r\nMxYJJI4kH74KKgMpC0SB0Rt+8WrMqV1r3hhJ46df6Xr\/xolP3oD+eLbShPcblhdS\r\nVtkZEkoev8Sh6L2wDCeHDyPxzvj1w2dTdGVO9Kztn0xIlyfEBakqvBWtcxyi3Ln0\r\nklnxlMx3tPDUE4kqvpia9qNiB1AN2PV93eNr5\/2riAzIssMFSCarWCx0AKYb54+d\r\nxLpcYFyqPJ0ydBCkF78DD45RCZet6PNYkdzgbqlUWEGGomkuDoJbBg4wzgzO0D77\r\nH87KFhYW8tKFFvF1V3AHl\/sFQ9tDHaxM9Y0pZ2jPp\/ccdiqnmdkBxBDqsiRvHvVB\r\nCn6qpb4vWGFC7vHOBfYspmEL1zLlKXZv3ezMZEZw7O9ZvUP3VO\/wAtd2vUW8UFiq\r\ns2v1QnNLN6jNh51obcwmrBvWhJy9vQIdtIjQbDxqWTHh1zUSrw9wrlklCBZ\/zrM0\r\ni8nfCFwTxWRxp3H9KoECzO\/zS5R5KIS7s3\/wq\/w9T2Ie4rcecgXwDizwnn0C\/aKc\r\nbDIjujpL1s9HO05pcD\/V3wKcPZ1izymBkmMyIbL52iRVN5FTVHeZdXPpFuq+CTQJ\r\nQ238lC+A\/KOVAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGoKTnh8RfJV4sQItVC2\r\nAvfJagkrIqZ3iiQTUBQGTKBsTnAqE1H7QgUSV9vSd+8rgvHkyZsRjmtyR1e3A6Ji\r\noNCXUbExC\/0iCPUqdHZIVb+Lc\/vWuv4ByFMybGPydgtLoEUX2ZrKFWmcgZFDUSRd\r\n9Uj26vtUhCC4bU4jgu6hIrR9IuxOBLQUxGTRZyAcXvj7obqRAEZwFAKQgFpfpqTb\r\nH+kjcbZSaAlLVSF7vBc1syyI8RGYbqpwvtREqJtl5IEIwe6huEqJ3zPnlP2th\/55\r\ncf3Fovj6JJgbb9XFxrdnsOsDOu\/tpnaRWlvv5ib4+SzG5wWFT5UUEo4Wg2STQiiX\r\nuVSRQxK1LE1yg84bs3NZk9FSQh4B8vZVuRr5FaJsZZkwlFlhRO\/\/+TJtXRbyNgsf\r\noMRZGi8DLGU2SGEAHcRH\/QZHq\/XDUWVzdxrSBYcy7GSpT7UDVzGv1rEJUrn5veP1\r\n0KmauAqtiIaYRm4f6YBsn0INcZxzIPZ0p8qFtVZBPeHhvQtvOt0iXI\/XUxEWOa2F\r\nK2EqhErgMK\/N07U1JJJay5tYZRtvkGq46oP\/5kQG8hYST0MDK6VihJoPpvCmAm4E\r\npEYKQ96x6A4EH9Y9mZlYozH\/eqmxPbTK8n89\/p7Ydun4rI+B2iiLnY8REWWy6+UQ\r\nV204fGUkJqW5CrKy3P3XvY9X\r\n-----END CERTIFICATE-----"
}';
- $this->environmentHelper
- ->expects($this->any())
- ->method('getServerRoot')
- ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithInvalidModifiedContent/'));
$this->fileAccessHelper
->expects($this->once())
->method('file_put_contents')
@@ -524,7 +520,7 @@ class CheckerTest extends TestCase {
$rsa->loadKey($rsaPrivateKey);
$x509 = new X509();
$x509->loadX509($keyBundle);
- $this->checker->writeCoreSignature($x509, $rsa);
+ $this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithInvalidModifiedContent/');
}
public function testWriteCoreSignatureWithValidModifiedHtaccess() {
@@ -554,7 +550,7 @@ class CheckerTest extends TestCase {
$rsa->loadKey($rsaPrivateKey);
$x509 = new X509();
$x509->loadX509($keyBundle);
- $this->checker->writeCoreSignature($x509, $rsa);
+ $this->checker->writeCoreSignature($x509, $rsa, \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithValidModifiedContent');
}
public function testVerifyCoreSignatureWithoutSignatureData() {
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index 1bdaa9a2dbf..a9ebb7bc88a 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -347,6 +347,27 @@ class RepairMimeTypes extends \Test\TestCase {
}
/**
+ * Test renaming the richdocuments additional office mime types
+ */
+ public function testRenameRichDocumentsMimeTypes() {
+ $currentMimeTypes = [
+ ['test.lwp', 'application/octet-stream'],
+ ['test.one', 'application/octet-stream'],
+ ['test.vsd', 'application/octet-stream'],
+ ['test.wpd', 'application/octet-stream'],
+ ];
+
+ $fixedMimeTypes = [
+ ['test.lwp', 'application/vnd.lotus-wordpro'],
+ ['test.one', 'application/msonenote'],
+ ['test.vsd', 'application/vnd.visio'],
+ ['test.wpd', 'application/vnd.wordperfect'],
+ ];
+
+ $this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
+ }
+
+ /**
* Test renaming and splitting old office mime types when
* new ones already exist
*/
@@ -468,6 +489,10 @@ class RepairMimeTypes extends \Test\TestCase {
['test.hpp', 'text/x-h'],
['test.rss', 'application/rss+xml'],
['test.rtf', 'text/rtf'],
+ ['test.lwp', 'application/vnd.lotus-wordpro'],
+ ['test.one', 'application/msonenote'],
+ ['test.vsd', 'application/vnd.visio'],
+ ['test.wpd', 'application/vnd.wordperfect'],
];
$fixedMimeTypes = [
@@ -512,6 +537,10 @@ class RepairMimeTypes extends \Test\TestCase {
['test.hpp', 'text/x-h'],
['test.rss', 'application/rss+xml'],
['test.rtf', 'text/rtf'],
+ ['test.lwp', 'application/vnd.lotus-wordpro'],
+ ['test.one', 'application/msonenote'],
+ ['test.vsd', 'application/vnd.visio'],
+ ['test.wpd', 'application/vnd.wordperfect'],
];
$this->renameMimeTypes($currentMimeTypes, $fixedMimeTypes);
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index 5162a03f367..4519c33f9d1 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -1423,7 +1423,7 @@ class Test_Share extends \Test\TestCase {
$userSession->method('getUser')->willReturn($user);
- $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+ $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
->disableOriginalConstructor()
->getMock();
$qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
@@ -1478,7 +1478,7 @@ class Test_Share extends \Test\TestCase {
$userSession->method('getUser')->willReturn($user);
- $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+ $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
->disableOriginalConstructor()
->getMock();
$qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
@@ -1531,7 +1531,7 @@ class Test_Share extends \Test\TestCase {
$userSession->method('getUser')->willReturn($user);
- $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+ $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
->disableOriginalConstructor()
->getMock();
$qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
@@ -1584,7 +1584,7 @@ class Test_Share extends \Test\TestCase {
$userSession->method('getUser')->willReturn($user);
- $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder')
+ $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
->disableOriginalConstructor()
->getMock();
$qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
diff --git a/tests/lib/share20/managertest.php b/tests/lib/share20/managertest.php
index 270f5da33cd..ea0fb1838d7 100644
--- a/tests/lib/share20/managertest.php
+++ b/tests/lib/share20/managertest.php
@@ -22,6 +22,7 @@ namespace Test\Share20;
use OCP\Files\IRootFolder;
use OCP\IUserManager;
+use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IProviderFactory;
use OCP\Share\IShare;
use OC\Share20\Manager;
@@ -500,6 +501,33 @@ class ManagerTest extends \Test\TestCase {
}
/**
+ * @expectedException \OCP\Share\Exceptions\ShareNotFound
+ */
+ public function testGetExpiredShareById() {
+ $manager = $this->createManagerMock()
+ ->setMethods(['deleteShare'])
+ ->getMock();
+
+ $date = new \DateTime();
+ $date->setTime(0,0,0);
+
+ $share = $this->manager->newShare();
+ $share->setExpirationDate($date)
+ ->setShareType(\OCP\Share::SHARE_TYPE_LINK);
+
+ $this->defaultProvider->expects($this->once())
+ ->method('getShareById')
+ ->with('42')
+ ->willReturn($share);
+
+ $manager->expects($this->once())
+ ->method('deleteShare')
+ ->with($share);
+
+ $manager->getShareById('default:42');
+ }
+
+ /**
* @expectedException InvalidArgumentException
* @expectedExceptionMessage Passwords are enforced for link shares
*/
@@ -1672,6 +1700,109 @@ class ManagerTest extends \Test\TestCase {
$manager->createShare($share);
}
+ public function testGetSharesBy() {
+ $share = $this->manager->newShare();
+
+ $node = $this->getMock('OCP\Files\Folder');
+
+ $this->defaultProvider->expects($this->once())
+ ->method('getSharesBy')
+ ->with(
+ $this->equalTo('user'),
+ $this->equalTo(\OCP\Share::SHARE_TYPE_USER),
+ $this->equalTo($node),
+ $this->equalTo(true),
+ $this->equalTo(1),
+ $this->equalTo(1)
+ )->willReturn([$share]);
+
+ $shares = $this->manager->getSharesBy('user', \OCP\Share::SHARE_TYPE_USER, $node, true, 1, 1);
+
+ $this->assertCount(1, $shares);
+ $this->assertSame($share, $shares[0]);
+ }
+
+ /**
+ * Test to ensure we correctly remove expired link shares
+ *
+ * We have 8 Shares and we want the 3 first valid shares.
+ * share 3-6 and 8 are expired. Thus at the end of this test we should
+ * have received share 1,2 and 7. And from the manager. Share 3-6 should be
+ * deleted (as they are evaluated). but share 8 should still be there.
+ */
+ public function testGetSharesByExpiredLinkShares() {
+ $manager = $this->createManagerMock()
+ ->setMethods(['deleteShare'])
+ ->getMock();
+
+ /** @var \OCP\Share\IShare[] $shares */
+ $shares = [];
+
+ /*
+ * This results in an array of 8 IShare elements
+ */
+ for ($i = 0; $i < 8; $i++) {
+ $share = $this->manager->newShare();
+ $share->setId($i);
+ $shares[] = $share;
+ }
+
+ $today = new \DateTime();
+ $today->setTime(0,0,0);
+
+ /*
+ * Set the expiration date to today for some shares
+ */
+ $shares[2]->setExpirationDate($today);
+ $shares[3]->setExpirationDate($today);
+ $shares[4]->setExpirationDate($today);
+ $shares[5]->setExpirationDate($today);
+
+ /** @var \OCP\Share\IShare[] $i */
+ $shares2 = [];
+ for ($i = 0; $i < 8; $i++) {
+ $shares2[] = clone $shares[$i];
+ }
+
+ $node = $this->getMock('OCP\Files\File');
+
+ /*
+ * Simulate the getSharesBy call.
+ */
+ $this->defaultProvider
+ ->method('getSharesBy')
+ ->will($this->returnCallback(function($uid, $type, $node, $reshares, $limit, $offset) use (&$shares2) {
+ return array_slice($shares2, $offset, $limit);
+ }));
+
+ /*
+ * Simulate the deleteShare call.
+ */
+ $manager->method('deleteShare')
+ ->will($this->returnCallback(function($share) use (&$shares2) {
+ for($i = 0; $i < count($shares2); $i++) {
+ if ($shares2[$i]->getId() === $share->getId()) {
+ array_splice($shares2, $i, 1);
+ break;
+ }
+ }
+ }));
+
+ $res = $manager->getSharesBy('user', \OCP\Share::SHARE_TYPE_LINK, $node, true, 3, 0);
+
+ $this->assertCount(3, $res);
+ $this->assertEquals($shares[0]->getId(), $res[0]->getId());
+ $this->assertEquals($shares[1]->getId(), $res[1]->getId());
+ $this->assertEquals($shares[6]->getId(), $res[2]->getId());
+
+ $this->assertCount(4, $shares2);
+ $this->assertEquals(0, $shares2[0]->getId());
+ $this->assertEquals(1, $shares2[1]->getId());
+ $this->assertEquals(6, $shares2[2]->getId());
+ $this->assertEquals(7, $shares2[3]->getId());
+ $this->assertSame($today, $shares[3]->getExpirationDate());
+ }
+
public function testGetShareByToken() {
$factory = $this->getMock('\OCP\Share\IProviderFactory');
@@ -1704,6 +1835,48 @@ class ManagerTest extends \Test\TestCase {
$this->assertSame($share, $ret);
}
+ /**
+ * @expectedException \OCP\Share\Exceptions\ShareNotFound
+ */
+ public function testGetShareByTokenExpired() {
+ $manager = $this->createManagerMock()
+ ->setMethods(['deleteShare'])
+ ->getMock();
+
+ $date = new \DateTime();
+ $date->setTime(0,0,0);
+ $share = $this->manager->newShare();
+ $share->setExpirationDate($date);
+
+ $this->defaultProvider->expects($this->once())
+ ->method('getShareByToken')
+ ->with('expiredToken')
+ ->willReturn($share);
+
+ $manager->expects($this->once())
+ ->method('deleteShare')
+ ->with($this->equalTo($share));
+
+ $manager->getShareByToken('expiredToken');
+ }
+
+ public function testGetShareByTokenNotExpired() {
+ $date = new \DateTime();
+ $date->setTime(0,0,0);
+ $date->add(new \DateInterval('P2D'));
+ $share = $this->manager->newShare();
+ $share->setExpirationDate($date);
+
+ $this->defaultProvider->expects($this->once())
+ ->method('getShareByToken')
+ ->with('expiredToken')
+ ->willReturn($share);
+
+ $res = $this->manager->getShareByToken('expiredToken');
+
+ $this->assertSame($share, $res);
+ }
+
public function testCheckPasswordNoLinkShare() {
$share = $this->getMock('\OCP\Share\IShare');
$share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_USER);
@@ -1870,19 +2043,24 @@ class ManagerTest extends \Test\TestCase {
$originalShare = $this->manager->newShare();
$originalShare->setShareType(\OCP\Share::SHARE_TYPE_USER)
- ->setSharedWith('origUser');
+ ->setSharedWith('origUser')
+ ->setPermissions(1);
+
+ $node = $this->getMock('\OCP\Files\File');
+ $node->method('getId')->willReturn(100);
+ $node->method('getPath')->willReturn('/newUser/files/myPath');
$manager->expects($this->once())->method('canShare')->willReturn(true);
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
- $node = $this->getMock('\OCP\Files\File');
-
$share = $this->manager->newShare();
$share->setProviderId('foo')
->setId('42')
->setShareType(\OCP\Share::SHARE_TYPE_USER)
->setSharedWith('origUser')
->setShareOwner('newUser')
+ ->setSharedBy('sharer')
+ ->setPermissions(31)
->setNode($node);
$this->defaultProvider->expects($this->once())
@@ -1894,6 +2072,20 @@ class ManagerTest extends \Test\TestCase {
\OCP\Util::connectHook('OCP\Share', 'post_set_expiration_date', $hookListner, 'post');
$hookListner->expects($this->never())->method('post');
+ $this->rootFolder->method('getUserFolder')->with('newUser')->will($this->returnSelf());
+ $this->rootFolder->method('getRelativePath')->with('/newUser/files/myPath')->willReturn('/myPath');
+
+ $hookListner2 = $this->getMockBuilder('Dummy')->setMethods(['post'])->getMock();
+ \OCP\Util::connectHook('OCP\Share', 'post_update_permissions', $hookListner2, 'post');
+ $hookListner2->expects($this->once())->method('post')->with([
+ 'itemType' => 'file',
+ 'itemSource' => 100,
+ 'shareType' => \OCP\Share::SHARE_TYPE_USER,
+ 'shareWith' => 'origUser',
+ 'uidOwner' => 'sharer',
+ 'permissions' => 31,
+ 'path' => '/myPath',
+ ]);
$manager->updateShare($share);
}
@@ -1911,7 +2103,8 @@ class ManagerTest extends \Test\TestCase {
$originalShare = $this->manager->newShare();
$originalShare->setShareType(\OCP\Share::SHARE_TYPE_GROUP)
- ->setSharedWith('origUser');
+ ->setSharedWith('origUser')
+ ->setPermissions(31);
$manager->expects($this->once())->method('canShare')->willReturn(true);
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
@@ -1924,7 +2117,8 @@ class ManagerTest extends \Test\TestCase {
->setShareType(\OCP\Share::SHARE_TYPE_GROUP)
->setSharedWith('origUser')
->setShareOwner('owner')
- ->setNode($node);
+ ->setNode($node)
+ ->setPermissions(31);
$this->defaultProvider->expects($this->once())
->method('update')
@@ -1935,6 +2129,9 @@ class ManagerTest extends \Test\TestCase {
\OCP\Util::connectHook('OCP\Share', 'post_set_expiration_date', $hookListner, 'post');
$hookListner->expects($this->never())->method('post');
+ $hookListner2 = $this->getMockBuilder('Dummy')->setMethods(['post'])->getMock();
+ \OCP\Util::connectHook('OCP\Share', 'post_update_permissions', $hookListner2, 'post');
+ $hookListner2->expects($this->never())->method('post');
$manager->updateShare($share);
}
@@ -1953,7 +2150,8 @@ class ManagerTest extends \Test\TestCase {
->getMock();
$originalShare = $this->manager->newShare();
- $originalShare->setShareType(\OCP\Share::SHARE_TYPE_LINK);
+ $originalShare->setShareType(\OCP\Share::SHARE_TYPE_LINK)
+ ->setPermissions(15);
$tomorrow = new \DateTime();
$tomorrow->setTime(0,0,0);
@@ -1970,7 +2168,8 @@ class ManagerTest extends \Test\TestCase {
->setShareOwner('owner')
->setPassword('password')
->setExpirationDate($tomorrow)
- ->setNode($file);
+ ->setNode($file)
+ ->setPermissions(15);
$manager->expects($this->once())->method('canShare')->willReturn(true);
$manager->expects($this->once())->method('getShareById')->with('foo:42')->willReturn($originalShare);
@@ -1990,6 +2189,10 @@ class ManagerTest extends \Test\TestCase {
'uidOwner' => 'owner',
]);
+ $hookListner2 = $this->getMockBuilder('Dummy')->setMethods(['post'])->getMock();
+ \OCP\Util::connectHook('OCP\Share', 'post_update_permissions', $hookListner2, 'post');
+ $hookListner2->expects($this->never())->method('post');
+
$manager->updateShare($share);
}
diff --git a/tests/phpunit-autotest.xml b/tests/phpunit-autotest.xml
index 499c69bc9d1..7ef7c12df82 100644
--- a/tests/phpunit-autotest.xml
+++ b/tests/phpunit-autotest.xml
@@ -17,7 +17,7 @@
<filter>
<!-- whitelist processUncoveredFilesFromWhitelist="true" -->
<whitelist>
- <directory suffix=".php">..</directory>
+ <directory suffix=".php">../apps/federatedfilesharing/</directory>
<exclude>
<directory suffix=".php">../3rdparty</directory>
<directory suffix=".php">../apps/files/l10n</directory>
diff --git a/version.php b/version.php
index f807b01d7d0..44bddca0700 100644
--- a/version.php
+++ b/version.php
@@ -25,7 +25,7 @@
// We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades
// between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel
// when updating major/minor version number.
-$OC_Version = array(9, 0, 0, 9);
+$OC_Version = array(9, 0, 0, 10);
// The human readable string
$OC_VersionString = '9.0 pre alpha';